1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/basictypes.h"
10 #include "base/logging.h"
11 #include <public/WebGraphicsContext3D.h>
13 #define SHADER0(Src) #Src
14 #define SHADER(Src) SHADER0(Src)
16 using WebKit::WebGraphicsContext3D
;
22 static void getProgramUniformLocations(WebGraphicsContext3D
* context
, unsigned program
, const char** shaderUniforms
, size_t count
, size_t maxLocations
, int* locations
, bool usingBindUniform
, int* baseUniformIndex
)
24 for (size_t uniformIndex
= 0; uniformIndex
< count
; uniformIndex
++) {
25 DCHECK(uniformIndex
< maxLocations
);
27 if (usingBindUniform
) {
28 locations
[uniformIndex
] = (*baseUniformIndex
)++;
29 context
->bindUniformLocationCHROMIUM(program
, locations
[uniformIndex
], shaderUniforms
[uniformIndex
]);
31 locations
[uniformIndex
] = context
->getUniformLocation(program
, shaderUniforms
[uniformIndex
]);
37 VertexShaderPosTex::VertexShaderPosTex()
38 : m_matrixLocation(-1)
42 void VertexShaderPosTex::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
44 static const char* shaderUniforms
[] = {
49 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
51 m_matrixLocation
= locations
[0];
52 DCHECK(m_matrixLocation
!= -1);
55 std::string
VertexShaderPosTex::getShaderString() const
58 attribute vec4 a_position
;
59 attribute vec2 a_texCoord
;
61 varying vec2 v_texCoord
;
64 gl_Position
= matrix
* a_position
;
65 v_texCoord
= a_texCoord
;
70 VertexShaderPosTexYUVStretch::VertexShaderPosTexYUVStretch()
71 : m_matrixLocation(-1)
72 , m_yWidthScaleFactorLocation(-1)
73 , m_uvWidthScaleFactorLocation(-1)
77 void VertexShaderPosTexYUVStretch::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
79 static const char* shaderUniforms
[] = {
82 "uv_widthScaleFactor",
86 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
88 m_matrixLocation
= locations
[0];
89 m_yWidthScaleFactorLocation
= locations
[1];
90 m_uvWidthScaleFactorLocation
= locations
[2];
91 DCHECK(m_matrixLocation
!= -1 && m_yWidthScaleFactorLocation
!= -1 && m_uvWidthScaleFactorLocation
!= -1);
94 std::string
VertexShaderPosTexYUVStretch::getShaderString() const
97 precision mediump
float;
98 attribute vec4 a_position
;
99 attribute vec2 a_texCoord
;
101 varying vec2 y_texCoord
;
102 varying vec2 uv_texCoord
;
103 uniform
float y_widthScaleFactor
;
104 uniform
float uv_widthScaleFactor
;
107 gl_Position
= matrix
* a_position
;
108 y_texCoord
= vec2(y_widthScaleFactor
* a_texCoord
.x
, a_texCoord
.y
);
109 uv_texCoord
= vec2(uv_widthScaleFactor
* a_texCoord
.x
, a_texCoord
.y
);
114 VertexShaderPos::VertexShaderPos()
115 : m_matrixLocation(-1)
119 void VertexShaderPos::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
121 static const char* shaderUniforms
[] = {
126 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
128 m_matrixLocation
= locations
[0];
129 DCHECK(m_matrixLocation
!= -1);
132 std::string
VertexShaderPos::getShaderString() const
135 attribute vec4 a_position
;
139 gl_Position
= matrix
* a_position
;
144 VertexShaderPosTexTransform::VertexShaderPosTexTransform()
145 : m_matrixLocation(-1)
146 , m_texTransformLocation(-1)
150 void VertexShaderPosTexTransform::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
152 static const char* shaderUniforms
[] = {
158 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
160 m_matrixLocation
= locations
[0];
161 m_texTransformLocation
= locations
[1];
162 DCHECK(m_matrixLocation
!= -1 && m_texTransformLocation
!= -1);
165 std::string
VertexShaderPosTexTransform::getShaderString() const
168 attribute vec4 a_position
;
169 attribute vec2 a_texCoord
;
171 uniform vec4 texTransform
;
172 varying vec2 v_texCoord
;
175 gl_Position
= matrix
* a_position
;
176 v_texCoord
= a_texCoord
* texTransform
.zw
+ texTransform
.xy
;
181 VertexShaderQuad::VertexShaderQuad()
182 : m_matrixLocation(-1)
183 , m_pointLocation(-1)
187 std::string
VertexShaderPosTexIdentity::getShaderString() const
190 attribute vec4 a_position
;
191 varying vec2 v_texCoord
;
194 gl_Position
= a_position
;
195 v_texCoord
= (a_position
.xy
+ vec2(1.0)) * 0.5;
200 void VertexShaderQuad::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
202 static const char* shaderUniforms
[] = {
208 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
210 m_matrixLocation
= locations
[0];
211 m_pointLocation
= locations
[1];
212 DCHECK(m_matrixLocation
!= -1 && m_pointLocation
!= -1);
215 std::string
VertexShaderQuad::getShaderString() const
218 attribute vec4 a_position
;
219 attribute vec2 a_texCoord
;
221 uniform vec2 point
[4];
222 varying vec2 v_texCoord
;
225 vec2 complement
= abs(a_texCoord
- 1.0);
226 vec4 pos
= vec4(0.0, 0.0, a_position
.z
, a_position
.w
);
227 pos
.xy
+= (complement
.x
* complement
.y
) * point
[0];
228 pos
.xy
+= (a_texCoord
.x
* complement
.y
) * point
[1];
229 pos
.xy
+= (a_texCoord
.x
* a_texCoord
.y
) * point
[2];
230 pos
.xy
+= (complement
.x
* a_texCoord
.y
) * point
[3];
231 gl_Position
= matrix
* pos
;
232 v_texCoord
= pos
.xy
+ vec2(0.5);
237 VertexShaderTile::VertexShaderTile()
238 : m_matrixLocation(-1)
239 , m_pointLocation(-1)
240 , m_vertexTexTransformLocation(-1)
244 void VertexShaderTile::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
246 static const char* shaderUniforms
[] = {
249 "vertexTexTransform",
253 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
255 m_matrixLocation
= locations
[0];
256 m_pointLocation
= locations
[1];
257 m_vertexTexTransformLocation
= locations
[2];
258 DCHECK(m_matrixLocation
!= -1 && m_pointLocation
!= -1 && m_vertexTexTransformLocation
!= -1);
261 std::string
VertexShaderTile::getShaderString() const
264 attribute vec4 a_position
;
265 attribute vec2 a_texCoord
;
267 uniform vec2 point
[4];
268 uniform vec4 vertexTexTransform
;
269 varying vec2 v_texCoord
;
272 vec2 complement
= abs(a_texCoord
- 1.0);
273 vec4 pos
= vec4(0.0, 0.0, a_position
.z
, a_position
.w
);
274 pos
.xy
+= (complement
.x
* complement
.y
) * point
[0];
275 pos
.xy
+= (a_texCoord
.x
* complement
.y
) * point
[1];
276 pos
.xy
+= (a_texCoord
.x
* a_texCoord
.y
) * point
[2];
277 pos
.xy
+= (complement
.x
* a_texCoord
.y
) * point
[3];
278 gl_Position
= matrix
* pos
;
279 v_texCoord
= pos
.xy
* vertexTexTransform
.zw
+ vertexTexTransform
.xy
;
284 VertexShaderVideoTransform::VertexShaderVideoTransform()
285 : m_matrixLocation(-1)
286 , m_texMatrixLocation(-1)
290 bool VertexShaderVideoTransform::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
292 static const char* shaderUniforms
[] = {
298 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
300 m_matrixLocation
= locations
[0];
301 m_texMatrixLocation
= locations
[1];
302 return m_matrixLocation
!= -1 && m_texMatrixLocation
!= -1;
305 std::string
VertexShaderVideoTransform::getShaderString() const
308 attribute vec4 a_position
;
309 attribute vec2 a_texCoord
;
311 uniform mat4 texMatrix
;
312 varying vec2 v_texCoord
;
315 gl_Position
= matrix
* a_position
;
316 v_texCoord
= vec2(texMatrix
* vec4(a_texCoord
.x
, 1.0 - a_texCoord
.y
, 0.0, 1.0));
321 FragmentTexAlphaBinding::FragmentTexAlphaBinding()
322 : m_samplerLocation(-1)
323 , m_alphaLocation(-1)
327 void FragmentTexAlphaBinding::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
329 static const char* shaderUniforms
[] = {
335 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
337 m_samplerLocation
= locations
[0];
338 m_alphaLocation
= locations
[1];
339 DCHECK(m_samplerLocation
!= -1 && m_alphaLocation
!= -1);
342 FragmentTexOpaqueBinding::FragmentTexOpaqueBinding()
343 : m_samplerLocation(-1)
347 void FragmentTexOpaqueBinding::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
349 static const char* shaderUniforms
[] = {
354 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
356 m_samplerLocation
= locations
[0];
357 DCHECK(m_samplerLocation
!= -1);
360 std::string
FragmentShaderRGBATexFlipAlpha::getShaderString() const
363 precision mediump
float;
364 varying vec2 v_texCoord
;
365 uniform sampler2D s_texture
;
369 vec4 texColor
= texture2D(s_texture
, vec2(v_texCoord
.x
, 1.0 - v_texCoord
.y
));
370 gl_FragColor
= vec4(texColor
.x
, texColor
.y
, texColor
.z
, texColor
.w
) * alpha
;
375 bool FragmentShaderOESImageExternal::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
377 static const char* shaderUniforms
[] = {
382 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
384 m_samplerLocation
= locations
[0];
385 return m_samplerLocation
!= -1;
388 std::string
FragmentShaderOESImageExternal::getShaderString() const
390 // Cannot use the SHADER() macro because of the '#' char
391 return "#extension GL_OES_EGL_image_external : require \n"
392 "precision mediump float;\n"
393 "varying vec2 v_texCoord;\n"
394 "uniform samplerExternalOES s_texture;\n"
397 " vec4 texColor = texture2D(s_texture, v_texCoord);\n"
398 " gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w);\n"
402 std::string
FragmentShaderRGBATexAlpha::getShaderString() const
405 precision mediump
float;
406 varying vec2 v_texCoord
;
407 uniform sampler2D s_texture
;
411 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
412 gl_FragColor
= texColor
* alpha
;
417 std::string
FragmentShaderRGBATexRectFlipAlpha::getShaderString() const
419 // This must be paired with VertexShaderPosTexTransform to pick up the texTransform uniform.
420 // The necessary #extension preprocessing directive breaks the SHADER and SHADER0 macros.
421 return "#extension GL_ARB_texture_rectangle : require\n"
422 "precision mediump float;\n"
423 "varying vec2 v_texCoord;\n"
424 "uniform vec4 texTransform;\n"
425 "uniform sampler2DRect s_texture;\n"
426 "uniform float alpha;\n"
429 " vec4 texColor = texture2DRect(s_texture, vec2(v_texCoord.x, texTransform.w - v_texCoord.y));\n"
430 " gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha;\n"
434 std::string
FragmentShaderRGBATexRectAlpha::getShaderString() const
436 return "#extension GL_ARB_texture_rectangle : require\n"
437 "precision mediump float;\n"
438 "varying vec2 v_texCoord;\n"
439 "uniform sampler2DRect s_texture;\n"
440 "uniform float alpha;\n"
443 " vec4 texColor = texture2DRect(s_texture, v_texCoord);\n"
444 " gl_FragColor = texColor * alpha;\n"
448 std::string
FragmentShaderRGBATexOpaque::getShaderString() const
451 precision mediump
float;
452 varying vec2 v_texCoord
;
453 uniform sampler2D s_texture
;
456 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
457 gl_FragColor
= vec4(texColor
.rgb
, 1.0);
462 std::string
FragmentShaderRGBATex::getShaderString() const
465 precision mediump
float;
466 varying vec2 v_texCoord
;
467 uniform sampler2D s_texture
;
470 gl_FragColor
= texture2D(s_texture
, v_texCoord
);
475 std::string
FragmentShaderRGBATexSwizzleAlpha::getShaderString() const
478 precision mediump
float;
479 varying vec2 v_texCoord
;
480 uniform sampler2D s_texture
;
484 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
485 gl_FragColor
= vec4(texColor
.z
, texColor
.y
, texColor
.x
, texColor
.w
) * alpha
;
490 std::string
FragmentShaderRGBATexSwizzleOpaque::getShaderString() const
493 precision mediump
float;
494 varying vec2 v_texCoord
;
495 uniform sampler2D s_texture
;
498 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
499 gl_FragColor
= vec4(texColor
.z
, texColor
.y
, texColor
.x
, 1.0);
504 FragmentShaderRGBATexAlphaAA::FragmentShaderRGBATexAlphaAA()
505 : m_samplerLocation(-1)
506 , m_alphaLocation(-1)
511 void FragmentShaderRGBATexAlphaAA::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
513 static const char* shaderUniforms
[] = {
520 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
522 m_samplerLocation
= locations
[0];
523 m_alphaLocation
= locations
[1];
524 m_edgeLocation
= locations
[2];
525 DCHECK(m_samplerLocation
!= -1 && m_alphaLocation
!= -1 && m_edgeLocation
!= -1);
528 std::string
FragmentShaderRGBATexAlphaAA::getShaderString() const
531 precision mediump
float;
532 varying vec2 v_texCoord
;
533 uniform sampler2D s_texture
;
535 uniform vec3 edge
[8];
538 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
539 vec3 pos
= vec3(gl_FragCoord
.xy
, 1);
540 float a0
= clamp(dot(edge
[0], pos
), 0.0, 1.0);
541 float a1
= clamp(dot(edge
[1], pos
), 0.0, 1.0);
542 float a2
= clamp(dot(edge
[2], pos
), 0.0, 1.0);
543 float a3
= clamp(dot(edge
[3], pos
), 0.0, 1.0);
544 float a4
= clamp(dot(edge
[4], pos
), 0.0, 1.0);
545 float a5
= clamp(dot(edge
[5], pos
), 0.0, 1.0);
546 float a6
= clamp(dot(edge
[6], pos
), 0.0, 1.0);
547 float a7
= clamp(dot(edge
[7], pos
), 0.0, 1.0);
548 gl_FragColor
= texColor
* alpha
* min(min(a0
, a2
) * min(a1
, a3
), min(a4
, a6
) * min(a5
, a7
));
553 FragmentTexClampAlphaAABinding::FragmentTexClampAlphaAABinding()
554 : m_samplerLocation(-1)
555 , m_alphaLocation(-1)
556 , m_fragmentTexTransformLocation(-1)
561 void FragmentTexClampAlphaAABinding::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
563 static const char* shaderUniforms
[] = {
566 "fragmentTexTransform",
571 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
573 m_samplerLocation
= locations
[0];
574 m_alphaLocation
= locations
[1];
575 m_fragmentTexTransformLocation
= locations
[2];
576 m_edgeLocation
= locations
[3];
577 DCHECK(m_samplerLocation
!= -1 && m_alphaLocation
!= -1 && m_fragmentTexTransformLocation
!= -1 && m_edgeLocation
!= -1);
580 std::string
FragmentShaderRGBATexClampAlphaAA::getShaderString() const
583 precision mediump
float;
584 varying vec2 v_texCoord
;
585 uniform sampler2D s_texture
;
587 uniform vec4 fragmentTexTransform
;
588 uniform vec3 edge
[8];
591 vec2 texCoord
= clamp(v_texCoord
, 0.0, 1.0) * fragmentTexTransform
.zw
+ fragmentTexTransform
.xy
;
592 vec4 texColor
= texture2D(s_texture
, texCoord
);
593 vec3 pos
= vec3(gl_FragCoord
.xy
, 1);
594 float a0
= clamp(dot(edge
[0], pos
), 0.0, 1.0);
595 float a1
= clamp(dot(edge
[1], pos
), 0.0, 1.0);
596 float a2
= clamp(dot(edge
[2], pos
), 0.0, 1.0);
597 float a3
= clamp(dot(edge
[3], pos
), 0.0, 1.0);
598 float a4
= clamp(dot(edge
[4], pos
), 0.0, 1.0);
599 float a5
= clamp(dot(edge
[5], pos
), 0.0, 1.0);
600 float a6
= clamp(dot(edge
[6], pos
), 0.0, 1.0);
601 float a7
= clamp(dot(edge
[7], pos
), 0.0, 1.0);
602 gl_FragColor
= texColor
* alpha
* min(min(a0
, a2
) * min(a1
, a3
), min(a4
, a6
) * min(a5
, a7
));
607 std::string
FragmentShaderRGBATexClampSwizzleAlphaAA::getShaderString() const
610 precision mediump
float;
611 varying vec2 v_texCoord
;
612 uniform sampler2D s_texture
;
614 uniform vec4 fragmentTexTransform
;
615 uniform vec3 edge
[8];
618 vec2 texCoord
= clamp(v_texCoord
, 0.0, 1.0) * fragmentTexTransform
.zw
+ fragmentTexTransform
.xy
;
619 vec4 texColor
= texture2D(s_texture
, texCoord
);
620 vec3 pos
= vec3(gl_FragCoord
.xy
, 1);
621 float a0
= clamp(dot(edge
[0], pos
), 0.0, 1.0);
622 float a1
= clamp(dot(edge
[1], pos
), 0.0, 1.0);
623 float a2
= clamp(dot(edge
[2], pos
), 0.0, 1.0);
624 float a3
= clamp(dot(edge
[3], pos
), 0.0, 1.0);
625 float a4
= clamp(dot(edge
[4], pos
), 0.0, 1.0);
626 float a5
= clamp(dot(edge
[5], pos
), 0.0, 1.0);
627 float a6
= clamp(dot(edge
[6], pos
), 0.0, 1.0);
628 float a7
= clamp(dot(edge
[7], pos
), 0.0, 1.0);
629 gl_FragColor
= vec4(texColor
.z
, texColor
.y
, texColor
.x
, texColor
.w
) * alpha
* min(min(a0
, a2
) * min(a1
, a3
), min(a4
, a6
) * min(a5
, a7
));
634 FragmentShaderRGBATexAlphaMask::FragmentShaderRGBATexAlphaMask()
635 : m_samplerLocation(-1)
636 , m_maskSamplerLocation(-1)
637 , m_alphaLocation(-1)
638 , m_maskTexCoordScaleLocation(-1)
642 void FragmentShaderRGBATexAlphaMask::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
644 static const char* shaderUniforms
[] = {
649 "maskTexCoordOffset",
653 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
655 m_samplerLocation
= locations
[0];
656 m_maskSamplerLocation
= locations
[1];
657 m_alphaLocation
= locations
[2];
658 m_maskTexCoordScaleLocation
= locations
[3];
659 m_maskTexCoordOffsetLocation
= locations
[4];
660 DCHECK(m_samplerLocation
!= -1 && m_maskSamplerLocation
!= -1 && m_alphaLocation
!= -1);
663 std::string
FragmentShaderRGBATexAlphaMask::getShaderString() const
666 precision mediump
float;
667 varying vec2 v_texCoord
;
668 uniform sampler2D s_texture
;
669 uniform sampler2D s_mask
;
670 uniform vec2 maskTexCoordScale
;
671 uniform vec2 maskTexCoordOffset
;
675 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
676 vec2 maskTexCoord
= vec2(maskTexCoordOffset
.x
+ v_texCoord
.x
* maskTexCoordScale
.x
, maskTexCoordOffset
.y
+ v_texCoord
.y
* maskTexCoordScale
.y
);
677 vec4 maskColor
= texture2D(s_mask
, maskTexCoord
);
678 gl_FragColor
= vec4(texColor
.x
, texColor
.y
, texColor
.z
, texColor
.w
) * alpha
* maskColor
.w
;
683 FragmentShaderRGBATexAlphaMaskAA::FragmentShaderRGBATexAlphaMaskAA()
684 : m_samplerLocation(-1)
685 , m_maskSamplerLocation(-1)
686 , m_alphaLocation(-1)
688 , m_maskTexCoordScaleLocation(-1)
692 void FragmentShaderRGBATexAlphaMaskAA::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
694 static const char* shaderUniforms
[] = {
700 "maskTexCoordOffset",
704 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
706 m_samplerLocation
= locations
[0];
707 m_maskSamplerLocation
= locations
[1];
708 m_alphaLocation
= locations
[2];
709 m_edgeLocation
= locations
[3];
710 m_maskTexCoordScaleLocation
= locations
[4];
711 m_maskTexCoordOffsetLocation
= locations
[5];
712 DCHECK(m_samplerLocation
!= -1 && m_maskSamplerLocation
!= -1 && m_alphaLocation
!= -1 && m_edgeLocation
!= -1);
715 std::string
FragmentShaderRGBATexAlphaMaskAA::getShaderString() const
718 precision mediump
float;
719 varying vec2 v_texCoord
;
720 uniform sampler2D s_texture
;
721 uniform sampler2D s_mask
;
722 uniform vec2 maskTexCoordScale
;
723 uniform vec2 maskTexCoordOffset
;
725 uniform vec3 edge
[8];
728 vec4 texColor
= texture2D(s_texture
, v_texCoord
);
729 vec2 maskTexCoord
= vec2(maskTexCoordOffset
.x
+ v_texCoord
.x
* maskTexCoordScale
.x
, maskTexCoordOffset
.y
+ v_texCoord
.y
* maskTexCoordScale
.y
);
730 vec4 maskColor
= texture2D(s_mask
, maskTexCoord
);
731 vec3 pos
= vec3(gl_FragCoord
.xy
, 1);
732 float a0
= clamp(dot(edge
[0], pos
), 0.0, 1.0);
733 float a1
= clamp(dot(edge
[1], pos
), 0.0, 1.0);
734 float a2
= clamp(dot(edge
[2], pos
), 0.0, 1.0);
735 float a3
= clamp(dot(edge
[3], pos
), 0.0, 1.0);
736 float a4
= clamp(dot(edge
[4], pos
), 0.0, 1.0);
737 float a5
= clamp(dot(edge
[5], pos
), 0.0, 1.0);
738 float a6
= clamp(dot(edge
[6], pos
), 0.0, 1.0);
739 float a7
= clamp(dot(edge
[7], pos
), 0.0, 1.0);
740 gl_FragColor
= vec4(texColor
.x
, texColor
.y
, texColor
.z
, texColor
.w
) * alpha
* maskColor
.w
* min(min(a0
, a2
) * min(a1
, a3
), min(a4
, a6
) * min(a5
, a7
));
745 FragmentShaderYUVVideo::FragmentShaderYUVVideo()
746 : m_yTextureLocation(-1)
747 , m_uTextureLocation(-1)
748 , m_vTextureLocation(-1)
749 , m_alphaLocation(-1)
750 , m_yuvMatrixLocation(-1)
751 , m_yuvAdjLocation(-1)
755 void FragmentShaderYUVVideo::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
757 static const char* shaderUniforms
[] = {
767 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
769 m_yTextureLocation
= locations
[0];
770 m_uTextureLocation
= locations
[1];
771 m_vTextureLocation
= locations
[2];
772 m_alphaLocation
= locations
[3];
773 m_yuvMatrixLocation
= locations
[4];
774 m_yuvAdjLocation
= locations
[5];
776 DCHECK(m_yTextureLocation
!= -1 && m_uTextureLocation
!= -1 && m_vTextureLocation
!= -1
777 && m_alphaLocation
!= -1 && m_yuvMatrixLocation
!= -1 && m_yuvAdjLocation
!= -1);
780 std::string
FragmentShaderYUVVideo::getShaderString() const
783 precision mediump
float;
784 precision mediump
int;
785 varying vec2 y_texCoord
;
786 varying vec2 uv_texCoord
;
787 uniform sampler2D y_texture
;
788 uniform sampler2D u_texture
;
789 uniform sampler2D v_texture
;
791 uniform vec3 yuv_adj
;
792 uniform mat3 yuv_matrix
;
795 float y_raw
= texture2D(y_texture
, y_texCoord
).x
;
796 float u_unsigned
= texture2D(u_texture
, uv_texCoord
).x
;
797 float v_unsigned
= texture2D(v_texture
, uv_texCoord
).x
;
798 vec3 yuv
= vec3(y_raw
, u_unsigned
, v_unsigned
) + yuv_adj
;
799 vec3 rgb
= yuv_matrix
* yuv
;
800 gl_FragColor
= vec4(rgb
, float(1)) * alpha
;
805 FragmentShaderColor::FragmentShaderColor()
806 : m_colorLocation(-1)
810 void FragmentShaderColor::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
812 static const char* shaderUniforms
[] = {
817 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
819 m_colorLocation
= locations
[0];
820 DCHECK(m_colorLocation
!= -1);
823 std::string
FragmentShaderColor::getShaderString() const
826 precision mediump
float;
830 gl_FragColor
= color
;
835 FragmentShaderCheckerboard::FragmentShaderCheckerboard()
836 : m_alphaLocation(-1)
837 , m_texTransformLocation(-1)
838 , m_frequencyLocation(-1)
842 void FragmentShaderCheckerboard::init(WebGraphicsContext3D
* context
, unsigned program
, bool usingBindUniform
, int* baseUniformIndex
)
844 static const char* shaderUniforms
[] = {
852 getProgramUniformLocations(context
, program
, shaderUniforms
, arraysize(shaderUniforms
), arraysize(locations
), locations
, usingBindUniform
, baseUniformIndex
);
854 m_alphaLocation
= locations
[0];
855 m_texTransformLocation
= locations
[1];
856 m_frequencyLocation
= locations
[2];
857 m_colorLocation
= locations
[3];
858 DCHECK(m_alphaLocation
!= -1 && m_texTransformLocation
!= -1 && m_frequencyLocation
!= -1 && m_colorLocation
!= -1);
861 std::string
FragmentShaderCheckerboard::getShaderString() const
863 // Shader based on Example 13-17 of "OpenGL ES 2.0 Programming Guide"
864 // by Munshi, Ginsburg, Shreiner.
866 precision mediump
float;
867 precision mediump
int;
868 varying vec2 v_texCoord
;
870 uniform
float frequency
;
871 uniform vec4 texTransform
;
875 vec4 color1
= vec4(1.0, 1.0, 1.0, 1.0);
877 vec2 texCoord
= clamp(v_texCoord
, 0.0, 1.0) * texTransform
.zw
+ texTransform
.xy
;
878 vec2 coord
= mod(floor(texCoord
* frequency
* 2.0), 2.0);
879 float picker
= abs(coord
.x
- coord
.y
);
880 gl_FragColor
= mix(color1
, color2
, picker
) * alpha
;