From bbe83786304b8ee7b74d046eaeedee66103bbc56 Mon Sep 17 00:00:00 2001 From: omigamedev Date: Tue, 2 Jun 2026 09:04:28 +0200 Subject: [PATCH] Move NodeCanvas GL mappings to renderer gl --- docs/modernization/build-inventory.md | 4 + docs/modernization/roadmap.md | 4 + src/node_canvas.cpp | 130 +++++++++++++++----------- 3 files changed, 84 insertions(+), 54 deletions(-) diff --git a/docs/modernization/build-inventory.md b/docs/modernization/build-inventory.md index 77913a4..74a9eb0 100644 --- a/docs/modernization/build-inventory.md +++ b/docs/modernization/build-inventory.md @@ -205,6 +205,10 @@ Known local toolchain state: 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. + `NodeCanvas` panorama UI rendering also consumes backend-owned sampler + defaults, viewport/clear-state queries, blend/depth/scissor state, color + clear masks, active texture units, fallback 2D texture unbind targets, copy + targets, and RGBA8 render-target formats. - `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 6f9077a..2bf2011 100644 --- a/docs/modernization/roadmap.md +++ b/docs/modernization/roadmap.md @@ -749,6 +749,10 @@ Results: - 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. +- `NodeCanvas` panorama UI rendering now routes sampler defaults, saved + viewport/clear/blend/depth/scissor state, color clears, active texture units, + fallback 2D texture unbinds, copy targets, and RGBA8 render-target 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/node_canvas.cpp b/src/node_canvas.cpp index 2f33265..6061c83 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -1,9 +1,27 @@ #include "pch.h" + +#include + #include "app.h" #include "log.h" #include "node_canvas.h" #include "node_image_texture.h" #include "settings.h" +#include "renderer_gl/opengl_capabilities.h" + +namespace { + +void set_active_texture_unit(std::uint32_t unit_index) +{ + glActiveTexture(pp::renderer::gl::active_texture_unit(unit_index)); +} + +void unbind_texture_2d() +{ + glBindTexture(pp::renderer::gl::texture_2d_target(), 0); +} + +} Node* NodeCanvas::clone_instantiate() const { @@ -22,12 +40,14 @@ void NodeCanvas::init() m_canvas->m_node = this; m_sampler.create(); - //m_sampler.set_filter(GL_LINEAR, GL_NEAREST); + //m_sampler.set_filter(pp::renderer::gl::linear_texture_filter(), pp::renderer::gl::nearest_texture_filter()); - m_sampler_nearest.create(GL_NEAREST); + m_sampler_nearest.create(pp::renderer::gl::nearest_texture_filter()); - m_sampler_linear.create(GL_LINEAR); - m_sampler_stencil.create(GL_LINEAR, GL_REPEAT); + m_sampler_linear.create(pp::renderer::gl::linear_texture_filter()); + m_sampler_stencil.create( + pp::renderer::gl::linear_texture_filter(), + pp::renderer::gl::repeat_texture_wrap()); m_face_plane.create<1>(2, 2); m_line.create(); CanvasMode::node = this; @@ -45,7 +65,9 @@ void NodeCanvas::restore_context() m_sampler.create(); - m_sampler.set_filter(GL_LINEAR, GL_NEAREST); + m_sampler.set_filter( + pp::renderer::gl::linear_texture_filter(), + pp::renderer::gl::nearest_texture_filter()); m_face_plane.create<1>(2, 2); m_canvas->snapshot_restore(); CanvasMode::node = this; @@ -74,13 +96,13 @@ void NodeCanvas::draw() GLint vp[4]; GLfloat cc[4]; - glGetIntegerv(GL_VIEWPORT, vp); - glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); - auto blend = glIsEnabled(GL_BLEND); - auto depth = glIsEnabled(GL_DEPTH_TEST); - auto scissor = glIsEnabled(GL_SCISSOR_TEST); + glGetIntegerv(pp::renderer::gl::viewport_query(), vp); + glGetFloatv(pp::renderer::gl::color_clear_value_query(), cc); + auto blend = glIsEnabled(pp::renderer::gl::blend_state()); + auto depth = glIsEnabled(pp::renderer::gl::depth_test_state()); + auto scissor = glIsEnabled(pp::renderer::gl::scissor_test_state()); - glDisable(GL_SCISSOR_TEST); + glDisable(pp::renderer::gl::scissor_test_state()); glm::ivec4 c = (glm::ivec4)glm::vec4(box.x, (int)(vp[3] - box.y - box.w), box.z, box.w); @@ -120,13 +142,13 @@ void NodeCanvas::draw() { m_rtt.bindFramebuffer(); glClearColor(1, 1, 0, 0); - glClear(GL_COLOR_BUFFER_BIT); + glClear(pp::renderer::gl::framebuffer_color_buffer_mask()); glViewport(0, 0, m_rtt.getWidth(), m_rtt.getHeight()); } else { glClearColor(1, 1, 1, 0); - glClear(GL_COLOR_BUFFER_BIT); + glClear(pp::renderer::gl::framebuffer_color_buffer_mask()); glViewport(c.x + App::I->off_x, c.y + App::I->off_y, c.z, c.w); } @@ -136,7 +158,7 @@ void NodeCanvas::draw() if (draw_merged) { - glDisable(GL_BLEND); + glDisable(pp::renderer::gl::blend_state()); // draw the grid for (int plane_index = 0; plane_index < 6; plane_index++) { @@ -164,7 +186,7 @@ void NodeCanvas::draw() ShaderManager::u_int(kShaderUniform::Highlight, false); ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers_merge.rtt(plane_index).bindTexture(); m_face_plane.draw_fill(); m_canvas->m_layers_merge.rtt(plane_index).unbindTexture(); @@ -205,8 +227,8 @@ void NodeCanvas::draw() } // if not using shader blend, use gl rasterizer blend - use_blend ? glDisable(GL_BLEND) : glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); + use_blend ? glDisable(pp::renderer::gl::blend_state()) : glEnable(pp::renderer::gl::blend_state()); + glDisable(pp::renderer::gl::depth_test_state()); const auto& b = m_canvas->m_current_stroke->m_brush; @@ -254,23 +276,23 @@ void NodeCanvas::draw() //ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked); ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z); - glActiveTexture(GL_TEXTURE1); + set_active_texture_unit(1); m_canvas->m_tmp[plane_index].bindTexture(); - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_canvas->m_smask.rtt(plane_index).bindTexture(); for (int frame = frame_start; frame <= frame_end; frame++) { float onion_alpha = 1.f - (float)glm::abs(frame - frame_current) / (float)(onion_size + 1); ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index]->m_opacity* onion_alpha); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).bindTexture(); m_face_plane.draw_fill(); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).unbindTexture(); } - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_canvas->m_smask.rtt(plane_index).unbindTexture(); - glActiveTexture(GL_TEXTURE1); + set_active_texture_unit(1); m_canvas->m_tmp[plane_index].unbindTexture(); } else if(m_canvas->m_current_stroke && m_canvas->m_show_tmp && m_canvas->m_current_layer_idx == layer_index) @@ -309,33 +331,33 @@ void NodeCanvas::draw() ShaderManager::u_int(kShaderUniform::PatternBlendMode, b->m_pattern_blend_mode); ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset); - glActiveTexture(GL_TEXTURE1); + set_active_texture_unit(1); m_canvas->m_tmp[plane_index].bindTexture(); - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_canvas->m_smask.rtt(plane_index).bindTexture(); - glActiveTexture(GL_TEXTURE3); + set_active_texture_unit(3); if (b->m_dual_enabled) m_canvas->m_tmp_dual[plane_index].bindTexture(); - glActiveTexture(GL_TEXTURE4); + set_active_texture_unit(4); b->m_pattern_texture ? b->m_pattern_texture->bind() : - glBindTexture(GL_TEXTURE_2D, 0); + unbind_texture_2d(); for (int frame = frame_start; frame <= frame_end; frame++) { float onion_alpha = 1.f - (float)glm::abs(frame - frame_current) / (float)(onion_size + 1); ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index]->m_opacity * onion_alpha); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).bindTexture(); m_face_plane.draw_fill(); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).unbindTexture(); } - glActiveTexture(GL_TEXTURE3); + set_active_texture_unit(3); if (b->m_dual_enabled) m_canvas->m_tmp_dual[plane_index].unbindTexture(); - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_canvas->m_smask.rtt(plane_index).unbindTexture(); - glActiveTexture(GL_TEXTURE1); + set_active_texture_unit(1); m_canvas->m_tmp[plane_index].unbindTexture(); } else @@ -350,7 +372,7 @@ void NodeCanvas::draw() { float onion_alpha = 1.f - (float)glm::abs(frame - frame_current) / (float)(onion_size + 1); ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index]->m_opacity * onion_alpha); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).bindTexture(); m_face_plane.draw_fill(); m_canvas->m_layers[layer_index]->rtt(plane_index, frame).unbindTexture(); @@ -376,13 +398,13 @@ void NodeCanvas::draw() ShaderManager::u_float(kShaderUniform::Alpha, 1.f); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-1, 1, -1, 1)); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_blender_rtt.bindTexture(); if (!ShaderManager::ext_framebuffer_fetch) { - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_blender_bg.bind(); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, + glCopyTexSubImage2D(pp::renderer::gl::texture_2d_target(), 0, 0, 0, 0, 0, m_blender_bg.size().x, m_blender_bg.size().y); } @@ -390,10 +412,10 @@ void NodeCanvas::draw() if (!ShaderManager::ext_framebuffer_fetch) { - glActiveTexture(GL_TEXTURE2); + set_active_texture_unit(2); m_blender_bg.unbind(); } - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_blender_rtt.unbindTexture(); } @@ -428,7 +450,7 @@ void NodeCanvas::draw() // draw the grid behind the layers using a temporary copy if (use_blend) { - glEnable(GL_BLEND); + glEnable(pp::renderer::gl::blend_state()); //draw the grid for (int plane_index = 0; plane_index < 6; plane_index++) @@ -446,7 +468,7 @@ void NodeCanvas::draw() // draw the layers m_sampler.bind(0); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_cache_rtt.bindTexture(); ShaderManager::use(kShader::Texture); ShaderManager::u_int(kShaderUniform::Tex, 0); @@ -456,7 +478,7 @@ void NodeCanvas::draw() } } - glDisable(GL_DEPTH_TEST); + glDisable(pp::renderer::gl::depth_test_state()); if (m_canvas->m_smask_active || m_canvas->m_current_mode == kCanvasMode::Copy || m_canvas->m_current_mode == kCanvasMode::Cut) { @@ -471,8 +493,8 @@ void NodeCanvas::draw() ShaderManager::use(kShader::TextureMask); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_outline_pan); - glActiveTexture(GL_TEXTURE0); - glEnable(GL_BLEND); + set_active_texture_unit(0); + glEnable(pp::renderer::gl::blend_state()); //draw the cube faces for (int plane_index = 0; plane_index < 6; plane_index++) @@ -506,12 +528,12 @@ void NodeCanvas::draw() m_rtt.unbindFramebuffer(); glClearColor(1, 1, 1, 0); - glClear(GL_COLOR_BUFFER_BIT); + glClear(pp::renderer::gl::framebuffer_color_buffer_mask()); glViewport(c.x + App::I->off_x, c.y + App::I->off_y, c.z, c.w); // draw the canvas m_sampler_nearest.bind(0); - glActiveTexture(GL_TEXTURE0); + set_active_texture_unit(0); m_rtt.bindTexture(); ShaderManager::use(kShader::Texture); ShaderManager::u_int(kShaderUniform::Tex, 0); @@ -520,9 +542,9 @@ void NodeCanvas::draw() m_rtt.unbindTexture(); } - scissor ? glEnable(GL_SCISSOR_TEST) : glDisable(GL_SCISSOR_TEST); - blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); - depth ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST); + scissor ? glEnable(pp::renderer::gl::scissor_test_state()) : glDisable(pp::renderer::gl::scissor_test_state()); + blend ? glEnable(pp::renderer::gl::blend_state()) : glDisable(pp::renderer::gl::blend_state()); + depth ? glEnable(pp::renderer::gl::depth_test_state()) : glDisable(pp::renderer::gl::depth_test_state()); glViewport(vp[0], vp[1], vp[2], vp[3]); glClearColor(cc[0], cc[1], cc[2], cc[3]); } @@ -668,11 +690,11 @@ void NodeCanvas::create_buffers() auto new_size = GetSize() * m_density; LOG("NodeCanvas::create_buffers size: %d x %d density %f", (int)new_size.x, (int)new_size.y, m_density); m_canvas->m_mixer.create((int)new_size.x * m_canvas->m_mixer_scale, - (int)new_size.y * m_canvas->m_mixer_scale, -1, GL_RGBA8); - m_blender_rtt.create((int)new_size.x, (int)new_size.y, -1, GL_RGBA8); - m_cache_rtt.create((int)new_size.x, (int)new_size.y, -1, GL_RGBA8); - m_rtt.create((int)new_size.x, (int)new_size.y, -1, GL_RGBA8, true); - m_blender_bg.create((int)new_size.x, (int)new_size.y, GL_RGBA8); + (int)new_size.y * m_canvas->m_mixer_scale, -1, pp::renderer::gl::rgba8_internal_format()); + m_blender_rtt.create((int)new_size.x, (int)new_size.y, -1, pp::renderer::gl::rgba8_internal_format()); + m_cache_rtt.create((int)new_size.x, (int)new_size.y, -1, pp::renderer::gl::rgba8_internal_format()); + m_rtt.create((int)new_size.x, (int)new_size.y, -1, pp::renderer::gl::rgba8_internal_format(), true); + m_blender_bg.create((int)new_size.x, (int)new_size.y, pp::renderer::gl::rgba8_internal_format()); } void NodeCanvas::set_density(float d)