@@ -1142,6 +1142,7 @@ typedef struct SDLGPU_Renderer
1142
1142
uint8_t needFragmentSamplerBind ;
1143
1143
1144
1144
/* Pipeline state */
1145
+
1145
1146
FNA3D_BlendState fnaBlendState ;
1146
1147
FNA3D_RasterizerState fnaRasterizerState ;
1147
1148
FNA3D_DepthStencilState fnaDepthStencilState ;
@@ -1156,6 +1157,10 @@ typedef struct SDLGPU_Renderer
1156
1157
uint8_t hasDepthStencilAttachment ;
1157
1158
SDL_GpuTextureFormat depthStencilFormat ;
1158
1159
1160
+ /* Viewport state */
1161
+
1162
+ FNA3D_Viewport viewport ;
1163
+
1159
1164
/* Presentation structure */
1160
1165
1161
1166
void * mainWindowHandle ;
@@ -1194,6 +1199,9 @@ typedef struct SDLGPU_Renderer
1194
1199
MOJOSHADER_effect * currentEffect ;
1195
1200
const MOJOSHADER_effectTechnique * currentTechnique ;
1196
1201
uint32_t currentPass ;
1202
+
1203
+ /* Capabilities */
1204
+ uint8_t supportsBaseVertex ;
1197
1205
} SDLGPU_Renderer ;
1198
1206
1199
1207
/* Statics */
@@ -1440,6 +1448,28 @@ static void SDLGPU_INTERNAL_GetTextureData(
1440
1448
1441
1449
/* Drawing */
1442
1450
1451
+ static void SDLGPU_INTERNAL_SetViewport (
1452
+ SDLGPU_Renderer * renderer
1453
+ ) {
1454
+ SDL_GpuViewport gpuViewport ;
1455
+
1456
+ /* Flipping the viewport for compatibility with D3D */
1457
+ gpuViewport .x = (float ) renderer -> viewport .x ;
1458
+ gpuViewport .w = (float ) renderer -> viewport .w ;
1459
+ gpuViewport .minDepth = renderer -> viewport .minDepth ;
1460
+ gpuViewport .maxDepth = renderer -> viewport .maxDepth ;
1461
+
1462
+ /* FIXME: moltenVK hack */
1463
+ gpuViewport .y = (float ) renderer -> viewport .y + renderer -> viewport .h ;
1464
+ gpuViewport .h = (float ) - renderer -> viewport .h ;
1465
+
1466
+ SDL_GpuSetViewport (
1467
+ renderer -> device ,
1468
+ renderer -> commandBuffer ,
1469
+ & gpuViewport
1470
+ );
1471
+ }
1472
+
1443
1473
static void SDLGPU_INTERNAL_PrepareRenderPassClear (
1444
1474
SDLGPU_Renderer * renderer ,
1445
1475
FNA3D_Vec4 * color ,
@@ -2092,6 +2122,9 @@ static void SDLGPU_INTERNAL_BindGraphicsPipeline(
2092
2122
renderer -> needVertexSamplerBind = 1 ;
2093
2123
renderer -> needVertexBufferBind = 1 ;
2094
2124
renderer -> indexBufferBinding .gpuBuffer = NULL ;
2125
+
2126
+ /* Force viewport for D3D compatibility hack */
2127
+ SDLGPU_INTERNAL_SetViewport (renderer );
2095
2128
}
2096
2129
2097
2130
static SDL_GpuSampler * SDLGPU_INTERNAL_FetchSamplerState (
@@ -2247,6 +2280,11 @@ static void SDLGPU_ApplyVertexBufferBindings(
2247
2280
int32_t i , bindingsIndex ;
2248
2281
uint32_t hash ;
2249
2282
2283
+ if (renderer -> supportsBaseVertex )
2284
+ {
2285
+ baseVertex = 0 ;
2286
+ }
2287
+
2250
2288
/* link/compile shader program if it hasn't been yet */
2251
2289
if (!MOJOSHADER_sdlCheckProgramStatus (renderer -> mojoshaderContext ))
2252
2290
{
@@ -2321,20 +2359,17 @@ static void SDLGPU_SetViewport(
2321
2359
FNA3D_Viewport * viewport
2322
2360
) {
2323
2361
SDLGPU_Renderer * renderer = (SDLGPU_Renderer * ) driverData ;
2324
- SDL_GpuViewport gpuViewport ;
2325
2362
2326
- gpuViewport .x = (float ) viewport -> x ;
2327
- gpuViewport .y = (float ) viewport -> y ;
2328
- gpuViewport .w = (float ) viewport -> w ;
2329
- gpuViewport .h = (float ) viewport -> h ;
2330
- gpuViewport .minDepth = viewport -> minDepth ;
2331
- gpuViewport .maxDepth = viewport -> maxDepth ;
2332
-
2333
- SDL_GpuSetViewport (
2334
- renderer -> device ,
2335
- renderer -> commandBuffer ,
2336
- & gpuViewport
2337
- );
2363
+ if ( viewport -> x != renderer -> viewport .x ||
2364
+ viewport -> y != renderer -> viewport .y ||
2365
+ viewport -> w != renderer -> viewport .w ||
2366
+ viewport -> h != renderer -> viewport .h ||
2367
+ viewport -> minDepth != renderer -> viewport .minDepth ||
2368
+ viewport -> maxDepth != renderer -> viewport .maxDepth )
2369
+ {
2370
+ renderer -> viewport = * viewport ;
2371
+ SDLGPU_INTERNAL_SetViewport (renderer );
2372
+ }
2338
2373
}
2339
2374
2340
2375
static void SDLGPU_SetScissorRect (
@@ -4102,6 +4137,9 @@ static FNA3D_Device* SDLGPU_CreateDevice(
4102
4137
NULL
4103
4138
);
4104
4139
4140
+ /* FIXME: moltenVK fix */
4141
+ renderer -> supportsBaseVertex = 1 ;
4142
+
4105
4143
/* Acquire command buffer, we are ready for takeoff */
4106
4144
4107
4145
SDLGPU_ResetCommandBufferState (renderer );
0 commit comments