diff --git a/src/render/gpu/SDL_shaders_gpu.c b/src/render/gpu/SDL_shaders_gpu.c index 8870e6072b..e4ade83a05 100644 --- a/src/render/gpu/SDL_shaders_gpu.c +++ b/src/render/gpu/SDL_shaders_gpu.c @@ -33,6 +33,15 @@ typedef struct GPU_ShaderModuleSource SDL_GPUShaderFormat format; } GPU_ShaderModuleSource; +#if defined(SDL_GPU_PRIVATE) +#define IF_PRIVATE(...) __VA_ARGS__ +#define HAVE_PRIVATE_SHADERS 1 +#include "SDL_render_private_shaders.h" +#else +#define IF_PRIVATE(...) +#define HAVE_PRIVATE_SHADERS 0 +#endif + #if defined(SDL_GPU_VULKAN) && SDL_GPU_VULKAN #define IF_VULKAN(...) __VA_ARGS__ #define HAVE_SPIRV_SHADERS 1 @@ -62,6 +71,7 @@ typedef struct GPU_ShaderModuleSource typedef struct GPU_ShaderSources { + IF_PRIVATE(GPU_ShaderModuleSource private;) IF_VULKAN(GPU_ShaderModuleSource spirv;) IF_D3D12(GPU_ShaderModuleSource dxil60;) IF_METAL(GPU_ShaderModuleSource msl;) @@ -69,6 +79,9 @@ typedef struct GPU_ShaderSources unsigned int num_uniform_buffers; } GPU_ShaderSources; +#define SHADER_PRIVATE(code) \ + IF_PRIVATE(.private = { code, sizeof(code), SDL_GPU_SHADERFORMAT_PRIVATE }, ) + #define SHADER_SPIRV(code) \ IF_VULKAN(.spirv = { code, sizeof(code), SDL_GPU_SHADERFORMAT_SPIRV }, ) @@ -83,6 +96,7 @@ static const GPU_ShaderSources vert_shader_sources[NUM_VERT_SHADERS] = { [VERT_SHADER_LINEPOINT] = { .num_samplers = 0, .num_uniform_buffers = 1, + SHADER_PRIVATE(linepoint_vert_private) SHADER_SPIRV(linepoint_vert_spv) SHADER_DXIL60(linepoint_vert_dxil) SHADER_METAL(linepoint_vert_msl) @@ -90,6 +104,7 @@ static const GPU_ShaderSources vert_shader_sources[NUM_VERT_SHADERS] = { [VERT_SHADER_TRI_COLOR] = { .num_samplers = 0, .num_uniform_buffers = 1, + SHADER_PRIVATE(tri_color_vert_private) SHADER_SPIRV(tri_color_vert_spv) SHADER_DXIL60(tri_color_vert_dxil) SHADER_METAL(tri_color_vert_msl) @@ -97,6 +112,7 @@ static const GPU_ShaderSources vert_shader_sources[NUM_VERT_SHADERS] = { [VERT_SHADER_TRI_TEXTURE] = { .num_samplers = 0, .num_uniform_buffers = 1, + SHADER_PRIVATE(tri_texture_vert_private) SHADER_SPIRV(tri_texture_vert_spv) SHADER_DXIL60(tri_texture_vert_dxil) SHADER_METAL(tri_texture_vert_msl) @@ -107,6 +123,7 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = { [FRAG_SHADER_COLOR] = { .num_samplers = 0, .num_uniform_buffers = 1, + SHADER_PRIVATE(color_frag_private) SHADER_SPIRV(color_frag_spv) SHADER_DXIL60(color_frag_dxil) SHADER_METAL(color_frag_msl) @@ -114,6 +131,7 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = { [FRAG_SHADER_TEXTURE_RGB] = { .num_samplers = 1, .num_uniform_buffers = 1, + SHADER_PRIVATE(texture_rgb_frag_private) SHADER_SPIRV(texture_rgb_frag_spv) SHADER_DXIL60(texture_rgb_frag_dxil) SHADER_METAL(texture_rgb_frag_msl) @@ -121,6 +139,7 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = { [FRAG_SHADER_TEXTURE_RGBA] = { .num_samplers = 1, .num_uniform_buffers = 1, + SHADER_PRIVATE(texture_rgba_frag_private) SHADER_SPIRV(texture_rgba_frag_spv) SHADER_DXIL60(texture_rgba_frag_dxil) SHADER_METAL(texture_rgba_frag_msl) @@ -128,6 +147,7 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = { [FRAG_SHADER_TEXTURE_ADVANCED] = { .num_samplers = 3, .num_uniform_buffers = 1, + SHADER_PRIVATE(texture_advanced_frag_private) SHADER_SPIRV(texture_advanced_frag_spv) SHADER_DXIL60(texture_advanced_frag_dxil) SHADER_METAL(texture_advanced_frag_msl) @@ -143,6 +163,10 @@ static SDL_GPUShader *CompileShader(const GPU_ShaderSources *sources, SDL_GPUDev if (formats == SDL_GPU_SHADERFORMAT_INVALID) { // SDL_GetGPUShaderFormats already set the error return NULL; +#if HAVE_PRIVATE_SHADERS + } else if (formats & SDL_GPU_SHADERFORMAT_PRIVATE) { + sms = &sources->private; +#endif // HAVE_PRIVATE_SHADERS #if HAVE_SPIRV_SHADERS } else if (formats & SDL_GPU_SHADERFORMAT_SPIRV) { sms = &sources->spirv; @@ -251,6 +275,7 @@ void GPU_FillSupportedShaderFormats(SDL_PropertiesID props) custom_shaders = true; } if (!custom_shaders) { + SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN, HAVE_PRIVATE_SHADERS); SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN, HAVE_SPIRV_SHADERS); SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN, HAVE_DXIL60_SHADERS); SDL_SetBooleanProperty(props, SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN, HAVE_METAL_SHADERS);