diff --git a/src/FNA3D_Driver_SDL.c b/src/FNA3D_Driver_SDL.c index feaba69a..80e334ce 100644 --- a/src/FNA3D_Driver_SDL.c +++ b/src/FNA3D_Driver_SDL.c @@ -1142,6 +1142,7 @@ typedef struct SDLGPU_Renderer uint8_t needFragmentSamplerBind; /* Pipeline state */ + FNA3D_BlendState fnaBlendState; FNA3D_RasterizerState fnaRasterizerState; FNA3D_DepthStencilState fnaDepthStencilState; @@ -1156,6 +1157,10 @@ typedef struct SDLGPU_Renderer uint8_t hasDepthStencilAttachment; SDL_GpuTextureFormat depthStencilFormat; + /* Viewport state */ + + FNA3D_Viewport viewport; + /* Presentation structure */ void *mainWindowHandle; @@ -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 */ @@ -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, @@ -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( @@ -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)) { @@ -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( @@ -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);