// 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 gpu { namespace gles2 { class GLES2Interface; } } namespace cc { enum TexCoordPrecision { TexCoordPrecisionNA = 0, TexCoordPrecisionMedium = 1, TexCoordPrecisionHigh = 2, NumTexCoordPrecisions = 3 }; enum SamplerType { SamplerTypeNA = 0, SamplerType2D = 1, SamplerType2DRect = 2, SamplerTypeExternalOES = 3, NumSamplerTypes = 4 }; // 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( gpu::gles2::GLES2Interface* context, int *highp_threshold_cache, int highp_threshold_min, gfx::Point max_coordinate); CC_EXPORT TexCoordPrecision TexCoordPrecisionRequired( gpu::gles2::GLES2Interface* context, int *highp_threshold_cache, int highp_threshold_min, gfx::Size max_size); class VertexShaderPosTex { public: VertexShaderPosTex(); void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, int* base_uniform_index) {} std::string GetShaderString() const; }; class VertexShaderPosTexTransform { public: VertexShaderPosTexTransform(); void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(gpu::gles2::GLES2Interface* context, unsigned program, 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(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_; } private: int sampler_location_; int alpha_location_; DISALLOW_COPY_AND_ASSIGN(FragmentTexAlphaBinding); }; class FragmentTexColorMatrixAlphaBinding { 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_; } private: int sampler_location_; int alpha_location_; int color_matrix_location_; int color_offset_location_; }; class FragmentTexOpaqueBinding { 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_; } private: int sampler_location_; DISALLOW_COPY_AND_ASSIGN(FragmentTexOpaqueBinding); }; class FragmentTexBackgroundBinding { 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_; } private: int background_color_location_; int sampler_location_; DISALLOW_COPY_AND_ASSIGN(FragmentTexBackgroundBinding); }; class FragmentShaderRGBATexVaryingAlpha : public FragmentTexOpaqueBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexPremultiplyAlpha : public FragmentTexOpaqueBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderTexBackgroundVaryingAlpha : public FragmentTexBackgroundBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderTexBackgroundPremultiplyAlpha : public FragmentTexBackgroundBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexAlpha : public FragmentTexAlphaBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexColorMatrixAlpha : public FragmentTexColorMatrixAlphaBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexOpaque : public FragmentTexOpaqueBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATex : public FragmentTexOpaqueBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; // Swizzles the red and blue component of sampled texel with alpha. class FragmentShaderRGBATexSwizzleAlpha : public FragmentTexAlphaBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; // Swizzles the red and blue component of sampled texel without alpha. class FragmentShaderRGBATexSwizzleOpaque : public FragmentTexOpaqueBinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexAlphaAA { public: FragmentShaderRGBATexAlphaAA(); void Init(gpu::gles2::GLES2Interface* context, unsigned program, int* base_uniform_index); std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) 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(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_; } 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, SamplerType sampler) const; }; // Swizzles the red and blue component of sampled texel. class FragmentShaderRGBATexClampSwizzleAlphaAA : public FragmentTexClampAlphaAABinding { public: std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) const; }; class FragmentShaderRGBATexAlphaMask { public: FragmentShaderRGBATexAlphaMask(); std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) 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_; } 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, SamplerType sampler) 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_; } 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, SamplerType sampler) 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_; } 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, SamplerType sampler) 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_; } private: int sampler_location_; int alpha_location_; int color_matrix_location_; int color_offset_location_; }; class FragmentShaderRGBATexAlphaMaskColorMatrix { public: FragmentShaderRGBATexAlphaMaskColorMatrix(); std::string GetShaderString( TexCoordPrecision precision, SamplerType sampler) 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_; } 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, SamplerType sampler) const; void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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, SamplerType sampler) const; void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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, SamplerType sampler) const; void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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, SamplerType sampler) const; void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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, SamplerType sampler) const; void Init(gpu::gles2::GLES2Interface* context, unsigned program, 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_