perf(viz): graph_renderer edges via TBO + vertex pulling (issue 0049d)
El buffer de aristas pasa a estatico (16B/arista: source, target, color, flags) y solo se reupload cuando cambia el grafo. Las posiciones de los nodos viven en un Texture Buffer Object (RG32F) actualizado por frame; el vertex shader hace texelFetch con gl_VertexID & 1 para elegir endpoint. Draw call: glDrawArraysInstanced(GL_LINES, 0, 2, edge_count) con divisor=1. Para 100k aristas: el upload de 4.8 MB/frame baja a 0 en regimen estable. edge_alpha pasa a uniform; la pre-multiplicacion en CPU desaparece. GLSL sigue en 330 core (samplerBuffer/texelFetch estan en 1.40+). gl_loader gana glBufferSubData, glVertexAttribIPointer y glTexBuffer (en Linux ya estaban via GL_GLEXT_PROTOTYPES; ahora estan disponibles tambien en MinGW/Windows). Tests: nuevo test_graph_edge_static valida el layout de 16B y el packing RGBA8 del fallback. test_visual sigue verde — render visualmente identico. Bump graph_renderer 1.2.0 -> 1.3.0.
This commit is contained in:
@@ -46,6 +46,9 @@ PFNGLFRAMEBUFFERRENDERBUFFERPROC fn_glFramebufferRenderbuffer = nullptr;
|
||||
PFNGLGENRENDERBUFFERSPROC fn_glGenRenderbuffers = nullptr;
|
||||
PFNGLRENDERBUFFERSTORAGEPROC fn_glRenderbufferStorage = nullptr;
|
||||
PFNGLFRAMEBUFFERTEXTUREPROC fn_glFramebufferTexture = nullptr;
|
||||
PFNGLBUFFERSUBDATAPROC fn_glBufferSubData = nullptr;
|
||||
PFNGLVERTEXATTRIBIPOINTERPROC fn_glVertexAttribIPointer = nullptr;
|
||||
PFNGLTEXBUFFERPROC fn_glTexBuffer = nullptr;
|
||||
|
||||
namespace fn::gfx {
|
||||
|
||||
@@ -98,6 +101,9 @@ bool gl_loader_init() {
|
||||
LOAD(glGenRenderbuffers);
|
||||
LOAD(glRenderbufferStorage);
|
||||
LOAD(glFramebufferTexture);
|
||||
LOAD(glBufferSubData);
|
||||
LOAD(glVertexAttribIPointer);
|
||||
LOAD(glTexBuffer);
|
||||
|
||||
#undef LOAD
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user