| Index: cc/output/program_binding.h
|
| diff --git a/cc/output/program_binding.h b/cc/output/program_binding.h
|
| index 6f0e818b5ed1b6d93ce5531e06ee32f35a222dcd..78a2ae0e4da7d585da7e841cebba7930cb837400 100644
|
| --- a/cc/output/program_binding.h
|
| +++ b/cc/output/program_binding.h
|
| @@ -54,44 +54,176 @@ class ProgramBindingBase {
|
| DISALLOW_COPY_AND_ASSIGN(ProgramBindingBase);
|
| };
|
|
|
| -template <class VertexShader, class FragmentShader>
|
| +template <class FragmentShader>
|
| class ProgramBinding : public ProgramBindingBase {
|
| public:
|
| ProgramBinding() {}
|
|
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler) {
|
| - return Initialize(
|
| - context_provider, precision, sampler, BLEND_MODE_NONE, false);
|
| + void InitializeDebugBorderProgram(ContextProvider* context_provider) {
|
| + vertex_shader_.has_matrix_ = true;
|
| +
|
| + fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| +
|
| + InitializeInternal(context_provider);
|
| + }
|
| +
|
| + void InitializeSolidColorProgram(ContextProvider* context_provider,
|
| + bool use_aa) {
|
| + vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
|
| + vertex_shader_.has_matrix_ = true;
|
| +#if defined(OS_ANDROID)
|
| + vertex_shader_.has_dummy_variables_ = true;
|
| +#endif
|
| + vertex_shader_.has_aa_ = use_aa;
|
| +
|
| + fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + fragment_shader_.has_aa_ = use_aa;
|
| +
|
| + InitializeInternal(context_provider);
|
| + }
|
| +
|
| + void InitializeTileProgram(ContextProvider* context_provider,
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + AAMode aa_mode,
|
| + SwizzleMode swizzle_mode,
|
| + OpacityMode opacity_mode) {
|
| + vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
|
| + vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
|
| + vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
|
| + vertex_shader_.has_matrix_ = true;
|
| + fragment_shader_.tex_coord_precision_ = precision;
|
| + fragment_shader_.sampler_type_ = sampler;
|
| + if (swizzle_mode == DO_SWIZZLE)
|
| + fragment_shader_.has_swizzle_ = true;
|
| + if (aa_mode == USE_AA) {
|
| + vertex_shader_.has_aa_ = true;
|
| + fragment_shader_.has_aa_ = true;
|
| + fragment_shader_.has_rgba_fragment_tex_transform_ = true;
|
| + }
|
| +
|
| + if (opacity_mode == IS_OPAQUE) {
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE;
|
| + } else {
|
| + fragment_shader_.has_uniform_alpha_ = true;
|
| + // TODO(ccameron): Determine if we can always use FRAG_COLOR_MODE_DEFAULT
|
| + // here.
|
| + if (aa_mode == NO_AA && swizzle_mode == NO_SWIZZLE)
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
|
| + else
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + }
|
| +
|
| + InitializeInternal(context_provider);
|
| }
|
|
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler,
|
| - BlendMode blend_mode) {
|
| - return Initialize(
|
| - context_provider, precision, sampler, blend_mode, false);
|
| + void InitializeTextureProgram(ContextProvider* context_provider,
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + PremultipliedAlphaMode premultiplied_alpha,
|
| + bool has_background_color) {
|
| + 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;
|
| + fragment_shader_.tex_coord_precision_ = precision;
|
| + fragment_shader_.sampler_type_ = sampler;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| + fragment_shader_.has_varying_alpha_ = true;
|
| + if (premultiplied_alpha == NON_PREMULTIPLIED_ALPHA)
|
| + fragment_shader_.has_premultiply_alpha_ = true;
|
| + fragment_shader_.has_background_color_ = has_background_color;
|
| + InitializeInternal(context_provider);
|
| }
|
|
|
| - void Initialize(ContextProvider* context_provider,
|
| - TexCoordPrecision precision,
|
| - SamplerType sampler,
|
| - BlendMode blend_mode,
|
| - bool mask_for_background) {
|
| + // TODO(ccameron): Merge |mask_for_background| into MaskMode.
|
| + void InitializeRenderPassProgram(ContextProvider* context_provider,
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + BlendMode blend_mode,
|
| + AAMode aa_mode,
|
| + MaskMode mask_mode,
|
| + bool mask_for_background,
|
| + bool has_color_matrix) {
|
| + vertex_shader_.has_matrix_ = true;
|
| + if (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;
|
| + vertex_shader_.has_aa_ = true;
|
| + fragment_shader_.has_aa_ = true;
|
| + }
|
| +
|
| + fragment_shader_.tex_coord_precision_ = precision;
|
| + fragment_shader_.sampler_type_ = sampler;
|
| + fragment_shader_.blend_mode_ = blend_mode;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
|
| + fragment_shader_.has_uniform_alpha_ = true;
|
| + fragment_shader_.mask_for_background_ = mask_for_background;
|
| + fragment_shader_.has_color_matrix_ = has_color_matrix;
|
| + if (mask_mode == HAS_MASK) {
|
| + fragment_shader_.has_mask_sampler_ = true;
|
| + fragment_shader_.ignore_sampler_type_ = true;
|
| + } else {
|
| + DCHECK(!mask_for_background);
|
| + }
|
| +
|
| + InitializeInternal(context_provider);
|
| + }
|
| +
|
| + void InitializeVideoStreamProgram(ContextProvider* context_provider,
|
| + TexCoordPrecision precision) {
|
| + 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_ = precision;
|
| + fragment_shader_.sampler_type_ = SAMPLER_TYPE_EXTERNAL_OES;
|
| + fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
|
| +
|
| + InitializeInternal(context_provider);
|
| + }
|
| +
|
| + void InitializeVideoYUVProgram(ContextProvider* context_provider,
|
| + TexCoordPrecision precision,
|
| + SamplerType sampler,
|
| + 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_.tex_coord_precision_ = precision;
|
| + fragment_shader_.sampler_type_ = sampler;
|
| + fragment_shader_.SetFeatures(use_alpha_plane, use_nv12, use_color_lut);
|
| +
|
| + InitializeInternal(context_provider);
|
| + }
|
| +
|
| + const VertexShaderBase& vertex_shader() const { return vertex_shader_; }
|
| + const FragmentShader& fragment_shader() const { return fragment_shader_; }
|
| +
|
| + private:
|
| + void InitializeInternal(ContextProvider* context_provider) {
|
| DCHECK(context_provider);
|
| DCHECK(!initialized_);
|
|
|
| if (IsContextLost(context_provider->ContextGL()))
|
| return;
|
|
|
| - fragment_shader_.set_blend_mode(blend_mode);
|
| - fragment_shader_.set_mask_for_background(mask_for_background);
|
| -
|
| - if (!ProgramBindingBase::Init(
|
| - context_provider->ContextGL(),
|
| - vertex_shader_.GetShaderString(),
|
| - fragment_shader_.GetShaderString(precision, sampler))) {
|
| + if (!ProgramBindingBase::Init(context_provider->ContextGL(),
|
| + vertex_shader_.GetShaderString(),
|
| + fragment_shader_.GetShaderString())) {
|
| DCHECK(IsContextLost(context_provider->ContextGL()));
|
| return;
|
| }
|
| @@ -111,12 +243,7 @@ class ProgramBinding : public ProgramBindingBase {
|
| initialized_ = true;
|
| }
|
|
|
| - const VertexShader& vertex_shader() const { return vertex_shader_; }
|
| - const FragmentShader& fragment_shader() const { return fragment_shader_; }
|
| - FragmentShader* mutable_fragment_shader() { return &fragment_shader_; }
|
| -
|
| - private:
|
| - VertexShader vertex_shader_;
|
| + VertexShaderBase vertex_shader_;
|
| FragmentShader fragment_shader_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ProgramBinding);
|
|
|