| Index: cc/output/gl_renderer.cc
|
| diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
|
| index 10985875d8c36122453ee585c8d6dc85bad36621..6b7e8ffcea771fc6384b117e937d611eb815ecef 100644
|
| --- a/cc/output/gl_renderer.cc
|
| +++ b/cc/output/gl_renderer.cc
|
| @@ -2160,7 +2160,7 @@ void GLRenderer::FlushTextureQuadCache(BoundGeometry flush_binding) {
|
| draw_cache_.resource_id,
|
| draw_cache_.nearest_neighbor ? GL_NEAREST : GL_LINEAR);
|
| DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
|
| - gl_->BindTexture(GL_TEXTURE_2D, locked_quad.texture_id());
|
| + gl_->BindTexture(locked_quad.target(), locked_quad.texture_id());
|
|
|
| static_assert(sizeof(Float4) == 4 * sizeof(float),
|
| "Float4 struct should be densely packed");
|
| @@ -2222,20 +2222,24 @@ void GLRenderer::EnqueueTextureQuad(const DrawingFrame* frame,
|
| highp_threshold_min_,
|
| quad->shared_quad_state->visible_content_rect.bottom_right());
|
|
|
| + ResourceProvider::ScopedReadLockGL lock(resource_provider_,
|
| + quad->resource_id);
|
| + const SamplerType sampler = SamplerTypeFromTextureTarget(lock.target());
|
| // Choose the correct texture program binding
|
| TexTransformTextureProgramBinding binding;
|
| if (quad->premultiplied_alpha) {
|
| if (quad->background_color == SK_ColorTRANSPARENT) {
|
| - binding.Set(GetTextureProgram(tex_coord_precision));
|
| + binding.Set(GetTextureProgram(tex_coord_precision, sampler));
|
| } else {
|
| - binding.Set(GetTextureBackgroundProgram(tex_coord_precision));
|
| + binding.Set(GetTextureBackgroundProgram(tex_coord_precision, sampler));
|
| }
|
| } else {
|
| if (quad->background_color == SK_ColorTRANSPARENT) {
|
| - binding.Set(GetNonPremultipliedTextureProgram(tex_coord_precision));
|
| - } else {
|
| binding.Set(
|
| - GetNonPremultipliedTextureBackgroundProgram(tex_coord_precision));
|
| + GetNonPremultipliedTextureProgram(tex_coord_precision, sampler));
|
| + } else {
|
| + binding.Set(GetNonPremultipliedTextureBackgroundProgram(
|
| + tex_coord_precision, sampler));
|
| }
|
| }
|
|
|
| @@ -3197,58 +3201,71 @@ const GLRenderer::TileProgramSwizzleAA* GLRenderer::GetTileProgramSwizzleAA(
|
| }
|
|
|
| const GLRenderer::TextureProgram* GLRenderer::GetTextureProgram(
|
| - TexCoordPrecision precision) {
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler) {
|
| DCHECK_GE(precision, 0);
|
| DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
|
| - TextureProgram* program = &texture_program_[precision];
|
| + DCHECK_GE(sampler, 0);
|
| + DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
|
| + TextureProgram* program = &texture_program_[precision][sampler];
|
| if (!program->initialized()) {
|
| TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize");
|
| program->Initialize(output_surface_->context_provider(), precision,
|
| - SAMPLER_TYPE_2D);
|
| + sampler);
|
| }
|
| return program;
|
| }
|
|
|
| const GLRenderer::NonPremultipliedTextureProgram*
|
| -GLRenderer::GetNonPremultipliedTextureProgram(TexCoordPrecision precision) {
|
| +GLRenderer::GetNonPremultipliedTextureProgram(TexCoordPrecision precision,
|
| + SamplerType sampler) {
|
| DCHECK_GE(precision, 0);
|
| DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
|
| + DCHECK_GE(sampler, 0);
|
| + DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
|
| NonPremultipliedTextureProgram* program =
|
| - &nonpremultiplied_texture_program_[precision];
|
| + &nonpremultiplied_texture_program_[precision][sampler];
|
| if (!program->initialized()) {
|
| TRACE_EVENT0("cc",
|
| "GLRenderer::NonPremultipliedTextureProgram::Initialize");
|
| program->Initialize(output_surface_->context_provider(), precision,
|
| - SAMPLER_TYPE_2D);
|
| + sampler);
|
| }
|
| return program;
|
| }
|
|
|
| const GLRenderer::TextureBackgroundProgram*
|
| -GLRenderer::GetTextureBackgroundProgram(TexCoordPrecision precision) {
|
| +GLRenderer::GetTextureBackgroundProgram(TexCoordPrecision precision,
|
| + SamplerType sampler) {
|
| DCHECK_GE(precision, 0);
|
| DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
|
| - TextureBackgroundProgram* program = &texture_background_program_[precision];
|
| + DCHECK_GE(sampler, 0);
|
| + DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
|
| + TextureBackgroundProgram* program =
|
| + &texture_background_program_[precision][sampler];
|
| if (!program->initialized()) {
|
| TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize");
|
| program->Initialize(output_surface_->context_provider(), precision,
|
| - SAMPLER_TYPE_2D);
|
| + sampler);
|
| }
|
| return program;
|
| }
|
|
|
| const GLRenderer::NonPremultipliedTextureBackgroundProgram*
|
| GLRenderer::GetNonPremultipliedTextureBackgroundProgram(
|
| - TexCoordPrecision precision) {
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler) {
|
| DCHECK_GE(precision, 0);
|
| DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
|
| + DCHECK_GE(sampler, 0);
|
| + DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
|
| NonPremultipliedTextureBackgroundProgram* program =
|
| - &nonpremultiplied_texture_background_program_[precision];
|
| + &nonpremultiplied_texture_background_program_[precision][sampler];
|
| if (!program->initialized()) {
|
| TRACE_EVENT0("cc",
|
| "GLRenderer::NonPremultipliedTextureProgram::Initialize");
|
| program->Initialize(output_surface_->context_provider(), precision,
|
| - SAMPLER_TYPE_2D);
|
| + sampler);
|
| }
|
| return program;
|
| }
|
| @@ -3336,10 +3353,12 @@ void GLRenderer::CleanupSharedObjects() {
|
| render_pass_color_matrix_program_aa_[i][j].Cleanup(gl_);
|
| }
|
|
|
| - texture_program_[i].Cleanup(gl_);
|
| - nonpremultiplied_texture_program_[i].Cleanup(gl_);
|
| - texture_background_program_[i].Cleanup(gl_);
|
| - nonpremultiplied_texture_background_program_[i].Cleanup(gl_);
|
| + for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) {
|
| + texture_program_[i][j].Cleanup(gl_);
|
| + nonpremultiplied_texture_program_[i][j].Cleanup(gl_);
|
| + texture_background_program_[i][j].Cleanup(gl_);
|
| + nonpremultiplied_texture_background_program_[i][j].Cleanup(gl_);
|
| + }
|
| texture_io_surface_program_[i].Cleanup(gl_);
|
|
|
| video_yuv_program_[i].Cleanup(gl_);
|
|
|