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

@@ -73,6 +73,26 @@ GLenum 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()
{
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
GLint vp[4];
GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc);
GLboolean blend = glIsEnabled(GL_BLEND);
glGetIntegerv(viewport_query(), vp);
glGetFloatv(color_clear_value_query(), cc);
auto blend = glIsEnabled(blend_state());
// prepare common states
glViewport(0, 0, w, h);
@@ -2760,7 +2780,7 @@ Image Canvas::thumbnail_generate(int w, int h)
fb.clear({ 1, 1, 1, 0 });
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));
ShaderManager::use(kShader::TextureBlend);
@@ -2769,7 +2789,7 @@ Image Canvas::thumbnail_generate(int w, int h)
if (!ShaderManager::ext_framebuffer_fetch)
{
ShaderManager::u_int(kShaderUniform::TexBG, 2);
glActiveTexture(GL_TEXTURE2);
set_active_texture_unit(2);
blendtex.bind();
m_sampler_nearest.bind(2);
}
@@ -2782,12 +2802,12 @@ Image Canvas::thumbnail_generate(int w, int h)
continue;
if (!ShaderManager::ext_framebuffer_fetch)
{
glActiveTexture(GL_TEXTURE2);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h);
set_active_texture_unit(2);
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_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_face_plane.draw_fill();
m_layers[layer_index]->rtt(i).unbindTexture();
@@ -2795,14 +2815,14 @@ Image Canvas::thumbnail_generate(int w, int h)
if (!ShaderManager::ext_framebuffer_fetch)
{
glActiveTexture(GL_TEXTURE2);
set_active_texture_unit(2);
blendtex.unbind();
}
glActiveTexture(GL_TEXTURE0);
set_active_texture_unit(0);
blendtex.bind();
// 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
ShaderManager::use(kShader::Checkerboard);
@@ -2810,7 +2830,7 @@ Image Canvas::thumbnail_generate(int w, int h)
m_face_plane.draw_fill();
// now blend with the background
glEnable(GL_BLEND);
glEnable(blend_state());
ShaderManager::use(kShader::Texture);
ShaderManager::u_int(kShaderUniform::Tex, 0);
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();
// 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]);
glClearColor(cc[0], cc[1], cc[2], cc[3]);
glActiveTexture(GL_TEXTURE0);
set_active_texture_unit(0);
});
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
GLint vp[4];
GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc);
GLboolean blend = glIsEnabled(GL_BLEND);
glGetIntegerv(viewport_query(), vp);
glGetFloatv(color_clear_value_query(), cc);
auto blend = glIsEnabled(blend_state());
// prepare common states
glViewport(0, 0, layer.w, layer.h);
glDisable(GL_BLEND);
glDisable(blend_state());
GLuint rboID;
glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, layer.w, layer.h);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glBindRenderbuffer(renderbuffer_target(), rboID);
glRenderbufferStorage(renderbuffer_target(), depth_component24_format(), layer.w, layer.h);
glBindRenderbuffer(renderbuffer_target(), 0);
glm::mat4 proj = glm::perspective(glm::radians(90.f), 1.f, .01f, 1000.f);
for (int i = 0; i < 6; i++)
{
glm::mat4 plane_camera = glm::lookAt(glm::vec3(0), m_plane_origin[i], m_plane_tangent[i]);
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);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0);
glFramebufferRenderbuffer(framebuffer_target(), framebuffer_depth_attachment(), renderbuffer_target(), 0);
layer.rtt(i, frame).unbindFramebuffer();
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);
// 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]);
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
GLint vp[4];
GLfloat cc[4];
glGetIntegerv(GL_VIEWPORT, vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc);
GLboolean blend = glIsEnabled(GL_BLEND);
glGetIntegerv(viewport_query(), vp);
glGetFloatv(color_clear_value_query(), cc);
auto blend = glIsEnabled(blend_state());
// prepare common states
glViewport(0, 0, layer.w, layer.h);
glDisable(GL_BLEND);
glDisable(blend_state());
GLuint rboID;
glGenRenderbuffers(1, &rboID);
glBindRenderbuffer(GL_RENDERBUFFER, rboID);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, layer.w, layer.h);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
glBindRenderbuffer(renderbuffer_target(), rboID);
glRenderbufferStorage(renderbuffer_target(), depth_component24_format(), layer.w, layer.h);
glBindRenderbuffer(renderbuffer_target(), 0);
RTT rtt;
rtt.create(layer.w, layer.h);
rtt.bindFramebuffer();
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboID);
glFramebufferRenderbuffer(framebuffer_target(), framebuffer_depth_attachment(), renderbuffer_target(), rboID);
rtt.unbindFramebuffer();
// 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)
{
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_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::u_int(kShaderUniform::Tex, 0);
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);
rtt.bindTexture();
m_plane.draw_fill();
@@ -3010,10 +3030,10 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
rtt.destroy();
// 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]);
glClearColor(cc[0], cc[1], cc[2], cc[3]);
glActiveTexture(GL_TEXTURE0);
set_active_texture_unit(0);
});
}