Index: cc/output/shader.h |
diff --git a/cc/output/shader.h b/cc/output/shader.h |
index 804f9ad97dac66e1274bbe3fdec271ca3da43338..a028c3846478d0fc8af56ef4d6cbaed95487000a 100644 |
--- a/cc/output/shader.h |
+++ b/cc/output/shader.h |
@@ -62,6 +62,21 @@ enum PositionSource { |
POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM, |
}; |
+enum AAMode { |
+ NO_AA = 0, |
+ USE_AA = 1, |
+}; |
+ |
+enum SwizzleMode { |
+ NO_SWIZZLE = 0, |
+ DO_SWIZZLE = 1, |
+}; |
+ |
+enum PremultipliedAlphaMode { |
+ PREMULTIPLIED_ALPHA = 0, |
+ NON_PREMULTIPLIED_ALPHA = 1, |
+}; |
+ |
enum SamplerType { |
SAMPLER_TYPE_NA = 0, |
SAMPLER_TYPE_2D = 1, |
@@ -109,6 +124,11 @@ enum MaskMode { |
LAST_MASK_VALUE = HAS_MASK |
}; |
+enum OpacityMode { |
+ NOT_OPAQUE = 0, |
+ IS_OPAQUE = 1, |
+}; |
+ |
struct ShaderLocations { |
ShaderLocations(); |
@@ -175,6 +195,9 @@ class VertexShaderBase { |
int quad_location() const { return quad_location_; } |
protected: |
+ template <class FragmentShader> |
+ friend class ProgramBinding; |
+ |
// Use arrays of uniforms for matrix, texTransform, and opacity. |
bool use_uniform_arrays_ = false; |
@@ -215,117 +238,14 @@ class VertexShaderBase { |
int edge_location_ = -1; |
}; |
-class VertexShaderPosTex : public VertexShaderBase { |
- public: |
- VertexShaderPosTex() { |
- tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
- has_matrix_ = true; |
- } |
-}; |
- |
-class VertexShaderPosTexYUVStretchOffset : public VertexShaderBase { |
- public: |
- VertexShaderPosTexYUVStretchOffset() { |
- tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
- has_matrix_ = true; |
- is_ya_uv_ = true; |
- } |
-}; |
- |
-class VertexShaderPos : public VertexShaderBase { |
- public: |
- VertexShaderPos() { has_matrix_ = true; } |
-}; |
- |
-class VertexShaderPosTexTransform : public VertexShaderBase { |
- public: |
- VertexShaderPosTexTransform() { |
- tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
- tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
- has_matrix_ = true; |
- has_vertex_opacity_ = true; |
- use_uniform_arrays_ = true; |
- } |
-}; |
- |
-class VertexShaderQuad : public VertexShaderBase { |
- public: |
- VertexShaderQuad() { |
- position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
- has_matrix_ = true; |
-#if defined(OS_ANDROID) |
- has_dummy_variables_ = true; |
-#endif |
- } |
-}; |
- |
-class VertexShaderQuadAA : public VertexShaderBase { |
- public: |
- VertexShaderQuadAA() { |
- position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
- has_matrix_ = true; |
- has_aa_ = true; |
- } |
-}; |
- |
-class VertexShaderQuadTexTransformAA : public VertexShaderBase { |
- public: |
- VertexShaderQuadTexTransformAA() { |
- position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
- tex_coord_source_ = TEX_COORD_SOURCE_POSITION; |
- tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4; |
- has_matrix_ = true; |
- has_aa_ = true; |
- } |
-}; |
- |
-class VertexShaderTile : public VertexShaderBase { |
- public: |
- VertexShaderTile() { |
- position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
- tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
- tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
- has_matrix_ = true; |
- } |
-}; |
- |
-class VertexShaderTileAA : public VertexShaderBase { |
- public: |
- VertexShaderTileAA() { |
- position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM; |
- tex_coord_source_ = TEX_COORD_SOURCE_POSITION; |
- tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4; |
- has_matrix_ = true; |
- has_aa_ = true; |
- } |
-}; |
- |
-class VertexShaderVideoTransform : public VertexShaderBase { |
- public: |
- VertexShaderVideoTransform() { |
- tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE; |
- tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX; |
- has_matrix_ = true; |
- } |
-}; |
- |
class FragmentShaderBase { |
public: |
virtual void Init(gpu::gles2::GLES2Interface* context, |
unsigned program, |
int* base_uniform_index); |
- std::string GetShaderString(TexCoordPrecision precision, |
- SamplerType sampler) const; |
+ std::string GetShaderString() const; |
void FillLocations(ShaderLocations* locations) const; |
- BlendMode blend_mode() const { return blend_mode_; } |
- void set_blend_mode(BlendMode blend_mode) { blend_mode_ = blend_mode; } |
- bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; } |
- void set_mask_for_background(bool mask_for_background) { |
- mask_for_background_ = mask_for_background; |
- } |
- 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_; } |
@@ -337,6 +257,7 @@ class FragmentShaderBase { |
protected: |
FragmentShaderBase(); |
virtual std::string GetShaderSource() const; |
+ bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; } |
std::string SetBlendModeFunctions(const std::string& shader_string) const; |
@@ -382,10 +303,15 @@ class FragmentShaderBase { |
bool has_background_color_ = false; |
int background_color_location_ = -1; |
- private: |
+ TexCoordPrecision tex_coord_precision_ = TEX_COORD_PRECISION_NA; |
+ SamplerType sampler_type_ = SAMPLER_TYPE_NA; |
BlendMode blend_mode_ = BLEND_MODE_NONE; |
bool mask_for_background_ = false; |
+ private: |
+ template <class FragmentShader> |
+ friend class ProgramBinding; |
+ |
std::string GetHelperFunctions() const; |
std::string GetBlendFunction() const; |
std::string GetBlendFunctionBodyForRGB() const; |
@@ -393,173 +319,6 @@ class FragmentShaderBase { |
DISALLOW_COPY_AND_ASSIGN(FragmentShaderBase); |
}; |
-class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexVaryingAlpha() { |
- has_varying_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-class FragmentShaderRGBATexPremultiplyAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexPremultiplyAlpha() { |
- has_varying_alpha_ = true; |
- has_premultiply_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderTexBackgroundVaryingAlpha() { |
- has_background_color_ = true; |
- has_varying_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderTexBackgroundPremultiplyAlpha() { |
- has_background_color_ = true; |
- has_varying_alpha_ = true; |
- has_premultiply_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlpha() { |
- has_uniform_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- } |
-}; |
- |
-class FragmentShaderRGBATexColorMatrixAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexColorMatrixAlpha() { |
- has_uniform_alpha_ = true; |
- has_color_matrix_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- } |
-}; |
- |
-class FragmentShaderRGBATexOpaque : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexOpaque() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; } |
-}; |
- |
-class FragmentShaderRGBATex : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATex() { frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; } |
-}; |
- |
-// Swizzles the red and blue component of sampled texel with alpha. |
-class FragmentShaderRGBATexSwizzleAlpha : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexSwizzleAlpha() { |
- has_uniform_alpha_ = true; |
- has_swizzle_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-// Swizzles the red and blue component of sampled texel without alpha. |
-class FragmentShaderRGBATexSwizzleOpaque : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexSwizzleOpaque() { |
- has_swizzle_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- } |
-}; |
- |
-class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexClampAlphaAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- has_rgba_fragment_tex_transform_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-// Swizzles the red and blue component of sampled texel. |
-class FragmentShaderRGBATexClampSwizzleAlphaAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexClampSwizzleAlphaAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- has_rgba_fragment_tex_transform_ = true; |
- has_swizzle_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaMask() { |
- has_uniform_alpha_ = true; |
- has_mask_sampler_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- ignore_sampler_type_ = true; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaMaskAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- has_mask_sampler_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- ignore_sampler_type_ = true; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaMaskColorMatrixAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- has_mask_sampler_ = true; |
- has_color_matrix_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- ignore_sampler_type_ = true; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaColorMatrixAA() { |
- has_aa_ = true; |
- has_uniform_alpha_ = true; |
- has_color_matrix_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- } |
-}; |
- |
-class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase { |
- public: |
- FragmentShaderRGBATexAlphaMaskColorMatrix() { |
- has_uniform_alpha_ = true; |
- has_mask_sampler_ = true; |
- has_color_matrix_ = true; |
- frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE; |
- ignore_sampler_type_ = true; |
- } |
-}; |
- |
class FragmentShaderYUVVideo : public FragmentShaderBase { |
public: |
FragmentShaderYUVVideo(); |