• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "config.h"
27 
28 #if USE(ACCELERATED_COMPOSITING)
29 
30 #include "ShaderChromium.h"
31 
32 #include "GraphicsContext.h"
33 #include "GraphicsContext3D.h"
34 
35 #define SHADER0(Src) #Src
36 #define SHADER(Src) SHADER0(Src)
37 
38 namespace WebCore {
39 
VertexShaderPosTex()40 VertexShaderPosTex::VertexShaderPosTex()
41     : m_matrixLocation(-1)
42 {
43 }
44 
init(GraphicsContext3D * context,unsigned program)45 bool VertexShaderPosTex::init(GraphicsContext3D* context, unsigned program)
46 {
47     m_matrixLocation = context->getUniformLocation(program, "matrix");
48     return m_matrixLocation != -1;
49 }
50 
getShaderString() const51 String VertexShaderPosTex::getShaderString() const
52 {
53     return SHADER(
54         attribute vec4 a_position;
55         attribute vec2 a_texCoord;
56         uniform mat4 matrix;
57         varying vec2 v_texCoord;
58         void main()
59         {
60             gl_Position = matrix * a_position;
61             v_texCoord = a_texCoord;
62         }
63     );
64 }
65 
VertexShaderPosTexYUVStretch()66 VertexShaderPosTexYUVStretch::VertexShaderPosTexYUVStretch()
67     : m_matrixLocation(-1)
68     , m_yWidthScaleFactorLocation(-1)
69     , m_uvWidthScaleFactorLocation(-1)
70 {
71 }
72 
init(GraphicsContext3D * context,unsigned program)73 bool VertexShaderPosTexYUVStretch::init(GraphicsContext3D* context, unsigned program)
74 {
75     m_matrixLocation = context->getUniformLocation(program, "matrix");
76     m_yWidthScaleFactorLocation = context->getUniformLocation(program, "y_widthScaleFactor");
77     m_uvWidthScaleFactorLocation = context->getUniformLocation(program, "uv_widthScaleFactor");
78     return m_matrixLocation != -1 && m_yWidthScaleFactorLocation != -1 && m_uvWidthScaleFactorLocation != -1;
79 }
80 
getShaderString() const81 String VertexShaderPosTexYUVStretch::getShaderString() const
82 {
83     return SHADER(
84         precision mediump float;
85         attribute vec4 a_position;
86         attribute vec2 a_texCoord;
87         uniform mat4 matrix;
88         varying vec2 y_texCoord;
89         varying vec2 uv_texCoord;
90         uniform float y_widthScaleFactor;
91         uniform float uv_widthScaleFactor;
92         void main()
93         {
94             gl_Position = matrix * a_position;
95             y_texCoord = vec2(y_widthScaleFactor * a_texCoord.x, a_texCoord.y);
96             uv_texCoord = vec2(uv_widthScaleFactor * a_texCoord.x, a_texCoord.y);
97         }
98     );
99 }
100 
VertexShaderPos()101 VertexShaderPos::VertexShaderPos()
102     : m_matrixLocation(-1)
103 {
104 }
105 
init(GraphicsContext3D * context,unsigned program)106 bool VertexShaderPos::init(GraphicsContext3D* context, unsigned program)
107 {
108     m_matrixLocation = context->getUniformLocation(program, "matrix");
109     return m_matrixLocation != -1;
110 }
111 
getShaderString() const112 String VertexShaderPos::getShaderString() const
113 {
114     return SHADER(
115         attribute vec4 a_position;
116         uniform mat4 matrix;
117         void main()
118         {
119             gl_Position = matrix * a_position;
120         }
121     );
122 }
123 
VertexShaderPosTexTransform()124 VertexShaderPosTexTransform::VertexShaderPosTexTransform()
125     : m_matrixLocation(-1)
126     , m_texTransformLocation(-1)
127 {
128 }
129 
init(GraphicsContext3D * context,unsigned program)130 bool VertexShaderPosTexTransform::init(GraphicsContext3D* context, unsigned program)
131 {
132     m_matrixLocation = context->getUniformLocation(program, "matrix");
133     m_texTransformLocation = context->getUniformLocation(program, "texTransform");
134     return m_matrixLocation != -1 && m_texTransformLocation != -1;
135 }
136 
getShaderString() const137 String VertexShaderPosTexTransform::getShaderString() const
138 {
139     return SHADER(
140         attribute vec4 a_position;
141         attribute vec2 a_texCoord;
142         uniform mat4 matrix;
143         uniform vec4 texTransform;
144         varying vec2 v_texCoord;
145         void main()
146         {
147             gl_Position = matrix * a_position;
148             v_texCoord = a_texCoord * texTransform.zw + texTransform.xy;
149         }
150     );
151 }
152 
FragmentTexAlphaBinding()153 FragmentTexAlphaBinding::FragmentTexAlphaBinding()
154     : m_samplerLocation(-1)
155     , m_alphaLocation(-1)
156 {
157 }
158 
init(GraphicsContext3D * context,unsigned program)159 bool FragmentTexAlphaBinding::init(GraphicsContext3D* context, unsigned program)
160 {
161     m_samplerLocation = context->getUniformLocation(program, "s_texture");
162     m_alphaLocation = context->getUniformLocation(program, "alpha");
163 
164     return m_samplerLocation != -1 && m_alphaLocation != -1;
165 }
166 
getShaderString() const167 String FragmentShaderRGBATexFlipAlpha::getShaderString() const
168 {
169     return SHADER(
170         precision mediump float;
171         varying vec2 v_texCoord;
172         uniform sampler2D s_texture;
173         uniform float alpha;
174         void main()
175         {
176             vec4 texColor = texture2D(s_texture, vec2(v_texCoord.x, 1.0 - v_texCoord.y));
177             gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha;
178         }
179     );
180 }
181 
getShaderString() const182 String FragmentShaderRGBATexAlpha::getShaderString() const
183 {
184     return SHADER(
185         precision mediump float;
186         varying vec2 v_texCoord;
187         uniform sampler2D s_texture;
188         uniform float alpha;
189         void main()
190         {
191             vec4 texColor = texture2D(s_texture, v_texCoord);
192             gl_FragColor = texColor * alpha;
193         }
194     );
195 }
196 
getShaderString() const197 String FragmentShaderBGRATexAlpha::getShaderString() const
198 {
199     return SHADER(
200         precision mediump float;
201         varying vec2 v_texCoord;
202         uniform sampler2D s_texture;
203         uniform float alpha;
204         void main()
205         {
206             vec4 texColor = texture2D(s_texture, v_texCoord);
207             gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha;
208         }
209     );
210 }
211 
FragmentShaderRGBATexAlphaMask()212 FragmentShaderRGBATexAlphaMask::FragmentShaderRGBATexAlphaMask()
213     : m_samplerLocation(-1)
214     , m_maskSamplerLocation(-1)
215     , m_alphaLocation(-1)
216 {
217 }
218 
init(GraphicsContext3D * context,unsigned program)219 bool FragmentShaderRGBATexAlphaMask::init(GraphicsContext3D* context, unsigned program)
220 {
221     m_samplerLocation = context->getUniformLocation(program, "s_texture");
222     m_maskSamplerLocation = context->getUniformLocation(program, "s_mask");
223     m_alphaLocation = context->getUniformLocation(program, "alpha");
224 
225     return m_samplerLocation != -1 && m_maskSamplerLocation != -1 && m_alphaLocation != -1;
226 }
227 
getShaderString() const228 String FragmentShaderRGBATexAlphaMask::getShaderString() const
229 {
230     return SHADER(
231         precision mediump float;
232         varying vec2 v_texCoord;
233         uniform sampler2D s_texture;
234         uniform sampler2D s_mask;
235         uniform float alpha;
236         void main()
237         {
238             vec4 texColor = texture2D(s_texture, v_texCoord);
239             vec4 maskColor = texture2D(s_mask, v_texCoord);
240             gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha * maskColor.w;
241         }
242     );
243 }
244 
FragmentShaderYUVVideo()245 FragmentShaderYUVVideo::FragmentShaderYUVVideo()
246     : m_yTextureLocation(-1)
247     , m_uTextureLocation(-1)
248     , m_vTextureLocation(-1)
249     , m_alphaLocation(-1)
250     , m_ccMatrixLocation(-1)
251     , m_yuvAdjLocation(-1)
252 {
253 }
254 
init(GraphicsContext3D * context,unsigned program)255 bool FragmentShaderYUVVideo::init(GraphicsContext3D* context, unsigned program)
256 {
257     m_yTextureLocation = context->getUniformLocation(program, "y_texture");
258     m_uTextureLocation = context->getUniformLocation(program, "u_texture");
259     m_vTextureLocation = context->getUniformLocation(program, "v_texture");
260     m_alphaLocation = context->getUniformLocation(program, "alpha");
261     m_ccMatrixLocation = context->getUniformLocation(program, "cc_matrix");
262     m_yuvAdjLocation = context->getUniformLocation(program, "yuv_adj");
263 
264     return m_yTextureLocation != -1 && m_uTextureLocation != -1 && m_vTextureLocation != -1
265            && m_alphaLocation != -1 && m_ccMatrixLocation != -1 && m_yuvAdjLocation != -1;
266 }
267 
getShaderString() const268 String FragmentShaderYUVVideo::getShaderString() const
269 {
270     return SHADER(
271         precision mediump float;
272         precision mediump int;
273         varying vec2 y_texCoord;
274         varying vec2 uv_texCoord;
275         uniform sampler2D y_texture;
276         uniform sampler2D u_texture;
277         uniform sampler2D v_texture;
278         uniform float alpha;
279         uniform vec3 yuv_adj;
280         uniform mat3 cc_matrix;
281         void main()
282         {
283             float y_raw = texture2D(y_texture, y_texCoord).x;
284             float u_unsigned = texture2D(u_texture, uv_texCoord).x;
285             float v_unsigned = texture2D(v_texture, uv_texCoord).x;
286             vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned) + yuv_adj;
287             vec3 rgb = cc_matrix * yuv;
288             gl_FragColor = vec4(rgb, float(1)) * alpha;
289         }
290     );
291 }
292 
FragmentShaderColor()293 FragmentShaderColor::FragmentShaderColor()
294     : m_colorLocation(-1)
295 {
296 }
297 
init(GraphicsContext3D * context,unsigned program)298 bool FragmentShaderColor::init(GraphicsContext3D* context, unsigned program)
299 {
300     m_colorLocation = context->getUniformLocation(program, "color");
301     return m_colorLocation != -1;
302 }
303 
getShaderString() const304 String FragmentShaderColor::getShaderString() const
305 {
306     return SHADER(
307         precision mediump float;
308         uniform vec4 color;
309         void main()
310         {
311             gl_FragColor = vec4(color.xyz * color.w, color.w);
312         }
313     );
314 }
315 
316 } // namespace WebCore
317 
318 #endif // USE(ACCELERATED_COMPOSITING)
319