Skip to content

Commit 9a66d6f

Browse files
committed
fixing various SDL backend crashes
1 parent d873ec4 commit 9a66d6f

File tree

1 file changed

+35
-38
lines changed

1 file changed

+35
-38
lines changed

src/FNA3D_Driver_SDL.c

+35-38
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ MOJOSHADER_sdlProgram *MOJOSHADER_sdlLinkProgram(
410410

411411
if (v_transpiled_source == NULL)
412412
{
413-
set_error("Failed to transpile vertex shader from SPIR-V!");
413+
set_error(SHD_GetError());
414414
return NULL;
415415
}
416416

@@ -423,7 +423,7 @@ MOJOSHADER_sdlProgram *MOJOSHADER_sdlLinkProgram(
423423

424424
if (p_transpiled_source == NULL)
425425
{
426-
set_error("Failed to transpile pixel shader from SPIR-V!");
426+
set_error(SHD_GetError());
427427
ctx->free_fn((char*) v_transpiled_source, ctx->malloc_data);
428428
return NULL;
429429
}
@@ -627,28 +627,7 @@ void MOJOSHADER_sdlDeleteShader(
627627
uint8_t MOJOSHADER_sdlCheckProgramStatus(
628628
MOJOSHADER_sdlContext *ctx
629629
) {
630-
MOJOSHADER_sdlShader *vshader = ctx->vertex_shader;
631-
MOJOSHADER_sdlShader *pshader = ctx->pixel_shader;
632-
633-
if (ctx->linker_cache == NULL)
634-
{
635-
ctx->linker_cache = hash_create(NULL, hash_shaders, match_shaders,
636-
nuke_shaders, 0, ctx->malloc_fn,
637-
ctx->free_fn, ctx->malloc_data);
638-
639-
if (ctx->linker_cache == NULL)
640-
{
641-
out_of_memory();
642-
return 0;
643-
}
644-
}
645-
646-
BoundShaders shaders;
647-
shaders.vertex = vshader;
648-
shaders.fragment = pshader;
649-
650-
const void *val = NULL;
651-
return hash_find(ctx->linker_cache, &shaders, &val);
630+
return ctx->bound_program != NULL;
652631
}
653632

654633
void MOJOSHADER_sdlShaderAddRef(MOJOSHADER_sdlShader *shader)
@@ -1123,8 +1102,8 @@ typedef struct SDLGPU_Renderer
11231102
int32_t currentVertexBufferBindingsIndex;
11241103

11251104
SDL_GpuGraphicsPipeline *currentGraphicsPipeline;
1126-
SDL_GpuShaderModule *currentVertexShader;
1127-
SDL_GpuShaderModule *currentFragmentShader;
1105+
MOJOSHADER_sdlShader *currentVertexShader;
1106+
MOJOSHADER_sdlShader *currentFragmentShader;
11281107

11291108
PackedVertexBufferBindingsArray vertexBufferBindingsCache;
11301109

@@ -1221,6 +1200,8 @@ static void SDLGPU_DestroyDevice(FNA3D_Device *device)
12211200
static void SDLGPU_ResetCommandBufferState(
12221201
SDLGPU_Renderer *renderer
12231202
) {
1203+
renderer->commandBuffer = SDL_GpuAcquireCommandBuffer(renderer->device);
1204+
12241205
/* Reset state */
12251206
renderer->needNewRenderPass = 1;
12261207
renderer->needNewGraphicsPipeline = 1;
@@ -2023,18 +2004,18 @@ static void SDLGPU_INTERNAL_BindGraphicsPipeline(
20232004
SDLGPU_Renderer *renderer
20242005
) {
20252006
SDL_GpuGraphicsPipeline *pipeline;
2026-
SDL_GpuShaderModule *vertShaderModule, *fragShaderModule;
2007+
MOJOSHADER_sdlShader *vertShader, *fragShader;
20272008

2028-
MOJOSHADER_sdlGetShaderModules(
2009+
MOJOSHADER_sdlGetBoundShaders(
20292010
renderer->mojoshaderContext,
2030-
&vertShaderModule,
2031-
&fragShaderModule
2011+
&vertShader,
2012+
&fragShader
20322013
);
20332014

20342015
if (
20352016
!renderer->needNewGraphicsPipeline &&
2036-
renderer->currentVertexShader == vertShaderModule &&
2037-
renderer->currentFragmentShader == fragShaderModule
2017+
renderer->currentVertexShader == vertShader &&
2018+
renderer->currentFragmentShader == fragShader
20382019
) {
20392020
return;
20402021
}
@@ -2052,8 +2033,8 @@ static void SDLGPU_INTERNAL_BindGraphicsPipeline(
20522033
renderer->currentGraphicsPipeline = pipeline;
20532034
}
20542035

2055-
renderer->currentVertexShader = vertShaderModule;
2056-
renderer->currentFragmentShader = fragShaderModule;
2036+
renderer->currentVertexShader = vertShader;
2037+
renderer->currentFragmentShader = fragShader;
20572038

20582039
/* Reset deferred binding state */
20592040
renderer->needNewGraphicsPipeline = 0;
@@ -2219,7 +2200,11 @@ static void SDLGPU_ApplyVertexBufferBindings(
22192200
/* link/compile shader program if it hasn't been yet */
22202201
if (!MOJOSHADER_sdlCheckProgramStatus(renderer->mojoshaderContext))
22212202
{
2222-
MOJOSHADER_sdlLinkProgram(renderer->mojoshaderContext);
2203+
if (!MOJOSHADER_sdlLinkProgram(renderer->mojoshaderContext))
2204+
{
2205+
FNA3D_LogError(MOJOSHADER_sdlGetError(renderer->mojoshaderContext));
2206+
return;
2207+
}
22232208
}
22242209

22252210
/* Check VertexBufferBindings */
@@ -3030,7 +3015,6 @@ static void SDLGPU_INTERNAL_SetTextureData(
30303015
void* data,
30313016
uint32_t dataLength
30323017
) {
3033-
SDLGPU_TextureHandle *textureHandle = (SDLGPU_TextureHandle*) texture;
30343018
SDL_GpuBufferCopy copyParams;
30353019
SDL_GpuTextureRegion textureRegion;
30363020
SDL_GpuBufferImageCopy textureCopyParams;
@@ -3064,7 +3048,7 @@ static void SDLGPU_INTERNAL_SetTextureData(
30643048
renderer->textureUploadBufferOffset == 0 ? SDL_GPU_TRANSFEROPTIONS_CYCLE : SDL_GPU_TRANSFEROPTIONS_UNSAFE
30653049
);
30663050

3067-
textureRegion.textureSlice.texture = textureHandle->texture;
3051+
textureRegion.textureSlice.texture = texture;
30683052
textureRegion.textureSlice.layer = layer;
30693053
textureRegion.textureSlice.mipLevel = mipLevel;
30703054
textureRegion.x = x;
@@ -3925,7 +3909,7 @@ static FNA3D_Texture* SDLGPU_CreateSysTexture(
39253909

39263910
static uint8_t SDLGPU_PrepareWindowAttributes(uint32_t *flags)
39273911
{
3928-
SDL_GpuBackend selectedBackend =
3912+
selectedBackend =
39293913
SDL_GpuSelectBackend(
39303914
preferredBackends,
39313915
2,
@@ -3948,6 +3932,7 @@ static FNA3D_Device* SDLGPU_CreateDevice(
39483932
SDLGPU_Renderer *renderer;
39493933
SDL_GpuDevice *device;
39503934
FNA3D_Device *result;
3935+
int32_t i;
39513936

39523937
requestedPresentationParameters = *presentationParameters;
39533938
device = SDL_GpuCreateDevice(debugMode);
@@ -4011,6 +3996,18 @@ static FNA3D_Device* SDLGPU_CreateDevice(
40113996
renderer->bufferUploadBufferSize
40123997
);
40133998

3999+
/*
4000+
* Initialize renderer members not covered by SDL_memset('\0')
4001+
*/
4002+
4003+
renderer->multisampleMask = 0xFFFFFFFF;
4004+
4005+
for (i = 0; i < MAX_BOUND_VERTEX_BUFFERS; i += 1)
4006+
{
4007+
renderer->vertexBindings[i].vertexDeclaration.elements =
4008+
renderer->vertexElements[i];
4009+
}
4010+
40144011
renderer->mojoshaderContext = MOJOSHADER_sdlCreateContext(
40154012
device,
40164013
selectedBackend,

0 commit comments

Comments
 (0)