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

Unified Diff: cc/output/shader.h

Issue 2608863002: The great shader refactor: Merge fragment shaders into an uber-shader (Closed)
Patch Set: Better variable name Created 3 years, 12 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 | « no previous file | 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 a74a58fac456d013836b35f73e107f9bbf48d1ff..c0cb75801e2cabe43f0467b3d2046b94d7d9a848 100644
--- a/cc/output/shader.h
+++ b/cc/output/shader.h
@@ -59,6 +59,18 @@ enum BlendMode {
LAST_BLEND_MODE = BLEND_MODE_LUMINOSITY
};
+enum InputColorSource {
+ INPUT_COLOR_SOURCE_RGBA_TEXTURE,
+ INPUT_COLOR_SOURCE_UNIFORM,
+};
+
+// TODO(ccameron): Merge this with BlendMode.
+enum FragColorMode {
+ FRAG_COLOR_MODE_DEFAULT,
+ FRAG_COLOR_MODE_OPAQUE,
+ FRAG_COLOR_MODE_APPLY_BLEND_MODE,
+};
+
enum MaskMode {
NO_MASK = 0,
HAS_MASK = 1,
@@ -381,15 +393,37 @@ class FragmentShaderBase {
protected:
FragmentShaderBase();
- virtual std::string GetShaderSource() const = 0;
+ virtual std::string GetShaderSource() const;
std::string SetBlendModeFunctions(const std::string& shader_string) const;
+ // Settings that are modified by sub-classes.
+ bool has_aa_ = false;
+ bool has_varying_alpha_ = false;
+ bool has_swizzle_ = false;
+ bool has_premultiply_alpha_ = false;
+ FragColorMode frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
+ InputColorSource input_color_type_ = INPUT_COLOR_SOURCE_RGBA_TEXTURE;
+
// Used only if |blend_mode_| is not BLEND_MODE_NONE.
int backdrop_location_ = -1;
int original_backdrop_location_ = -1;
int backdrop_rect_location_ = -1;
+ // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_RGBA_TEXTURE.
+ bool has_rgba_fragment_tex_transform_ = false;
+ int sampler_location_ = -1;
+ int fragment_tex_transform_location_ = -1;
+
+ // Always use sampler2D and texture2D for the RGBA texture, regardless of the
+ // specified SamplerType.
+ // TODO(ccameron): Change GLRenderer to always specify the correct
+ // SamplerType.
+ bool ignore_sampler_type_ = false;
+
+ // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_UNIFORM.
+ int color_location_ = -1;
+
bool has_mask_sampler_ = false;
int mask_sampler_location_ = -1;
int mask_tex_coord_scale_location_ = -1;
@@ -399,21 +433,12 @@ class FragmentShaderBase {
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_ = BLEND_MODE_NONE;
bool mask_for_background_ = false;
@@ -421,198 +446,175 @@ class FragmentShaderBase {
std::string GetHelperFunctions() const;
std::string GetBlendFunction() const;
std::string GetBlendFunctionBodyForRGB() const;
+
+ DISALLOW_COPY_AND_ASSIGN(FragmentShaderBase);
};
-class FragmentTexAlphaBinding : public FragmentShaderBase {
+class FragmentShaderRGBATexVaryingAlpha : public FragmentShaderBase {
public:
- FragmentTexAlphaBinding() {
- has_sampler_ = true;
- has_uniform_alpha_ = true;
+ FragmentShaderRGBATexVaryingAlpha() {
+ has_varying_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FragmentTexAlphaBinding);
};
-class FragmentTexColorMatrixAlphaBinding : public FragmentShaderBase {
+class FragmentShaderRGBATexPremultiplyAlpha : public FragmentShaderBase {
public:
- FragmentTexColorMatrixAlphaBinding() {
- has_sampler_ = true;
- has_uniform_alpha_ = true;
- has_color_matrix_ = true;
+ FragmentShaderRGBATexPremultiplyAlpha() {
+ has_varying_alpha_ = true;
+ has_premultiply_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
-
- private:
};
-class FragmentTexOpaqueBinding : public FragmentShaderBase {
+class FragmentShaderTexBackgroundVaryingAlpha : public FragmentShaderBase {
public:
- FragmentTexOpaqueBinding() { has_sampler_ = true; }
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding);
+ FragmentShaderTexBackgroundVaryingAlpha() {
+ has_background_color_ = true;
+ has_varying_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
+ }
};
-class FragmentTexBackgroundBinding : public FragmentShaderBase {
+class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentShaderBase {
public:
- FragmentTexBackgroundBinding() {
- has_sampler_ = true;
+ FragmentShaderTexBackgroundPremultiplyAlpha() {
has_background_color_ = true;
+ has_varying_alpha_ = true;
+ has_premultiply_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding);
-};
-
-class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding {
- private:
- std::string GetShaderSource() const override;
-};
-
-class FragmentShaderRGBATexPremultiplyAlpha : public FragmentTexOpaqueBinding {
- private:
- std::string GetShaderSource() const override;
-};
-
-class FragmentShaderTexBackgroundVaryingAlpha
- : public FragmentTexBackgroundBinding {
- private:
- std::string GetShaderSource() const override;
-};
-
-class FragmentShaderTexBackgroundPremultiplyAlpha
- : public FragmentTexBackgroundBinding {
- private:
- std::string GetShaderSource() const override;
};
-class FragmentShaderRGBATexAlpha : public FragmentTexAlphaBinding {
- private:
- std::string GetShaderSource() const override;
+class FragmentShaderRGBATexAlpha : public FragmentShaderBase {
+ public:
+ FragmentShaderRGBATexAlpha() {
+ has_uniform_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
+ }
};
-class FragmentShaderRGBATexColorMatrixAlpha
- : public FragmentTexColorMatrixAlphaBinding {
- private:
- std::string GetShaderSource() const override;
+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 FragmentTexOpaqueBinding {
- private:
- std::string GetShaderSource() const override;
+class FragmentShaderRGBATexOpaque : public FragmentShaderBase {
+ public:
+ FragmentShaderRGBATexOpaque() { frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE; }
};
-class FragmentShaderRGBATex : public FragmentTexOpaqueBinding {
- private:
- std::string GetShaderSource() const override;
+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 FragmentTexAlphaBinding {
- private:
- std::string GetShaderSource() const override;
+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 FragmentTexOpaqueBinding {
- private:
- std::string GetShaderSource() const override;
+class FragmentShaderRGBATexSwizzleOpaque : public FragmentShaderBase {
+ public:
+ FragmentShaderRGBATexSwizzleOpaque() {
+ has_swizzle_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE;
+ }
};
class FragmentShaderRGBATexAlphaAA : public FragmentShaderBase {
public:
FragmentShaderRGBATexAlphaAA() {
- has_sampler_ = true;
+ has_aa_ = true;
has_uniform_alpha_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
}
-
- private:
- std::string GetShaderSource() const override;
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaAA);
};
-class FragmentTexClampAlphaAABinding : public FragmentShaderBase {
+class FragmentShaderRGBATexClampAlphaAA : public FragmentShaderBase {
public:
- FragmentTexClampAlphaAABinding() {
- has_sampler_ = true;
+ FragmentShaderRGBATexClampAlphaAA() {
+ has_aa_ = true;
has_uniform_alpha_ = true;
- has_fragment_tex_transform_ = true;
+ has_rgba_fragment_tex_transform_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
}
- private:
- DISALLOW_COPY_AND_ASSIGN(FragmentTexClampAlphaAABinding);
-};
-
-class FragmentShaderRGBATexClampAlphaAA
- : public FragmentTexClampAlphaAABinding {
- private:
- std::string GetShaderSource() const override;
};
// Swizzles the red and blue component of sampled texel.
-class FragmentShaderRGBATexClampSwizzleAlphaAA
- : public FragmentTexClampAlphaAABinding {
- private:
- std::string GetShaderSource() const override;
+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_sampler_ = true;
has_uniform_alpha_ = true;
has_mask_sampler_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
+ ignore_sampler_type_ = true;
}
- private:
- std::string GetShaderSource() const override;
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMask);
};
class FragmentShaderRGBATexAlphaMaskAA : public FragmentShaderBase {
public:
FragmentShaderRGBATexAlphaMaskAA() {
- has_sampler_ = true;
+ has_aa_ = true;
has_uniform_alpha_ = true;
has_mask_sampler_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
+ ignore_sampler_type_ = true;
}
- private:
- std::string GetShaderSource() const override;
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaMaskAA);
};
class FragmentShaderRGBATexAlphaMaskColorMatrixAA : public FragmentShaderBase {
public:
FragmentShaderRGBATexAlphaMaskColorMatrixAA() {
- has_sampler_ = true;
+ 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;
}
- private:
- std::string GetShaderSource() const override;
};
class FragmentShaderRGBATexAlphaColorMatrixAA : public FragmentShaderBase {
public:
FragmentShaderRGBATexAlphaColorMatrixAA() {
- has_sampler_ = true;
+ has_aa_ = true;
has_uniform_alpha_ = true;
has_color_matrix_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
}
-
- private:
- std::string GetShaderSource() const override;
};
class FragmentShaderRGBATexAlphaMaskColorMatrix : public FragmentShaderBase {
public:
FragmentShaderRGBATexAlphaMaskColorMatrix() {
- has_sampler_ = 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;
}
- private:
- std::string GetShaderSource() const override;
};
class FragmentShaderYUVVideo : public FragmentShaderBase {
@@ -659,26 +661,23 @@ class FragmentShaderYUVVideo : public FragmentShaderBase {
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() { has_uniform_color_ = true; }
-
- private:
- std::string GetShaderSource() const override;
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderColor);
+ FragmentShaderColor() {
+ input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
+ }
};
class FragmentShaderColorAA : public FragmentShaderBase {
public:
- FragmentShaderColorAA() { has_uniform_color_ = true; }
-
- private:
- std::string GetShaderSource() const override;
- DISALLOW_COPY_AND_ASSIGN(FragmentShaderColorAA);
+ FragmentShaderColorAA() {
+ input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
+ has_aa_ = true;
+ frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
+ }
};
} // namespace cc
« no previous file with comments | « no previous file | cc/output/shader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698