Skip to content

Commit a64f150

Browse files
committed
SDL backend viewport fix
1 parent 1a66d3f commit a64f150

File tree

1 file changed

+51
-13
lines changed

1 file changed

+51
-13
lines changed

src/FNA3D_Driver_SDL.c

+51-13
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,7 @@ typedef struct SDLGPU_Renderer
11421142
uint8_t needFragmentSamplerBind;
11431143

11441144
/* Pipeline state */
1145+
11451146
FNA3D_BlendState fnaBlendState;
11461147
FNA3D_RasterizerState fnaRasterizerState;
11471148
FNA3D_DepthStencilState fnaDepthStencilState;
@@ -1156,6 +1157,10 @@ typedef struct SDLGPU_Renderer
11561157
uint8_t hasDepthStencilAttachment;
11571158
SDL_GpuTextureFormat depthStencilFormat;
11581159

1160+
/* Viewport state */
1161+
1162+
FNA3D_Viewport viewport;
1163+
11591164
/* Presentation structure */
11601165

11611166
void *mainWindowHandle;
@@ -1194,6 +1199,9 @@ typedef struct SDLGPU_Renderer
11941199
MOJOSHADER_effect *currentEffect;
11951200
const MOJOSHADER_effectTechnique *currentTechnique;
11961201
uint32_t currentPass;
1202+
1203+
/* Capabilities */
1204+
uint8_t supportsBaseVertex;
11971205
} SDLGPU_Renderer;
11981206

11991207
/* Statics */
@@ -1440,6 +1448,28 @@ static void SDLGPU_INTERNAL_GetTextureData(
14401448

14411449
/* Drawing */
14421450

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+
14431473
static void SDLGPU_INTERNAL_PrepareRenderPassClear(
14441474
SDLGPU_Renderer *renderer,
14451475
FNA3D_Vec4 *color,
@@ -2092,6 +2122,9 @@ static void SDLGPU_INTERNAL_BindGraphicsPipeline(
20922122
renderer->needVertexSamplerBind = 1;
20932123
renderer->needVertexBufferBind = 1;
20942124
renderer->indexBufferBinding.gpuBuffer = NULL;
2125+
2126+
/* Force viewport for D3D compatibility hack */
2127+
SDLGPU_INTERNAL_SetViewport(renderer);
20952128
}
20962129

20972130
static SDL_GpuSampler* SDLGPU_INTERNAL_FetchSamplerState(
@@ -2247,6 +2280,11 @@ static void SDLGPU_ApplyVertexBufferBindings(
22472280
int32_t i, bindingsIndex;
22482281
uint32_t hash;
22492282

2283+
if (renderer->supportsBaseVertex)
2284+
{
2285+
baseVertex = 0;
2286+
}
2287+
22502288
/* link/compile shader program if it hasn't been yet */
22512289
if (!MOJOSHADER_sdlCheckProgramStatus(renderer->mojoshaderContext))
22522290
{
@@ -2321,20 +2359,17 @@ static void SDLGPU_SetViewport(
23212359
FNA3D_Viewport *viewport
23222360
) {
23232361
SDLGPU_Renderer *renderer = (SDLGPU_Renderer*) driverData;
2324-
SDL_GpuViewport gpuViewport;
23252362

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+
}
23382373
}
23392374

23402375
static void SDLGPU_SetScissorRect(
@@ -4102,6 +4137,9 @@ static FNA3D_Device* SDLGPU_CreateDevice(
41024137
NULL
41034138
);
41044139

4140+
/* FIXME: moltenVK fix */
4141+
renderer->supportsBaseVertex = 1;
4142+
41054143
/* Acquire command buffer, we are ready for takeoff */
41064144

41074145
SDLGPU_ResetCommandBufferState(renderer);

0 commit comments

Comments
 (0)