summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoronelin <oscar@nelin.dk>2025-12-18 22:21:48 +0000
committeronelin <oscar@nelin.dk>2025-12-20 22:53:17 +0000
commit71bca57087f5746aaafba07ccce5b6bbc270b8c1 (patch)
tree039bae97ec38f4101d27b65f5de81c70787fbab6 /src
parent49fbbcc95e1234e0eb1464fc877b0264c5fcb9d1 (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.
Diffstat (limited to 'src')
-rw-r--r--src/daw.c176
-rw-r--r--src/include/daw/rendering.h3
-rw-r--r--src/include/daw/window.h4
-rw-r--r--src/rendering.c139
-rw-r--r--src/window.c9
5 files changed, 160 insertions, 171 deletions
diff --git a/src/daw.c b/src/daw.c
index f49e508..c6553ab 100644
--- a/src/daw.c
+++ b/src/daw.c
@@ -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); \