Route remaining canvas GL constants through renderer gl

This commit is contained in:
2026-06-02 09:27:42 +02:00
parent b7d9dfbf31
commit c22f2e7fa2
3 changed files with 67 additions and 37 deletions

View File

@@ -226,6 +226,11 @@ Known local toolchain state:
unbind targets, and merge framebuffer copy targets. unbind targets, and merge framebuffer copy targets.
Canvas equirectangular import drawing and depth export rendering also consume Canvas equirectangular import drawing and depth export rendering also consume
backend-owned depth/blend state and active texture units. backend-owned depth/blend state and active texture units.
Canvas thumbnail generation and object-drawing helpers also consume
backend-owned saved viewport/clear/blend state, active texture units,
readback format/type, framebuffer copy targets, and renderbuffer/depth
attachment parameters; `src/canvas.cpp` no longer contains raw `GL_*`
constants.
- `windows-msvc-vcpkg-headless` validates manifest install/configure/build/test - `windows-msvc-vcpkg-headless` validates manifest install/configure/build/test
for the current headless component matrix; see DEBT-0007 for remaining app for the current headless component matrix; see DEBT-0007 for remaining app
and platform triplet migration. and platform triplet migration.

View File

@@ -771,6 +771,11 @@ Results:
- Canvas equirectangular import drawing and depth export rendering now route - Canvas equirectangular import drawing and depth export rendering now route
depth/blend state and active texture units through the renderer GL backend depth/blend state and active texture units through the renderer GL backend
mapping. mapping.
- Canvas thumbnail generation and object-drawing helpers now route saved
viewport/clear/blend state, active texture units, readback format/type,
framebuffer copy targets, and renderbuffer/depth attachment parameters through
the renderer GL backend mapping; `src/canvas.cpp` no longer contains raw
`GL_*` constants.
- Known remaining warnings: legacy project/vendor diagnostics, Visual Studio - Known remaining warnings: legacy project/vendor diagnostics, Visual Studio
vcpkg-manifest warning, `LNK4099` missing libyuv PDBs, and `LNK4098` runtime vcpkg-manifest warning, `LNK4099` missing libyuv PDBs, and `LNK4098` runtime
library conflict from retained vendor binaries. library conflict from retained vendor binaries.

View File

