| Index: cc/output/program_binding.h
|
| diff --git a/cc/output/program_binding.h b/cc/output/program_binding.h
|
| index 2c414aed3b0218f6ef9db1395226916d54bc636d..357642db26f1b3cda17ca72953d76e3a7a703224 100644
|
| --- a/cc/output/program_binding.h
|
| +++ b/cc/output/program_binding.h
|
| @@ -54,22 +54,106 @@ class ProgramBindingBase {
|
| DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase);
|
| };
|
|
|
| +enum ProgramType {
|
| + PROGRAM_TYPE_DEBUG_BORDER,
|
| + PROGRAM_TYPE_SOLID_COLOR,
|
| + PROGRAM_TYPE_TILE,
|
| + PROGRAM_TYPE_TEXTURE,
|
| + PROGRAM_TYPE_RENDER_PASS,
|
| + PROGRAM_TYPE_VIDEO_STREAM,
|
| +};
|
| +
|
| +class CC_EXPORT ProgramKey {
|
| + public:
|
| + ProgramKey(const ProgramKey& other);
|
| + ~ProgramKey();
|
| +
|
| + static ProgramKey DebugBorder();
|
| + static ProgramKey SolidColor(AAMode aa_mode);
|
| + static ProgramKey Tile(TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + AAMode aa_mode,
|
| + SwizzleMode swizzle_mode,
|
| + bool is_opaque);
|
| + static ProgramKey Texture(TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + PremultipliedAlphaMode premultiplied_alpha,
|
| + bool has_background_color);
|
| +
|
| + // TODO(ccameron): Merge |mask_for_background| into MaskMode.
|
| + static ProgramKey RenderPass(TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + BlendMode blend_mode,
|
| + AAMode aa_mode,
|
| + MaskMode mask_mode,
|
| + bool mask_for_background,
|
| + bool has_color_matrix);
|
| + static ProgramKey VideoStream(TexCoordPrecision precision);
|
| +
|
| + bool operator==(const ProgramKey& other) const;
|
| +
|
| + private:
|
| + ProgramKey();
|
| + friend struct ProgramKeyHash;
|
| + template <class VertexShader, class FragmentShader>
|
| + friend class ProgramBinding;
|
| +
|
| + ProgramType type_ = PROGRAM_TYPE_DEBUG_BORDER;
|
| + TexCoordPrecision precision_ = TEX_COORD_PRECISION_NA;
|
| + SamplerType sampler_ = SAMPLER_TYPE_NA;
|
| + BlendMode blend_mode_ = BLEND_MODE_NONE;
|
| + AAMode aa_mode_ = NO_AA;
|
| + SwizzleMode swizzle_mode_ = NO_SWIZZLE;
|
| + bool is_opaque_ = false;
|
| +
|
| + PremultipliedAlphaMode premultiplied_alpha_ = PREMULTIPLIED_ALPHA;
|
| + bool has_background_color_ = false;
|
| +
|
| + MaskMode mask_mode_ = NO_MASK;
|
| + bool mask_for_background_ = false;
|
| + bool has_color_matrix_ = false;
|
| +};
|
| +
|
| template <class VertexShader, class FragmentShader>
|
| class ProgramBinding : public ProgramBindingBase {
|
| public:
|
| ProgramBinding() {}
|
|
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler) {
|
| - Initialize(context_provider, precision, sampler, BLEND_MODE_NONE, false);
|
| - }
|
| + void Initialize(ContextProvider* context_provider, const ProgramKey& key) {
|
| + // Set parameters that are common to all sub-classes.
|
| + vertex_shader_.aa_mode_ = key.aa_mode_;
|
| + fragment_shader_.aa_mode_ = key.aa_mode_;
|
| + fragment_shader_.blend_mode_ = key.blend_mode_;
|
| + fragment_shader_.tex_coord_precision_ = key.precision_;
|
| + fragment_shader_.sampler_type_ = key.sampler_;
|
| + fragment_shader_.swizzle_mode_ = key.swizzle_mode_;
|
| + fragment_shader_.premultiply_alpha_mode_ = key.premultiplied_alpha_;
|
| + fragment_shader_.mask_mode_ = key.mask_mode_;
|
| + fragment_shader_.mask_for_background_ = key.mask_for_background_;
|
|
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler,
|
| - BlendMode blend_mode) {
|
| - Initialize(context_provider, precision, sampler, blend_mode, false);
|
| + switch (key.type_) {
|
| + case PROGRAM_TYPE_DEBUG_BORDER:
|
| + InitializeDebugBorderProgram();
|
| + break;
|
| + case PROGRAM_TYPE_SOLID_COLOR:
|
| + InitializeSolidColorProgram(key);
|
| + break;
|
| + case PROGRAM_TYPE_TILE:
|
| + InitializeTileProgram(key);
|
| + break;
|
| + case PROGRAM_TYPE_TEXTURE:
|
| + InitializeTextureProgram(key);
|
| + break;
|
| + case PROGRAM_TYPE_RENDER_PASS:
|
| + InitializeRenderPassProgram(key);
|
| + break;
|
| + case PROGRAM_TYPE_VIDEO_STREAM:
|
| + InitializeVideoStreamProgram(key);
|
| + break;
|
| + }
|
| + fragment_shader_.CheckSubclassProperties();
|
| + vertex_shader_.CheckSubclassProperties();
|
| + InitializeInternal(context_provider);
|
| }
|
|
|
| void InitializeVideoYUV(ContextProvider* context_provider,
|
| @@ -78,23 +162,18 @@ class ProgramBinding : public ProgramBindingBase {
|
| bool use_alpha_plane,
|
| bool use_nv12,
|
| bool use_color_lut) {
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.has_matrix_ = true;
|
| + vertex_shader_.is_ya_uv_ = true;
|
| +
|
| fragment_shader_.use_alpha_texture_ = use_alpha_plane;
|
| fragment_shader_.use_nv12_ = use_nv12;
|
| fragment_shader_.use_color_lut_ = use_color_lut;
|
| - Initialize(context_provider, precision, sampler);
|
| - }
|
| -
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler,
|
| - BlendMode blend_mode,
|
| - bool mask_for_background) {
|
| - vertex_shader_.SetSubclassProperties();
|
| - fragment_shader_.SetSubclassProperties();
|
| - fragment_shader_.blend_mode_ = blend_mode;
|
| - fragment_shader_.mask_for_background_ = mask_for_background;
|
| fragment_shader_.tex_coord_precision_ = precision;
|
| fragment_shader_.sampler_type_ = sampler;
|
| +
|
| + fragment_shader_.CheckSubclassProperties();
|
| + vertex_shader_.CheckSubclassProperties();
|
| InitializeInternal(context_provider);
|
| }
|
|
|
| @@ -102,6 +181,105 @@ class ProgramBinding : public ProgramBindingBase {
|
| const FragmentShader& fragment_shader() const { return fragment_shader_; }
|
|
|
| private:
|
| + void InitializeDebugBorderProgram() {
|
| + // Initialize vertex program.
|
| + vertex_shader_.has_matrix_ = true;
|
| +
|
| + // Initialize fragment program.
|
| + fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + }
|
| +
|
| + void InitializeSolidColorProgram(const ProgramKey& key) {
|
| + // Initialize vertex program.
|
| + vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
|
| + vertex_shader_.has_matrix_ = true;
|
| +#if defined(OS_ANDROID)
|
| + if (key.aa_mode_ == NO_AA)
|
| + vertex_shader_.has_dummy_variables_ = true;
|
| +#endif
|
| +
|
| + // Initialize fragment program.
|
| + fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + }
|
| +
|
| + void InitializeTileProgram(const ProgramKey& key) {
|
| + // Initialize vertex program.
|
| + vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.has_matrix_ = true;
|
| +
|
| + // Initialize fragment program.
|
| + if (key.is_opaque_) {
|
| + DCHECK_EQ(key.aa_mode_, NO_AA);
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE;
|
| + } else {
|
| + // TODO(ccameron): This branch shouldn't be needed (this is always
|
| + // BLEND_MODE_NONE).
|
| + if (key.aa_mode_ == NO_AA && key.swizzle_mode_ == NO_SWIZZLE)
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
|
| + fragment_shader_.has_uniform_alpha_ = true;
|
| + }
|
| +
|
| + // AA changes the texture coordinate mode (affecting both shaders).
|
| + if (key.aa_mode_ == USE_AA) {
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_POSITION;
|
| + vertex_shader_.aa_mode_ = USE_AA;
|
| + fragment_shader_.has_rgba_fragment_tex_transform_ = true;
|
| + }
|
| + }
|
| +
|
| + void InitializeTextureProgram(const ProgramKey& key) {
|
| + // Initialize vertex program.
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
|
| + vertex_shader_.has_matrix_ = true;
|
| + vertex_shader_.has_vertex_opacity_ = true;
|
| + vertex_shader_.use_uniform_arrays_ = true;
|
| +
|
| + // Initialize fragment program.
|
| + fragment_shader_.has_varying_alpha_ = true;
|
| + fragment_shader_.has_background_color_ = key.has_background_color_;
|
| + }
|
| +
|
| + void InitializeRenderPassProgram(const ProgramKey& key) {
|
| + // Initialize vertex program.
|
| + vertex_shader_.has_matrix_ = true;
|
| + if (key.aa_mode_ == NO_AA) {
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
|
| + vertex_shader_.has_vertex_opacity_ = true;
|
| + vertex_shader_.use_uniform_arrays_ = true;
|
| + } else {
|
| + vertex_shader_.position_source_ =
|
| + POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_POSITION;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4;
|
| + }
|
| +
|
| + // Initialize fragment program.
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
|
| + fragment_shader_.has_uniform_alpha_ = true;
|
| + fragment_shader_.has_color_matrix_ = key.has_color_matrix_;
|
| + if (key.mask_mode_ == HAS_MASK) {
|
| + fragment_shader_.ignore_sampler_type_ = true;
|
| + } else {
|
| + DCHECK(!key.mask_for_background_);
|
| + }
|
| + }
|
| +
|
| + void InitializeVideoStreamProgram(const ProgramKey& key) {
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX;
|
| + vertex_shader_.has_matrix_ = true;
|
| +
|
| + fragment_shader_.tex_coord_precision_ = key.precision_;
|
| + fragment_shader_.sampler_type_ = SAMPLER_TYPE_EXTERNAL_OES;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + }
|
| +
|
| void InitializeInternal(ContextProvider* context_provider) {
|
| DCHECK(context_provider);
|
| DCHECK(!initialized_);
|
|
|