From 2bacfe74bf35ae725820da7155e8f3e85e92c888 Mon Sep 17 00:00:00 2001 From: onelin Date: Sun, 15 Mar 2026 21:01:01 +0100 Subject: Add special buffer types --- src/gl.c | 2 +- src/include/daw/rendering.h | 55 ++++++++++++++++++++++++--------------------- src/rendering.c | 8 +++---- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/gl.c b/src/gl.c index 9c9e6da..7c630a6 100644 --- a/src/gl.c +++ b/src/gl.c @@ -200,7 +200,7 @@ void shaders_delete(Shader* shader, usize shader_len) { GLenum ShaderBuffer_get_gl_access(u64 flags) { const ShaderBufferFlag access = ShaderBuffer_get_access_type(flags); - switch(flags & 7) { // Stored in the first 3 bits + switch(ShaderBuffer_get_access_frequency(flags)) { // Stored in the first 3 bits case ShaderBuffer_AccessFrequency_stream: switch(access) { case ShaderBuffer_AccessType_draw: return GL_STREAM_DRAW; diff --git a/src/include/daw/rendering.h b/src/include/daw/rendering.h index 046141e..bebc60c 100644 --- a/src/include/daw/rendering.h +++ b/src/include/daw/rendering.h @@ -49,36 +49,41 @@ typedef struct { typedef enum { ShaderBufferFlag_none = 0x00, - // First 3 bytes describe the access frequency. - ShaderBuffer_AccessFrequency_stream = 1, // 1 - ShaderBuffer_AccessFrequency_static = 2, // 2 - ShaderBuffer_AccessFrequency_dynamic = 3, // 3 - - // Next 3 bytes describe the access type. - ShaderBuffer_AccessType_draw = 1 << 3, // 8 - ShaderBuffer_AccessType_read = 2 << 3, // 16 - ShaderBuffer_AccessType_copy = 3 << 3, // 24 - - // Next 3 bytes describe the buffer type - ShaderBuffer_Type_vertexData = 1 << 6, // 64 - ShaderBuffer_Type_vertexPosition = 2 << 6, // 128 - ShaderBuffer_Type_vertexIndex = 3 << 6, // 192 + // First 2 bytes are special buffer types + // static is set with bufferstorage, ie. immutable storage + ShaderBuffer_static = 1, // 1 - 0001 + + // Next 2 bytes describe the access frequency. + // Use ShaderBuffer_get_access_frequency to retrieve it + ShaderBuffer_AccessFrequency_stream = 1 << 2, // 4 - 0100 + ShaderBuffer_AccessFrequency_static = 2 << 2, // 8 - 1000 + ShaderBuffer_AccessFrequency_dynamic = 3 << 2, // 12 - 1100 + + // Next 2 bytes describe the access type. + ShaderBuffer_AccessType_draw = 1 << 4, // 16 - 01 0000 + ShaderBuffer_AccessType_read = 2 << 4, // 32 - 10 0000 + ShaderBuffer_AccessType_copy = 3 << 4, // 48 - 11 0000 + + // Next 2 bytes describe the buffer type + ShaderBuffer_Type_vertexData = 1 << 6, // 64 - 0100 0000 + ShaderBuffer_Type_vertexPosition = 2 << 6, // 128 - 1000 0000 + ShaderBuffer_Type_vertexIndex = 3 << 6, // 192 - 1100 0000 // Next 4 bytes are designated for the data type - ShaderBuffer_DataType_nil = 1 << 9, // 512 + ShaderBuffer_DataType_nil = 1 << 8, // 256 - ShaderBuffer_DataType_f32 = 2 << 9, // 1024 - ShaderBuffer_DataType_f64 = 3 << 9, // 1536 + ShaderBuffer_DataType_f32 = 2 << 8, // 512 + ShaderBuffer_DataType_f64 = 3 << 8, // 768 - ShaderBuffer_DataType_i8 = 4 << 9, // 2048 - ShaderBuffer_DataType_i16 = 5 << 9, // 2560 - ShaderBuffer_DataType_i32 = 6 << 9, // 3072 - ShaderBuffer_DataType_i64 = 7 << 9, // 3584 + ShaderBuffer_DataType_i8 = 4 << 8, // 1024 + ShaderBuffer_DataType_i16 = 5 << 8, // 1280 + ShaderBuffer_DataType_i32 = 6 << 8, // 1536 + ShaderBuffer_DataType_i64 = 7 << 8, // 1792 - ShaderBuffer_DataType_u8 = 8 << 9, // 4096 - ShaderBuffer_DataType_u16 = 9 << 9, // 4608 - ShaderBuffer_DataType_u32 = 10 << 9, // 5120 - ShaderBuffer_DataType_u64 = 11 << 9, // 5632 + ShaderBuffer_DataType_u8 = 8 << 8, // 2048 + ShaderBuffer_DataType_u16 = 9 << 8, // 2304 + ShaderBuffer_DataType_u32 = 10 << 8, // 2560 + ShaderBuffer_DataType_u64 = 11 << 8, // 2816 } ShaderBufferFlag; typedef struct { diff --git a/src/rendering.c b/src/rendering.c index dceacc4..4a00c92 100644 --- a/src/rendering.c +++ b/src/rendering.c @@ -97,10 +97,10 @@ ShaderBufferDataType_size(u16 flags) { } } -ShaderBufferFlag ShaderBuffer_get_access_frequency(u64 flags) { return flags & ( 7 << 0); } -ShaderBufferFlag ShaderBuffer_get_access_type(u64 flags) { return flags & ( 7 << 3); } -ShaderBufferFlag ShaderBuffer_get_type(u64 flags) { return flags & ( 7 << 6); } -ShaderBufferFlag ShaderBuffer_get_data_type(u64 flags) { return flags & (15 << 9); } +ShaderBufferFlag ShaderBuffer_get_access_frequency(u64 flags) { return flags & ( 3 << 2); } +ShaderBufferFlag ShaderBuffer_get_access_type(u64 flags) { return flags & ( 3 << 4); } +ShaderBufferFlag ShaderBuffer_get_type(u64 flags) { return flags & ( 3 << 6); } +ShaderBufferFlag ShaderBuffer_get_data_type(u64 flags) { return flags & (15 << 8); } u32 ShaderBuffer_get_gl_type(u64 flags) { switch(ShaderBuffer_get_type(flags)) { -- cgit v1.3