From 680deb35b0db77f220f76af1df205b439fdf174d Mon Sep 17 00:00:00 2001 From: martinfouilleul Date: Thu, 27 Jul 2023 11:37:39 +0200 Subject: [PATCH] [win32, gl canvas] grow path and element input buffers as needed --- examples/perf_text/main.c | 2 +- examples/tiger/main.c | 8 +----- src/gl_canvas.c | 59 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 58 insertions(+), 11 deletions(-) diff --git a/examples/perf_text/main.c b/examples/perf_text/main.c index 52328eb..bcb9952 100644 --- a/examples/perf_text/main.c +++ b/examples/perf_text/main.c @@ -201,7 +201,7 @@ int main() f32 trackX = mousePos.x/zoom - startX; f32 trackY = mousePos.y/zoom - startY; - zoom *= 1 + event->move.deltaY * 0.01; + zoom *= 1 + event->mouse.deltaY * 0.01; zoom = Clamp(zoom, 0.2, 10); startX = mousePos.x/zoom - trackX; diff --git a/examples/tiger/main.c b/examples/tiger/main.c index ea51073..42831f2 100644 --- a/examples/tiger/main.c +++ b/examples/tiger/main.c @@ -108,12 +108,6 @@ int main() mp_request_quit(); } break; - case MP_EVENT_WINDOW_RESIZE: - { - mp_rect frame = {0, 0, event->frame.rect.w, event->frame.rect.h}; - mg_surface_set_frame(surface, frame); - } break; - case MP_EVENT_MOUSE_BUTTON: { if(event->key.code == MP_MOUSE_LEFT) @@ -138,7 +132,7 @@ int main() f32 pinX = (mousePos.x - startX)/zoom; f32 pinY = (mousePos.y - startY)/zoom; - zoom *= 1 + event->move.deltaY * 0.01; + zoom *= 1 + event->mouse.deltaY * 0.01; zoom = Clamp(zoom, 0.5, 5); startX = mousePos.x - pinX*zoom; diff --git a/src/gl_canvas.c b/src/gl_canvas.c index 30c6b35..4fbdcc0 100644 --- a/src/gl_canvas.c +++ b/src/gl_canvas.c @@ -182,9 +182,47 @@ static void mg_update_path_extents(vec4* extents, vec2 p) extents->w = maximum(extents->w, p.y); } +void mg_gl_grow_input_buffer(mg_gl_mapped_buffer* buffer, int copyStart, int copySize, int newSize) +{ + mg_gl_mapped_buffer newBuffer = {0}; + newBuffer.size = newSize; + glGenBuffers(1, &newBuffer.buffer); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, newBuffer.buffer); + glBufferStorage(GL_SHADER_STORAGE_BUFFER, newBuffer.size, 0, GL_MAP_WRITE_BIT|GL_MAP_PERSISTENT_BIT); + newBuffer.contents = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, + 0, + newBuffer.size, + GL_MAP_WRITE_BIT + |GL_MAP_PERSISTENT_BIT + |GL_MAP_FLUSH_EXPLICIT_BIT); + + memcpy(newBuffer.contents + copyStart, buffer->contents + copyStart, copySize); + + glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer->buffer); + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + glDeleteBuffers(1, &buffer->buffer); + + *buffer = newBuffer; +} + void mg_gl_canvas_encode_element(mg_gl_canvas_backend* backend, mg_path_elt_type kind, vec2* p) { - mg_gl_path_elt* elementData = (mg_gl_path_elt*)backend->elementBuffer[backend->bufferIndex].contents; + int bufferIndex = backend->bufferIndex; + int bufferCap = backend->elementBuffer[bufferIndex].size / sizeof(mg_gl_path_elt); + if(backend->eltCount >= bufferCap) + { + int newBufferCap = (int)(bufferCap * 1.5); + int newBufferSize = newBufferCap * sizeof(mg_gl_path_elt); + + log_info("growing element buffer to %i elements\n", newBufferCap); + + mg_gl_grow_input_buffer(&backend->elementBuffer[bufferIndex], + backend->eltBatchStart * sizeof(mg_gl_path_elt), + backend->eltCount * sizeof(mg_gl_path_elt), + newBufferSize); + } + + mg_gl_path_elt* elementData = (mg_gl_path_elt*)backend->elementBuffer[bufferIndex].contents; mg_gl_path_elt* elt = &elementData[backend->eltCount]; backend->eltCount++; @@ -224,6 +262,21 @@ void mg_gl_canvas_encode_element(mg_gl_canvas_backend* backend, mg_path_elt_type void mg_gl_canvas_encode_path(mg_gl_canvas_backend* backend, mg_primitive* primitive, f32 scale) { + int bufferIndex = backend->bufferIndex; + int bufferCap = backend->pathBuffer[bufferIndex].size / sizeof(mg_gl_path); + if(backend->pathCount >= bufferCap) + { + int newBufferCap = (int)(bufferCap * 1.5); + int newBufferSize = newBufferCap * sizeof(mg_gl_path); + + log_info("growing path buffer to %i elements\n", newBufferCap); + + mg_gl_grow_input_buffer(&backend->pathBuffer[bufferIndex], + backend->pathBatchStart * sizeof(mg_gl_path), + backend->eltCount * sizeof(mg_gl_path), + newBufferSize); + } + mg_gl_path* pathData = (mg_gl_path*)backend->pathBuffer[backend->bufferIndex].contents; mg_gl_path* path = &pathData[backend->pathCount]; backend->pathCount++; @@ -1519,8 +1572,8 @@ int mg_gl_canvas_compile_render_program_named(const char* progName, #define mg_gl_canvas_compile_render_program(progName, shaderSrc, vertexSrc, out) \ mg_gl_canvas_compile_render_program_named(progName, #shaderSrc, #vertexSrc, shaderSrc, vertexSrc, out) -const u32 MG_GL_PATH_BUFFER_SIZE = (4<<20)*sizeof(mg_gl_path), - MG_GL_ELEMENT_BUFFER_SIZE = (4<<20)*sizeof(mg_gl_path_elt), +const u32 MG_GL_PATH_BUFFER_SIZE = (4<<10)*sizeof(mg_gl_path), + MG_GL_ELEMENT_BUFFER_SIZE = (4<<12)*sizeof(mg_gl_path_elt), MG_GL_SEGMENT_BUFFER_SIZE = (4<<20)*sizeof(mg_gl_segment), MG_GL_PATH_QUEUE_BUFFER_SIZE = (4<<20)*sizeof(mg_gl_path_queue), MG_GL_TILE_QUEUE_BUFFER_SIZE = (4<<20)*sizeof(mg_gl_tile_queue),