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

Unified Diff: cc/output/shader.cc

Issue 2697253002: color: Add support for shader generation (Closed)
Patch Set: More bits of precision Created 3 years, 10 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') | ui/gfx/color_transform.h » ('j') | 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 29721834e5b16451b806b1eccf44df5aa76fa0de..7b46db25b395346b0755857700fd572cc53bd41e 100644
--- a/cc/output/shader.cc
+++ b/cc/output/shader.cc
@@ -13,6 +13,7 @@
#include "base/strings/stringprintf.h"
#include "cc/output/static_geometry_binding.h"
#include "gpu/command_buffer/client/gles2_interface.h"
+#include "ui/gfx/color_transform.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
@@ -439,7 +440,8 @@ void FragmentShader::Init(GLES2Interface* context,
uniforms.push_back("a_texture");
uniforms.push_back("ya_clamp_rect");
uniforms.push_back("uv_clamp_rect");
- uniforms.push_back("yuv_and_resource_matrix");
+ uniforms.push_back("resource_multiplier");
+ uniforms.push_back("resource_offset");
break;
case INPUT_COLOR_SOURCE_UNIFORM:
uniforms.push_back("color");
@@ -492,7 +494,8 @@ void FragmentShader::Init(GLES2Interface* context,
a_texture_location_ = locations[index++];
ya_clamp_rect_location_ = locations[index++];
uv_clamp_rect_location_ = locations[index++];
- yuv_and_resource_matrix_location_ = locations[index++];
+ resource_multiplier_location_ = locations[index++];
+ resource_offset_location_ = locations[index++];
break;
case INPUT_COLOR_SOURCE_UNIFORM:
color_location_ = locations[index++];
@@ -862,10 +865,12 @@ std::string FragmentShader::GetShaderSource() const {
HDR("uniform SamplerType a_texture;");
HDR("uniform vec4 ya_clamp_rect;");
HDR("uniform vec4 uv_clamp_rect;");
- HDR("uniform mat4 yuv_and_resource_matrix;");
+ HDR("uniform float resource_multiplier;");
+ HDR("uniform float resource_offset;");
HDR("varying TexCoordPrecision vec2 v_yaTexCoord;");
HDR("varying TexCoordPrecision vec2 v_uvTexCoord;");
- SRC("texColor = yuv_and_resource_matrix * texColor;");
+ SRC("texColor.xyz -= vec3(resource_offset);");
+ SRC("texColor.xyz *= resource_multiplier;");
break;
case INPUT_COLOR_SOURCE_UNIFORM:
DCHECK(!ignore_sampler_type_);
@@ -877,22 +882,30 @@ std::string FragmentShader::GetShaderSource() const {
}
// Apply LUT based color conversion.
- if (color_conversion_mode_ == COLOR_CONVERSION_MODE_LUT) {
- HDR("uniform sampler2D lut_texture;");
- HDR("uniform float lut_size;");
- HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {");
- HDR(" pos *= size - 1.0;");
- HDR(" // Select layer");
- HDR(" float layer = min(floor(pos.z), size - 2.0);");
- HDR(" // Compress the xy coordinates so they stay within");
- HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)");
- HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;");
- HDR(" pos.y = (pos.y + layer) / size;");
- HDR(" return mix(LutLookup(sampler, pos.xy),");
- HDR(" LutLookup(sampler, pos.xy + vec2(0, 1.0 / size)),");
- HDR(" pos.z - layer);");
- HDR("}");
- SRC("texColor.xyz = LUT(lut_texture, texColor.xyz, lut_size).xyz;");
+ switch (color_conversion_mode_) {
+ case COLOR_CONVERSION_MODE_LUT:
+ HDR("uniform sampler2D lut_texture;");
+ HDR("uniform float lut_size;");
+ HDR("vec4 LUT(sampler2D sampler, vec3 pos, float size) {");
+ HDR(" pos *= size - 1.0;");
+ HDR(" // Select layer");
+ HDR(" float layer = min(floor(pos.z), size - 2.0);");
+ HDR(" // Compress the xy coordinates so they stay within");
+ HDR(" // [0.5 .. 31.5] / N (assuming a LUT size of 17^3)");
+ HDR(" pos.xy = (pos.xy + vec2(0.5)) / size;");
+ HDR(" pos.y = (pos.y + layer) / size;");
+ HDR(" return mix(LutLookup(sampler, pos.xy),");
+ HDR(" LutLookup(sampler, pos.xy + vec2(0, 1.0 / size)),");
+ HDR(" pos.z - layer);");
+ HDR("}");
+ SRC("texColor.rgb = LUT(lut_texture, texColor.xyz, lut_size).xyz;");
+ break;
+ case COLOR_CONVERSION_MODE_SHADER:
+ header += color_transform_->GetShaderSource();
+ SRC("texColor.rgb = DoColorConversion(texColor.xyz);");
+ break;
+ case COLOR_CONVERSION_MODE_NONE:
+ break;
}
// Apply the color matrix to texColor.
« no previous file with comments | « cc/output/shader.h ('k') | ui/gfx/color_transform.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698