Skip to content

Commit

Permalink
SDL backend viewport fix
Browse files Browse the repository at this point in the history
  • Loading branch information
thatcosmonaut committed Mar 27, 2024
1 parent 1a66d3f commit a64f150
Showing 1 changed file with 51 additions and 13 deletions.
64 changes: 51 additions & 13 deletions src/FNA3D_Driver_SDL.c
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,7 @@ typedef struct SDLGPU_Renderer
uint8_t needFragmentSamplerBind;

/* Pipeline state */

FNA3D_BlendState fnaBlendState;
FNA3D_RasterizerState fnaRasterizerState;
FNA3D_DepthStencilState fnaDepthStencilState;
Expand All @@ -1156,6 +1157,10 @@ typedef struct SDLGPU_Renderer
uint8_t hasDepthStencilAttachment;
SDL_GpuTextureFormat depthStencilFormat;

/* Viewport state */

FNA3D_Viewport viewport;

/* Presentation structure */

void *mainWindowHandle;
Expand Down Expand Up @@ -1194,6 +1199,9 @@ typedef struct SDLGPU_Renderer
MOJOSHADER_effect *currentEffect;
const MOJOSHADER_effectTechnique *currentTechnique;
uint32_t currentPass;

/* Capabilities */
uint8_t supportsBaseVertex;
} SDLGPU_Renderer;

/* Statics */
Expand Down Expand Up @@ -1440,6 +1448,28 @@ static void SDLGPU_INTERNAL_GetTextureData(

/* Drawing */

static void SDLGPU_INTERNAL_SetViewport(
SDLGPU_Renderer *renderer
) {
SDL_GpuViewport gpuViewport;

/* Flipping the viewport for compatibility with D3D */
gpuViewport.x = (float) renderer->viewport.x;
gpuViewport.w = (float) renderer->viewport.w;
gpuViewport.minDepth = renderer->viewport.minDepth;
gpuViewport.maxDepth = renderer->viewport.maxDepth;

/* FIXME: moltenVK hack */
gpuViewport.y = (float) renderer->viewport.y + renderer->viewport.h;
gpuViewport.h = (float) -renderer->viewport.h;

SDL_GpuSetViewport(
renderer->device,
renderer->commandBuffer,
&gpuViewport
);
}

static void SDLGPU_INTERNAL_PrepareRenderPassClear(
SDLGPU_Renderer *renderer,
FNA3D_Vec4 *color,
Expand Down Expand Up @@ -2092,6 +2122,9 @@ static void SDLGPU_INTERNAL_BindGraphicsPipeline(
renderer->needVertexSamplerBind = 1;
renderer->needVertexBufferBind = 1;
renderer->indexBufferBinding.gpuBuffer = NULL;

/* Force viewport for D3D compatibility hack */
SDLGPU_INTERNAL_SetViewport(renderer);
}

static SDL_GpuSampler* SDLGPU_INTERNAL_FetchSamplerState(
Expand Down Expand Up @@ -2247,6 +2280,11 @@ static void SDLGPU_ApplyVertexBufferBindings(
int32_t i, bindingsIndex;
uint32_t hash;

if (renderer->supportsBaseVertex)
{
baseVertex = 0;
}

/* link/compile shader program if it hasn't been yet */
if (!MOJOSHADER_sdlCheckProgramStatus(renderer->mojoshaderContext))
{
Expand Down Expand Up @@ -2321,20 +2359,17 @@ static void SDLGPU_SetViewport(
FNA3D_Viewport *viewport
) {
SDLGPU_Renderer *renderer = (SDLGPU_Renderer*) driverData;
SDL_GpuViewport gpuViewport;

gpuViewport.x = (float) viewport->x;
gpuViewport.y = (float) viewport->y;
gpuViewport.w = (float) viewport->w;
gpuViewport.h = (float) viewport->h;
gpuViewport.minDepth = viewport->minDepth;
gpuViewport.maxDepth = viewport->maxDepth;

SDL_GpuSetViewport(
renderer->device,
renderer->commandBuffer,
&gpuViewport
);
if ( viewport->x != renderer->viewport.x ||
viewport->y != renderer->viewport.y ||
viewport->w != renderer->viewport.w ||
viewport->h != renderer->viewport.h ||
viewport->minDepth != renderer->viewport.minDepth ||
viewport->maxDepth != renderer->viewport.maxDepth )
{
renderer->viewport = *viewport;
SDLGPU_INTERNAL_SetViewport(renderer);
}
}

static void SDLGPU_SetScissorRect(
Expand Down Expand Up @@ -4102,6 +4137,9 @@ static FNA3D_Device* SDLGPU_CreateDevice(
NULL
);

/* FIXME: moltenVK fix */
renderer->supportsBaseVertex = 1;

/* Acquire command buffer, we are ready for takeoff */

SDLGPU_ResetCommandBufferState(renderer);
Expand Down

0 comments on commit a64f150

Please sign in to comment.