Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4314)

Unified Diff: cc/output/gl_renderer.cc

Issue 2613903002: The great shader refactor: Move all programs to a common cache (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/output/gl_renderer.cc
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index e79f3b26e4dfdc7fde3d510c97c2f2d01afd7bf4..10f88d7e2b2e320ac01afb008787183cb778215b 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -1317,79 +1317,23 @@ void GLRenderer::ChooseRPDQProgram(DrawRenderPassDrawQuadParams* params) {
? BlendModeFromSkXfermode(params->quad->shared_quad_state->blend_mode)
: BLEND_MODE_NONE;
- unsigned mask_texture_id = 0;
- SamplerType mask_sampler = SAMPLER_TYPE_NA;
+ SamplerType sampler_type = SAMPLER_TYPE_2D;
+ MaskMode mask_mode = NO_MASK;
+ bool mask_for_background = params->mask_for_background;
if (params->mask_resource_lock) {
- mask_texture_id = params->mask_resource_lock->texture_id();
- mask_sampler =
+ mask_mode = HAS_MASK;
+ sampler_type =
SamplerTypeFromTextureTarget(params->mask_resource_lock->target());
}
- bool mask_for_background = params->mask_for_background;
- if (params->use_aa && mask_texture_id && !params->use_color_matrix) {
- const RenderPassMaskProgramAA* program = GetRenderPassMaskProgramAA(
- tex_coord_precision, mask_sampler,
- shader_blend_mode, mask_for_background);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (!params->use_aa && mask_texture_id && !params->use_color_matrix) {
- const RenderPassMaskProgram* program = GetRenderPassMaskProgram(
- tex_coord_precision, mask_sampler,
- shader_blend_mode, mask_for_background);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (params->use_aa && !mask_texture_id && !params->use_color_matrix) {
- const RenderPassProgramAA* program =
- GetRenderPassProgramAA(tex_coord_precision, shader_blend_mode);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (params->use_aa && mask_texture_id && params->use_color_matrix) {
- const RenderPassMaskColorMatrixProgramAA* program =
- GetRenderPassMaskColorMatrixProgramAA(
- tex_coord_precision, mask_sampler,
- shader_blend_mode, mask_for_background);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (params->use_aa && !mask_texture_id && params->use_color_matrix) {
- const RenderPassColorMatrixProgramAA* program =
- GetRenderPassColorMatrixProgramAA(tex_coord_precision,
- shader_blend_mode);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (!params->use_aa && mask_texture_id && params->use_color_matrix) {
- const RenderPassMaskColorMatrixProgram* program =
- GetRenderPassMaskColorMatrixProgram(
- tex_coord_precision, mask_sampler,
- shader_blend_mode, mask_for_background);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else if (!params->use_aa && !mask_texture_id && params->use_color_matrix) {
- const RenderPassColorMatrixProgram* program =
- GetRenderPassColorMatrixProgram(tex_coord_precision, shader_blend_mode);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- } else {
- const RenderPassProgram* program =
- GetRenderPassProgram(tex_coord_precision, shader_blend_mode);
- SetUseProgram(program->program());
- program->vertex_shader().FillLocations(&params->locations);
- program->fragment_shader().FillLocations(&params->locations);
- gl_->Uniform1i(params->locations.sampler, 0);
- }
+ const Program* program = GetProgram(ProgramKey::RenderPass(
enne (OOO) 2017/01/09 19:46:48 This cleanup is great.
+ tex_coord_precision, sampler_type, shader_blend_mode,
+ params->use_aa ? USE_AA : NO_AA, mask_mode, mask_for_background,
+ params->use_color_matrix));
+ SetUseProgram(program->program());
+ program->vertex_shader().FillLocations(&params->locations);
+ program->fragment_shader().FillLocations(&params->locations);
+ gl_->Uniform1i(params->locations.sampler, 0);
}
void GLRenderer::UpdateRPDQUniforms(DrawRenderPassDrawQuadParams* params) {
@@ -3286,65 +3230,29 @@ void GLRenderer::PrepareGeometry(BoundGeometry binding) {
}
const GLRenderer::DebugBorderProgram* GLRenderer::GetDebugBorderProgram() {
- if (!debug_border_program_.initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::debugBorderProgram::initialize");
- debug_border_program_.InitializeDebugBorderProgram(
- output_surface_->context_provider());
- }
- return &debug_border_program_;
+ return GetProgram(ProgramKey::DebugBorder());
}
const GLRenderer::SolidColorProgram* GLRenderer::GetSolidColorProgram() {
- if (!solid_color_program_.initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::solidColorProgram::initialize");
- solid_color_program_.InitializeSolidColorProgram(
- output_surface_->context_provider(), false);
- }
- return &solid_color_program_;
+ return GetProgram(ProgramKey::SolidColor(NO_AA));
}
const GLRenderer::SolidColorProgramAA* GLRenderer::GetSolidColorProgramAA() {
- if (!solid_color_program_aa_.initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::solidColorProgramAA::initialize");
- solid_color_program_aa_.InitializeSolidColorProgram(
- output_surface_->context_provider(), true);
- }
- return &solid_color_program_aa_;
+ return GetProgram(ProgramKey::SolidColor(USE_AA));
}
const GLRenderer::RenderPassProgram* GLRenderer::GetRenderPassProgram(
TexCoordPrecision precision,
BlendMode blend_mode) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassProgram* program = &render_pass_program_[precision][blend_mode];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::renderPassProgram::initialize");
- program->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, SAMPLER_TYPE_2D, blend_mode,
- NO_AA, NO_MASK, false, false);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(
+ precision, SAMPLER_TYPE_2D, blend_mode, NO_AA, NO_MASK, false, false));
}
const GLRenderer::RenderPassProgramAA* GLRenderer::GetRenderPassProgramAA(
TexCoordPrecision precision,
BlendMode blend_mode) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassProgramAA* program =
- &render_pass_program_aa_[precision][blend_mode];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::renderPassProgramAA::initialize");
- program->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, SAMPLER_TYPE_2D, blend_mode,
- USE_AA, NO_MASK, false, false);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(
+ precision, SAMPLER_TYPE_2D, blend_mode, USE_AA, NO_MASK, false, false));
}
const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram(
@@ -3352,22 +3260,9 @@ const GLRenderer::RenderPassMaskProgram* GLRenderer::GetRenderPassMaskProgram(
SamplerType sampler,
BlendMode blend_mode,
bool mask_for_background) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- DCHECK_GE(sampler, 0);
- DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassMaskProgram* program =
- &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->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, sampler, blend_mode, NO_AA,
- HAS_MASK, mask_for_background, false);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(precision, sampler, blend_mode,
+ NO_AA, HAS_MASK, mask_for_background,
+ false));
}
const GLRenderer::RenderPassMaskProgramAA*
@@ -3375,286 +3270,131 @@ GLRenderer::GetRenderPassMaskProgramAA(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);
- DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassMaskProgramAA* program =
- &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->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, sampler, blend_mode, USE_AA,
- HAS_MASK, mask_for_background, false);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(precision, sampler, blend_mode,
+ USE_AA, HAS_MASK,
+ mask_for_background, false));
}
const GLRenderer::RenderPassColorMatrixProgram*
GLRenderer::GetRenderPassColorMatrixProgram(TexCoordPrecision precision,
BlendMode blend_mode) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassColorMatrixProgram* program =
- &render_pass_color_matrix_program_[precision][blend_mode];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::renderPassColorMatrixProgram::initialize");
- program->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, SAMPLER_TYPE_2D, blend_mode,
- NO_AA, NO_MASK, false, true);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(
+ precision, SAMPLER_TYPE_2D, blend_mode, NO_AA, NO_MASK, false, true));
}
const GLRenderer::RenderPassColorMatrixProgramAA*
GLRenderer::GetRenderPassColorMatrixProgramAA(TexCoordPrecision precision,
BlendMode blend_mode) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassColorMatrixProgramAA* program =
- &render_pass_color_matrix_program_aa_[precision][blend_mode];
- if (!program->initialized()) {
- TRACE_EVENT0("cc",
- "GLRenderer::renderPassColorMatrixProgramAA::initialize");
- program->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, SAMPLER_TYPE_2D, blend_mode,
- USE_AA, NO_MASK, false, true);
- }
- return program;
+ return GetProgram(ProgramKey::RenderPass(
+ precision, SAMPLER_TYPE_2D, blend_mode, USE_AA, NO_MASK, false, true));
}
const GLRenderer::RenderPassMaskColorMatrixProgram*
-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);
- DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
- DCHECK_GE(blend_mode, 0);
- DCHECK_LE(blend_mode, LAST_BLEND_MODE);
- RenderPassMaskColorMatrixProgram* program =
- &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->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, sampler, blend_mode, NO_AA,
- HAS_MASK, mask_for_background, true);
- }
- return program;
+GLRenderer::GetRenderPassMaskColorMatrixProgram(TexCoordPrecision precision,
+ SamplerType sampler,
+ BlendMode blend_mode,
+ bool mask_for_background) {
+ return GetProgram(ProgramKey::RenderPass(precision, sampler, blend_mode,
+ NO_AA, HAS_MASK, mask_for_background,
+ true));
}
const GLRenderer::RenderPassMaskColorMatrixProgramAA*
-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);
- DCHECK_LE(sampler, LAST_SAMPLER_TYPE);
- 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]
- [mask_for_background ? HAS_MASK : NO_MASK];
- if (!program->initialized()) {
- TRACE_EVENT0("cc",
- "GLRenderer::renderPassMaskColorMatrixProgramAA::initialize");
- program->InitializeRenderPassProgram(output_surface_->context_provider(),
- precision, sampler, blend_mode, USE_AA,
- HAS_MASK, mask_for_background, true);
+GLRenderer::GetRenderPassMaskColorMatrixProgramAA(TexCoordPrecision precision,
+ SamplerType sampler,
+ BlendMode blend_mode,
+ bool mask_for_background) {
+ return GetProgram(ProgramKey::RenderPass(precision, sampler, blend_mode,
+ USE_AA, HAS_MASK,
+ mask_for_background, true));
+}
+
+const GLRenderer::Program* GLRenderer::GetProgram(const ProgramKey& desc) {
+ Program*& program = program_cache_[desc];
+ if (!program) {
+ program = new Program;
+ program->Initialize(output_surface_->context_provider(), desc);
}
return program;
}
+const GLRenderer::Program* GLRenderer::GetProgramForTesting(
+ const ProgramKey& desc) const {
+ const auto found = program_cache_.find(desc);
+ if (found == program_cache_.end())
+ return nullptr;
+ return found->second;
+}
+
const GLRenderer::TileProgram* GLRenderer::GetTileProgram(
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);
- TileProgram* program = &tile_program_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgram::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, NO_AA, NO_SWIZZLE,
- NOT_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, NO_AA, NO_SWIZZLE, NOT_OPAQUE));
}
const GLRenderer::TileProgramOpaque* GLRenderer::GetTileProgramOpaque(
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);
- TileProgramOpaque* program = &tile_program_opaque_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgramOpaque::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, NO_AA, NO_SWIZZLE,
- IS_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, NO_AA, NO_SWIZZLE, IS_OPAQUE));
}
const GLRenderer::TileProgramAA* GLRenderer::GetTileProgramAA(
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);
- TileProgramAA* program = &tile_program_aa_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgramAA::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, USE_AA, NO_SWIZZLE,
- NOT_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, USE_AA, NO_SWIZZLE, NOT_OPAQUE));
}
const GLRenderer::TileProgramSwizzle* GLRenderer::GetTileProgramSwizzle(
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);
- TileProgramSwizzle* program = &tile_program_swizzle_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgramSwizzle::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, NO_AA, DO_SWIZZLE,
- NOT_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, NO_AA, DO_SWIZZLE, NOT_OPAQUE));
}
const GLRenderer::TileProgramSwizzleOpaque*
GLRenderer::GetTileProgramSwizzleOpaque(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);
- TileProgramSwizzleOpaque* program =
- &tile_program_swizzle_opaque_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgramSwizzleOpaque::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, NO_AA, DO_SWIZZLE,
- IS_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, NO_AA, DO_SWIZZLE, IS_OPAQUE));
}
const GLRenderer::TileProgramSwizzleAA* GLRenderer::GetTileProgramSwizzleAA(
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);
- TileProgramSwizzleAA* program = &tile_program_swizzle_aa_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::tileProgramSwizzleAA::initialize");
- program->InitializeTileProgram(output_surface_->context_provider(),
- precision, sampler, USE_AA, DO_SWIZZLE,
- NOT_OPAQUE);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Tile(precision, sampler, USE_AA, DO_SWIZZLE, NOT_OPAQUE));
}
const GLRenderer::TextureProgram* GLRenderer::GetTextureProgram(
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);
- TextureProgram* program = &texture_program_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize");
- program->InitializeTextureProgram(output_surface_->context_provider(),
- precision, sampler, PREMULTIPLIED_ALPHA,
- false);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Texture(precision, sampler, PREMULTIPLIED_ALPHA, false));
}
const GLRenderer::NonPremultipliedTextureProgram*
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][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc",
- "GLRenderer::NonPremultipliedTextureProgram::Initialize");
- program->InitializeTextureProgram(output_surface_->context_provider(),
- precision, sampler,
- NON_PREMULTIPLIED_ALPHA, false);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Texture(precision, sampler, NON_PREMULTIPLIED_ALPHA, false));
}
const GLRenderer::TextureBackgroundProgram*
GLRenderer::GetTextureBackgroundProgram(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);
- TextureBackgroundProgram* program =
- &texture_background_program_[precision][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::textureProgram::initialize");
- program->InitializeTextureProgram(output_surface_->context_provider(),
- precision, sampler, PREMULTIPLIED_ALPHA,
- true);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Texture(precision, sampler, PREMULTIPLIED_ALPHA, true));
}
const GLRenderer::NonPremultipliedTextureBackgroundProgram*
GLRenderer::GetNonPremultipliedTextureBackgroundProgram(
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][sampler];
- if (!program->initialized()) {
- TRACE_EVENT0("cc",
- "GLRenderer::NonPremultipliedTextureProgram::Initialize");
- program->InitializeTextureProgram(output_surface_->context_provider(),
- precision, sampler,
- NON_PREMULTIPLIED_ALPHA, true);
- }
- return program;
+ return GetProgram(
+ ProgramKey::Texture(precision, sampler, NON_PREMULTIPLIED_ALPHA, true));
}
const GLRenderer::VideoYUVProgram* GLRenderer::GetVideoYUVProgram(
@@ -3681,16 +3421,7 @@ const GLRenderer::VideoYUVProgram* GLRenderer::GetVideoYUVProgram(
const GLRenderer::VideoStreamTextureProgram*
GLRenderer::GetVideoStreamTextureProgram(TexCoordPrecision precision) {
- DCHECK_GE(precision, 0);
- DCHECK_LE(precision, LAST_TEX_COORD_PRECISION);
- VideoStreamTextureProgram* program =
- &video_stream_texture_program_[precision];
- if (!program->initialized()) {
- TRACE_EVENT0("cc", "GLRenderer::streamTextureProgram::initialize");
- program->InitializeVideoStreamProgram(output_surface_->context_provider(),
- precision);
- }
- return program;
+ return GetProgram(ProgramKey::VideoStream(precision));
}
void GLRenderer::CleanupSharedObjects() {
@@ -3698,22 +3429,6 @@ void GLRenderer::CleanupSharedObjects() {
for (int i = 0; i <= LAST_TEX_COORD_PRECISION; ++i) {
for (int j = 0; j <= LAST_SAMPLER_TYPE; ++j) {
- tile_program_[i][j].Cleanup(gl_);
- tile_program_opaque_[i][j].Cleanup(gl_);
- tile_program_swizzle_[i][j].Cleanup(gl_);
- tile_program_swizzle_opaque_[i][j].Cleanup(gl_);
- tile_program_aa_[i][j].Cleanup(gl_);
- tile_program_swizzle_aa_[i][j].Cleanup(gl_);
-
- for (int k = 0; k <= LAST_BLEND_MODE; k++) {
- for (int l = 0; l <= LAST_MASK_VALUE; ++l) {
- 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 k = 0; k < 2; k++) {
for (int l = 0; l < 2; l++) {
for (int m = 0; m < 2; m++) {
@@ -3722,26 +3437,13 @@ void GLRenderer::CleanupSharedObjects() {
}
}
}
- for (int j = 0; j <= LAST_BLEND_MODE; j++) {
- render_pass_program_[i][j].Cleanup(gl_);
- render_pass_program_aa_[i][j].Cleanup(gl_);
- render_pass_color_matrix_program_[i][j].Cleanup(gl_);
- render_pass_color_matrix_program_aa_[i][j].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_);
- }
-
- video_stream_texture_program_[i].Cleanup(gl_);
}
-
- debug_border_program_.Cleanup(gl_);
- solid_color_program_.Cleanup(gl_);
- solid_color_program_aa_.Cleanup(gl_);
+ for (auto iter : program_cache_) {
+ Program* program = iter.second;
+ program->Cleanup(gl_);
+ delete program;
+ }
+ program_cache_.clear();
if (offscreen_framebuffer_id_)
gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_);

Powered by Google App Engine
This is Rietveld 408576698