@@ -73,6 +73,26 @@ GLenum blend_state()
return static_cast<GLenum>(pp::renderer::gl::blend_state()); return static_cast<GLenum>(pp::renderer::gl::blend_state());
} }
GLenum renderbuffer_target()
{
return static_cast<GLenum>(pp::renderer::gl::renderbuffer_target());
}
GLenum depth_component24_format()
{
return static_cast<GLenum>(pp::renderer::gl::depth_component24_format());
}
GLenum framebuffer_target()
{
return static_cast<GLenum>(pp::renderer::gl::framebuffer_target());
}
GLenum framebuffer_depth_attachment()
{
return static_cast<GLenum>(pp::renderer::gl::framebuffer_depth_attachment());
}
GLint texture_filter_linear() GLint texture_filter_linear()
{ {
return static_cast<GLint>(pp::renderer::gl::linear_texture_filter()); return static_cast<GLint>(pp::renderer::gl::linear_texture_filter());
@@ -2739,9 +2759,9 @@ Image Canvas::thumbnail_generate(int w, int h)
// save viewport and clear color states // save viewport and clear color states
GLint vp[4]; GLint vp[4];
GLfloat cc[4]; GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp); glGetIntegerv(viewport_query(), vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); glGetFloatv(color_clear_value_query(), cc);
GLboolean blend = glIsEnabled(GL_BLEND); auto blend = glIsEnabled(blend_state());
// prepare common states // prepare common states
glViewport(0, 0, w, h); glViewport(0, 0, w, h);
@@ -2760,7 +2780,7 @@ Image Canvas::thumbnail_generate(int w, int h)
fb.clear({ 1, 1, 1, 0 }); fb.clear({ 1, 1, 1, 0 });
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
glDisable(GL_BLEND); glDisable(blend_state());
auto plane_mvp = proj * m_mv * m_plane_transform[i] * glm::translate(glm::vec3(0, 0, -1)); auto plane_mvp = proj * m_mv * m_plane_transform[i] * glm::translate(glm::vec3(0, 0, -1));
ShaderManager::use(kShader::TextureBlend); ShaderManager::use(kShader::TextureBlend);
@@ -2769,7 +2789,7 @@ Image Canvas::thumbnail_generate(int w, int h)
if (!ShaderManager::ext_framebuffer_fetch) if (!ShaderManager::ext_framebuffer_fetch)
{ {
ShaderManager::u_int(kShaderUniform::TexBG, 2); ShaderManager::u_int(kShaderUniform::TexBG, 2);
glActiveTexture(GL_TEXTURE2); set_active_texture_unit(2);
blendtex.bind(); blendtex.bind();
m_sampler_nearest.bind(2); m_sampler_nearest.bind(2);
} }
@@ -2782,12 +2802,12 @@ Image Canvas::thumbnail_generate(int w, int h)
continue; continue;
if (!ShaderManager::ext_framebuffer_fetch) if (!ShaderManager::ext_framebuffer_fetch)
{ {
glActiveTexture(GL_TEXTURE2); set_active_texture_unit(2);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h); glCopyTexSubImage2D(texture_2d_target(), 0, 0, 0, 0, 0, w, h);
} }
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index]->m_blend_mode); ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index]->m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity);
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
m_layers[layer_index]->rtt(i).bindTexture(); m_layers[layer_index]->rtt(i).bindTexture();
m_face_plane.draw_fill(); m_face_plane.draw_fill();
m_layers[layer_index]->rtt(i).unbindTexture(); m_layers[layer_index]->rtt(i).unbindTexture();
@@ -2795,14 +2815,14 @@ Image Canvas::thumbnail_generate(int w, int h)
if (!ShaderManager::ext_framebuffer_fetch) if (!ShaderManager::ext_framebuffer_fetch)
{ {
glActiveTexture(GL_TEXTURE2); set_active_texture_unit(2);
blendtex.unbind(); blendtex.unbind();
} }
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
blendtex.bind(); blendtex.bind();
// copy the content of the fb before drawing the grid // copy the content of the fb before drawing the grid
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h); glCopyTexSubImage2D(texture_2d_target(), 0, 0, 0, 0, 0, w, h);
// draw the grid // draw the grid
ShaderManager::use(kShader::Checkerboard); ShaderManager::use(kShader::Checkerboard);
@@ -2810,7 +2830,7 @@ Image Canvas::thumbnail_generate(int w, int h)
m_face_plane.draw_fill(); m_face_plane.draw_fill();
// now blend with the background // now blend with the background
glEnable(GL_BLEND); glEnable(blend_state());
ShaderManager::use(kShader::Texture); ShaderManager::use(kShader::Texture);
ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::Tex, 0);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
@@ -2829,10 +2849,10 @@ Image Canvas::thumbnail_generate(int w, int h)
blendtex.destroy(); blendtex.destroy();
// restore viewport and clear color states // restore viewport and clear color states
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); blend ? glEnable(blend_state()) : glDisable(blend_state());
glViewport(vp[0], vp[1], vp[2], vp[3]); glViewport(vp[0], vp[1], vp[2], vp[3]);
glClearColor(cc[0], cc[1], cc[2], cc[3]); glClearColor(cc[0], cc[1], cc[2], cc[3]);
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
}); });
return image; return image;
@@ -2872,30 +2892,30 @@ void Canvas::draw_objects_direct(std::function<void(const glm::mat4& camera, con
// save viewport and clear color states // save viewport and clear color states
GLint vp[4]; GLint vp[4];
GLfloat cc[4]; GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp); glGetIntegerv(viewport_query(), vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); glGetFloatv(color_clear_value_query(), cc);
GLboolean blend = glIsEnabled(GL_BLEND); auto blend = glIsEnabled(blend_state());
// prepare common states // prepare common states
glViewport(0, 0, layer.w, layer.h); glViewport(0, 0, layer.w, layer.h);
glDisable(GL_BLEND); glDisable(blend_state());
GLuint rboID; GLuint rboID;
glGenRenderbuffers(1, &rboID); glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID); glBindRenderbuffer(renderbuffer_target(), rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, layer.w, layer.h); glRenderbufferStorage(renderbuffer_target(), depth_component24_format(), layer.w, layer.h);
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(renderbuffer_target(), 0);
glm::mat4 proj = glm::perspective(glm::radians(90.f), 1.f, .01f, 1000.f); glm::mat4 proj = glm::perspective(glm::radians(90.f), 1.f, .01f, 1000.f);
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
glm::mat4 plane_camera = glm::lookAt(glm::vec3(0), m_plane_origin[i], m_plane_tangent[i]); glm::mat4 plane_camera = glm::lookAt(glm::vec3(0), m_plane_origin[i], m_plane_tangent[i]);
layer.rtt(i, frame).bindFramebuffer(); layer.rtt(i, frame).bindFramebuffer();
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID); glFramebufferRenderbuffer(framebuffer_target(), framebuffer_depth_attachment(), renderbuffer_target(), rboID);
observer(plane_camera, proj, i); observer(plane_camera, proj, i);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); glFramebufferRenderbuffer(framebuffer_target(), framebuffer_depth_attachment(), renderbuffer_target(), 0);
layer.rtt(i, frame).unbindFramebuffer(); layer.rtt(i, frame).unbindFramebuffer();
layer.face(i, frame) = true; layer.face(i, frame) = true;
@@ -2905,10 +2925,10 @@ void Canvas::draw_objects_direct(std::function<void(const glm::mat4& camera, con
glDeleteRenderbuffers(1, &rboID); glDeleteRenderbuffers(1, &rboID);
// restore viewport and clear color states // restore viewport and clear color states
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); blend ? glEnable(blend_state()) : glDisable(blend_state());
glViewport(vp[0], vp[1], vp[2], vp[3]); glViewport(vp[0], vp[1], vp[2], vp[3]);
glClearColor(cc[0], cc[1], cc[2], cc[3]); glClearColor(cc[0], cc[1], cc[2], cc[3]);
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
}); });
} }
@@ -2919,24 +2939,24 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
// save viewport and clear color states // save viewport and clear color states
GLint vp[4]; GLint vp[4];
GLfloat cc[4]; GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp); glGetIntegerv(viewport_query(), vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); glGetFloatv(color_clear_value_query(), cc);
GLboolean blend = glIsEnabled(GL_BLEND); auto blend = glIsEnabled(blend_state());
// prepare common states // prepare common states
glViewport(0, 0, layer.w, layer.h); glViewport(0, 0, layer.w, layer.h);
glDisable(GL_BLEND); glDisable(blend_state());
GLuint rboID; GLuint rboID;
glGenRenderbuffers(1, &rboID); glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID); glBindRenderbuffer(renderbuffer_target(), rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, layer.w, layer.h); glRenderbufferStorage(renderbuffer_target(), depth_component24_format(), layer.w, layer.h);
glBindRenderbuffer(GL_RENDERBUFFER, 0); glBindRenderbuffer(renderbuffer_target(), 0);
RTT rtt; RTT rtt;
rtt.create(layer.w, layer.h); rtt.create(layer.w, layer.h);
rtt.bindFramebuffer(); rtt.bindFramebuffer();
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID); glFramebufferRenderbuffer(framebuffer_target(), framebuffer_depth_attachment(), renderbuffer_target(), rboID);
rtt.unbindFramebuffer(); rtt.unbindFramebuffer();
// allocate action to add to history // allocate action to add to history
@@ -2970,7 +2990,7 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
if (has_data) if (has_data)
{ {
action->m_image[i] = std::make_unique<uint8_t[]>(box_sz.x * box_sz.y * 4); action->m_image[i] = std::make_unique<uint8_t[]>(box_sz.x * box_sz.y * 4);
glReadPixels(bounds.x, bounds.y, box_sz.x, box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get()); glReadPixels(bounds.x, bounds.y, box_sz.x, box_sz.y, rgba_pixel_format(), unsigned_byte_component_type(), action->m_image[i].get());
action->m_box[i] = bounds; action->m_box[i] = bounds;
} }
action->m_old_box[i] = layer.box(i, frame); action->m_old_box[i] = layer.box(i, frame);
@@ -2983,7 +3003,7 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
ShaderManager::use(kShader::Texture); ShaderManager::use(kShader::Texture);
ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::Tex, 0);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-0.5f, 0.5f, -0.5f, 0.5f)); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-0.5f, 0.5f, -0.5f, 0.5f));
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
m_sampler_nearest.bind(0); m_sampler_nearest.bind(0);
rtt.bindTexture(); rtt.bindTexture();
m_plane.draw_fill(); m_plane.draw_fill();
@@ -3010,10 +3030,10 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
rtt.destroy(); rtt.destroy();
// restore viewport and clear color states // restore viewport and clear color states
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); blend ? glEnable(blend_state()) : glDisable(blend_state());
glViewport(vp[0], vp[1], vp[2], vp[3]); glViewport(vp[0], vp[1], vp[2], vp[3]);
glClearColor(cc[0], cc[1], cc[2], cc[3]); glClearColor(cc[0], cc[1], cc[2], cc[3]);
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
}); });
} }