119 bool loadFromMemory(ShaderStage stage,
const void *data,
size_t size, Uint32 numSamplers = 0,
120 Uint32 numStorageTextures = 0, Uint32 numStorageBuffers = 0,
121 Uint32 numUniformBuffers = 0) {
122 SDL_GPUShaderCreateInfo createInfo{};
123 createInfo.code =
static_cast<const Uint8 *
>(data);
124 createInfo.code_size = size;
125 createInfo.entrypoint = (m_format == ShaderFormat::MSL) ?
"main0" :
"main";
128 case ShaderFormat::SPIRV:
129 createInfo.format = SDL_GPU_SHADERFORMAT_SPIRV;
131 case ShaderFormat::MSL:
132 createInfo.format = SDL_GPU_SHADERFORMAT_MSL;
134 case ShaderFormat::DXIL:
135 createInfo.format = SDL_GPU_SHADERFORMAT_DXIL;
141 createInfo.stage = (stage == ShaderStage::Vertex) ? SDL_GPU_SHADERSTAGE_VERTEX
142 : SDL_GPU_SHADERSTAGE_FRAGMENT;
144 createInfo.num_samplers = numSamplers;
145 createInfo.num_storage_textures = numStorageTextures;
146 createInfo.num_storage_buffers = numStorageBuffers;
147 createInfo.num_uniform_buffers = numUniformBuffers;
149 SDL_GPUShader *shader = SDL_CreateGPUShader(m_device, &createInfo);
151 FLINT_ENGINE_ERROR(
"Failed to create shader: {}", SDL_GetError());
155 if (stage == ShaderStage::Vertex) {
156 if (m_vertexShader) {
157 GPU_RELEASE_SHADER(m_device, m_vertexShader);
159 m_vertexShader = shader;
160 GPU_TRACK_SHADER(m_vertexShader,
"Vertex Shader in Shader class");
162 if (m_fragmentShader) {
163 GPU_RELEASE_SHADER(m_device, m_fragmentShader);
165 m_fragmentShader = shader;
166 GPU_TRACK_SHADER(m_fragmentShader,
"Fragment Shader in Shader class");