add sdlgpu renderer
This commit is contained in:
+34
-16
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user