ShaderChromium.cpp [plain text]
#include "config.h"
#if USE(ACCELERATED_COMPOSITING)
#include "ShaderChromium.h"
#include "GraphicsContext.h"
#include "GraphicsContext3D.h"
#define SHADER0(Src) #Src
#define SHADER(Src) SHADER0(Src)
namespace WebCore {
VertexShaderPosTex::VertexShaderPosTex()
: m_matrixLocation(-1)
{
}
bool VertexShaderPosTex::init(GraphicsContext3D* context, unsigned program)
{
m_matrixLocation = context->getUniformLocation(program, "matrix");
return m_matrixLocation != -1;
}
String VertexShaderPosTex::getShaderString() const
{
return SHADER(
attribute vec4 a_position;
attribute vec2 a_texCoord;
uniform mat4 matrix;
varying vec2 v_texCoord;
void main()
{
gl_Position = matrix * a_position;
v_texCoord = a_texCoord;
}
);
}
VertexShaderPosTexYUVStretch::VertexShaderPosTexYUVStretch()
: m_matrixLocation(-1)
, m_yWidthScaleFactorLocation(-1)
, m_uvWidthScaleFactorLocation(-1)
{
}
bool VertexShaderPosTexYUVStretch::init(GraphicsContext3D* context, unsigned program)
{
m_matrixLocation = context->getUniformLocation(program, "matrix");
m_yWidthScaleFactorLocation = context->getUniformLocation(program, "y_widthScaleFactor");
m_uvWidthScaleFactorLocation = context->getUniformLocation(program, "uv_widthScaleFactor");
return m_matrixLocation != -1 && m_yWidthScaleFactorLocation != -1 && m_uvWidthScaleFactorLocation != -1;
}
String VertexShaderPosTexYUVStretch::getShaderString() const
{
return SHADER(
precision mediump float;
attribute vec4 a_position;
attribute vec2 a_texCoord;
uniform mat4 matrix;
varying vec2 y_texCoord;
varying vec2 uv_texCoord;
uniform float y_widthScaleFactor;
uniform float uv_widthScaleFactor;
void main()
{
gl_Position = matrix * a_position;
y_texCoord = vec2(y_widthScaleFactor * a_texCoord.x, a_texCoord.y);
uv_texCoord = vec2(uv_widthScaleFactor * a_texCoord.x, a_texCoord.y);
}
);
}
VertexShaderPos::VertexShaderPos()
: m_matrixLocation(-1)
{
}
bool VertexShaderPos::init(GraphicsContext3D* context, unsigned program)
{
m_matrixLocation = context->getUniformLocation(program, "matrix");
return m_matrixLocation != -1;
}
String VertexShaderPos::getShaderString() const
{
return SHADER(
attribute vec4 a_position;
uniform mat4 matrix;
void main()
{
gl_Position = matrix * a_position;
}
);
}
VertexShaderPosTexTransform::VertexShaderPosTexTransform()
: m_matrixLocation(-1)
, m_texTransformLocation(-1)
{
}
bool VertexShaderPosTexTransform::init(GraphicsContext3D* context, unsigned program)
{
m_matrixLocation = context->getUniformLocation(program, "matrix");
m_texTransformLocation = context->getUniformLocation(program, "texTransform");
return m_matrixLocation != -1 && m_texTransformLocation != -1;
}
String VertexShaderPosTexTransform::getShaderString() const
{
return SHADER(
attribute vec4 a_position;
attribute vec2 a_texCoord;
uniform mat4 matrix;
uniform vec4 texTransform;
varying vec2 v_texCoord;
void main()
{
gl_Position = matrix * a_position;
v_texCoord = a_texCoord * texTransform.zw + texTransform.xy;
}
);
}
FragmentTexAlphaBinding::FragmentTexAlphaBinding()
: m_samplerLocation(-1)
, m_alphaLocation(-1)
{
}
bool FragmentTexAlphaBinding::init(GraphicsContext3D* context, unsigned program)
{
m_samplerLocation = context->getUniformLocation(program, "s_texture");
m_alphaLocation = context->getUniformLocation(program, "alpha");
return m_samplerLocation != -1 && m_alphaLocation != -1;
}
String FragmentShaderRGBATexFlipAlpha::getShaderString() const
{
return SHADER(
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform float alpha;
void main()
{
vec4 texColor = texture2D(s_texture, vec2(v_texCoord.x, 1.0 - v_texCoord.y));
gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha;
}
);
}
String FragmentShaderRGBATexAlpha::getShaderString() const
{
return SHADER(
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform float alpha;
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
gl_FragColor = texColor * alpha;
}
);
}
String FragmentShaderBGRATexAlpha::getShaderString() const
{
return SHADER(
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform float alpha;
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
gl_FragColor = vec4(texColor.z, texColor.y, texColor.x, texColor.w) * alpha;
}
);
}
FragmentShaderRGBATexAlphaMask::FragmentShaderRGBATexAlphaMask()
: m_samplerLocation(-1)
, m_maskSamplerLocation(-1)
, m_alphaLocation(-1)
{
}
bool FragmentShaderRGBATexAlphaMask::init(GraphicsContext3D* context, unsigned program)
{
m_samplerLocation = context->getUniformLocation(program, "s_texture");
m_maskSamplerLocation = context->getUniformLocation(program, "s_mask");
m_alphaLocation = context->getUniformLocation(program, "alpha");
return m_samplerLocation != -1 && m_maskSamplerLocation != -1 && m_alphaLocation != -1;
}
String FragmentShaderRGBATexAlphaMask::getShaderString() const
{
return SHADER(
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
uniform sampler2D s_mask;
uniform float alpha;
void main()
{
vec4 texColor = texture2D(s_texture, v_texCoord);
vec4 maskColor = texture2D(s_mask, v_texCoord);
gl_FragColor = vec4(texColor.x, texColor.y, texColor.z, texColor.w) * alpha * maskColor.w;
}
);
}
FragmentShaderYUVVideo::FragmentShaderYUVVideo()
: m_yTextureLocation(-1)
, m_uTextureLocation(-1)
, m_vTextureLocation(-1)
, m_alphaLocation(-1)
, m_ccMatrixLocation(-1)
, m_yuvAdjLocation(-1)
{
}
bool FragmentShaderYUVVideo::init(GraphicsContext3D* context, unsigned program)
{
m_yTextureLocation = context->getUniformLocation(program, "y_texture");
m_uTextureLocation = context->getUniformLocation(program, "u_texture");
m_vTextureLocation = context->getUniformLocation(program, "v_texture");
m_alphaLocation = context->getUniformLocation(program, "alpha");
m_ccMatrixLocation = context->getUniformLocation(program, "cc_matrix");
m_yuvAdjLocation = context->getUniformLocation(program, "yuv_adj");
return m_yTextureLocation != -1 && m_uTextureLocation != -1 && m_vTextureLocation != -1
&& m_alphaLocation != -1 && m_ccMatrixLocation != -1 && m_yuvAdjLocation != -1;
}
String FragmentShaderYUVVideo::getShaderString() const
{
return SHADER(
precision mediump float;
precision mediump int;
varying vec2 y_texCoord;
varying vec2 uv_texCoord;
uniform sampler2D y_texture;
uniform sampler2D u_texture;
uniform sampler2D v_texture;
uniform float alpha;
uniform vec3 yuv_adj;
uniform mat3 cc_matrix;
void main()
{
float y_raw = texture2D(y_texture, y_texCoord).x;
float u_unsigned = texture2D(u_texture, uv_texCoord).x;
float v_unsigned = texture2D(v_texture, uv_texCoord).x;
vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned) + yuv_adj;
vec3 rgb = cc_matrix * yuv;
gl_FragColor = vec4(rgb, float(1)) * alpha;
}
);
}
FragmentShaderColor::FragmentShaderColor()
: m_colorLocation(-1)
{
}
bool FragmentShaderColor::init(GraphicsContext3D* context, unsigned program)
{
m_colorLocation = context->getUniformLocation(program, "color");
return m_colorLocation != -1;
}
String FragmentShaderColor::getShaderString() const
{
return SHADER(
precision mediump float;
uniform vec4 color;
void main()
{
gl_FragColor = vec4(color.xyz * color.w, color.w);
}
);
}
}
#endif // USE(ACCELERATED_COMPOSITING)