From a447863e4fb9834e91cdd803a9052e188d1ef9ac Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Fri, 14 Mar 2025 10:27:50 -0700
Subject: [PATCH] Set a default shader entry point
The default should be the entrypoint generated by SDL_shadercross. That way it doesn't need to be hand-specified in the common workflow.
(cherry picked from commit dcb97a5f49a336f871828672be7a905502778dbc)
---
src/gpu/d3d12/SDL_gpu_d3d12.c | 1 -
src/gpu/metal/SDL_gpu_metal.m | 4 ++++
src/gpu/vulkan/SDL_gpu_vulkan.c | 14 +++++++-------
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/src/gpu/d3d12/SDL_gpu_d3d12.c b/src/gpu/d3d12/SDL_gpu_d3d12.c
index e003952264bd8..ab7554cd7046c 100644
--- a/src/gpu/d3d12/SDL_gpu_d3d12.c
+++ b/src/gpu/d3d12/SDL_gpu_d3d12.c
@@ -8103,7 +8103,6 @@ static void D3D12_INTERNAL_InitBlitResources(
shaderCreateInfo.code_size = sizeof(D3D12_FullscreenVert);
shaderCreateInfo.stage = SDL_GPU_SHADERSTAGE_VERTEX;
shaderCreateInfo.format = SDL_GPU_SHADERFORMAT_DXBC;
- shaderCreateInfo.entrypoint = "main";
renderer->blitVertexShader = D3D12_CreateShader(
(SDL_GPURenderer *)renderer,
diff --git a/src/gpu/metal/SDL_gpu_metal.m b/src/gpu/metal/SDL_gpu_metal.m
index de9df7274cefd..0e3f6efa7ee0e 100644
--- a/src/gpu/metal/SDL_gpu_metal.m
+++ b/src/gpu/metal/SDL_gpu_metal.m
@@ -840,6 +840,10 @@ static MetalLibraryFunction METAL_INTERNAL_CompileShader(
dispatch_data_t data;
id<MTLFunction> function;
+ if (!entrypoint) {
+ entrypoint = "main0";
+ }
+
if (format == SDL_GPU_SHADERFORMAT_MSL) {
NSString *codeString = [[NSString alloc]
initWithBytes:code
diff --git a/src/gpu/vulkan/SDL_gpu_vulkan.c b/src/gpu/vulkan/SDL_gpu_vulkan.c
index 8638dd82cafff..6b13a26cca044 100644
--- a/src/gpu/vulkan/SDL_gpu_vulkan.c
+++ b/src/gpu/vulkan/SDL_gpu_vulkan.c
@@ -606,7 +606,7 @@ typedef struct VulkanSampler
typedef struct VulkanShader
{
VkShaderModule shaderModule;
- const char *entrypointName;
+ char *entrypointName;
SDL_GPUShaderStage stage;
Uint32 numSamplers;
Uint32 numStorageTextures;
@@ -3175,7 +3175,7 @@ static void VULKAN_INTERNAL_DestroyShader(
vulkanShader->shaderModule,
NULL);
- SDL_free((void *)vulkanShader->entrypointName);
+ SDL_free(vulkanShader->entrypointName);
SDL_free(vulkanShader);
}
@@ -6694,7 +6694,6 @@ static SDL_GPUShader *VULKAN_CreateShader(
VkResult vulkanResult;
VkShaderModuleCreateInfo vkShaderModuleCreateInfo;
VulkanRenderer *renderer = (VulkanRenderer *)driverData;
- size_t entryPointNameLength;
vulkanShader = SDL_malloc(sizeof(VulkanShader));
vkShaderModuleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
@@ -6714,10 +6713,11 @@ static SDL_GPUShader *VULKAN_CreateShader(
CHECK_VULKAN_ERROR_AND_RETURN(vulkanResult, vkCreateShaderModule, NULL);
}
- entryPointNameLength = SDL_strlen(createinfo->entrypoint) + 1;
- vulkanShader->entrypointName = SDL_malloc(entryPointNameLength);
- SDL_utf8strlcpy((char *)vulkanShader->entrypointName, createinfo->entrypoint, entryPointNameLength);
-
+ const char *entrypoint = createinfo->entrypoint;
+ if (!entrypoint) {
+ entrypoint = "main";
+ }
+ vulkanShader->entrypointName = SDL_strdup(entrypoint);
vulkanShader->stage = createinfo->stage;
vulkanShader->numSamplers = createinfo->num_samplers;
vulkanShader->numStorageTextures = createinfo->num_storage_textures;