void Android_DestroyWindow(_THIS, SDL_Window * window) { SDL_WindowData *data; if (window == Android_Window) { Android_Window = NULL; if (Android_PauseSem) SDL_DestroySemaphore(Android_PauseSem); if (Android_ResumeSem) SDL_DestroySemaphore(Android_ResumeSem); Android_PauseSem = NULL; Android_ResumeSem = NULL; if(window->driverdata) { data = (SDL_WindowData *) window->driverdata; if (data->egl_surface != EGL_NO_SURFACE) { SDL_EGL_DestroySurface(_this, data->egl_surface); } if (data->native_window) { ANativeWindow_release(data->native_window); } SDL_free(window->driverdata); window->driverdata = NULL; } } }
void KMSDRM_DestroyWindow(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; if(data) { /* Wait for any pending page flips and unlock buffer */ KMSDRM_WaitPageFlip(_this, data, -1); if (data->crtc_bo != NULL) { KMSDRM_gbm_surface_release_buffer(data->gs, data->crtc_bo); data->crtc_bo = NULL; } if (data->next_bo != NULL) { KMSDRM_gbm_surface_release_buffer(data->gs, data->next_bo); data->next_bo = NULL; } if (data->current_bo != NULL) { KMSDRM_gbm_surface_release_buffer(data->gs, data->current_bo); data->current_bo = NULL; } #if SDL_VIDEO_OPENGL_EGL SDL_EGL_MakeCurrent(_this, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (data->egl_surface != EGL_NO_SURFACE) { SDL_EGL_DestroySurface(_this, data->egl_surface); } #endif /* SDL_VIDEO_OPENGL_EGL */ if (data->gs != NULL) { KMSDRM_gbm_surface_destroy(data->gs); data->gs = NULL; } SDL_free(data); window->driverdata = NULL; } }
void VIVANTE_DestroyWindow(_THIS, SDL_Window * window) { SDL_VideoData *videodata = (SDL_VideoData *)_this->driverdata; SDL_WindowData *data; data = window->driverdata; if (data) { #if SDL_VIDEO_OPENGL_EGL if (data->egl_surface != EGL_NO_SURFACE) { SDL_EGL_DestroySurface(_this, data->egl_surface); } #endif if (data->native_window) { #if SDL_VIDEO_DRIVER_VIVANTE_VDK vdkDestroyWindow(data->native_window); #else videodata->fbDestroyWindow(data->native_window); #endif } SDL_free(data); } window->driverdata = NULL; }
void Wayland_DestroyWindow(_THIS, SDL_Window *window) { SDL_VideoData *data = _this->driverdata; SDL_WindowData *wind = window->driverdata; if (data) { SDL_EGL_DestroySurface(_this, wind->egl_surface); WAYLAND_wl_egl_window_destroy(wind->egl_window); if (wind->shell_surface) wl_shell_surface_destroy(wind->shell_surface); #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (wind->extended_surface) { QtExtendedSurface_Unsubscribe(wind->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION); QtExtendedSurface_Unsubscribe(wind->extended_surface, SDL_HINT_QTWAYLAND_WINDOW_FLAGS); qt_extended_surface_destroy(wind->extended_surface); } #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ wl_surface_destroy(wind->surface); SDL_free(wind); WAYLAND_wl_display_flush(data->display); } window->driverdata = NULL; }
void RPI_DestroyWindow(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; if(data) { #if SDL_VIDEO_OPENGL_EGL if (data->egl_surface != EGL_NO_SURFACE) { SDL_EGL_DestroySurface(_this, data->egl_surface); } #endif SDL_free(data); window->driverdata = NULL; } }
void RPI_DestroyWindow(_THIS, SDL_Window * window) { SDL_WindowData *data; if(window->driverdata) { data = (SDL_WindowData *) window->driverdata; if (data->egl_surface != EGL_NO_SURFACE) { SDL_EGL_DestroySurface(_this, data->egl_surface); data->egl_surface = EGL_NO_SURFACE; } SDL_free(window->driverdata); window->driverdata = NULL; } }
void MIR_DestroyWindow(_THIS, SDL_Window* window) { MIR_Data* mir_data = _this->driverdata; MIR_Window* mir_window = window->driverdata; if (mir_data) { SDL_EGL_DestroySurface(_this, mir_window->egl_surface); MIR_mir_surface_release_sync(mir_window->surface); mir_data->current_window = NULL; SDL_free(mir_window); } window->driverdata = NULL; }
void Wayland_DestroyWindow(_THIS, SDL_Window *window) { SDL_VideoData *data = _this->driverdata; SDL_WindowData *wind = window->driverdata; if (data) { SDL_EGL_DestroySurface(_this, wind->egl_surface); WAYLAND_wl_egl_window_destroy(wind->egl_window); if (wind->shell_surface) wl_shell_surface_destroy(wind->shell_surface); #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH if (wind->extended_surface) qt_extended_surface_destroy(wind->extended_surface); #endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */ wl_surface_destroy(wind->surface); SDL_free(wind); WAYLAND_wl_display_flush(data->display); } window->driverdata = NULL; }
int MIR_CreateWindow(_THIS, SDL_Window* window) { MIR_Window* mir_window; MIR_Data* mir_data; MirSurfaceParameters surfaceparm = { .name = "MirSurface", .width = window->w, .height = window->h, .pixel_format = mir_pixel_format_invalid, .buffer_usage = mir_buffer_usage_hardware, .output_id = mir_display_output_id_invalid }; MirEventDelegate delegate = { MIR_HandleInput, window }; mir_window = SDL_calloc(1, sizeof(MIR_Window)); if (!mir_window) return SDL_OutOfMemory(); mir_data = _this->driverdata; window->driverdata = mir_window; if (mir_data->software) surfaceparm.buffer_usage = mir_buffer_usage_software; if (window->x == SDL_WINDOWPOS_UNDEFINED) window->x = 0; if (window->y == SDL_WINDOWPOS_UNDEFINED) window->y = 0; mir_window->mir_data = mir_data; mir_window->sdl_window = window; surfaceparm.pixel_format = FindValidPixelFormat(mir_data); if (surfaceparm.pixel_format == mir_pixel_format_invalid) { return SDL_SetError("Failed to find a valid pixel format."); } mir_window->surface = MIR_mir_connection_create_surface_sync(mir_data->connection, &surfaceparm); if (!MIR_mir_surface_is_valid(mir_window->surface)) { const char* error = MIR_mir_surface_get_error_message(mir_window->surface); return SDL_SetError("Failed to created a mir surface: %s", error); } if (window->flags & SDL_WINDOW_OPENGL) { EGLNativeWindowType egl_native_window = (EGLNativeWindowType)MIR_mir_surface_get_egl_native_window(mir_window->surface); mir_window->egl_surface = SDL_EGL_CreateSurface(_this, egl_native_window); if (mir_window->egl_surface == EGL_NO_SURFACE) { return SDL_SetError("Failed to created a window surface %p", _this->egl_data->egl_display); } } else { mir_window->egl_surface = EGL_NO_SURFACE; } MIR_mir_surface_set_event_handler(mir_window->surface, &delegate); return 0; } void MIR_DestroyWindow(_THIS, SDL_Window* window) { MIR_Data* mir_data = _this->driverdata; MIR_Window* mir_window = window->driverdata; if (mir_data) { SDL_EGL_DestroySurface(_this, mir_window->egl_surface); MIR_mir_surface_release_sync(mir_window->surface); SDL_free(mir_window); } window->driverdata = NULL; }
int KMSDRM_CreateWindow(_THIS, SDL_Window * window) { SDL_WindowData *wdata; SDL_VideoDisplay *display; SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata); Uint32 surface_fmt, surface_flags; /* Allocate window internal data */ wdata = (SDL_WindowData *) SDL_calloc(1, sizeof(SDL_WindowData)); if (wdata == NULL) { SDL_OutOfMemory(); goto error; } wdata->waiting_for_flip = SDL_FALSE; display = SDL_GetDisplayForWindow(window); /* Windows have one size for now */ window->w = display->desktop_mode.w; window->h = display->desktop_mode.h; /* Maybe you didn't ask for a fullscreen OpenGL window, but that's what you get */ window->flags |= (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL); surface_fmt = GBM_FORMAT_XRGB8888; surface_flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING; if (!KMSDRM_gbm_device_is_format_supported(vdata->gbm, surface_fmt, surface_flags)) { SDL_LogWarn(SDL_LOG_CATEGORY_VIDEO, "GBM surface format not supported. Trying anyway."); } wdata->gs = KMSDRM_gbm_surface_create(vdata->gbm, window->w, window->h, surface_fmt, surface_flags); #if SDL_VIDEO_OPENGL_EGL if (!_this->egl_data) { if (SDL_GL_LoadLibrary(NULL) < 0) { goto error; } } wdata->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) wdata->gs); if (wdata->egl_surface == EGL_NO_SURFACE) { SDL_SetError("Could not create EGL window surface"); goto error; } #endif /* SDL_VIDEO_OPENGL_EGL */ /* In case we want low-latency, double-buffer video, we take note here */ wdata->double_buffer = SDL_FALSE; if (SDL_GetHintBoolean(SDL_HINT_VIDEO_DOUBLE_BUFFER, SDL_FALSE)) { wdata->double_buffer = SDL_TRUE; } /* Window is created, but we have yet to set up CRTC to one of the GBM buffers if we want drmModePageFlip to work, and we can't do it until EGL is completely setup, because we need to do eglSwapBuffers so we can get a valid GBM buffer object to call drmModeSetCrtc on it. */ wdata->crtc_ready = SDL_FALSE; /* Setup driver data for this window */ window->driverdata = wdata; /* One window, it always has focus */ SDL_SetMouseFocus(window); SDL_SetKeyboardFocus(window); /* Window has been successfully created */ return 0; error: if (wdata != NULL) { #if SDL_VIDEO_OPENGL_EGL if (wdata->egl_surface != EGL_NO_SURFACE) SDL_EGL_DestroySurface(_this, wdata->egl_surface); #endif /* SDL_VIDEO_OPENGL_EGL */ if (wdata->gs != NULL) KMSDRM_gbm_surface_destroy(wdata->gs); SDL_free(wdata); } return -1; }