diff options
Diffstat (limited to 'chromium/cc/output/shader.h')
-rw-r--r-- | chromium/cc/output/shader.h | 745 |
1 files changed, 745 insertions, 0 deletions
diff --git a/chromium/cc/output/shader.h b/chromium/cc/output/shader.h new file mode 100644 index 00000000000..7135befd389 --- /dev/null +++ b/chromium/cc/output/shader.h @@ -0,0 +1,745 @@ +// Copyright 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_OUTPUT_SHADER_H_ +#define CC_OUTPUT_SHADER_H_ + +#include <string> + +#include "base/basictypes.h" +#include "cc/base/cc_export.h" +#include "third_party/skia/include/core/SkColorPriv.h" + +namespace gfx { +class Point; +class Size; +} + +namespace WebKit { class WebGraphicsContext3D; } + +namespace cc { + +enum TexCoordPrecision { + TexCoordPrecisionNA, + TexCoordPrecisionMedium, + TexCoordPrecisionHigh, +}; + +// Note: The highp_threshold_cache must be provided by the caller to make +// the caching multi-thread/context safe in an easy low-overhead manner. +// The caller must make sure to clear highp_threshold_cache to 0, so it can be +// reinitialized, if a new or different context is used. +CC_EXPORT TexCoordPrecision TexCoordPrecisionRequired( + WebKit::WebGraphicsContext3D* context, + int *highp_threshold_cache, + int highp_threshold_min, + gfx::Point max_coordinate); + +CC_EXPORT TexCoordPrecision TexCoordPrecisionRequired( + WebKit::WebGraphicsContext3D* context, + int *highp_threshold_cache, + int highp_threshold_min, + gfx::Size max_size); + +class VertexShaderPosTex { + public: + VertexShaderPosTex(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + + private: + int matrix_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTex); +}; + +class VertexShaderPosTexYUVStretch { + public: + VertexShaderPosTexYUVStretch(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int tex_scale_location() const { return tex_scale_location_; } + + private: + int matrix_location_; + int tex_scale_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTexYUVStretch); +}; + +class VertexShaderPos { + public: + VertexShaderPos(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + + private: + int matrix_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderPos); +}; + +class VertexShaderPosTexIdentity { + public: + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index) {} + std::string GetShaderString() const; +}; + +class VertexShaderPosTexTransform { + public: + VertexShaderPosTexTransform(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int tex_transform_location() const { return tex_transform_location_; } + int vertex_opacity_location() const { return vertex_opacity_location_; } + + private: + int matrix_location_; + int tex_transform_location_; + int vertex_opacity_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderPosTexTransform); +}; + +class VertexShaderQuad { + public: + VertexShaderQuad(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int viewport_location() const { return -1; } + int quad_location() const { return quad_location_; } + int edge_location() const { return -1; } + + private: + int matrix_location_; + int quad_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderQuad); +}; + +class VertexShaderQuadAA { + public: + VertexShaderQuadAA(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int viewport_location() const { return viewport_location_; } + int quad_location() const { return quad_location_; } + int edge_location() const { return edge_location_; } + + private: + int matrix_location_; + int viewport_location_; + int quad_location_; + int edge_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderQuadAA); +}; + + +class VertexShaderQuadTexTransformAA { + public: + VertexShaderQuadTexTransformAA(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int viewport_location() const { return viewport_location_; } + int quad_location() const { return quad_location_; } + int edge_location() const { return edge_location_; } + int tex_transform_location() const { return tex_transform_location_; } + + private: + int matrix_location_; + int viewport_location_; + int quad_location_; + int edge_location_; + int tex_transform_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderQuadTexTransformAA); +}; + +class VertexShaderTile { + public: + VertexShaderTile(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int viewport_location() const { return -1; } + int quad_location() const { return quad_location_; } + int edge_location() const { return -1; } + int vertex_tex_transform_location() const { + return vertex_tex_transform_location_; + } + + private: + int matrix_location_; + int quad_location_; + int vertex_tex_transform_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderTile); +}; + +class VertexShaderTileAA { + public: + VertexShaderTileAA(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int viewport_location() const { return viewport_location_; } + int quad_location() const { return quad_location_; } + int edge_location() const { return edge_location_; } + int vertex_tex_transform_location() const { + return vertex_tex_transform_location_; + } + + private: + int matrix_location_; + int viewport_location_; + int quad_location_; + int edge_location_; + int vertex_tex_transform_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderTileAA); +}; + +class VertexShaderVideoTransform { + public: + VertexShaderVideoTransform(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString() const; + + int matrix_location() const { return matrix_location_; } + int tex_matrix_location() const { return tex_matrix_location_; } + + private: + int matrix_location_; + int tex_matrix_location_; + + DISALLOW_COPY_AND_ASSIGN(VertexShaderVideoTransform); +}; + +class FragmentTexAlphaBinding { + public: + FragmentTexAlphaBinding(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; } + + private: + int sampler_location_; + int alpha_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentTexAlphaBinding); +}; + +class FragmentTexColorMatrixAlphaBinding { + public: + FragmentTexColorMatrixAlphaBinding(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool usingBindUniform, + int* baseUniformIndex); + 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_; } + + private: + int sampler_location_; + int alpha_location_; + int color_matrix_location_; + int color_offset_location_; +}; + +class FragmentTexOpaqueBinding { + public: + FragmentTexOpaqueBinding(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; } + + private: + int sampler_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding); +}; + +class FragmentTexBackgroundBinding { + public: + FragmentTexBackgroundBinding(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + int background_color_location() const { return background_color_location_; } + int sampler_location() const { return sampler_location_; } + + private: + int background_color_location_; + int sampler_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding); +}; + +class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexPremultiplyAlpha : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderTexBackgroundVaryingAlpha + : public FragmentTexBackgroundBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderTexBackgroundPremultiplyAlpha + : public FragmentTexBackgroundBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexAlpha : public FragmentTexAlphaBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexColorMatrixAlpha + : public FragmentTexColorMatrixAlphaBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexRectVaryingAlpha : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATex : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +// Swizzles the red and blue component of sampled texel with alpha. +class FragmentShaderRGBATexSwizzleAlpha : public FragmentTexAlphaBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +// Swizzles the red and blue component of sampled texel without alpha. +class FragmentShaderRGBATexSwizzleOpaque : public FragmentTexOpaqueBinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +// Fragment shader for external textures. +class FragmentShaderOESImageExternal : public FragmentTexAlphaBinding { + public: + FragmentShaderOESImageExternal(); + + std::string GetShaderString(TexCoordPrecision precision) const; + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + private: + int sampler_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderOESImageExternal); +}; + +class FragmentShaderRGBATexAlphaAA { + public: + FragmentShaderRGBATexAlphaAA(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + std::string GetShaderString(TexCoordPrecision precision) const; + + int alpha_location() const { return alpha_location_; } + int sampler_location() const { return sampler_location_; } + + private: + int sampler_location_; + int alpha_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderRGBATexAlphaAA); +}; + +class FragmentTexClampAlphaAABinding { + public: + FragmentTexClampAlphaAABinding(); + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; + } + + private: + int sampler_location_; + int alpha_location_; + int fragment_tex_transform_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentTexClampAlphaAABinding); +}; + +class FragmentShaderRGBATexClampAlphaAA + : public FragmentTexClampAlphaAABinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +// Swizzles the red and blue component of sampled texel. +class FragmentShaderRGBATexClampSwizzleAlphaAA + : public FragmentTexClampAlphaAABinding { + public: + std::string GetShaderString(TexCoordPrecision precision) const; +}; + +class FragmentShaderRGBATexAlphaMask { + public: + FragmentShaderRGBATexAlphaMask(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; + } + int mask_tex_coord_offset_location() const { + return mask_tex_coord_offset_location_; + } + + private: + 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: + FragmentShaderRGBATexAlphaMaskAA(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; + } + int mask_tex_coord_offset_location() const { + return mask_tex_coord_offset_location_; + } + + private: + 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: + FragmentShaderRGBATexAlphaMaskColorMatrixAA(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; + } + 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: + 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: + FragmentShaderRGBATexAlphaColorMatrixAA(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; } + + private: + int sampler_location_; + int alpha_location_; + int color_matrix_location_; + int color_offset_location_; +}; + +class FragmentShaderRGBATexAlphaMaskColorMatrix { + public: + FragmentShaderRGBATexAlphaMaskColorMatrix(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + 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_; + } + 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: + 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: + FragmentShaderYUVVideo(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + 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_; } + int alpha_location() const { return alpha_location_; } + int yuv_matrix_location() const { return yuv_matrix_location_; } + int yuv_adj_location() const { return yuv_adj_location_; } + + private: + int y_texture_location_; + int u_texture_location_; + int v_texture_location_; + int alpha_location_; + int yuv_matrix_location_; + int yuv_adj_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderYUVVideo); +}; + + +class FragmentShaderYUVAVideo { + public: + FragmentShaderYUVAVideo(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + + 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_; } + int a_texture_location() const { return a_texture_location_; } + int alpha_location() const { return alpha_location_; } + int yuv_matrix_location() const { return yuv_matrix_location_; } + int yuv_adj_location() const { return yuv_adj_location_; } + + private: + int y_texture_location_; + int u_texture_location_; + int v_texture_location_; + int a_texture_location_; + int alpha_location_; + int yuv_matrix_location_; + int yuv_adj_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderYUVAVideo); +}; + +class FragmentShaderColor { + public: + FragmentShaderColor(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + int color_location() const { return color_location_; } + + private: + int color_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderColor); +}; + +class FragmentShaderColorAA { + public: + FragmentShaderColorAA(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + int color_location() const { return color_location_; } + + private: + int color_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderColorAA); +}; + +class FragmentShaderCheckerboard { + public: + FragmentShaderCheckerboard(); + std::string GetShaderString(TexCoordPrecision precision) const; + + void Init(WebKit::WebGraphicsContext3D* context, + unsigned program, + bool using_bind_uniform, + int* base_uniform_index); + int alpha_location() const { return alpha_location_; } + int tex_transform_location() const { return tex_transform_location_; } + int frequency_location() const { return frequency_location_; } + int color_location() const { return color_location_; } + + private: + int alpha_location_; + int tex_transform_location_; + int frequency_location_; + int color_location_; + + DISALLOW_COPY_AND_ASSIGN(FragmentShaderCheckerboard); +}; + +} // namespace cc + +#endif // CC_OUTPUT_SHADER_H_ |