Skip to content

Commit d439db1

Browse files
committed
SDL backend: fix crash when recreating backbuffer
1 parent cc5f833 commit d439db1

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

src/FNA3D_Driver_SDL.c

+27-3
Original file line numberDiff line numberDiff line change
@@ -1104,6 +1104,8 @@ typedef struct SDLGPU_Renderer
11041104
SDL_GpuTexture *nextRenderPassDepthStencilAttachment; /* may be NULL */
11051105
SDL_GpuTextureFormat nextRenderPassDepthStencilFormat;
11061106

1107+
uint8_t renderTargetInUse;
1108+
11071109
uint8_t needNewGraphicsPipeline;
11081110
int32_t currentVertexBufferBindingsIndex;
11091111

@@ -1522,6 +1524,8 @@ static void SDLGPU_INTERNAL_BeginRenderPass(
15221524
colorAttachmentInfos[i].clearColor.z = 0;
15231525
colorAttachmentInfos[i].clearColor.w = 0;
15241526
}
1527+
1528+
renderer->colorAttachmentFormats[i] = renderer->nextRenderPassColorAttachmentFormats[i];
15251529
}
15261530

15271531
if (renderer->nextRenderPassDepthStencilAttachment != NULL)
@@ -1558,6 +1562,7 @@ static void SDLGPU_INTERNAL_BeginRenderPass(
15581562
/* We always have to store just in case changing render state breaks the render pass. */
15591563
/* FIXME: perhaps there is a way around this? */
15601564
depthStencilAttachmentInfo.storeOp = SDL_GPU_STOREOP_STORE;
1565+
depthStencilAttachmentInfo.stencilStoreOp = SDL_GPU_STOREOP_STORE;
15611566

15621567
depthStencilAttachmentInfo.writeOption =
15631568
depthStencilAttachmentInfo.loadOp == SDL_GPU_LOADOP_LOAD || depthStencilAttachmentInfo.loadOp == SDL_GPU_LOADOP_LOAD ?
@@ -1622,12 +1627,14 @@ static void SDLGPU_SetRenderTargets(
16221627
{
16231628
renderer->nextRenderPassColorAttachments[0] = renderer->fauxBackbufferColor;
16241629
renderer->nextRenderPassColorAttachmentCubeFace[0] = 0;
1625-
renderer->nextRenderPassColorAttachmentFormats[0] = renderer->fauxBackbufferColorFormat;
1626-
renderer->nextRenderPassColorAttachmentCount = 1;
1627-
1630+
renderer->nextRenderPassColorAttachmentFormats[0] = XNAToSDL_SurfaceFormat[renderer->fauxBackbufferColorFormat];
16281631
renderer->nextRenderPassMultisampleCount = XNAToSDL_SampleCount(renderer->fauxBackbufferSampleCount);
1632+
renderer->nextRenderPassColorAttachmentCount = 1;
16291633

16301634
renderer->nextRenderPassDepthStencilAttachment = renderer->fauxBackbufferDepthStencil;
1635+
renderer->nextRenderPassDepthStencilFormat = XNAToSDL_DepthFormat(renderer->fauxBackbufferDepthStencilFormat);
1636+
1637+
renderer->renderTargetInUse = 0;
16311638
}
16321639
else
16331640
{
@@ -1654,6 +1661,7 @@ static void SDLGPU_SetRenderTargets(
16541661
}
16551662

16561663
renderer->nextRenderPassColorAttachmentCount = numRenderTargets;
1664+
renderer->renderTargetInUse = 1;
16571665
}
16581666

16591667
if (depthStencilBuffer != NULL)
@@ -2687,6 +2695,22 @@ static void SDLGPU_INTERNAL_CreateFauxBackbuffer(
26872695
renderer->fauxBackbufferDepthStencilFormat = presentationParameters->depthStencilFormat;
26882696

26892697
renderer->fauxBackbufferSampleCount = presentationParameters->multiSampleCount;
2698+
2699+
/* Set default render pass state if necessary */
2700+
if (!renderer->renderTargetInUse)
2701+
{
2702+
renderer->nextRenderPassColorAttachments[0] = renderer->fauxBackbufferColor;
2703+
renderer->nextRenderPassColorAttachmentCubeFace[0] = 0;
2704+
renderer->nextRenderPassColorAttachmentFormats[0] = XNAToSDL_SurfaceFormat[renderer->fauxBackbufferColorFormat];
2705+
renderer->nextRenderPassColorAttachmentCount = 1;
2706+
renderer->nextRenderPassMultisampleCount = renderer->fauxBackbufferSampleCount;
2707+
2708+
if (presentationParameters->depthStencilFormat != FNA3D_DEPTHFORMAT_NONE)
2709+
{
2710+
renderer->nextRenderPassDepthStencilAttachment = renderer->fauxBackbufferDepthStencil;
2711+
renderer->nextRenderPassDepthStencilFormat = XNAToSDL_DepthFormat(renderer->fauxBackbufferDepthStencilFormat);
2712+
}
2713+
}
26902714
}
26912715

26922716
static void SDLGPU_ResetBackbuffer(

0 commit comments

Comments
 (0)