diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index 648849e..77913a4 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -202,6 +202,9 @@ Known local toolchain state: Desktop VR drawing also consumes backend-owned scissor/depth/blend state, depth clear masks, active texture units, and fallback 2D texture unbind 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 for the current headless component matrix; see DEBT-0007 for remaining app and platform triplet migration. diff --git a/docs/modernization/roadmap.md b/docs/modernization/roadmap.md index d0f14f8..6f9077a 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -746,6 +746,9 @@ Results: depth clears, active texture units, and fallback 2D texture unbinds through the renderer GL backend mapping; platform VR SDK bridges remain isolated for 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 vcpkg-manifest warning, `LNK4099` missing libyuv PDBs, and `LNK4098` runtime library conflict from retained vendor binaries. diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 65ccc4d..a29ce6f 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -1,4 +1,7 @@ #include "pch.h" + +#include + #include "log.h" #include "canvas_modes.h" #include "layout.h" @@ -7,9 +10,19 @@ #include "node_canvas.h" #include "app.h" #include "util.h" +#include "renderer_gl/opengl_capabilities.h" 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) { 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, ((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; 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); @@ -303,15 +319,15 @@ void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::eulerAngleZ(tip_angle) * glm::scale(glm::vec3(tip_scale, 1)) ); - bool blend = glIsEnabled(GL_BLEND); - glEnable(GL_BLEND); - glActiveTexture(GL_TEXTURE0); + bool blend = glIsEnabled(pp::renderer::gl::blend_state()); + glEnable(pp::renderer::gl::blend_state()); + set_active_texture_unit(0); auto& tex = *brush->m_tip_texture; tex.bind(); Canvas::I->m_sampler_brush.bind(0); Canvas::I->m_plane.draw_fill(); 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::scale(glm::vec3(tip_scale, 1)) ); - bool blend = glIsEnabled(GL_BLEND); - glEnable(GL_BLEND); - glActiveTexture(GL_TEXTURE0); + bool blend = glIsEnabled(pp::renderer::gl::blend_state()); + glEnable(pp::renderer::gl::blend_state()); + set_active_texture_unit(0); auto& tex = *brush->m_tip_texture; tex.bind(); Canvas::I->m_sampler_brush.bind(0); Canvas::I->m_plane.draw_fill(); 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_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) { - //glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); + // blending state intentionally left unchanged here. + glDisable(pp::renderer::gl::depth_test_state()); ShaderManager::use(kShader::Color); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera); 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) { - bool depth = glIsEnabled(GL_DEPTH_TEST); - glDisable(GL_DEPTH_TEST); + bool depth = glIsEnabled(pp::renderer::gl::depth_test_state()); + glDisable(pp::renderer::gl::depth_test_state()); if (m_points.size() > 3) { if (m_dragging) @@ -803,7 +819,7 @@ void CanvasModeMaskFree::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, // 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()) { 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::u_mat4(kShaderUniform::MVP, proj * camera); 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(); m_tex[plane].create(bb_sz.x, bb_sz.y); 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(); 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([&] { glViewport(0, 0, layer->w, layer->h); - glDisable(GL_DEPTH_TEST); - glDisable(GL_BLEND); - glActiveTexture(GL_TEXTURE0); + glDisable(pp::renderer::gl::depth_test_state()); + glDisable(pp::renderer::gl::blend_state()); + set_active_texture_unit(0); ShaderManager::use(kShader::Color); ShaderManager::u_mat4(kShaderUniform::MVP, mvp); ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 0 }); layer->rtt(i).bindFramebuffer(); // 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++) m_shape[j].draw_fill(); layer->rtt(i).unbindFramebuffer(); @@ -1407,19 +1432,28 @@ void CanvasModeTransform::leave(kCanvasMode next) { layer->rtt(i).bindFramebuffer(); - glDisable(GL_DEPTH_TEST); - glDisable(GL_BLEND); - glActiveTexture(GL_TEXTURE0); + glDisable(pp::renderer::gl::depth_test_state()); + glDisable(pp::renderer::gl::blend_state()); + set_active_texture_unit(0); glViewport(0, 0, layer->rtt(i).getWidth(), layer->rtt(i).getHeight()); // 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 - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); 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 - glActiveTexture(GL_TEXTURE1); + set_active_texture_unit(1); for (int j = 0; j < 6; j++) { 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) { - bool depth = glIsEnabled(GL_DEPTH_TEST); - glDisable(GL_DEPTH_TEST); + bool depth = glIsEnabled(pp::renderer::gl::depth_test_state()); + glDisable(pp::renderer::gl::depth_test_state()); - glEnable(GL_BLEND); + glEnable(pp::renderer::gl::blend_state()); for (int i = 0; i < 6; i++) { 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::u_int(kShaderUniform::Tex, 0); ShaderManager::u_mat4(kShaderUniform::MVP, proj * camera * m_xform * m_xform_local); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_tex[i].bind(); Canvas::I->m_sampler_linear.bind(0); 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(); } - if (depth) glEnable(GL_DEPTH_TEST); + if (depth) glEnable(pp::renderer::gl::depth_test_state()); } void CanvasModeTransform::on_MouseEvent(MouseEvent* me, glm::vec2& loc)