mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 13:58:40 +00:00
render/opengl: flushed instance buffers
This commit is contained in:
@@ -65,6 +65,29 @@ r_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal GLuint
|
||||||
|
r_ogl_instance_buffer_from_size(U64 size)
|
||||||
|
{
|
||||||
|
GLuint buffer = r_ogl_state->scratch_buffer_64kb;
|
||||||
|
if(size > KB(64))
|
||||||
|
{
|
||||||
|
// rjf: build buffer
|
||||||
|
U64 flushed_buffer_size = size;
|
||||||
|
flushed_buffer_size += MB(1)-1;
|
||||||
|
flushed_buffer_size -= flushed_buffer_size%MB(1);
|
||||||
|
glGenBuffers(1, &buffer);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, flushed_buffer_size, 0, GL_DYNAMIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
// rjf: push buffer to flush list
|
||||||
|
R_OGL_FlushBuffer *n = push_array(r_ogl_state->buffer_flush_arena, R_OGL_FlushBuffer, 1);
|
||||||
|
n->id = buffer;
|
||||||
|
SLLQueuePush(r_ogl_state->first_buffer_to_flush, r_ogl_state->last_buffer_to_flush, n);
|
||||||
|
}
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
|
r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)
|
||||||
{
|
{
|
||||||
@@ -150,9 +173,9 @@ r_init(CmdLine *cmdln)
|
|||||||
|
|
||||||
//- rjf: set up built-in resources
|
//- rjf: set up built-in resources
|
||||||
glGenVertexArrays(1, &r_ogl_state->all_purpose_vao);
|
glGenVertexArrays(1, &r_ogl_state->all_purpose_vao);
|
||||||
glGenBuffers(1, &r_ogl_state->scratch_buffer_2mb);
|
glGenBuffers(1, &r_ogl_state->scratch_buffer_64kb);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, r_ogl_state->scratch_buffer_2mb);
|
glBindBuffer(GL_ARRAY_BUFFER, r_ogl_state->scratch_buffer_64kb);
|
||||||
glBufferData(GL_ARRAY_BUFFER, MB(2), 0, GL_DYNAMIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, KB(64), 0, GL_DYNAMIC_DRAW);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glGenTextures(1, &r_ogl_state->white_texture);
|
glGenTextures(1, &r_ogl_state->white_texture);
|
||||||
glBindTexture(GL_TEXTURE_2D, r_ogl_state->white_texture);
|
glBindTexture(GL_TEXTURE_2D, r_ogl_state->white_texture);
|
||||||
@@ -160,6 +183,9 @@ r_init(CmdLine *cmdln)
|
|||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &white_pixel);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &white_pixel);
|
||||||
glEnable(GL_FRAMEBUFFER_SRGB);
|
glEnable(GL_FRAMEBUFFER_SRGB);
|
||||||
|
|
||||||
|
//- rjf: set up buffer flush state
|
||||||
|
r_ogl_state->buffer_flush_arena = arena_alloc();
|
||||||
|
|
||||||
//- rjf: set up debug callback
|
//- rjf: set up debug callback
|
||||||
B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug"));
|
B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit("opengl_debug"));
|
||||||
#if BUILD_DEBUG
|
#if BUILD_DEBUG
|
||||||
@@ -334,6 +360,12 @@ r_window_begin_frame(OS_Handle os, R_Handle r)
|
|||||||
r_hook void
|
r_hook void
|
||||||
r_window_end_frame(OS_Handle os, R_Handle r)
|
r_window_end_frame(OS_Handle os, R_Handle r)
|
||||||
{
|
{
|
||||||
|
for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next)
|
||||||
|
{
|
||||||
|
glDeleteBuffers(1, &flush_buffer->id);
|
||||||
|
}
|
||||||
|
arena_clear(r_ogl_state->buffer_flush_arena);
|
||||||
|
r_ogl_state->first_buffer_to_flush = r_ogl_state->last_buffer_to_flush = 0;
|
||||||
r_ogl_os_window_swap(os, r);
|
r_ogl_os_window_swap(os, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -382,7 +414,7 @@ r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: get & fill buffer
|
//- rjf: get & fill buffer
|
||||||
GLuint buffer = r_ogl_state->scratch_buffer_2mb; // TODO(rjf): r_ogl_instance_buffer_from_size(batches->byte_count);
|
GLuint buffer = r_ogl_instance_buffer_from_size(batches->byte_count);
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
glBindBuffer(GL_ARRAY_BUFFER, buffer);
|
||||||
U64 off = 0;
|
U64 off = 0;
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ struct R_OGL_AttributeArray
|
|||||||
#define R_OGL_ProcedureXList \
|
#define R_OGL_ProcedureXList \
|
||||||
X(glGenBuffers, void, (GLsizei n, GLuint *buffers))\
|
X(glGenBuffers, void, (GLsizei n, GLuint *buffers))\
|
||||||
X(glBindBuffer, void, (GLenum target, GLuint buffer))\
|
X(glBindBuffer, void, (GLenum target, GLuint buffer))\
|
||||||
|
X(glDeleteBuffers, void, (GLsizei n, GLuint *buffers))\
|
||||||
X(glGenVertexArrays, void, (GLsizei n, GLuint *arrays))\
|
X(glGenVertexArrays, void, (GLsizei n, GLuint *arrays))\
|
||||||
X(glBindVertexArray, void, (GLuint array))\
|
X(glBindVertexArray, void, (GLuint array))\
|
||||||
X(glCreateProgram, GLuint, (void))\
|
X(glCreateProgram, GLuint, (void))\
|
||||||
@@ -179,6 +180,13 @@ struct R_OGL_Tex2D
|
|||||||
Vec2S32 size;
|
Vec2S32 size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct R_OGL_FlushBuffer R_OGL_FlushBuffer;
|
||||||
|
struct R_OGL_FlushBuffer
|
||||||
|
{
|
||||||
|
R_OGL_FlushBuffer *next;
|
||||||
|
GLuint id;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct R_OGL_State R_OGL_State;
|
typedef struct R_OGL_State R_OGL_State;
|
||||||
struct R_OGL_State
|
struct R_OGL_State
|
||||||
{
|
{
|
||||||
@@ -186,8 +194,11 @@ struct R_OGL_State
|
|||||||
R_OGL_Tex2D *free_tex2d;
|
R_OGL_Tex2D *free_tex2d;
|
||||||
GLuint shaders[R_OGL_ShaderKind_COUNT];
|
GLuint shaders[R_OGL_ShaderKind_COUNT];
|
||||||
GLuint all_purpose_vao;
|
GLuint all_purpose_vao;
|
||||||
GLuint scratch_buffer_2mb;
|
GLuint scratch_buffer_64kb;
|
||||||
GLuint white_texture;
|
GLuint white_texture;
|
||||||
|
Arena *buffer_flush_arena;
|
||||||
|
R_OGL_FlushBuffer *first_buffer_to_flush;
|
||||||
|
R_OGL_FlushBuffer *last_buffer_to_flush;
|
||||||
};
|
};
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -201,6 +212,7 @@ global R_OGL_State *r_ogl_state = 0;
|
|||||||
internal R_Handle r_ogl_handle_from_tex2d(R_OGL_Tex2D *t);
|
internal R_Handle r_ogl_handle_from_tex2d(R_OGL_Tex2D *t);
|
||||||
internal R_OGL_Tex2D *r_ogl_tex2d_from_handle(R_Handle h);
|
internal R_OGL_Tex2D *r_ogl_tex2d_from_handle(R_Handle h);
|
||||||
internal R_OGL_FormatInfo r_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt);
|
internal R_OGL_FormatInfo r_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt);
|
||||||
|
internal GLuint r_ogl_instance_buffer_from_size(U64 size);
|
||||||
internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam);
|
internal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam);
|
||||||
|
|
||||||
#define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0))
|
#define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0))
|
||||||
|
|||||||
Reference in New Issue
Block a user