add sdlgpu renderer

This commit is contained in:
Sven Balzer
2026-07-03 14:19:41 +02:00
parent aaa5b2078b
commit e7ad1d36ba
16 changed files with 1161 additions and 125 deletions
+34 -16
View File
@@ -67,7 +67,7 @@ static_assert(SDL_arraysize(texel_sizes) == R_TEXTURE_FORMAT_COUNT);
static WGPUTextureUsage texture_usages[] = {
[R_TEXTURE_USAGE_SAMPLED] = WGPUTextureUsage_TextureBinding,
[R_TEXTURE_USAGE_STORAGE] = WGPUTextureUsage_StorageBinding,
[R_TEXTURE_USAGE_STORAGE] = WGPUTextureUsage_TextureBinding,
[R_TEXTURE_USAGE_TARGET] = WGPUTextureUsage_RenderAttachment,
};
static_assert(SDL_arraysize(texture_usages) == R_TEXTURE_USAGE_COUNT);
@@ -332,19 +332,28 @@ void renderer_frame_set_shader(R_Shader shader) {
void renderer_frame_draw(R_Buffer vertex_buffer, R_Buffer index_buffer, R_Buffer instance_buffer, Uint32 num_indices, Uint32 num_instances, const R_Draw_Resources *resources) {
SDL_assert(pass_encoder);
if (resources->num_vertex_textures || resources->num_vertex_storage_buffers) {
WGPUBindGroupEntry *entries = SDL_stack_alloc(WGPUBindGroupEntry, resources->num_vertex_textures + resources->num_vertex_storage_buffers);
if (resources->num_vertex_sampled_textures || resources->num_vertex_storage_textures || resources->num_vertex_storage_buffers) {
WGPUBindGroupEntry *entries = SDL_stack_alloc(WGPUBindGroupEntry, resources->num_vertex_sampled_textures + resources->num_vertex_storage_textures + resources->num_vertex_storage_buffers);
for (int i = 0; i < resources->num_vertex_textures; i++) {
for (int i = 0; i < resources->num_vertex_sampled_textures; i++) {
entries[i] = (WGPUBindGroupEntry){
.binding = i,
.textureView = resources->vertex_textures[i]->view,
.textureView = resources->vertex_sampled_textures[i]->view,
};
}
Uint32 entry_offset = resources->num_vertex_sampled_textures;
for (int i = 0; i < resources->num_vertex_storage_textures; i++) {
entries[i] = (WGPUBindGroupEntry){
.binding = i,
.textureView = resources->vertex_storage_textures[i]->view,
};
}
entry_offset += resources->num_vertex_storage_textures;
for (int i = 0; i < resources->num_vertex_storage_buffers; i++) {
entries[resources->num_vertex_textures + i] = (WGPUBindGroupEntry){
.binding = resources->num_vertex_textures + i,
entries[entry_offset + i] = (WGPUBindGroupEntry){
.binding = entry_offset + i,
.buffer = resources->vertex_storage_buffers[i]->buffer,
.offset = 0,
.size = WGPU_WHOLE_SIZE,
@@ -353,7 +362,7 @@ void renderer_frame_draw(R_Buffer vertex_buffer, R_Buffer index_buffer, R_Buffer
WGPUBindGroup bind_group = wgpuDeviceCreateBindGroup(device, &(WGPUBindGroupDescriptor){
.layout = wgpuRenderPipelineGetBindGroupLayout(shaders[current_shader], 0),
.entryCount = resources->num_vertex_textures + resources->num_vertex_storage_buffers,
.entryCount = resources->num_vertex_sampled_textures + resources->num_vertex_storage_textures + resources->num_vertex_storage_buffers,
.entries = entries,
});
@@ -391,13 +400,13 @@ void renderer_frame_draw(R_Buffer vertex_buffer, R_Buffer index_buffer, R_Buffer
wgpuRenderPassEncoderSetBindGroup(pass_encoder, 1, NULL, 0, NULL);
}
if (resources->num_fragment_textures || resources->num_fragment_storage_buffers) {
WGPUBindGroupEntry *entries = SDL_stack_alloc(WGPUBindGroupEntry, resources->num_fragment_textures * 2 + resources->num_fragment_storage_buffers);
if (resources->num_fragment_sampled_textures || resources->num_fragment_storage_textures || resources->num_fragment_storage_buffers) {
WGPUBindGroupEntry *entries = SDL_stack_alloc(WGPUBindGroupEntry, resources->num_fragment_sampled_textures * 2 + resources->num_fragment_storage_textures + resources->num_fragment_storage_buffers);
for (int i = 0; i < resources->num_fragment_textures; i++) {
for (int i = 0; i < resources->num_fragment_sampled_textures; i++) {
entries[i * 2] = (WGPUBindGroupEntry){
.binding = i * 2,
.textureView = resources->fragment_textures[i]->view,
.textureView = resources->fragment_sampled_textures[i]->view,
};
entries[i * 2 + 1] = (WGPUBindGroupEntry){
@@ -405,10 +414,19 @@ void renderer_frame_draw(R_Buffer vertex_buffer, R_Buffer index_buffer, R_Buffer
.sampler = bilinear_sampler,
};
}
Uint32 entry_offset = resources->num_fragment_sampled_textures * 2;
for (int i = 0; i < resources->num_fragment_storage_textures; i++) {
entries[entry_offset + i] = (WGPUBindGroupEntry){
.binding = entry_offset + i,
.textureView = resources->fragment_storage_textures[i]->view,
};
}
entry_offset += resources->num_fragment_storage_textures;
for (int i = 0; i < resources->num_fragment_storage_buffers; i++) {
entries[resources->num_fragment_textures * 2 + i] = (WGPUBindGroupEntry){
.binding = resources->num_fragment_textures * 2 + i,
entries[entry_offset + i] = (WGPUBindGroupEntry){
.binding = entry_offset + i,
.buffer = resources->fragment_storage_buffers[i]->buffer,
.offset = 0,
.size = WGPU_WHOLE_SIZE,
@@ -417,7 +435,7 @@ void renderer_frame_draw(R_Buffer vertex_buffer, R_Buffer index_buffer, R_Buffer
WGPUBindGroup bind_group = wgpuDeviceCreateBindGroup(device, &(WGPUBindGroupDescriptor){
.layout = wgpuRenderPipelineGetBindGroupLayout(shaders[current_shader], 2),
.entryCount = resources->num_fragment_textures * 2 + resources->num_fragment_storage_buffers,
.entryCount = resources->num_fragment_sampled_textures * 2 + resources->num_fragment_storage_textures + resources->num_fragment_storage_buffers,
.entries = entries,
});
@@ -652,7 +670,7 @@ bool renderer_init(SDL_Window *window_) {
.writeMask = WGPUColorWriteMask_All,
};
// Shader
// Shaders
{ // Basic
const char shader_source[] = {
#embed "shaders/wgsl/basic.wgsl"