From 28ec461ebf54517befcc16eea5aba7367f7663bb Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Wed, 12 Mar 2025 15:14:56 -0700
Subject: [PATCH] Organize the GPU renderer draw code
---
src/render/gpu/SDL_render_gpu.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/src/render/gpu/SDL_render_gpu.c b/src/render/gpu/SDL_render_gpu.c
index 52694291548cb..489f70eac8d26 100644
--- a/src/render/gpu/SDL_render_gpu.c
+++ b/src/render/gpu/SDL_render_gpu.c
@@ -468,7 +468,7 @@ static SDL_GPURenderPass *RestartRenderPass(GPU_RenderData *data)
return data->state.render_pass;
}
-static void PushUniforms(GPU_RenderData *data, SDL_RenderCommand *cmd)
+static void PushVertexUniforms(GPU_RenderData *data, SDL_RenderCommand *cmd)
{
GPU_ShaderUniformData uniforms;
SDL_zero(uniforms);
@@ -522,19 +522,19 @@ static void Draw(
RestartRenderPass(data);
}
+ SDL_GPURenderPass *pass = data->state.render_pass;
GPU_VertexShaderID v_shader;
GPU_FragmentShaderID f_shader;
- SDL_GPURenderPass *pass = data->state.render_pass;
- GPU_TextureData *tdata = NULL;
-
- if (cmd->data.draw.texture) {
- tdata = (GPU_TextureData *)cmd->data.draw.texture->internal;
- }
if (prim == SDL_GPU_PRIMITIVETYPE_TRIANGLELIST) {
- if (cmd->data.draw.texture) {
+ SDL_Texture *texture = cmd->data.draw.texture;
+ if (texture) {
v_shader = VERT_SHADER_TRI_TEXTURE;
- f_shader = tdata->shader;
+ if (texture->format == SDL_PIXELFORMAT_RGBA32 || texture->format == SDL_PIXELFORMAT_BGRA32) {
+ f_shader = FRAG_SHADER_TEXTURE_RGBA;
+ } else {
+ f_shader = FRAG_SHADER_TEXTURE_RGB;
+ }
} else {
v_shader = VERT_SHADER_TRI_COLOR;
f_shader = FRAG_SHADER_COLOR;
@@ -558,15 +558,14 @@ static void Draw(
}
SDL_GPUGraphicsPipeline *pipe = GPU_GetPipeline(&data->pipeline_cache, &data->shaders, data->device, &pipe_params);
-
if (!pipe) {
return;
}
- SetViewportAndScissor(data);
- SDL_BindGPUGraphicsPipeline(data->state.render_pass, pipe);
+ SDL_BindGPUGraphicsPipeline(pass, pipe);
- if (tdata) {
+ if (cmd->data.draw.texture) {
+ GPU_TextureData *tdata = (GPU_TextureData *)cmd->data.draw.texture->internal;
SDL_GPUTextureSamplerBinding sampler_bind;
SDL_zero(sampler_bind);
sampler_bind.sampler = *SamplerPointer(data, cmd->data.draw.texture_address_mode, cmd->data.draw.texture_scale_mode);
@@ -578,10 +577,12 @@ static void Draw(
SDL_zero(buffer_bind);
buffer_bind.buffer = data->vertices.buffer;
buffer_bind.offset = offset;
-
SDL_BindGPUVertexBuffers(pass, 0, &buffer_bind, 1);
- PushUniforms(data, cmd);
- SDL_DrawGPUPrimitives(data->state.render_pass, num_verts, 1, 0, 0);
+ PushVertexUniforms(data, cmd);
+
+ SetViewportAndScissor(data);
+
+ SDL_DrawGPUPrimitives(pass, num_verts, 1, 0, 0);
}
static void ReleaseVertexBuffer(GPU_RenderData *data)