int MIR_CreateWindowFramebuffer(_THIS, SDL_Window* window, Uint32* format, void** pixels, int* pitch) { MIR_Data* mir_data = _this->driverdata; MIR_Window* mir_window; MirSurfaceParameters surfaceparm; if (MIR_CreateWindow(_this, window) < 0) return SDL_SetError("Failed to created a mir window."); mir_window = window->driverdata; MIR_mir_surface_get_parameters(mir_window->surface, &surfaceparm); *format = MIR_GetSDLPixelFormat(surfaceparm.pixel_format); if (*format == SDL_PIXELFORMAT_UNKNOWN) return SDL_SetError("Unknown pixel format"); *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3); *pixels = SDL_malloc(window->h*(*pitch)); if (*pixels == NULL) return SDL_OutOfMemory(); 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); } return 0; }
device->Vulkan_CreateSurface = MIR_Vulkan_CreateSurface; #endif return device; } VideoBootStrap MIR_bootstrap = { MIR_DRIVER_NAME, "SDL Mir video driver", MIR_Available, MIR_CreateDevice }; static SDL_DisplayMode MIR_ConvertModeToSDLMode(MirOutputMode const* mode, MirPixelFormat format) { SDL_DisplayMode sdl_mode = { .format = MIR_GetSDLPixelFormat(format), .w = MIR_mir_output_mode_get_width(mode), .h = MIR_mir_output_mode_get_height(mode), .refresh_rate = MIR_mir_output_mode_get_refresh_rate(mode), .driverdata = NULL }; return sdl_mode; } static void MIR_AddModeToDisplay(SDL_VideoDisplay* display, MirOutputMode const* mode, MirPixelFormat format) { SDL_DisplayMode sdl_mode = MIR_ConvertModeToSDLMode(mode, format); SDL_AddDisplayMode(display, &sdl_mode); }