Route paint texture unit binding through GL backend
This commit is contained in:
@@ -40,6 +40,38 @@ pp::paint_renderer::CanvasStrokeFeedbackPlan stroke_preview_destination_feedback
|
||||
return fallback;
|
||||
}
|
||||
|
||||
void activate_opengl_texture(std::uint32_t texture_unit) noexcept
|
||||
{
|
||||
glActiveTexture(static_cast<GLenum>(texture_unit));
|
||||
}
|
||||
|
||||
void bind_opengl_texture(std::uint32_t target, std::uint32_t texture) noexcept
|
||||
{
|
||||
glBindTexture(static_cast<GLenum>(target), static_cast<GLuint>(texture));
|
||||
}
|
||||
|
||||
void set_active_texture_unit(std::uint32_t unit_index)
|
||||
{
|
||||
const auto status = pp::renderer::gl::activate_opengl_texture_unit(
|
||||
unit_index,
|
||||
pp::renderer::gl::OpenGlActiveTextureDispatch {
|
||||
.active_texture = activate_opengl_texture,
|
||||
});
|
||||
if (!status.ok())
|
||||
LOG("NodeStrokePreview active texture dispatch failed because: %s", status.message);
|
||||
}
|
||||
|
||||
void unbind_texture_2d()
|
||||
{
|
||||
const auto status = pp::renderer::gl::bind_opengl_texture_2d(
|
||||
0U,
|
||||
pp::renderer::gl::OpenGlTexture2DBindDispatch {
|
||||
.bind_texture = bind_opengl_texture,
|
||||
});
|
||||
if (!status.ok())
|
||||
LOG("NodeStrokePreview texture unbind dispatch failed because: %s", status.message);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::atomic_int NodeStrokePreview::s_instances{ 0 };
|
||||
@@ -165,16 +197,16 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
|
||||
m_sampler_linear.bind(0);
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(0U));
|
||||
set_active_texture_unit(0U);
|
||||
m_tex_background.bind();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
m_rtt.bindTexture();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(3U));
|
||||
set_active_texture_unit(3U);
|
||||
m_tex_dual.bind();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(4U));
|
||||
set_active_texture_unit(4U);
|
||||
b->m_pattern_texture ?
|
||||
b->m_pattern_texture->bind() :
|
||||
glBindTexture(pp::renderer::gl::texture_2d_target(), 0);
|
||||
unbind_texture_2d();
|
||||
m_plane.draw_fill();
|
||||
|
||||
m_rtt_mixer.unbindFramebuffer();
|
||||
@@ -188,7 +220,7 @@ glm::vec4 NodeStrokePreview::stroke_draw_samples(
|
||||
{
|
||||
if (copy_stroke_destination)
|
||||
{
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
blend_tex.bind(); // bg, copy of framebuffer (copied before drawing)
|
||||
}
|
||||
|
||||
@@ -227,7 +259,7 @@ glm::vec4 NodeStrokePreview::stroke_draw_samples(
|
||||
|
||||
if (copy_stroke_destination)
|
||||
{
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
blend_tex.unbind();
|
||||
}
|
||||
|
||||
@@ -416,10 +448,10 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
ShaderManager::u_float(kShaderUniform::MixAlpha, 0);
|
||||
ShaderManager::u_float(kShaderUniform::Wet, 0);
|
||||
ShaderManager::u_float(kShaderUniform::Noise, 0);
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(0U));
|
||||
set_active_texture_unit(0U);
|
||||
dual_brush->m_tip_texture ?
|
||||
dual_brush->m_tip_texture->bind() :
|
||||
glBindTexture(pp::renderer::gl::texture_2d_target(), 0);
|
||||
unbind_texture_2d();
|
||||
auto frames_dual = stroke_draw_compute(m_dual_stroke, zoom);
|
||||
for (auto& f : frames_dual)
|
||||
{
|
||||
@@ -430,7 +462,7 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
}
|
||||
|
||||
// copy raw stroke to tex
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
m_tex_dual.bind();
|
||||
copy_framebuffer_to_texture_2d(
|
||||
0,
|
||||
@@ -467,19 +499,19 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
ShaderManager::u_float(kShaderUniform::Wet, b->m_tip_wet);
|
||||
ShaderManager::u_float(kShaderUniform::Noise, b->m_tip_noise);
|
||||
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(0U));
|
||||
set_active_texture_unit(0U);
|
||||
b->m_tip_texture->bind();
|
||||
if (copy_stroke_destination)
|
||||
{
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
m_tex.bind(); // tmp swap for blending
|
||||
}
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(2U));
|
||||
set_active_texture_unit(2U);
|
||||
b->m_pattern_texture ?
|
||||
b->m_pattern_texture->bind() :
|
||||
glBindTexture(pp::renderer::gl::texture_2d_target(), 0);
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(3U));
|
||||
b->m_tip_mix > 0.f ? m_rtt_mixer.bindTexture() : glBindTexture(pp::renderer::gl::texture_2d_target(), 0);
|
||||
unbind_texture_2d();
|
||||
set_active_texture_unit(3U);
|
||||
b->m_tip_mix > 0.f ? m_rtt_mixer.bindTexture() : unbind_texture_2d();
|
||||
auto frames = stroke_draw_compute(m_stroke, zoom);
|
||||
m_rtt.clear();
|
||||
for (auto& f : frames)
|
||||
@@ -498,11 +530,11 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
ShaderManager::u_float(kShaderUniform::Opacity, f.opacity);
|
||||
/*auto rect =*/ stroke_draw_samples(f.shapes, m_tex, copy_stroke_destination);
|
||||
}
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(3U));
|
||||
set_active_texture_unit(3U);
|
||||
m_rtt_mixer.unbindTexture();
|
||||
|
||||
// copy raw stroke to tex
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
m_tex.bind();
|
||||
copy_framebuffer_to_texture_2d(
|
||||
0,
|
||||
@@ -544,16 +576,16 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
m_sampler_linear.bind(3);
|
||||
m_sampler_linear_repeat.bind(4);
|
||||
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(0U));
|
||||
set_active_texture_unit(0U);
|
||||
m_tex_background.bind();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(1U));
|
||||
set_active_texture_unit(1U);
|
||||
m_tex.bind();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(3U));
|
||||
set_active_texture_unit(3U);
|
||||
m_tex_dual.bind();
|
||||
glActiveTexture(pp::renderer::gl::active_texture_unit(4U));
|
||||
set_active_texture_unit(4U);
|
||||
b->m_pattern_texture ?
|
||||
b->m_pattern_texture->bind() :
|
||||
glBindTexture(pp::renderer::gl::texture_2d_target(), 0);
|
||||
unbind_texture_2d();
|
||||
m_plane.draw_fill();
|
||||
|
||||
// copy the result to the actual preview
|
||||
|
||||
Reference in New Issue
Block a user