Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index b5150e572df69562cccbe2901aff85d22b1002ca..292201004138d93c546bfdcf001b6c1aa161a2a2 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -938,7 +938,9 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
DCHECK(!background_image); |
use_shaders_for_blending = false; |
} else if (background_image) { |
- background_texture.reset(); |
+ // Reset original background texture if there is not any mask |
+ if (!quad->mask_resource_id) |
+ background_texture.reset(); |
} else if (CanApplyBlendModeUsingBlendFunc(blend_mode) && |
ShouldApplyBackgroundFilters(frame, quad)) { |
// Something went wrong with applying background filters to the backdrop. |
@@ -946,7 +948,11 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
background_texture.reset(); |
} |
} |
- |
+ // Need original background texture for mask? |
+ bool mask_for_background = |
+ background_texture && // Have original background texture |
+ background_image && // Have filtered background texture |
+ quad->mask_resource_id; // Have mask texture |
SetBlendEnabled( |
!use_shaders_for_blending && |
(quad->ShouldDrawWithBlending() || !IsDefaultBlendMode(blend_mode))); |
@@ -1025,14 +1031,16 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
if (use_aa && mask_texture_id && !use_color_matrix) { |
const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA( |
- tex_coord_precision, mask_sampler, shader_blend_mode); |
+ tex_coord_precision, mask_sampler, |
+ shader_blend_mode, mask_for_background); |
SetUseProgram(program->program()); |
program->vertex_shader().FillLocations(&locations); |
program->fragment_shader().FillLocations(&locations); |
GLC(gl_, gl_->Uniform1i(locations.sampler, 0)); |
} else if (!use_aa && mask_texture_id && !use_color_matrix) { |
const RenderPassMaskProgram* program = GetRenderPassMaskProgram( |
- tex_coord_precision, mask_sampler, shader_blend_mode); |
+ tex_coord_precision, mask_sampler, |
+ shader_blend_mode, mask_for_background); |
SetUseProgram(program->program()); |
program->vertex_shader().FillLocations(&locations); |
program->fragment_shader().FillLocations(&locations); |
@@ -1047,7 +1055,8 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
} else if (use_aa && mask_texture_id && use_color_matrix) { |
const RenderPassMaskColorMatrixProgramAA* program = |
GetRenderPassMaskColorMatrixProgramAA( |
- tex_coord_precision, mask_sampler, shader_blend_mode); |
+ tex_coord_precision, mask_sampler, |
+ shader_blend_mode, mask_for_background); |
SetUseProgram(program->program()); |
program->vertex_shader().FillLocations(&locations); |
program->fragment_shader().FillLocations(&locations); |
@@ -1063,7 +1072,8 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
} else if (!use_aa && mask_texture_id && use_color_matrix) { |
const RenderPassMaskColorMatrixProgram* program = |
GetRenderPassMaskColorMatrixProgram( |
- tex_coord_precision, mask_sampler, shader_blend_mode); |
+ tex_coord_precision, mask_sampler, |
+ shader_blend_mode, mask_for_background); |
SetUseProgram(program->program()); |
program->vertex_shader().FillLocations(&locations); |
program->fragment_shader().FillLocations(&locations); |
@@ -1177,7 +1187,11 @@ void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, |
GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit)); |
gl_->BindTexture(GL_TEXTURE_2D, texture->getTextureHandle()); |
GLC(gl_, gl_->ActiveTexture(GL_TEXTURE0)); |
- } else { |
+ if (mask_for_background) |
+ GLC(gl_, gl_->Uniform1i(locations.original_backdrop, |
+ ++last_texture_unit)); |
+ } |
+ if (background_texture) { |
shader_background_sampler_lock = make_scoped_ptr( |
new ResourceProvider::ScopedSamplerGL(resource_provider_, |
background_texture->id(), |
@@ -2693,7 +2707,8 @@ const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA( |
const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram( |
TexCoordPrecision precision, |
SamplerType sampler, |
- BlendMode blend_mode) { |
+ BlendMode blend_mode, |
+ bool mask_for_background) { |
DCHECK_GE(precision, 0); |
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |
DCHECK_GE(sampler, 0); |
@@ -2701,11 +2716,13 @@ const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram( |
DCHECK_GE(blend_mode, 0); |
DCHECK_LE(blend_mode, LAST_BLEND_MODE); |
RenderPassMaskProgram* program = |
- &render_pass_mask_program_[precision][sampler][blend_mode]; |
+ &render_pass_mask_program_[precision][sampler][blend_mode] |
+ [mask_for_background ? HAS_MASK : NO_MASK]; |
if (!program->initialized()) { |
TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgram::initialize"); |
program->Initialize( |
- output_surface_->context_provider(), precision, sampler, blend_mode); |
+ output_surface_->context_provider(), precision, |
+ sampler, blend_mode, mask_for_background); |
} |
return program; |
} |
@@ -2713,7 +2730,8 @@ const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram( |
const GLRenderer::RenderPassMaskProgramAA* |
GLRenderer::GetRenderPassMaskProgramAA(TexCoordPrecision precision, |
SamplerType sampler, |
- BlendMode blend_mode) { |
+ BlendMode blend_mode, |
+ bool mask_for_background) { |
DCHECK_GE(precision, 0); |
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |
DCHECK_GE(sampler, 0); |
@@ -2721,11 +2739,13 @@ GLRenderer::GetRenderPassMaskProgramAA(TexCoordPrecision precision, |
DCHECK_GE(blend_mode, 0); |
DCHECK_LE(blend_mode, LAST_BLEND_MODE); |
RenderPassMaskProgramAA* program = |
- &render_pass_mask_program_aa_[precision][sampler][blend_mode]; |
+ &render_pass_mask_program_aa_[precision][sampler][blend_mode] |
+ [mask_for_background ? HAS_MASK : NO_MASK]; |
if (!program->initialized()) { |
TRACE_EVENT0("cc", "GLRenderer::renderPassMaskProgramAA::initialize"); |
program->Initialize( |
- output_surface_->context_provider(), precision, sampler, blend_mode); |
+ output_surface_->context_provider(), precision, |
+ sampler, blend_mode, mask_for_background); |
} |
return program; |
} |
@@ -2766,9 +2786,11 @@ GLRenderer::GetRenderPassColorMatrixProgramAA(TexCoordPrecision precision, |
} |
const GLRenderer::RenderPassMaskColorMatrixProgram* |
-GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision, |
- SamplerType sampler, |
- BlendMode blend_mode) { |
+GLRenderer::GetRenderPassMaskColorMatrixProgram( |
+ TexCoordPrecision precision, |
+ SamplerType sampler, |
+ BlendMode blend_mode, |
+ bool mask_for_background) { |
DCHECK_GE(precision, 0); |
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |
DCHECK_GE(sampler, 0); |
@@ -2776,20 +2798,24 @@ GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision, |
DCHECK_GE(blend_mode, 0); |
DCHECK_LE(blend_mode, LAST_BLEND_MODE); |
RenderPassMaskColorMatrixProgram* program = |
- &render_pass_mask_color_matrix_program_[precision][sampler][blend_mode]; |
+ &render_pass_mask_color_matrix_program_[precision][sampler][blend_mode] |
+ [mask_for_background ? HAS_MASK : NO_MASK]; |
if (!program->initialized()) { |
TRACE_EVENT0("cc", |
"GLRenderer::renderPassMaskColorMatrixProgram::initialize"); |
program->Initialize( |
- output_surface_->context_provider(), precision, sampler, blend_mode); |
+ output_surface_->context_provider(), precision, |
+ sampler, blend_mode, mask_for_background); |
} |
return program; |
} |
const GLRenderer::RenderPassMaskColorMatrixProgramAA* |
-GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision, |
- SamplerType sampler, |
- BlendMode blend_mode) { |
+GLRenderer::GetRenderPassMaskColorMatrixProgramAA( |
+ TexCoordPrecision precision, |
+ SamplerType sampler, |
+ BlendMode blend_mode, |
+ bool mask_for_background) { |
DCHECK_GE(precision, 0); |
DCHECK_LE(precision, LAST_TEX_COORD_PRECISION); |
DCHECK_GE(sampler, 0); |
@@ -2797,13 +2823,14 @@ GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision, |
DCHECK_GE(blend_mode, 0); |
DCHECK_LE(blend_mode, LAST_BLEND_MODE); |
RenderPassMaskColorMatrixProgramAA* program = |
- &render_pass_mask_color_matrix_program_aa_[precision][sampler] |
- [blend_mode]; |
+ &render_pass_mask_color_matrix_program_aa_[precision][sampler][blend_mode] |
+ [mask_for_background ? HAS_MASK : NO_MASK]; |
if (!program->initialized()) { |
TRACE_EVENT0("cc", |
"GLRenderer::renderPassMaskColorMatrixProgramAA::initialize"); |
program->Initialize( |
- output_surface_->context_provider(), precision, sampler, blend_mode); |
+ output_surface_->context_provider(), precision, |
+ sampler, blend_mode, mask_for_background); |
} |
return program; |
} |
@@ -3030,10 +3057,12 @@ void GLRenderer::CleanupSharedObjects() { |
tile_program_swizzle_aa_[i][j].Cleanup(gl_); |
for (int k = 0; k <= LAST_BLEND_MODE; k++) { |
- render_pass_mask_program_[i][j][k].Cleanup(gl_); |
- render_pass_mask_program_aa_[i][j][k].Cleanup(gl_); |
- render_pass_mask_color_matrix_program_aa_[i][j][k].Cleanup(gl_); |
- render_pass_mask_color_matrix_program_[i][j][k].Cleanup(gl_); |
+ for (int l = 0; l <= 1; ++l) { |
enne (OOO)
2015/03/04 19:58:44
Use the enum here?
|
+ render_pass_mask_program_[i][j][k][l].Cleanup(gl_); |
+ render_pass_mask_program_aa_[i][j][k][l].Cleanup(gl_); |
+ render_pass_mask_color_matrix_program_aa_[i][j][k][l].Cleanup(gl_); |
+ render_pass_mask_color_matrix_program_[i][j][k][l].Cleanup(gl_); |
+ } |
} |
} |
for (int j = 0; j <= LAST_BLEND_MODE; j++) { |