How to create a Metal renderer on macOS?

Hello,

I just started learning SDL2 today:

#define SDL_VIDEO_RENDER_METAL 1
#include <SDL2/SDL.h>

int main (int argc, char** argv)
{
    SDL_Window* window = NULL;
    window = SDL_CreateWindow
    (
        "hello world", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED,
        640,
        480,
        SDL_WINDOW_SHOWN
    );

    // Setup renderer
    SDL_Renderer* renderer = NULL;
    renderer =  SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);
            
    SDL_RendererInfo *rend_info = (SDL_RendererInfo *) malloc(sizeof(SDL_RendererInfo));
            SDL_GetRendererInfo(renderer, rend_info);

    puts(rend_info->name);


printf(%p\n", SDL_RenderGetMetalLayer(renderer));

    // Set render color to red ( background will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 255, 255, 0, 255 );

    // Clear winow
    SDL_RenderClear( renderer );

    // Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high.
    SDL_Rect r;
    r.x = 50;
    r.y = 50;
    r.w = 50;
    r.h = 50;

    // Set render color to blue ( rect will be rendered in this color )
    SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );

    // Render rect
    SDL_RenderFillRect( renderer, &r );

    // Render the rect to the screen
    SDL_RenderPresent(renderer);

    // Wait for 5 sec
    SDL_Delay( 5000 );

    SDL_DestroyWindow(window);
    SDL_Quit();

    return EXIT_SUCCESS;
}

rend_info->name is "opengl" and SDL_RenderGetMetalLayer(renderer) is 0x00

Couldn’t find it in the docs. Thanks.

I found this:

SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal");

But now no window is created at all :frowning:

Just tried a different tutorial. Now the window is created, but the image is not rendered when using Metal:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#undef main

int main(int argc, char** args) {
    SDL_Init(SDL_INIT_EVERYTHING);
    //For loading PNG images
    IMG_Init(IMG_INIT_PNG);
    //SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal");
    SDL_Window* window = SDL_CreateWindow("Getting Started", SDL_WINDOWPOS_UNDEFINED,
        SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN | SDL_WINDOW_ALLOW_HIGHDPI);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
    SDL_Event input;
    int quit = 0;

    SDL_Texture* texture = NULL;
    SDL_Surface* temp = IMG_Load("pic.png");

    //Filling texture with the image using a surface
    texture = SDL_CreateTextureFromSurface(renderer, temp);

    //Deleting the temporary surface
    SDL_FreeSurface(temp);

    SDL_Rect rect;
    rect.x = 0; //Extreme left of the window
    rect.y = 500; //Very bottom of the window
    rect.w = 500; //100 pixels width
    rect.h = 500; //100 pixels height
    //'rect' defines the dimensions for the bottom-left of the window

    while (!quit)
    {
        while (SDL_PollEvent(&input) > 0)
        {
            if (input.type == SDL_QUIT) quit = 1;
        }

        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);

        //Copying the texture on to the window using renderer and rectangle
        SDL_RenderCopy(renderer, texture, NULL, &rect);

        SDL_RenderPresent(renderer);
    }

    //Deleting the texture
    SDL_DestroyTexture(texture);

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    //For quitting IMG systems
    IMG_Quit();

    SDL_Quit();

    return 0;
}