diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index 994b0c4a2..2101df990 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -62,8 +62,10 @@ Other Changes: - Circle and Curves tessellation error are scaled accordingly. - Backends: - QNX: added QNX Screen backend. (#9492) [@mgorchak-blackberry] - - SDL2: fixed querying framebuffer scale/density when using Metal. (#5592) [@lailoken] + - SDL2: fixed querying framebuffer scale/density when using Metal without + going through a SDL_Renderer. (#5592) [@lailoken] - Examples: + - SDL2+Metal: create Metal context without using a SDL_Renderer. - QNX+OpenGL3, QNX+Vulkan: added QNX Screen examples. (#9492) [@mgorchak-blackberry] diff --git a/examples/example_sdl2_metal/main.mm b/examples/example_sdl2_metal/main.mm index bae566daf..edd436aca 100644 --- a/examples/example_sdl2_metal/main.mm +++ b/examples/example_sdl2_metal/main.mm @@ -28,9 +28,6 @@ int main(int, char**) return 1; } - // Inform SDL that we will be using metal for rendering. Without this hint initialization of Metal renderer may fail. - SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); - // From 2.0.18: Enable native IME. #ifdef SDL_HINT_IME_SHOW_UI SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); @@ -46,13 +43,18 @@ int main(int, char**) return 1; } - SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); - if (renderer == nullptr) + // Create Metal device _before_ creating the view/layer + id metalDevice = MTLCreateSystemDefaultDevice(); + if (!metalDevice) { - printf("Error creating renderer: %s\n", SDL_GetError()); - return -3; + printf("Error: failed to create Metal device.\n"); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; } - CAMetalLayer* layer = (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderer); + SDL_MetalView view = SDL_Metal_CreateView(window); + CAMetalLayer* layer = (__bridge CAMetalLayer*)SDL_Metal_GetLayer(view); + layer.device = metalDevice; layer.pixelFormat = MTLPixelFormatBGRA8Unorm; id commandQueue = [layer.device newCommandQueue]; @@ -123,7 +125,8 @@ int main(int, char**) } int width, height; - SDL_GetRendererOutputSize(renderer, &width, &height); + SDL_GetWindowSizeInPixels(window, &width, &height); + layer.drawableSize = CGSizeMake(width, height); id drawable = [layer nextDrawable]; @@ -195,7 +198,6 @@ int main(int, char**) ImGui_ImplSDL2_Shutdown(); ImGui::DestroyContext(); - SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit();