| Index: gpu/command_buffer/service/gles2_cmd_srgb_converter.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc b/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc
|
| index f52901b78535d08032b4ed8304cd1f22174b9671..97201e637eee586e2447cf1876a874a21246bb63 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_srgb_converter.cc
|
| @@ -41,10 +41,39 @@ void SRGBConverter::InitializeSRGBConverterProgram() {
|
|
|
| srgb_converter_program_ = glCreateProgram();
|
|
|
| + const char* kShaderPrecisionPreamble =
|
| + "#ifdef GL_ES\n"
|
| + "precision mediump float;\n"
|
| + "#define TexCoordPrecision mediump\n"
|
| + "#else\n"
|
| + "#define TexCoordPrecision\n"
|
| + "#endif\n";
|
| +
|
| + std::string vs_source;
|
| + if (feature_info_->gl_version_info().is_es) {
|
| + if (feature_info_->gl_version_info().is_es3) {
|
| + vs_source += "#version 300 es\n";
|
| + vs_source +=
|
| + "#define ATTRIBUTE in\n"
|
| + "#define VARYING out\n";
|
| + } else {
|
| + vs_source +=
|
| + "#define ATTRIBUTE attribute\n"
|
| + "#define VARYING varying\n";
|
| + }
|
| + } else {
|
| + vs_source += "#version 150\n";
|
| + vs_source +=
|
| + "#define ATTRIBUTE in\n"
|
| + "#define VARYING out\n";
|
| + }
|
| +
|
| + vs_source += kShaderPrecisionPreamble;
|
| +
|
| + // TODO(yizhou): gles 2.0 does not support gl_VertexID.
|
| // Compile the vertex shader
|
| - const char* vs_source =
|
| - "#version 150\n"
|
| - "out vec2 v_texcoord;\n"
|
| + vs_source +=
|
| + "VARYING TexCoordPrecision vec2 v_texcoord;\n"
|
| "\n"
|
| "void main()\n"
|
| "{\n"
|
| @@ -64,7 +93,7 @@ void SRGBConverter::InitializeSRGBConverterProgram() {
|
| " v_texcoord = quad_positions[gl_VertexID];\n"
|
| "}\n";
|
| GLuint vs = glCreateShader(GL_VERTEX_SHADER);
|
| - CompileShader(vs, vs_source);
|
| + CompileShader(vs, vs_source.c_str());
|
| glAttachShader(srgb_converter_program_, vs);
|
| glDeleteShader(vs);
|
|
|
| @@ -80,20 +109,50 @@ void SRGBConverter::InitializeSRGBConverterProgram() {
|
| // encoding, we don't need to use the equation to explicitly encode linear
|
| // to srgb in fragment shader.
|
| // As a result, we just use a simple fragment shader to do srgb conversion.
|
| - const char* fs_source =
|
| - "#version 150\n"
|
| - "uniform sampler2D u_source_texture;\n"
|
| - "in vec2 v_texcoord;\n"
|
| - "out vec4 output_color;\n"
|
| + std::string fs_source;
|
| + if (feature_info_->gl_version_info().is_es) {
|
| + if (feature_info_->gl_version_info().is_es3) {
|
| + fs_source += "#version 300 es\n";
|
| + }
|
| + } else {
|
| + fs_source += "#version 150\n";
|
| + }
|
| +
|
| + fs_source += kShaderPrecisionPreamble;
|
| +
|
| + if (feature_info_->gl_version_info().is_es) {
|
| + if (feature_info_->gl_version_info().is_es3) {
|
| + fs_source +=
|
| + "#define VARYING in\n"
|
| + "out vec4 frag_color;\n"
|
| + "#define FRAGCOLOR frag_color\n"
|
| + "#define TextureLookup texture\n";
|
| + } else {
|
| + fs_source +=
|
| + "#define VARYING varying\n"
|
| + "#define FRAGCOLOR gl_FragColor\n"
|
| + "#define TextureLookup texture2D\n";
|
| + }
|
| + } else {
|
| + fs_source +=
|
| + "#define VARYING in\n"
|
| + "out vec4 frag_color;\n"
|
| + "#define FRAGCOLOR frag_color\n"
|
| + "#define TextureLookup texture\n";
|
| + }
|
| +
|
| + fs_source +=
|
| + "uniform mediump sampler2D u_source_texture;\n"
|
| + "VARYING TexCoordPrecision vec2 v_texcoord;\n"
|
| "\n"
|
| "void main()\n"
|
| "{\n"
|
| - " vec4 c = texture(u_source_texture, v_texcoord);\n"
|
| - " output_color = c;\n"
|
| + " vec4 c = TextureLookup(u_source_texture, v_texcoord);\n"
|
| + " FRAGCOLOR = c;\n"
|
| "}\n";
|
|
|
| GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
|
| - CompileShader(fs, fs_source);
|
| + CompileShader(fs, fs_source.c_str());
|
| glAttachShader(srgb_converter_program_, fs);
|
| glDeleteShader(fs);
|
|
|
| @@ -243,9 +302,8 @@ void SRGBConverter::Blit(
|
| glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
|
|
| glBindTexture(GL_TEXTURE_2D, srgb_converter_textures_[1]);
|
| - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F,
|
| - c.width(), c.height(),
|
| - 0, GL_RGBA, GL_FLOAT, nullptr);
|
| + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, c.width(), c.height(), 0,
|
| + GL_RGBA, GL_FLOAT, nullptr);
|
| glBindFramebufferEXT(GL_FRAMEBUFFER, srgb_decoder_fbo_);
|
| glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
| GL_TEXTURE_2D, srgb_converter_textures_[1], 0);
|
| @@ -277,10 +335,8 @@ void SRGBConverter::Blit(
|
| glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
|
| glTexImage2D(
|
| GL_TEXTURE_2D, 0, decode ? GL_RGBA32F : src_framebuffer_internal_format,
|
| - width_draw, height_draw, 0,
|
| - decode ? GL_RGBA : src_framebuffer_format,
|
| - decode ? GL_FLOAT : src_framebuffer_type,
|
| - nullptr);
|
| + width_draw, height_draw, 0, decode ? GL_RGBA : src_framebuffer_format,
|
| + decode ? GL_FLOAT : src_framebuffer_type, nullptr);
|
|
|
| glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, srgb_encoder_fbo_);
|
| glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
|
|
|