Skip to content

Commit cc443d6

Browse files
committed
Expose enough SysRenderer gunk for the user to be able to create SDL textures
Implement SysTexture for SDL_GPU backend Add some asserts Update for typo fix in SDL_GPU headers
1 parent 41b6ee7 commit cc443d6

File tree

2 files changed

+54
-7
lines changed

2 files changed

+54
-7
lines changed

include/FNA3D_SysRenderer.h

+21
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,20 @@ typedef struct FNA3D_SysRendererEXT
8686
uint32_t queueFamilyIndex;
8787
} vulkan;
8888
#endif /* FNA3D_DRIVER_VULKAN */
89+
#if FNA3D_DRIVER_SDL
90+
struct
91+
{
92+
// FIXME: This definition is incomplete! -kg
93+
SDL_GPUDevice *device;
94+
// Reserved pointers to create space for things we need to expose later, for compatibility
95+
void *reserved1,
96+
*reserved2,
97+
*reserved3,
98+
*reserved4,
99+
*reserved5,
100+
*reserved6;
101+
} sdl;
102+
#endif
89103
uint8_t filler[64];
90104
} renderer;
91105
} FNA3D_SysRendererEXT;
@@ -131,6 +145,13 @@ typedef struct FNA3D_SysTextureEXT
131145
FNA3D_VULKAN_HANDLE_TYPE view; /* VkImageView */
132146
} vulkan;
133147
#endif /* FNA3D_DRIVER_VULKAN */
148+
#if FNA3D_DRIVER_SDL
149+
struct
150+
{
151+
void /* SDL_GPUTexture */ *texture;
152+
void /* SDL_GPUTextureCreateInfo */ *createInfo;
153+
} sdl;
154+
#endif
134155
uint8_t filler[64];
135156
} texture;
136157
} FNA3D_SysTextureEXT;

src/FNA3D_Driver_SDL.c

+33-7
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,9 @@ static void SDLGPU_INTERNAL_GenerateVertexInputInfo(
13751375
{
13761376
element = vertexDeclaration.elements[j];
13771377
usage = element.vertexElementUsage;
1378+
SDL_assert(usage < MOJOSHADER_USAGE_TOTAL);
13781379
index = element.usageIndex;
1380+
SDL_assert(index < sizeof(attrUse[usage]));
13791381

13801382
if (attrUse[usage][index])
13811383
{
@@ -1834,7 +1836,9 @@ static void SDLGPU_VerifyVertexSampler(
18341836

18351837
if (vertShader)
18361838
{
1837-
samplerType = MOJOSHADER_sdlGetShaderParseData(vertShader)->samplers[index].type;
1839+
MOJOSHADER_parseData *parseData = MOJOSHADER_sdlGetShaderParseData(vertShader);
1840+
SDL_assert(parseData);
1841+
samplerType = parseData->samplers[index].type;
18381842

18391843
if (samplerType == MOJOSHADER_SAMPLER_2D)
18401844
{
@@ -1896,7 +1900,9 @@ static void SDLGPU_VerifySampler(
18961900

18971901
if (fragShader)
18981902
{
1899-
samplerType = MOJOSHADER_sdlGetShaderParseData(fragShader)->samplers[index].type;
1903+
MOJOSHADER_parseData* parseData = MOJOSHADER_sdlGetShaderParseData(fragShader);
1904+
SDL_assert(parseData);
1905+
samplerType = parseData->samplers[index].type;
19001906
if (samplerType == MOJOSHADER_SAMPLER_2D)
19011907
{
19021908
renderer->fragmentTextureSamplerBindings[index].texture = renderer->dummyTexture2D;
@@ -2640,7 +2646,7 @@ static void SDLGPU_ResetBackbuffer(
26402646
{
26412647
if (presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_RGBA1010102)
26422648
{
2643-
swapchainComposition = SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048;
2649+
swapchainComposition = SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084;
26442650
}
26452651
else if ( presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_HALFVECTOR4 ||
26462652
presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_HDRBLENDABLE )
@@ -4035,17 +4041,35 @@ static void SDLGPU_GetSysRenderer(
40354041
FNA3D_Renderer *driverData,
40364042
FNA3D_SysRendererEXT *sysrenderer
40374043
) {
4038-
/* TODO */
4044+
SDLGPU_Renderer* renderer = (SDLGPU_Renderer*)driverData;
4045+
40394046
SDL_memset(sysrenderer, '\0', sizeof(FNA3D_SysRendererEXT));
40404047
sysrenderer->rendererType = FNA3D_RENDERER_TYPE_SDL_GPU_EXT;
4048+
sysrenderer->renderer.sdl.device = renderer->device;
4049+
// FIXME: Expose other necessary pointers. -kg
40414050
}
40424051

40434052
static FNA3D_Texture* SDLGPU_CreateSysTexture(
40444053
FNA3D_Renderer *driverData,
40454054
FNA3D_SysTextureEXT *systexture
40464055
) {
4047-
/* TODO */
4048-
return NULL;
4056+
SDLGPU_TextureHandle* result;
4057+
4058+
if (systexture->rendererType != FNA3D_RENDERER_TYPE_SDL_GPU_EXT)
4059+
{
4060+
return NULL;
4061+
}
4062+
4063+
result = (SDLGPU_TextureHandle*)SDL_malloc(sizeof(SDLGPU_TextureHandle));
4064+
SDL_zerop(result);
4065+
4066+
SDL_assert(systexture->texture.sdl.texture);
4067+
result->texture = systexture->texture.sdl.texture;
4068+
SDL_assert(systexture->texture.sdl.createInfo);
4069+
result->createInfo = *(SDL_GPUTextureCreateInfo *)systexture->texture.sdl.createInfo;
4070+
result->boundAsRenderTarget = 0;
4071+
4072+
return (FNA3D_Texture*)result;
40494073
}
40504074

40514075
/* Destroy */
@@ -4060,8 +4084,10 @@ static void SDLGPU_DestroyDevice(FNA3D_Device *device)
40604084

40614085
SDLGPU_INTERNAL_FlushCommands(renderer);
40624086
// avoid command buffer leaks by explicitly canceling newly-acquired command buffers
4087+
/*
40634088
SDL_CancelGPUCommandBuffer(renderer->uploadCommandBuffer);
40644089
SDL_CancelGPUCommandBuffer(renderer->renderCommandBuffer);
4090+
*/
40654091
SDL_WaitForGPUIdle(renderer->device);
40664092

40674093
SDL_UnlockMutex(renderer->copyPassMutex);
@@ -4221,7 +4247,7 @@ static FNA3D_Device* SDLGPU_CreateDevice(
42214247
{
42224248
if (presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_RGBA1010102)
42234249
{
4224-
swapchainComposition = SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2048;
4250+
swapchainComposition = SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084;
42254251
}
42264252
else if ( presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_HALFVECTOR4 ||
42274253
presentationParameters->backBufferFormat == FNA3D_SURFACEFORMAT_HDRBLENDABLE )

0 commit comments

Comments
 (0)