Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1931)

Unified Diff: cc/output/shader.cc

Issue 2622053005: The great shader refactor: Merge YUV shader class (Closed)
Patch Set: Rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/output/shader.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/output/shader.cc
diff --git a/cc/output/shader.cc b/cc/output/shader.cc
index 8356336947cf34249aa7277496f104274e8eb797..c86344c8910181f5b14423f0c2fc7f0636c6f924 100644
--- a/cc/output/shader.cc
+++ b/cc/output/shader.cc
@@ -166,11 +166,11 @@ TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
max_size.height());
}
-VertexShaderBase::VertexShaderBase() {}
+VertexShader::VertexShader() {}
-void VertexShaderBase::Init(GLES2Interface* context,
- unsigned program,
- int* base_uniform_index) {
+void VertexShader::Init(GLES2Interface* context,
+ unsigned program,
+ int* base_uniform_index) {
std::vector<const char*> uniforms;
std::vector<int> locations;
@@ -237,7 +237,7 @@ void VertexShaderBase::Init(GLES2Interface* context,
quad_location_ = locations[index++];
}
-std::string VertexShaderBase::GetShaderString() const {
+std::string VertexShader::GetShaderString() const {
// We unconditionally use highp in the vertex shader since
// we are unlikely to be vertex shader bound when drawing large quads.
// Also, some vertex shaders mutate the texture coordinate in such a
@@ -382,21 +382,34 @@ std::string VertexShaderBase::GetShaderString() const {
return header + source;
}
-FragmentShaderBase::FragmentShaderBase() {}
+FragmentShader::FragmentShader() {}
+
+std::string FragmentShader::GetShaderString() const {
+ // TODO(ccameron): Merge YUV shaders into the main shader generator.
+ std::string source;
+ if (input_color_type_ == INPUT_COLOR_SOURCE_YUV_TEXTURES)
+ source = GetShaderStringYUVVideo();
+ else
+ source = GetShaderSource();
-std::string FragmentShaderBase::GetShaderString() const {
TexCoordPrecision precision = tex_coord_precision_;
// The AA shader values will use TexCoordPrecision.
if (aa_mode_ == USE_AA && precision == TEX_COORD_PRECISION_NA)
precision = TEX_COORD_PRECISION_MEDIUM;
return SetFragmentTexCoordPrecision(
- precision, SetFragmentSamplerType(
- sampler_type_, SetBlendModeFunctions(GetShaderSource())));
+ precision,
+ SetFragmentSamplerType(sampler_type_, SetBlendModeFunctions(source)));
}
-void FragmentShaderBase::Init(GLES2Interface* context,
- unsigned program,
- int* base_uniform_index) {
+void FragmentShader::Init(GLES2Interface* context,
+ unsigned program,
+ int* base_uniform_index) {
+ // TODO(ccameron): Merge YUV shaders into the main shader generator.
+ if (input_color_type_ == INPUT_COLOR_SOURCE_YUV_TEXTURES) {
+ InitYUVVideo(context, program, base_uniform_index);
+ return;
+ }
+
std::vector<const char*> uniforms;
std::vector<int> locations;
if (has_blend_mode()) {
@@ -423,6 +436,9 @@ void FragmentShaderBase::Init(GLES2Interface* context,
if (has_rgba_fragment_tex_transform_)
uniforms.push_back("fragmentTexTransform");
break;
+ case INPUT_COLOR_SOURCE_YUV_TEXTURES:
+ NOTREACHED();
+ break;
case INPUT_COLOR_SOURCE_UNIFORM:
uniforms.push_back("color");
break;
@@ -458,6 +474,9 @@ void FragmentShaderBase::Init(GLES2Interface* context,
if (has_rgba_fragment_tex_transform_)
fragment_tex_transform_location_ = locations[index++];
break;
+ case INPUT_COLOR_SOURCE_YUV_TEXTURES:
+ NOTREACHED();
+ break;
case INPUT_COLOR_SOURCE_UNIFORM:
color_location_ = locations[index++];
break;
@@ -465,7 +484,7 @@ void FragmentShaderBase::Init(GLES2Interface* context,
DCHECK_EQ(index, locations.size());
}
-std::string FragmentShaderBase::SetBlendModeFunctions(
+std::string FragmentShader::SetBlendModeFunctions(
const std::string& shader_string) const {
if (shader_string.find("ApplyBlendMode") == std::string::npos)
return shader_string;
@@ -517,7 +536,7 @@ std::string FragmentShaderBase::SetBlendModeFunctions(
kFunctionApplyBlendMode + shader_string;
}
-std::string FragmentShaderBase::GetHelperFunctions() const {
+std::string FragmentShader::GetHelperFunctions() const {
static const std::string kFunctionHardLight = SHADER0([]() {
vec3 hardLight(vec4 src, vec4 dst) {
vec3 result;
@@ -678,7 +697,7 @@ std::string FragmentShaderBase::GetHelperFunctions() const {
}
}
-std::string FragmentShaderBase::GetBlendFunction() const {
+std::string FragmentShader::GetBlendFunction() const {
return "vec4 Blend(vec4 src, vec4 dst) {"
" vec4 result;"
" result.a = src.a + (1.0 - src.a) * dst.a;" +
@@ -687,7 +706,7 @@ std::string FragmentShaderBase::GetBlendFunction() const {
"}";
}
-std::string FragmentShaderBase::GetBlendFunctionBodyForRGB() const {
+std::string FragmentShader::GetBlendFunctionBodyForRGB() const {
switch (blend_mode_) {
case BLEND_MODE_NORMAL:
return "result.rgb = src.rgb + dst.rgb * (1.0 - src.a);";
@@ -760,7 +779,7 @@ std::string FragmentShaderBase::GetBlendFunctionBodyForRGB() const {
return "result = vec4(1.0, 0.0, 0.0, 1.0);";
}
-std::string FragmentShaderBase::GetShaderSource() const {
+std::string FragmentShader::GetShaderSource() const {
std::string header = "precision mediump float;\n";
std::string source = "void main() {\n";
@@ -788,6 +807,9 @@ std::string FragmentShaderBase::GetShaderSource() const {
SRC("vec4 texColor = TextureLookup(s_texture, v_texCoord);");
}
break;
+ case INPUT_COLOR_SOURCE_YUV_TEXTURES:
+ NOTREACHED();
+ break;
case INPUT_COLOR_SOURCE_UNIFORM:
DCHECK(!ignore_sampler_type_);
DCHECK(!has_rgba_fragment_tex_transform_);
@@ -896,9 +918,7 @@ std::string FragmentShaderBase::GetShaderSource() const {
return header + source;
}
-FragmentShaderYUVVideo::FragmentShaderYUVVideo() {}
-
-void FragmentShaderYUVVideo::Init(GLES2Interface* context,
+void FragmentShader::InitYUVVideo(GLES2Interface* context,
unsigned program,
int* base_uniform_index) {
static const char* uniforms[] = {
@@ -947,7 +967,7 @@ void FragmentShaderYUVVideo::Init(GLES2Interface* context,
uv_clamp_rect_location_ = locations[12];
}
-std::string FragmentShaderYUVVideo::GetShaderSource() const {
+std::string FragmentShader::GetShaderStringYUVVideo() const {
std::string head = SHADER0([]() {
precision mediump float;
precision mediump int;
« no previous file with comments | « cc/output/shader.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698