Move canvas mode GL mappings to renderer gl

This commit is contained in:
2026-06-02 09:00:53 +02:00
parent 4a7eff24bf
commit 466c1d0cc0
3 changed files with 72 additions and 32 deletions

View File

@@ -202,6 +202,9 @@ Known local toolchain state:
Desktop VR drawing also consumes backend-owned scissor/depth/blend state, Desktop VR drawing also consumes backend-owned scissor/depth/blend state,
depth clear masks, active texture units, and fallback 2D texture unbind depth clear masks, active texture units, and fallback 2D texture unbind
targets while retaining the existing VR SDK/platform bridge shape. targets while retaining the existing VR SDK/platform bridge shape.
Canvas mode overlay, mask, and transform paths also consume backend-owned
blend/depth state, active texture units, 2D texture copy targets, and RGBA8
readback format tokens.
- `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

@@ -746,6 +746,9 @@ Results:
depth clears, active texture units, and fallback 2D texture unbinds through depth clears, active texture units, and fallback 2D texture unbinds through
the renderer GL backend mapping; platform VR SDK bridges remain isolated for the renderer GL backend mapping; platform VR SDK bridges remain isolated for
later platform-shell extraction. later platform-shell extraction.
- Canvas mode overlay, mask, and transform paths now route generic OpenGL
blend/depth state, active texture units, 2D copy targets, and RGBA8
readback formats through the renderer GL backend mapping.
- 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

@@ -1,4 +1,7 @@
#include "pch.h" #include "pch.h"
#include <cstdint>
#include "log.h" #include "log.h"
#include "canvas_modes.h" #include "canvas_modes.h"
#include "layout.h" #include "layout.h"
@@ -7,9 +10,19 @@
#include "node_canvas.h" #include "node_canvas.h"
#include "app.h" #include "app.h"
#include "util.h" #include "util.h"
#include "renderer_gl/opengl_capabilities.h"
NodeCanvas* CanvasMode::node; NodeCanvas* CanvasMode::node;
namespace {
void set_active_texture_unit(std::uint32_t unit_index)
{
glActiveTexture(pp::renderer::gl::active_texture_unit(unit_index));
}
}
void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc) void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
{ {
switch (me->m_type) switch (me->m_type)
@@ -292,7 +305,10 @@ void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const
} }
glReadPixels((pos.x / App::I->width) * fb_width, glReadPixels((pos.x / App::I->width) * fb_width,
((App::I->height - pos.y - 1) / App::I->height) * fb_height, ((App::I->height - pos.y - 1) / App::I->height) * fb_height,
1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel); 1, 1,
pp::renderer::gl::rgba_pixel_format(),
pp::renderer::gl::unsigned_byte_component_type(),
&pixel);
bool outline = glm::min(tip_scale.x, tip_scale.y) < 20 || m_resizing ? false : m_draw_outline; bool outline = glm::min(tip_scale.x, tip_scale.y) < 20 || m_resizing ? false : m_draw_outline;
ShaderManager::u_int(kShaderUniform::DrawOutline, outline); ShaderManager::u_int(kShaderUniform::DrawOutline, outline);
ShaderManager::u_vec4(kShaderUniform::Col, outline ? glm::vec4(1.f - glm::vec3(pixel) / 255.f, 1.f) : tip_color); ShaderManager::u_vec4(kShaderUniform::Col, outline ? glm::vec4(1.f - glm::vec3(pixel) / 255.f, 1.f) : tip_color);
@@ -303,15 +319,15 @@ void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const
glm::eulerAngleZ(tip_angle) * glm::eulerAngleZ(tip_angle) *
glm::scale(glm::vec3(tip_scale, 1)) glm::scale(glm::vec3(tip_scale, 1))
); );
bool blend = glIsEnabled(GL_BLEND); bool blend = glIsEnabled(pp::renderer::gl::blend_state());
glEnable(GL_BLEND); glEnable(pp::renderer::gl::blend_state());
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
auto& tex = *brush->m_tip_texture; auto& tex = *brush->m_tip_texture;
tex.bind(); tex.bind();
Canvas::I->m_sampler_brush.bind(0); Canvas::I->m_sampler_brush.bind(0);
Canvas::I->m_plane.draw_fill(); Canvas::I->m_plane.draw_fill();
tex.unbind(); tex.unbind();
if (!blend) glDisable(GL_BLEND); if (!blend) glDisable(pp::renderer::gl::blend_state());
} }
} }
@@ -409,15 +425,15 @@ void CanvasModeLine::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, cons
glm::eulerAngleZ(tip_angle) * glm::eulerAngleZ(tip_angle) *
glm::scale(glm::vec3(tip_scale, 1)) glm::scale(glm::vec3(tip_scale, 1))
); );
bool blend = glIsEnabled(GL_BLEND); bool blend = glIsEnabled(pp::renderer::gl::blend_state());
glEnable(GL_BLEND); glEnable(pp::renderer::gl::blend_state());
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
auto& tex = *brush->m_tip_texture; auto& tex = *brush->m_tip_texture;
tex.bind(); tex.bind();
Canvas::I->m_sampler_brush.bind(0); Canvas::I->m_sampler_brush.bind(0);
Canvas::I->m_plane.draw_fill(); Canvas::I->m_plane.draw_fill();
tex.unbind(); tex.unbind();
if (!blend) glDisable(GL_BLEND); if (!blend) glDisable(pp::renderer::gl::blend_state());
} }
} }
@@ -704,8 +720,8 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
m_selection_cam = Canvas::I->get_camera(); m_selection_cam = Canvas::I->get_camera();
//m_points2d = poly_intersect(poly_remove_duplicate(m_points2d), Canvas::I->face_to_shape2D(0)); //m_points2d = poly_intersect(poly_remove_duplicate(m_points2d), Canvas::I->face_to_shape2D(0));
auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) { auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) {
//glEnable(GL_BLEND); // blending state intentionally left unchanged here.
glDisable(GL_DEPTH_TEST); glDisable(pp::renderer::gl::depth_test_state());
ShaderManager::use(kShader::Color); ShaderManager::use(kShader::Color);
ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera);
ShaderManager::u_vec4(kShaderUniform::Col, ShaderManager::u_vec4(kShaderUniform::Col,
@@ -783,8 +799,8 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
void CanvasModeMaskFree::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) void CanvasModeMaskFree::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera)
{ {
bool depth = glIsEnabled(GL_DEPTH_TEST); bool depth = glIsEnabled(pp::renderer::gl::depth_test_state());
glDisable(GL_DEPTH_TEST); glDisable(pp::renderer::gl::depth_test_state());
if (m_points.size() > 3) if (m_points.size() > 3)
{ {
if (m_dragging) if (m_dragging)
@@ -803,7 +819,7 @@ void CanvasModeMaskFree::on_Draw(const glm::mat4& ortho, const glm::mat4& proj,
// m_shape.draw_stroke(); // m_shape.draw_stroke();
//} //}
} }
if (depth) glEnable(GL_DEPTH_TEST); if (depth) glEnable(pp::renderer::gl::depth_test_state());
} }
@@ -840,7 +856,7 @@ void CanvasModeMaskLine::leave(kCanvasMode next)
if (!m_points.empty()) if (!m_points.empty())
{ {
auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) { auto drawer = [this](const glm::mat4& camera, const glm::mat4& proj) {
//glEnable(GL_BLEND); // blending state intentionally left unchanged here.
ShaderManager::use(kShader::Color); ShaderManager::use(kShader::Color);
ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera);
ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1}); ShaderManager::u_vec4(kShaderUniform::Col, {1, 1, 1, 1});
@@ -1248,7 +1264,9 @@ void CanvasModeTransform::enter(kCanvasMode prev)
Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->rtt(plane).bindFramebuffer(); Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->rtt(plane).bindFramebuffer();
m_tex[plane].create(bb_sz.x, bb_sz.y); m_tex[plane].create(bb_sz.x, bb_sz.y);
m_tex[plane].bind(); m_tex[plane].bind();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bb_min.x, bb_min.y, bb_sz.x, bb_sz.y); glCopyTexSubImage2D(
pp::renderer::gl::texture_2d_target(),
0, 0, 0, bb_min.x, bb_min.y, bb_sz.x, bb_sz.y);
m_tex[plane].unbind(); m_tex[plane].unbind();
Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->rtt(plane).unbindFramebuffer(); Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->rtt(plane).unbindFramebuffer();
}); });
@@ -1307,15 +1325,22 @@ void CanvasModeTransform::enter(kCanvasMode prev)
App::I->render_task([&] App::I->render_task([&]
{ {
glViewport(0, 0, layer->w, layer->h); glViewport(0, 0, layer->w, layer->h);
glDisable(GL_DEPTH_TEST); glDisable(pp::renderer::gl::depth_test_state());
glDisable(GL_BLEND); glDisable(pp::renderer::gl::blend_state());
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
ShaderManager::use(kShader::Color); ShaderManager::use(kShader::Color);
ShaderManager::u_mat4(kShaderUniform::MVP, mvp); ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 0 }); ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 0 });
layer->rtt(i).bindFramebuffer(); layer->rtt(i).bindFramebuffer();
// copy framebuffer to action data // copy framebuffer to action data
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get()); glReadPixels(
bb_min.x,
bb_min.y,
bb_sz.x,
bb_sz.y,
pp::renderer::gl::rgba_pixel_format(),
pp::renderer::gl::unsigned_byte_component_type(),
action->m_image[i].get());
for (int j = 0; j < 6; j++) for (int j = 0; j < 6; j++)
m_shape[j].draw_fill(); m_shape[j].draw_fill();
layer->rtt(i).unbindFramebuffer(); layer->rtt(i).unbindFramebuffer();
@@ -1407,19 +1432,28 @@ void CanvasModeTransform::leave(kCanvasMode next)
{ {
layer->rtt(i).bindFramebuffer(); layer->rtt(i).bindFramebuffer();
glDisable(GL_DEPTH_TEST); glDisable(pp::renderer::gl::depth_test_state());
glDisable(GL_BLEND); glDisable(pp::renderer::gl::blend_state());
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
glViewport(0, 0, layer->rtt(i).getWidth(), layer->rtt(i).getHeight()); glViewport(0, 0, layer->rtt(i).getWidth(), layer->rtt(i).getHeight());
// save fb content for history // save fb content for history
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get()); glReadPixels(
bb_min.x,
bb_min.y,
bb_sz.x,
bb_sz.y,
pp::renderer::gl::rgba_pixel_format(),
pp::renderer::gl::unsigned_byte_component_type(),
action->m_image[i].get());
// copy fb content to texture for blending // copy fb content to texture for blending
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
Canvas::I->m_tex2[i].bind(); Canvas::I->m_tex2[i].bind();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, bb_min.x, bb_min.y, bb_min.x, bb_min.y, bb_sz.x, bb_sz.y); glCopyTexSubImage2D(
pp::renderer::gl::texture_2d_target(),
0, bb_min.x, bb_min.y, bb_min.x, bb_min.y, bb_sz.x, bb_sz.y);
// slot for m_tex // slot for m_tex
glActiveTexture(GL_TEXTURE1); set_active_texture_unit(1);
for (int j = 0; j < 6; j++) for (int j = 0; j < 6; j++)
{ {
ShaderManager::use(kShader::CompDraw); ShaderManager::use(kShader::CompDraw);
@@ -1456,10 +1490,10 @@ void CanvasModeTransform::leave(kCanvasMode next)
void CanvasModeTransform::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) void CanvasModeTransform::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera)
{ {
bool depth = glIsEnabled(GL_DEPTH_TEST); bool depth = glIsEnabled(pp::renderer::gl::depth_test_state());
glDisable(GL_DEPTH_TEST); glDisable(pp::renderer::gl::depth_test_state());
glEnable(GL_BLEND); glEnable(pp::renderer::gl::blend_state());
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
ShaderManager::use(kShader::Color); ShaderManager::use(kShader::Color);
@@ -1470,7 +1504,7 @@ void CanvasModeTransform::on_Draw(const glm::mat4& ortho, const glm::mat4& proj,
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, proj * camera * m_xform * m_xform_local); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera * m_xform * m_xform_local);
glActiveTexture(GL_TEXTURE0); set_active_texture_unit(0);
m_tex[i].bind(); m_tex[i].bind();
Canvas::I->m_sampler_linear.bind(0); Canvas::I->m_sampler_linear.bind(0);
m_shape[i].draw_fill(); m_shape[i].draw_fill();
@@ -1499,7 +1533,7 @@ void CanvasModeTransform::on_Draw(const glm::mat4& ortho, const glm::mat4& proj,
m_circle.draw_stroke(); m_circle.draw_stroke();
} }
if (depth) glEnable(GL_DEPTH_TEST); if (depth) glEnable(pp::renderer::gl::depth_test_state());
} }
void CanvasModeTransform::on_MouseEvent(MouseEvent* me, glm::vec2& loc) void CanvasModeTransform::on_MouseEvent(MouseEvent* me, glm::vec2& loc)