diff --git a/src/gui/render/renderMetal.h b/src/gui/render/renderMetal.h index ed6219b3a..db927e594 100644 --- a/src/gui/render/renderMetal.h +++ b/src/gui/render/renderMetal.h @@ -24,7 +24,8 @@ struct FurnaceGUIRenderMetalPrivate; class FurnaceGUIRenderMetal: public FurnaceGUIRender { SDL_Renderer* sdlRend; FurnaceGUIRenderMetalPrivate* priv; - bool swapIntervalSet; + bool swapIntervalSet, bigTextures; + String vendorName, deviceName, apiVersion; public: ImTextureID getTextureID(FurnaceGUITexture* which); bool lockTexture(FurnaceGUITexture* which, void** data, int* pitch); @@ -44,6 +45,12 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { void present(); bool getOutputSize(int& w, int& h); int getWindowFlags(); + int getMaxTextureWidth(); + int getMaxTextureHeight(); + const char* getBackendName(); + const char* getVendorName(); + const char* getDeviceName(); + const char* getAPIVersion(); void setSwapInterval(int swapInterval); void preInit(); bool init(SDL_Window* win, int swapInterval); @@ -53,5 +60,9 @@ class FurnaceGUIRenderMetal: public FurnaceGUIRender { FurnaceGUIRenderMetal(): sdlRend(NULL), priv(NULL), - swapIntervalSet(false) {} + swapIntervalSet(false), + bigTextures(false), + vendorName("Unknown"), + deviceName("Unknown Graphics Device"), + apiVersion("???") {} }; diff --git a/src/gui/render/renderMetal.mm b/src/gui/render/renderMetal.mm index 48da7278d..4ee88592c 100644 --- a/src/gui/render/renderMetal.mm +++ b/src/gui/render/renderMetal.mm @@ -185,6 +185,30 @@ int FurnaceGUIRenderMetal::getWindowFlags() { return 0; } +int FurnaceGUIRenderMetal::getMaxTextureWidth() { + return bigTextures?16384:8192; +} + +int FurnaceGUIRenderMetal::getMaxTextureHeight() { + return bigTextures?16384:8192; +} + +const char* FurnaceGUIRenderMetal::getBackendName() { + return "Metal"; +} + +const char* FurnaceGUIRenderMetal::getVendorName() { + return vendorName.c_str(); +} + +const char* FurnaceGUIRenderMetal::getDeviceName() { + return deviceName.c_str(); +} + +const char* FurnaceGUIRenderMetal::getAPIVersion() { + return apiVersion.c_str(); +} + void FurnaceGUIRenderMetal::setSwapInterval(int swapInterval) { if (SDL_RenderSetVSync(sdlRend,(swapInterval>=0)?1:0)!=0) { swapIntervalSet=false; @@ -199,6 +223,33 @@ void FurnaceGUIRenderMetal::preInit() { priv=new FurnaceGUIRenderMetalPrivate; } +static const char* metalFamilyNames[]={ + "Apple1", + "Apple2", + "Apple3", + "Apple4", + "Apple5", + "Apple6", + "Apple7", + "Apple8", + "Apple9", + "Mac1", + "Mac2", + "Common1", + "Common2", + "Common3", + "Metal3", + NULL +}; + +static const NSInteger metalFamilies[]={ + 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, // Apple + 2001, 2002, // Mac + 3001, 3002, 3003, // Common + 5001, // Metal3 + 0 +}; + bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { SDL_SetHint(SDL_HINT_RENDER_DRIVER,"metal"); @@ -222,6 +273,24 @@ bool FurnaceGUIRenderMetal::init(SDL_Window* win, int swapInterval) { return false; } + vendorName=[priv->context.device.architecture.name UTF8String]; + deviceName=[priv->context.device.name UTF8String]; + apiVersion=""; + + bool comma=false; + for (int i=0; metalFamilies[i]; i++) { + const char* familyName=metalFamilyNames[i]; + MTLGPUFamily family=(MTLGPUFamily)metalFamilies[i]; + + if ([priv->context.device supportsFamily:family]) { + if (comma) { + apiVersion+=", "; + } + apiVersion+=familyName; + comma=true; + } + } + priv->context.pixelFormat=MTLPixelFormatBGRA8Unorm; priv->cmdQueue=[priv->context.device newCommandQueue];