Index: cc/output/shader.h |
diff --git a/cc/output/shader.h b/cc/output/shader.h |
index fdccb59355b9f1d40bd1f1795aa525d623642f46..a74a58fac456d013836b35f73e107f9bbf48d1ff 100644 |
--- a/cc/output/shader.h |
+++ b/cc/output/shader.h |
@@ -356,12 +356,12 @@ class VertexShaderVideoTransform { |
class FragmentShaderBase { |
public: |
+ virtual void Init(gpu::gles2::GLES2Interface* context, |
+ unsigned program, |
+ int* base_uniform_index); |
std::string GetShaderString(TexCoordPrecision precision, |
SamplerType sampler) const; |
- |
- int backdrop_location() const { return backdrop_location_; } |
- int original_backdrop_location() const { return original_backdrop_location_; } |
- int backdrop_rect_location() const { return backdrop_rect_location_; } |
+ void FillLocations(ShaderLocations* locations) const; |
BlendMode blend_mode() const { return blend_mode_; } |
void set_blend_mode(BlendMode blend_mode) { blend_mode_ = blend_mode; } |
@@ -371,19 +371,52 @@ class FragmentShaderBase { |
} |
bool mask_for_background() const { return mask_for_background_; } |
+ int sampler_location() const { return sampler_location_; } |
+ int alpha_location() const { return alpha_location_; } |
+ int color_location() const { return color_location_; } |
+ int background_color_location() const { return background_color_location_; } |
+ int fragment_tex_transform_location() const { |
+ return fragment_tex_transform_location_; |
+ } |
+ |
protected: |
FragmentShaderBase(); |
virtual std::string GetShaderSource() const = 0; |
std::string SetBlendModeFunctions(const std::string& shader_string) const; |
- int backdrop_location_; |
- int original_backdrop_location_; |
- int backdrop_rect_location_; |
+ // Used only if |blend_mode_| is not BLEND_MODE_NONE. |
+ int backdrop_location_ = -1; |
+ int original_backdrop_location_ = -1; |
+ int backdrop_rect_location_ = -1; |
+ |
+ bool has_mask_sampler_ = false; |
+ int mask_sampler_location_ = -1; |
+ int mask_tex_coord_scale_location_ = -1; |
+ int mask_tex_coord_offset_location_ = -1; |
+ |
+ bool has_color_matrix_ = false; |
+ int color_matrix_location_ = -1; |
+ int color_offset_location_ = -1; |
+ |
+ bool has_sampler_ = false; |
+ int sampler_location_ = -1; |
+ |
+ bool has_uniform_alpha_ = false; |
+ int alpha_location_ = -1; |
+ |
+ bool has_background_color_ = false; |
+ int background_color_location_ = -1; |
+ |
+ bool has_fragment_tex_transform_ = false; |
+ int fragment_tex_transform_location_ = -1; |
+ |
+ bool has_uniform_color_ = false; |
+ int color_location_ = -1; |
private: |
- BlendMode blend_mode_; |
- bool mask_for_background_; |
+ BlendMode blend_mode_ = BLEND_MODE_NONE; |
+ bool mask_for_background_ = false; |
std::string GetHelperFunctions() const; |
std::string GetBlendFunction() const; |
@@ -392,74 +425,42 @@ class FragmentShaderBase { |
class FragmentTexAlphaBinding : public FragmentShaderBase { |
public: |
- FragmentTexAlphaBinding(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int fragment_tex_transform_location() const { return -1; } |
- int sampler_location() const { return sampler_location_; } |
+ FragmentTexAlphaBinding() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ } |
private: |
- int sampler_location_; |
- int alpha_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentTexAlphaBinding); |
}; |
class FragmentTexColorMatrixAlphaBinding : public FragmentShaderBase { |
public: |
- FragmentTexColorMatrixAlphaBinding(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int color_matrix_location() const { return color_matrix_location_; } |
- int color_offset_location() const { return color_offset_location_; } |
- int fragment_tex_transform_location() const { return -1; } |
- int sampler_location() const { return sampler_location_; } |
+ FragmentTexColorMatrixAlphaBinding() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_color_matrix_ = true; |
+ } |
private: |
- int sampler_location_; |
- int alpha_location_; |
- int color_matrix_location_; |
- int color_offset_location_; |
}; |
class FragmentTexOpaqueBinding : public FragmentShaderBase { |
public: |
- FragmentTexOpaqueBinding(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return -1; } |
- int fragment_tex_transform_location() const { return -1; } |
- int background_color_location() const { return -1; } |
- int sampler_location() const { return sampler_location_; } |
+ FragmentTexOpaqueBinding() { has_sampler_ = true; } |
private: |
- int sampler_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding); |
}; |
class FragmentTexBackgroundBinding : public FragmentShaderBase { |
public: |
- FragmentTexBackgroundBinding(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int background_color_location() const { return background_color_location_; } |
- int sampler_location() const { return sampler_location_; } |
+ FragmentTexBackgroundBinding() { |
+ has_sampler_ = true; |
+ has_background_color_ = true; |
+ } |
private: |
- int background_color_location_; |
- int sampler_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding); |
}; |
@@ -486,18 +487,12 @@ class FragmentShaderTexBackgroundPremultiplyAlpha |
}; |
class FragmentShaderRGBATexAlpha : public FragmentTexAlphaBinding { |
- public: |
- void FillLocations(ShaderLocations* locations) const; |
- |
private: |
std::string GetShaderSource() const override; |
}; |
class FragmentShaderRGBATexColorMatrixAlpha |
: public FragmentTexColorMatrixAlphaBinding { |
- public: |
- void FillLocations(ShaderLocations* locations) const; |
- |
private: |
std::string GetShaderSource() const override; |
}; |
@@ -526,42 +521,24 @@ class FragmentShaderRGBATexSwizzleOpaque : public FragmentTexOpaqueBinding { |
class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaAA(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- void FillLocations(ShaderLocations* locations) const; |
- |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
+ FragmentShaderRGBATexAlphaAA() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ } |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int alpha_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaAA); |
}; |
class FragmentTexClampAlphaAABinding : public FragmentShaderBase { |
public: |
- FragmentTexClampAlphaAABinding(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int fragment_tex_transform_location() const { |
- return fragment_tex_transform_location_; |
+ FragmentTexClampAlphaAABinding() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_fragment_tex_transform_ = true; |
} |
- |
private: |
- int sampler_location_; |
- int alpha_location_; |
- int fragment_tex_transform_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentTexClampAlphaAABinding); |
}; |
@@ -580,138 +557,62 @@ class FragmentShaderRGBATexClampSwizzleAlphaAA |
class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaMask(); |
- void FillLocations(ShaderLocations* locations) const; |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int mask_sampler_location() const { return mask_sampler_location_; } |
- int mask_tex_coord_scale_location() const { |
- return mask_tex_coord_scale_location_; |
+ FragmentShaderRGBATexAlphaMask() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_mask_sampler_ = true; |
} |
- int mask_tex_coord_offset_location() const { |
- return mask_tex_coord_offset_location_; |
- } |
- |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int mask_sampler_location_; |
- int alpha_location_; |
- int mask_tex_coord_scale_location_; |
- int mask_tex_coord_offset_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMask); |
}; |
class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaMaskAA(); |
- void FillLocations(ShaderLocations* locations) const; |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int mask_sampler_location() const { return mask_sampler_location_; } |
- int mask_tex_coord_scale_location() const { |
- return mask_tex_coord_scale_location_; |
+ FragmentShaderRGBATexAlphaMaskAA() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_mask_sampler_ = true; |
} |
- int mask_tex_coord_offset_location() const { |
- return mask_tex_coord_offset_location_; |
- } |
- |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int mask_sampler_location_; |
- int alpha_location_; |
- int mask_tex_coord_scale_location_; |
- int mask_tex_coord_offset_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMaskAA); |
}; |
class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaMaskColorMatrixAA(); |
- void FillLocations(ShaderLocations* locations) const; |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int mask_sampler_location() const { return mask_sampler_location_; } |
- int mask_tex_coord_scale_location() const { |
- return mask_tex_coord_scale_location_; |
+ FragmentShaderRGBATexAlphaMaskColorMatrixAA() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_mask_sampler_ = true; |
+ has_color_matrix_ = true; |
} |
- int mask_tex_coord_offset_location() const { |
- return mask_tex_coord_offset_location_; |
- } |
- int color_matrix_location() const { return color_matrix_location_; } |
- int color_offset_location() const { return color_offset_location_; } |
- |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int mask_sampler_location_; |
- int alpha_location_; |
- int mask_tex_coord_scale_location_; |
- int mask_tex_coord_offset_location_; |
- int color_matrix_location_; |
- int color_offset_location_; |
}; |
class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaColorMatrixAA(); |
- void FillLocations(ShaderLocations* locations) const; |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int color_matrix_location() const { return color_matrix_location_; } |
- int color_offset_location() const { return color_offset_location_; } |
+ FragmentShaderRGBATexAlphaColorMatrixAA() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_color_matrix_ = true; |
+ } |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int alpha_location_; |
- int color_matrix_location_; |
- int color_offset_location_; |
}; |
class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase { |
public: |
- FragmentShaderRGBATexAlphaMaskColorMatrix(); |
- void FillLocations(ShaderLocations* locations) const; |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int alpha_location() const { return alpha_location_; } |
- int sampler_location() const { return sampler_location_; } |
- int mask_sampler_location() const { return mask_sampler_location_; } |
- int mask_tex_coord_scale_location() const { |
- return mask_tex_coord_scale_location_; |
+ FragmentShaderRGBATexAlphaMaskColorMatrix() { |
+ has_sampler_ = true; |
+ has_uniform_alpha_ = true; |
+ has_mask_sampler_ = true; |
+ has_color_matrix_ = true; |
} |
- int mask_tex_coord_offset_location() const { |
- return mask_tex_coord_offset_location_; |
- } |
- int color_matrix_location() const { return color_matrix_location_; } |
- int color_offset_location() const { return color_offset_location_; } |
- |
private: |
std::string GetShaderSource() const override; |
- int sampler_location_; |
- int mask_sampler_location_; |
- int alpha_location_; |
- int mask_tex_coord_scale_location_; |
- int mask_tex_coord_offset_location_; |
- int color_matrix_location_; |
- int color_offset_location_; |
}; |
class FragmentShaderYUVVideo : public FragmentShaderBase { |
@@ -721,7 +622,7 @@ class FragmentShaderYUVVideo : public FragmentShaderBase { |
void Init(gpu::gles2::GLES2Interface* context, |
unsigned program, |
- int* base_uniform_index); |
+ int* base_uniform_index) override; |
int y_texture_location() const { return y_texture_location_; } |
int u_texture_location() const { return u_texture_location_; } |
int v_texture_location() const { return v_texture_location_; } |
@@ -741,56 +642,42 @@ class FragmentShaderYUVVideo : public FragmentShaderBase { |
private: |
std::string GetShaderSource() const override; |
- bool use_alpha_texture_; |
- bool use_nv12_; |
- bool use_color_lut_; |
- |
- int y_texture_location_; |
- int u_texture_location_; |
- int v_texture_location_; |
- int uv_texture_location_; |
- int a_texture_location_; |
- int lut_texture_location_; |
- int alpha_location_; |
- int yuv_matrix_location_; |
- int yuv_adj_location_; |
- int ya_clamp_rect_location_; |
- int uv_clamp_rect_location_; |
- int resource_multiplier_location_; |
- int resource_offset_location_; |
+ bool use_alpha_texture_ = false; |
+ bool use_nv12_ = false; |
+ bool use_color_lut_ = false; |
+ |
+ int y_texture_location_ = -1; |
+ int u_texture_location_ = -1; |
+ int v_texture_location_ = -1; |
+ int uv_texture_location_ = -1; |
+ int a_texture_location_ = -1; |
+ int lut_texture_location_ = -1; |
+ int alpha_location_ = -1; |
+ int yuv_matrix_location_ = -1; |
+ int yuv_adj_location_ = -1; |
+ int ya_clamp_rect_location_ = -1; |
+ int uv_clamp_rect_location_ = -1; |
+ int resource_multiplier_location_ = -1; |
+ int resource_offset_location_ = -1; |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderYUVVideo); |
}; |
class FragmentShaderColor : public FragmentShaderBase { |
public: |
- FragmentShaderColor(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int color_location() const { return color_location_; } |
+ FragmentShaderColor() { has_uniform_color_ = true; } |
private: |
std::string GetShaderSource() const override; |
- int color_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderColor); |
}; |
class FragmentShaderColorAA : public FragmentShaderBase { |
public: |
- FragmentShaderColorAA(); |
- |
- void Init(gpu::gles2::GLES2Interface* context, |
- unsigned program, |
- int* base_uniform_index); |
- int color_location() const { return color_location_; } |
+ FragmentShaderColorAA() { has_uniform_color_ = true; } |
private: |
std::string GetShaderSource() const override; |
- int color_location_; |
- |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderColorAA); |
}; |