glsl framebuffer_fetch extension check at runtime
This commit is contained in:
@@ -394,9 +394,8 @@ void Canvas::stroke_draw()
|
||||
glDisable(GL_BLEND);
|
||||
ShaderManager::use(kShader::Stroke);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0); // brush
|
||||
#ifndef __IOS__
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
|
||||
#endif
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
|
||||
ShaderManager::u_int(kShaderUniform::TexStencil, 2); // stencil
|
||||
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
|
||||
//ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer
|
||||
@@ -549,8 +548,11 @@ void Canvas::stroke_draw()
|
||||
|
||||
m_tmp[i].bindFramebuffer();
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tex[i].bind(); // bg, copy of framebuffer (copied before drawing)
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tex[i].bind(); // bg, copy of framebuffer (copied before drawing)
|
||||
}
|
||||
|
||||
glm::vec2 bb_min(m_width, m_height);
|
||||
glm::vec2 bb_max(0, 0);
|
||||
@@ -564,12 +566,11 @@ void Canvas::stroke_draw()
|
||||
glm::vec2 pad(1);
|
||||
glm::ivec2 tex_pos = glm::clamp(glm::floor(bb_min) - pad , { 0, 0 }, { m_width, m_height });
|
||||
glm::ivec2 tex_sz = glm::clamp(glm::ceil(bb_sz ) + pad*2.f, { 0, 0 }, (glm::vec2)(glm::ivec2(m_width, m_height) - tex_pos));
|
||||
#ifndef __IOS__
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0,
|
||||
tex_pos.x, tex_pos.y,
|
||||
tex_pos.x, tex_pos.y,
|
||||
tex_sz.x, tex_sz.y);
|
||||
#endif
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, tex_pos.x, tex_pos.y,
|
||||
tex_pos.x, tex_pos.y, tex_sz.x, tex_sz.y);
|
||||
}
|
||||
|
||||
m_dirty_box[i] = glm::vec4(
|
||||
glm::min(xy(m_dirty_box[i]), (glm::vec2)tex_pos),
|
||||
@@ -630,8 +631,11 @@ void Canvas::stroke_draw()
|
||||
m_brush_shape.draw_stroke();
|
||||
*/
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tex[i].unbind();
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tex[i].unbind();
|
||||
}
|
||||
|
||||
m_tmp[i].unbindFramebuffer();
|
||||
}
|
||||
@@ -1307,26 +1311,32 @@ void Canvas::export_equirectangular_thread(std::string file_path)
|
||||
ShaderManager::use(kShader::TextureBlend);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
ShaderManager::u_int(kShaderUniform::TexA, 1);
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 2);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
|
||||
m_tmp[i].bindFramebuffer();
|
||||
// clear transparent not to mess with blending modes
|
||||
m_tmp[i].clear({ 1, 1, 1, 0 });
|
||||
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
face.bind();
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 2);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
face.bind();
|
||||
m_sampler_bg.bind(2);
|
||||
}
|
||||
m_sampler_bg.bind(0); // nearest
|
||||
m_sampler_mask.bind(1); // linear
|
||||
m_sampler_bg.bind(2);
|
||||
for (auto layer_index : m_order)
|
||||
{
|
||||
if (!m_layers[layer_index].m_visible ||
|
||||
m_layers[layer_index].m_opacity == 0.f ||
|
||||
!m_layers[layer_index].m_dirty_face[i])
|
||||
continue;
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
||||
}
|
||||
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);
|
||||
@@ -1338,8 +1348,12 @@ void Canvas::export_equirectangular_thread(std::string file_path)
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_layers[layer_index].m_rtt[i].unbindTexture();
|
||||
}
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
face.unbind();
|
||||
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
face.unbind();
|
||||
}
|
||||
|
||||
// now blend with the background
|
||||
glEnable(GL_BLEND);
|
||||
@@ -2131,21 +2145,27 @@ Image Canvas::thumbnail_generate(int w, int h)
|
||||
ShaderManager::use(kShader::TextureBlend);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
ShaderManager::u_int(kShaderUniform::TexA, 1);
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 2);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
blendtex.bind();
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 2);
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
blendtex.bind();
|
||||
m_sampler_bg.bind(2);
|
||||
}
|
||||
m_sampler_bg.bind(0); // nearest
|
||||
m_sampler_mask.bind(1); // linear
|
||||
m_sampler_bg.bind(2);
|
||||
for (auto layer_index : m_order)
|
||||
{
|
||||
if (!m_layers[layer_index].m_visible ||
|
||||
m_layers[layer_index].m_opacity == 0.f ||
|
||||
!m_layers[layer_index].m_dirty_face[i])
|
||||
continue;
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h);
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 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);
|
||||
@@ -2158,8 +2178,15 @@ Image Canvas::thumbnail_generate(int w, int h)
|
||||
m_layers[layer_index].m_rtt[i].unbindTexture();
|
||||
}
|
||||
|
||||
// copy the framebuffer before clearing to white
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
if (!ShaderManager::ext_framebuffer_fetch)
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
blendtex.unbind();
|
||||
}
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
blendtex.bind();
|
||||
// copy the content of the fb before drawing the grid
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h);
|
||||
|
||||
// draw the grid
|
||||
@@ -2173,9 +2200,8 @@ Image Canvas::thumbnail_generate(int w, int h)
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
m_sampler_mask.bind(0); // linear
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
blendtex.bind();
|
||||
m_plane.draw_fill();
|
||||
|
||||
blendtex.unbind();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user