diff options
| author | onelin <oscar@nelin.dk> | 2025-12-18 22:21:48 +0000 |
|---|---|---|
| committer | onelin <oscar@nelin.dk> | 2025-12-20 22:53:17 +0000 |
| commit | 71bca57087f5746aaafba07ccce5b6bbc270b8c1 (patch) | |
| tree | 039bae97ec38f4101d27b65f5de81c70787fbab6 | |
| parent | 49fbbcc95e1234e0eb1464fc877b0264c5fcb9d1 (diff) | |
Move pipeline reset to rendering/window
Also set the damn memory to zero
Who could've guessed that you should zero your initialized memory when
you're making assumptions later that uninitizalied members are zero.
| -rw-r--r-- | src/daw.c | 176 | ||||
| -rw-r--r-- | src/include/daw/rendering.h | 3 | ||||
| -rw-r--r-- | src/include/daw/window.h | 4 | ||||
| -rw-r--r-- | src/rendering.c | 139 | ||||
| -rw-r--r-- | src/window.c | 9 |
5 files changed, 160 insertions, 171 deletions
@@ -41,9 +41,6 @@ Instance* GLOBAL_PLATFORM = NULL; -#define DEFAULT_CAMERA { .pos = {3, 0, 0}, .dir = {1, 1, 1}, } -static Camera default_camera = DEFAULT_CAMERA; - input_callback_t* callbacks[128]; usize callbacks_len; @@ -152,82 +149,10 @@ Instance* engine_init(const char* windowtitle, i32 windowWidth, i32 windowHeight return p; } -// TODO: MOVE TO RENDERING -static f32 default_quad[8] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - 1.0f, 1.0f, - -1.0f, 1.0f, -}; - -static f32 default_quad_uv[8] = { - 0.f, 0.f, - 1.f, 0.f, - 1.f, 1.f, - 0.f, 1.f, -}; - -static u8 default_quad_ibo[6] = { - 0, 1, 2, - 2, 3, 0, -}; - -// TODO: CREATE DEFAULT SHADERBUFF -#define COUNT(a) sizeof(a) / sizeof(a[0]) -static ShaderBuffer shaderbuf[3] = { - SHADERBUFFER_NEW(f32, COUNT(default_quad), 2, default_quad, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexPosition), - SHADERBUFFER_NEW(f32, COUNT(default_quad_uv), 2, default_quad_uv, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw), - SHADERBUFFER_NEW(u8, COUNT(default_quad_ibo), 3, default_quad_ibo, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexIndex), -}; -#undef COUNT - -static const char* default_quad_shader_vertex_src = -"#version 330 core\n" -"\n" -"layout(location = 0) in vec2 vertexPosition_modelspace;\n" -"layout(location = 1) in vec2 vertexUV;\n" -"\n" -"out vec2 UV;\n" -"\n" -"void main() {\n" -" gl_Position = vec4(vertexPosition_modelspace, 0, 1);\n" -"\n" -" UV = vertexUV;\n" -"}"; - -static const char* default_quad_shader_fragment_src = -"#version 330 core\n" -"\n" -"// Ouput data\n" -"in vec2 UV;\n" -"out vec3 color;\n" -"\n" -"uniform sampler2D textureSampler;\n" -"\n" -"void main() {\n" -" color = texture(textureSampler, UV).rgb;\n" -"}"; - - -void framebuffer_size_callback_default(ivec3* dst,ivec2 src) { - glm_ivec2_copy(src, *dst); -} - -void camera_reset_callback_default(Camera* dst, void* state, ivec2 src) { - r_reset_camera(dst, src); -} - - i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { - // TODO: MOVE TO INIT - Shader default_quad_shaders[] = { - compile_shader(default_quad_shader_vertex_src, Shader_Vertex), - compile_shader(default_quad_shader_fragment_src, Shader_Fragment), - (Shader){0}, - }; - default_quad_shaders[2] = compose_shader(default_quad_shaders, 2); + Shader default_quad_shader = init_default_shader(); RenderObject default_quad_renderobject; if (p == NULL) { @@ -245,52 +170,13 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { { u64 state_init_time = get_time(); State_init(state, p->window, mem, state_arg); - if (!w->render_targets) { - // Create only 1 additional framebuffer, in addition to the default - // one. This is used to render a texture that is represented as a quad - // on the default framebuffer. - ivec2 wsz; - window_get_size(&wsz); - u32 t[] = { - BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8), - // The depth buffer could also be a texture like so: - // BUFFERPARAMETER_SET_PARAMETER( - // BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), - // BUFFERPARAMETER_FMT_DEPTH32 - // ), - BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F), - }; - FramebufferParameters p[] = { - {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {wsz[0], wsz[1], 0}}, - }; - window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t); - - w->render_targets->framebuffer_size_callback[0] = &framebuffer_size_callback_default; - w->render_targets->camera_reset_callback[0] = &camera_reset_callback_default; - w->render_targets->cam[0] = &default_camera; - - window_reset_cameras(w, mem, w->render_targets); - } - - u32 first_texture = 0; - - for (usize i = 0; i < w->render_targets->buffer_len; i++) { - if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) { - first_texture = w->render_targets->buffer[i]; - break; - } - } - - default_quad_renderobject = RenderObject_new( - // Shader - &default_quad_shaders[2], - // Texture - first_texture, - // Vertices - shaderbuf, - sizeof(shaderbuf) / sizeof(ShaderBuffer) - ); + r_reset_pipeline(w); + // TODO: Both the shader & renderobject should only be created here if it is + // overwritten in Instance->Window. + // TODO: Add default quad & renderobject to Instance->Window. Should allow + // for customization. + default_quad_renderobject = init_default_renderobject(w, default_quad_shader); INFO("Initializing state \"%s\" took %.1fns", StateTypeStr[state], (get_time() - state_init_time)); @@ -346,53 +232,9 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) { { u64 state_init_time = get_time(); State_init(state, p->window, mem, retval); - if (!w->render_targets) { - // Create only 1 additional framebuffer, in addition to the default - // one. This is used to render a texture that is represented as a quad - // on the default framebuffer. - ivec2 wsz; - window_get_size(&wsz); - u32 t[] = { - BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8), - - // The depth buffer could also be a texture like so: - // BUFFERPARAMETER_SET_PARAMETER( - // BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), - // BUFFERPARAMETER_FMT_DEPTH32 - // ), - BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F), - }; - FramebufferParameters p[] = { - {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {wsz[0], wsz[1], 0}}, - }; - window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t); - - // TODO set if null ..? - w->render_targets->framebuffer_size_callback[0] = &framebuffer_size_callback_default; - w->render_targets->camera_reset_callback[0] = &camera_reset_callback_default; - w->render_targets->cam[0] = &default_camera; - - window_reset_cameras(w, mem, w->render_targets); - } - u32 first_texture = 0; - - for (usize i = 0; i < w->render_targets->buffer_len; i++) { - if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) { - first_texture = w->render_targets->buffer[i]; - break; - } - } - - default_quad_renderobject = RenderObject_new( - // Shader - &default_quad_shaders[2], - // Texture - first_texture, /*TODO*/ - // Vertices - shaderbuf, - sizeof(shaderbuf) / sizeof(ShaderBuffer) - ); + r_reset_pipeline(w); + default_quad_renderobject = init_default_renderobject(w, default_quad_shader); INFO("Initializing state \"%s\" took %.1fns", StateTypeStr[state], (get_time() - state_init_time)); diff --git a/src/include/daw/rendering.h b/src/include/daw/rendering.h index 321cfd0..640f104 100644 --- a/src/include/daw/rendering.h +++ b/src/include/daw/rendering.h @@ -400,6 +400,9 @@ void r_init_renderstack( void r_clear_buffer(void *restrict context, RenderTargets *restrict t, u32 framebuffer_idx); //static void r_create_renderbuffers(GladGLContext* restrict ctx, u32* restrict renderbuffer_array, u32* restrict renderbuffer_types, ivec2* restrict renderbuffer_sizes, usize num_targets); +// Callbacks used for framebuffers in rendertargets +void framebuffer_size_callback_default(ivec3* dst,ivec2 src); +void camera_reset_callback_default(Camera* dst, void* state, ivec2 src); #ifdef __cplusplus } diff --git a/src/include/daw/window.h b/src/include/daw/window.h index 3fe432d..99f6b6c 100644 --- a/src/include/daw/window.h +++ b/src/include/daw/window.h @@ -106,6 +106,10 @@ void window_reset_drawing(void); void render(Window* w); void draw_model(Window *restrict w, u32 framebuffer_idx, RenderObject* o, vec4 pos); +void r_reset_pipeline(Window* w); +RenderObject init_default_renderobject(Window* w, Shader s); +Shader init_default_shader(void); + void window_init_renderstack(Window *restrict w, usize num_fbuf, usize num_buf, FramebufferParameters *restrict fb_params, diff --git a/src/rendering.c b/src/rendering.c index 296c2ed..8feac35 100644 --- a/src/rendering.c +++ b/src/rendering.c @@ -13,6 +13,64 @@ #include <daw/rendering.h> #include <daw/logging.h> +static f32 default_quad[8] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + 1.0f, 1.0f, + -1.0f, 1.0f, +}; + +static f32 default_quad_uv[8] = { + 0.f, 0.f, + 1.f, 0.f, + 1.f, 1.f, + 0.f, 1.f, +}; + +static u8 default_quad_ibo[6] = { + 0, 1, 2, + 2, 3, 0, +}; + +#define DEFAULT_CAMERA { .pos = {3, 0, 0}, .dir = {1, 1, 1}, } +static Camera default_camera = DEFAULT_CAMERA; + + +// TODO: CREATE DEFAULT SHADERBUFF +#define COUNT(a) sizeof(a) / sizeof(a[0]) +static ShaderBuffer shaderbuf[3] = { + SHADERBUFFER_NEW(f32, COUNT(default_quad), 2, default_quad, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexPosition), + SHADERBUFFER_NEW(f32, COUNT(default_quad_uv), 2, default_quad_uv, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw), + SHADERBUFFER_NEW(u8, COUNT(default_quad_ibo), 3, default_quad_ibo, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexIndex), +}; +#undef COUNT + +static const char* default_quad_shader_vertex_src = +"#version 330 core\n" +"\n" +"layout(location = 0) in vec2 vertexPosition_modelspace;\n" +"layout(location = 1) in vec2 vertexUV;\n" +"\n" +"out vec2 UV;\n" +"\n" +"void main() {\n" +" gl_Position = vec4(vertexPosition_modelspace, 0, 1);\n" +"\n" +" UV = vertexUV;\n" +"}"; + +static const char* default_quad_shader_fragment_src = +"#version 330 core\n" +"\n" +"// Ouput data\n" +"in vec2 UV;\n" +"out vec3 color;\n" +"\n" +"uniform sampler2D textureSampler;\n" +"\n" +"void main() {\n" +" color = texture(textureSampler, UV).rgb;\n" +"}"; /* Extern globals */ extern Instance* GLOBAL_PLATFORM; @@ -922,3 +980,84 @@ void r_attach_buffers(void *restrict ctx, u32 fbo, u32* buffers, u32* buffer_par } } } + +void framebuffer_size_callback_default(ivec3* dst,ivec2 src) { + glm_ivec2_copy(src, *dst); +} + +void camera_reset_callback_default(Camera* dst, void* state, ivec2 src) { + r_reset_camera(dst, src); +} + +RenderObject init_default_renderobject(Window *restrict w, Shader s) { + u32 first_texture = 0; + + for (usize i = 0; i < w->render_targets->buffer_len; i++) { + if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) { + first_texture = w->render_targets->buffer[i]; + break; + } + } + + // WHAT?! + // --- Should _really_ make renderobjects heap allocated..! + return RenderObject_new( + // Shader + &s, + // Texture + first_texture, + // Vertices + shaderbuf, + sizeof(shaderbuf) / sizeof(ShaderBuffer) + ); +} + +Shader init_default_shader(void) { + // TODO: MOVE TO INIT + Shader default_quad_shaders[] = { + compile_shader(default_quad_shader_vertex_src, Shader_Vertex), + compile_shader(default_quad_shader_fragment_src, Shader_Fragment), + (Shader){0}, + }; + return compose_shader(default_quad_shaders, 2); +} + +void r_reset_pipeline(Window* w) { + if (w->render_targets == NULL) { + // Create only 1 additional framebuffer, in addition to the default + // one. This is used to render a texture that is represented as a quad + // on the default framebuffer. + u32 t[] = { + BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8), + + // The depth buffer could also be a texture like so: + // BUFFERPARAMETER_SET_PARAMETER( BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_DEPTH32), + BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F), + }; + FramebufferParameters p[] = { + // 16 by 16 is just some bogus values, but they cannot be zero, as they're + // needed to be set when resetting cameras. + {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {16, 16, 0}}, + }; + window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t); + } + + // Set default callbacks and camera for default framebuffer + if (w->render_targets->framebuffer_size_callback[0] == NULL) { + w->render_targets->framebuffer_size_callback[0] = framebuffer_size_callback_default; + } + if (w->render_targets->camera_reset_callback[0] == NULL) { + w->render_targets->camera_reset_callback[0] = camera_reset_callback_default; + } + if (w->render_targets->camera_reset_callback[0 == NULL]) { + w->render_targets->cam[0] = &default_camera; + } + + window_reset_cameras(w, GLOBAL_PLATFORM->mem->data, w->render_targets); + + // TODO: Both the shader & renderobject should only be created here if it is + // overwritten in Instance->Window. + // TODO: Add default quad & renderobject to Instance->Window. Should allow + // for customization. + //default_quad_renderobject = init_default_renderobject(p->window, default_quad_shader); +} diff --git a/src/window.c b/src/window.c index 79e9a42..6e5fe71 100644 --- a/src/window.c +++ b/src/window.c @@ -152,7 +152,7 @@ void window_init_renderstack(Window *restrict w, ASSERT(buffer_params != NULL); RenderTargets *t = NULL; - void* allocation = malloc( + usize allocation_sz = sizeof(RenderTargets) + sizeof(*t->framebuffer) * num_fbuf + sizeof(*t->framebuffer_parameters) * num_fbuf + @@ -160,9 +160,10 @@ void window_init_renderstack(Window *restrict w, sizeof(*t->framebuffer_size_callback) * num_fbuf + sizeof(*t->camera_reset_callback) * num_fbuf + sizeof(*t->buffer) * num_buf + - sizeof(*t->buffer_parameters) * num_buf - // TODO: callbacks - ); + sizeof(*t->buffer_parameters) * num_buf; + + void* allocation = malloc(allocation_sz); + memset(allocation, 0, allocation_sz); #define ADVANCE_PTR(target, count)\ t->target = (void*)((u64)allocation + acc); \ |
