Examples: SDL2+Metal: stop using SDL_CreateRenderer(). (#5592)

This commit is contained in:
ocornut
2026-08-06 21:28:57 +02:00
parent 98f3efcf07
commit 2ddb5fc095
2 changed files with 15 additions and 11 deletions
+3 -1
View File
@@ -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]
+12 -10
View File
@@ -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<MTLDevice> 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<MTLCommandQueue> 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<CAMetalDrawable> drawable = [layer nextDrawable];
@@ -195,7 +198,6 @@ int main(int, char**)
ImGui_ImplSDL2_Shutdown();
ImGui::DestroyContext();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();