Skip to content

Commit

Permalink
metal: set max texture size based on device capability.
Browse files Browse the repository at this point in the history
  • Loading branch information
slime73 committed Jan 8, 2018
1 parent a8c0532 commit 7d5437b
Showing 1 changed file with 61 additions and 40 deletions.
101 changes: 61 additions & 40 deletions src/render/metal/SDL_render_metal.m
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#else #else
#include "../../video/uikit/SDL_uikitmetalview.h" #include "../../video/uikit/SDL_uikitmetalview.h"
#endif #endif
#include <Availability.h>
#import <Metal/Metal.h> #import <Metal/Metal.h>
#import <QuartzCore/CAMetalLayer.h> #import <QuartzCore/CAMetalLayer.h>


Expand Down Expand Up @@ -88,27 +89,18 @@ static int METAL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect
SDL_RenderDriver METAL_RenderDriver = { SDL_RenderDriver METAL_RenderDriver = {
METAL_CreateRenderer, METAL_CreateRenderer,
{ {
"metal", "metal",
(SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE), (SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE),
6, 6,
{ {
SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB8888,
SDL_PIXELFORMAT_ABGR8888, SDL_PIXELFORMAT_ABGR8888,
SDL_PIXELFORMAT_YV12, SDL_PIXELFORMAT_YV12,
SDL_PIXELFORMAT_IYUV, SDL_PIXELFORMAT_IYUV,
SDL_PIXELFORMAT_NV12, SDL_PIXELFORMAT_NV12,
SDL_PIXELFORMAT_NV21 SDL_PIXELFORMAT_NV21
}, },

0, 0,
// !!! FIXME: how do you query Metal for this?
// (the weakest GPU supported by Metal on iOS has 4k texture max, and
// other models might be 2x or 4x more. On macOS, it's 16k across the
// board right now.)
#ifdef __MACOSX__
16384, 16384
#else
4096, 4096
#endif
} }
}; };


Expand Down Expand Up @@ -467,9 +459,10 @@ - (void)dealloc


static SDL_Renderer * static SDL_Renderer *
METAL_CreateRenderer(SDL_Window * window, Uint32 flags) METAL_CreateRenderer(SDL_Window * window, Uint32 flags)
{ { @autoreleasepool {
SDL_Renderer *renderer = NULL; SDL_Renderer *renderer = NULL;
METAL_RenderData *data = NULL; METAL_RenderData *data = NULL;
id<MTLDevice> mtldevice = nil;
SDL_SysWMinfo syswm; SDL_SysWMinfo syswm;


SDL_VERSION(&syswm.version); SDL_VERSION(&syswm.version);
Expand All @@ -487,24 +480,22 @@ - (void)dealloc
return NULL; return NULL;
} }


data = [[METAL_RenderData alloc] init]; // !!! FIXME: MTLCopyAllDevices() can find other GPUs on macOS...
mtldevice = MTLCreateSystemDefaultDevice();


renderer->driverdata = (void*)CFBridgingRetain(data);
renderer->window = window;

#ifdef __MACOSX__
id<MTLDevice> mtldevice = MTLCreateSystemDefaultDevice(); // !!! FIXME: MTLCopyAllDevices() can find other GPUs...
if (mtldevice == nil) { if (mtldevice == nil) {
SDL_free(renderer); SDL_free(renderer);
#if !__has_feature(objc_arc)
[data release];
#endif
SDL_SetError("Failed to obtain Metal device"); SDL_SetError("Failed to obtain Metal device");
return NULL; return NULL;
} }


// !!! FIXME: error checking on all of this. // !!! FIXME: error checking on all of this.
data = [[METAL_RenderData alloc] init];


renderer->driverdata = (void*)CFBridgingRetain(data);
renderer->window = window;

#ifdef __MACOSX__
NSView *view = Cocoa_Mtl_AddMetalView(window); NSView *view = Cocoa_Mtl_AddMetalView(window);
CAMetalLayer *layer = (CAMetalLayer *)[view layer]; CAMetalLayer *layer = (CAMetalLayer *)[view layer];


Expand Down Expand Up @@ -657,6 +648,40 @@ - (void)dealloc
renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC; renderer->info.flags |= SDL_RENDERER_PRESENTVSYNC;
} }


/* https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf */
int maxtexsize = 4096;
#if defined(__MACOSX__)
maxtexsize = 16384;
#elif defined(__TVOS__)
#ifdef __TVOS_11_0
if ([mtldevice supportsFeatureSet:MTLFeatureSet_tvOS_GPUFamily2_v1]) {
maxtexsize = 16384;
} else
#endif
{
maxtexsize = 8192;
}
#else
#ifdef __IPHONE_11_0
if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily4_v1]) {
maxtexsize = 16384;
} else
#endif
#ifdef __IPHONE_10_0
if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily3_v1]) {
maxtexsize = 16384;
} else
#endif
if ([mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily2_v2] || [mtldevice supportsFeatureSet:MTLFeatureSet_iOS_GPUFamily1_v2]) {
maxtexsize = 8192;
} else {
maxtexsize = 4096;
}
#endif

renderer->info.max_texture_width = maxtexsize;
renderer->info.max_texture_height = maxtexsize;

#if !__has_feature(objc_arc) #if !__has_feature(objc_arc)
[mtlcmdqueue release]; [mtlcmdqueue release];
[mtllibrary release]; [mtllibrary release];
Expand All @@ -666,13 +691,11 @@ - (void)dealloc
[mtlbufconstants release]; [mtlbufconstants release];
[view release]; [view release];
[data release]; [data release];
#ifdef __MACOSX__
[mtldevice release]; [mtldevice release];
#endif
#endif #endif


return renderer; return renderer;
} }}


static void static void
METAL_ActivateRenderCommandEncoder(SDL_Renderer * renderer, MTLLoadAction load) METAL_ActivateRenderCommandEncoder(SDL_Renderer * renderer, MTLLoadAction load)
Expand Down Expand Up @@ -1297,17 +1320,15 @@ - (void)dealloc
float c = cosf(rads), s = sinf(rads); float c = cosf(rads), s = sinf(rads);
SDL_memset(transform, 0, sizeof(transform)); SDL_memset(transform, 0, sizeof(transform));


// matrix multiplication carried out on paper:
// |1 x+c| |c -s |
// | 1 y+c| |s c |
// | 1 | | 1 |
// | 1| | 1|
// move rotate
transform[10] = transform[15] = 1.0f; transform[10] = transform[15] = 1.0f;

/* Rotation */
transform[0] = c; transform[0] = c;
transform[1] = s; transform[1] = s;
transform[4] = -s; transform[4] = -s;
transform[5] = c; transform[5] = c;

/* Translation */
transform[12] = dstrect->x + center->x; transform[12] = dstrect->x + center->x;
transform[13] = dstrect->y + center->y; transform[13] = dstrect->y + center->y;
} }
Expand Down

0 comments on commit 7d5437b

Please sign in to comment.