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

Unified Diff: cc/output/shader.h

Issue 2626823002: The great shader refactor: Separate initialization from ctor (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
« no previous file with comments | « cc/output/program_binding.h ('k') | cc/output/shader.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/shader.h
diff --git a/cc/output/shader.h b/cc/output/shader.h
index 804f9ad97dac66e1274bbe3fdec271ca3da43338..9d50182afa46bca37e57804d91e4db19353fb59c 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,
@@ -175,6 +190,9 @@ class VertexShaderBase {
int quad_location() const { return quad_location_; }
protected:
+ template <class VertexShader, class FragmentShader>
+ friend class ProgramBinding;
+
// Use arrays of uniforms for matrix, texTransform, and opacity.
bool use_uniform_arrays_ = false;
@@ -210,14 +228,14 @@ class VertexShaderBase {
bool has_vertex_opacity_ = false;
int vertex_opacity_location_ = -1;
- bool has_aa_ = false;
+ AAMode aa_mode_ = NO_AA;
int viewport_location_ = -1;
int edge_location_ = -1;
};
class VertexShaderPosTex : public VertexShaderBase {
public:
- VertexShaderPosTex() {
+ void SetSubclassProperties() {
tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
has_matrix_ = true;
}
@@ -225,7 +243,7 @@ class VertexShaderPosTex : public VertexShaderBase {
class VertexShaderPosTexYUVStretchOffset : public VertexShaderBase {
public:
- VertexShaderPosTexYUVStretchOffset() {
+ void SetSubclassProperties() {
tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
has_matrix_ = true;
is_ya_uv_ = true;
@@ -234,12 +252,12 @@ class VertexShaderPosTexYUVStretchOffset : public VertexShaderBase {
class VertexShaderPos : public VertexShaderBase {
public:
- VertexShaderPos() { has_matrix_ = true; }
+ void SetSubclassProperties() { has_matrix_ = true; }
};
class VertexShaderPosTexTransform : public VertexShaderBase {
public:
- VertexShaderPosTexTransform() {
+ void SetSubclassProperties() {
tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
has_matrix_ = true;
@@ -250,7 +268,7 @@ class VertexShaderPosTexTransform : public VertexShaderBase {
class VertexShaderQuad : public VertexShaderBase {
public:
- VertexShaderQuad() {
+ void SetSubclassProperties() {
position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
has_matrix_ = true;
#if defined(OS_ANDROID)
@@ -261,27 +279,27 @@ class VertexShaderQuad : public VertexShaderBase {
class VertexShaderQuadAA : public VertexShaderBase {
public:
- VertexShaderQuadAA() {
+ void SetSubclassProperties() {
position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
has_matrix_ = true;
- has_aa_ = true;
+ aa_mode_ = USE_AA;
}
};
class VertexShaderQuadTexTransformAA : public VertexShaderBase {
public:
- VertexShaderQuadTexTransformAA() {
+ void SetSubclassProperties() {
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;
+ aa_mode_ = USE_AA;
}
};
class VertexShaderTile : public VertexShaderBase {
public:
- VertexShaderTile() {
+ void SetSubclassProperties() {
position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
@@ -291,18 +309,18 @@ class VertexShaderTile : public VertexShaderBase {
class VertexShaderTileAA : public VertexShaderBase {
public:
- VertexShaderTileAA() {
+ void SetSubclassProperties() {
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;
+ aa_mode_ = USE_AA;
}
};
class VertexShaderVideoTransform : public VertexShaderBase {
public:
- VertexShaderVideoTransform() {
+ void SetSubclassProperties() {
tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX;
has_matrix_ = true;
@@ -314,18 +332,9 @@ class FragmentShaderBase {
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,14 +346,15 @@ 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;
// Settings that are modified by sub-classes.
- bool has_aa_ = false;
+ AAMode aa_mode_ = NO_AA;
bool has_varying_alpha_ = false;
- bool has_swizzle_ = false;
- bool has_premultiply_alpha_ = false;
+ SwizzleMode swizzle_mode_ = NO_SWIZZLE;
+ PremultipliedAlphaMode premultiply_alpha_mode_ = PREMULTIPLIED_ALPHA;
FragColorMode frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
InputColorSource input_color_type_ = INPUT_COLOR_SOURCE_RGBA_TEXTURE;
@@ -367,7 +377,7 @@ class FragmentShaderBase {
// Used only if |input_color_type_| is INPUT_COLOR_SOURCE_UNIFORM.
int color_location_ = -1;
- bool has_mask_sampler_ = false;
+ MaskMode mask_mode_ = NO_MASK;
int mask_sampler_location_ = -1;
int mask_tex_coord_scale_location_ = -1;
int mask_tex_coord_offset_location_ = -1;
@@ -382,10 +392,16 @@ 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 VertexShader, class FragmentShader>
+ friend class ProgramBinding;
+
std::string GetHelperFunctions() const;
std::string GetBlendFunction() const;
std::string GetBlendFunctionBodyForRGB() const;
@@ -395,7 +411,7 @@ class FragmentShaderBase {
class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase {
public:
- FragmentShaderRGBATexVaryingAlpha() {
+ void SetSubclassProperties() {
has_varying_alpha_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
@@ -403,16 +419,16 @@ class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase {
class FragmentShaderRGBATexPremultiplyAlpha : public FragmentShaderBase {
public:
- FragmentShaderRGBATexPremultiplyAlpha() {
+ void SetSubclassProperties() {
has_varying_alpha_ = true;
- has_premultiply_alpha_ = true;
+ premultiply_alpha_mode_ = NON_PREMULTIPLIED_ALPHA;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
};
class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase {
public:
- FragmentShaderTexBackgroundVaryingAlpha() {
+ void SetSubclassProperties() {
has_background_color_ = true;
has_varying_alpha_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
@@ -421,17 +437,17 @@ class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase {
class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentShaderBase {
public:
- FragmentShaderTexBackgroundPremultiplyAlpha() {
+ void SetSubclassProperties() {
has_background_color_ = true;
has_varying_alpha_ = true;
- has_premultiply_alpha_ = true;
+ premultiply_alpha_mode_ = NON_PREMULTIPLIED_ALPHA;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
};
class FragmentShaderRGBATexAlpha : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlpha() {
+ void SetSubclassProperties() {
has_uniform_alpha_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
}
@@ -439,7 +455,7 @@ class FragmentShaderRGBATexAlpha : public FragmentShaderBase {
class FragmentShaderRGBATexColorMatrixAlpha : public FragmentShaderBase {
public:
- FragmentShaderRGBATexColorMatrixAlpha() {
+ void SetSubclassProperties() {
has_uniform_alpha_ = true;
has_color_matrix_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
@@ -448,20 +464,20 @@ class FragmentShaderRGBATexColorMatrixAlpha : public FragmentShaderBase {
class FragmentShaderRGBATexOpaque : public FragmentShaderBase {
public:
- FragmentShaderRGBATexOpaque() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; }
+ void SetSubclassProperties() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; }
};
class FragmentShaderRGBATex : public FragmentShaderBase {
public:
- FragmentShaderRGBATex() { frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; }
+ void SetSubclassProperties() { frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT; }
};
// Swizzles the red and blue component of sampled texel with alpha.
class FragmentShaderRGBATexSwizzleAlpha : public FragmentShaderBase {
public:
- FragmentShaderRGBATexSwizzleAlpha() {
+ void SetSubclassProperties() {
has_uniform_alpha_ = true;
- has_swizzle_ = true;
+ swizzle_mode_ = DO_SWIZZLE;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
};
@@ -469,16 +485,16 @@ class FragmentShaderRGBATexSwizzleAlpha : public FragmentShaderBase {
// Swizzles the red and blue component of sampled texel without alpha.
class FragmentShaderRGBATexSwizzleOpaque : public FragmentShaderBase {
public:
- FragmentShaderRGBATexSwizzleOpaque() {
- has_swizzle_ = true;
+ void SetSubclassProperties() {
+ swizzle_mode_ = DO_SWIZZLE;
frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE;
}
};
class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
}
@@ -486,8 +502,8 @@ class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase {
class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexClampAlphaAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
has_rgba_fragment_tex_transform_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
@@ -497,20 +513,20 @@ class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase {
// Swizzles the red and blue component of sampled texel.
class FragmentShaderRGBATexClampSwizzleAlphaAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexClampSwizzleAlphaAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
has_rgba_fragment_tex_transform_ = true;
- has_swizzle_ = true;
+ swizzle_mode_ = DO_SWIZZLE;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
};
class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaMask() {
+ void SetSubclassProperties() {
has_uniform_alpha_ = true;
- has_mask_sampler_ = true;
+ mask_mode_ = HAS_MASK;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
ignore_sampler_type_ = true;
}
@@ -518,10 +534,10 @@ class FragmentShaderRGBATexAlphaMask : public FragmentShaderBase {
class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaMaskAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
- has_mask_sampler_ = true;
+ mask_mode_ = HAS_MASK;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
ignore_sampler_type_ = true;
}
@@ -529,10 +545,10 @@ class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase {
class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaMaskColorMatrixAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
- has_mask_sampler_ = true;
+ mask_mode_ = HAS_MASK;
has_color_matrix_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
ignore_sampler_type_ = true;
@@ -541,8 +557,8 @@ class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase {
class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaColorMatrixAA() {
- has_aa_ = true;
+ void SetSubclassProperties() {
+ aa_mode_ = USE_AA;
has_uniform_alpha_ = true;
has_color_matrix_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
@@ -551,9 +567,9 @@ class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase {
class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase {
public:
- FragmentShaderRGBATexAlphaMaskColorMatrix() {
+ void SetSubclassProperties() {
has_uniform_alpha_ = true;
- has_mask_sampler_ = true;
+ mask_mode_ = HAS_MASK;
has_color_matrix_ = true;
frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
ignore_sampler_type_ = true;
@@ -563,7 +579,8 @@ class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase {
class FragmentShaderYUVVideo : public FragmentShaderBase {
public:
FragmentShaderYUVVideo();
- void SetFeatures(bool use_alpha_texture, bool use_nv12, bool use_color_lut);
+
+ void SetSubclassProperties() {}
void Init(gpu::gles2::GLES2Interface* context,
unsigned program,
@@ -585,6 +602,9 @@ class FragmentShaderYUVVideo : public FragmentShaderBase {
int resource_offset_location() const { return resource_offset_location_; }
private:
+ template <class VertexShader, class FragmentShader>
+ friend class ProgramBinding;
+
std::string GetShaderSource() const override;
bool use_alpha_texture_ = false;
@@ -608,7 +628,7 @@ class FragmentShaderYUVVideo : public FragmentShaderBase {
class FragmentShaderColor : public FragmentShaderBase {
public:
- FragmentShaderColor() {
+ void SetSubclassProperties() {
input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
@@ -616,9 +636,9 @@ class FragmentShaderColor : public FragmentShaderBase {
class FragmentShaderColorAA : public FragmentShaderBase {
public:
- FragmentShaderColorAA() {
+ void SetSubclassProperties() {
input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
- has_aa_ = true;
+ aa_mode_ = USE_AA;
frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
};
« no previous file with comments | « cc/output/program_binding.h ('k') | cc/output/shader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698