| Index: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| index 6e299a9051d686191878d6462cfdacad17eaf889..e6e3035c9e868ccbd11a5107ad5e919d9d4fca64 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
|
| @@ -10,7 +10,6 @@
|
|
|
| #include "gpu/command_buffer/service/gl_utils.h"
|
| #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
|
| -#include "gpu/command_buffer/service/texture_manager.h"
|
| #include "ui/gl/gl_version_info.h"
|
|
|
| namespace {
|
| @@ -20,311 +19,113 @@
|
| 0.0f, 0.0f, 1.0f, 0.0f,
|
| 0.0f, 0.0f, 0.0f, 1.0f};
|
|
|
| -enum {
|
| - SAMPLER_2D,
|
| - SAMPLER_RECTANGLE_ARB,
|
| - SAMPLER_EXTERNAL_OES,
|
| - NUM_SAMPLERS
|
| +enum FragmentShaderId {
|
| + FRAGMENT_SHADER_COPY_TEXTURE_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES,
|
| + NUM_FRAGMENT_SHADERS,
|
| };
|
|
|
| -enum {
|
| - S_FORMAT_ALPHA,
|
| - S_FORMAT_LUMINANCE,
|
| - S_FORMAT_LUMINANCE_ALPHA,
|
| - S_FORMAT_RED,
|
| - S_FORMAT_RGB,
|
| - S_FORMAT_RGBA,
|
| - S_FORMAT_RGB8,
|
| - S_FORMAT_RGBA8,
|
| - S_FORMAT_BGRA_EXT,
|
| - S_FORMAT_BGRA8_EXT,
|
| - S_FORMAT_RGB_YCBCR_420V_CHROMIUM,
|
| - S_FORMAT_RGB_YCBCR_422_CHROMIUM,
|
| - S_FORMAT_COMPRESSED,
|
| - NUM_S_FORMAT
|
| -};
|
| -
|
| -enum {
|
| - D_FORMAT_RGB,
|
| - D_FORMAT_RGBA,
|
| - D_FORMAT_RGB8,
|
| - D_FORMAT_RGBA8,
|
| - D_FORMAT_BGRA_EXT,
|
| - D_FORMAT_BGRA8_EXT,
|
| - D_FORMAT_SRGB_EXT,
|
| - D_FORMAT_SRGB_ALPHA_EXT,
|
| - D_FORMAT_R8,
|
| - D_FORMAT_R8UI,
|
| - D_FORMAT_RG8,
|
| - D_FORMAT_RG8UI,
|
| - D_FORMAT_SRGB8,
|
| - D_FORMAT_RGB565,
|
| - D_FORMAT_RGB8UI,
|
| - D_FORMAT_SRGB8_ALPHA8,
|
| - D_FORMAT_RGB5_A1,
|
| - D_FORMAT_RGBA4,
|
| - D_FORMAT_RGBA8UI,
|
| - D_FORMAT_RGB9_E5,
|
| - D_FORMAT_R16F,
|
| - D_FORMAT_R32F,
|
| - D_FORMAT_RG16F,
|
| - D_FORMAT_RG32F,
|
| - D_FORMAT_RGB16F,
|
| - D_FORMAT_RGB32F,
|
| - D_FORMAT_RGBA16F,
|
| - D_FORMAT_RGBA32F,
|
| - D_FORMAT_R11F_G11F_B10F,
|
| - NUM_D_FORMAT
|
| -};
|
| -
|
| -const unsigned kNumVertexShaders = NUM_SAMPLERS;
|
| -const unsigned kNumFragmentShaders =
|
| - 4 * NUM_SAMPLERS * NUM_S_FORMAT * NUM_D_FORMAT;
|
| -
|
| -typedef unsigned ShaderId;
|
| -
|
| -ShaderId GetVertexShaderId(GLenum target) {
|
| - ShaderId id = 0;
|
| +// Returns the correct fragment shader id to evaluate the copy operation for
|
| +// the premultiply alpha pixel store settings and target.
|
| +FragmentShaderId GetFragmentShaderId(bool premultiply_alpha,
|
| + bool unpremultiply_alpha,
|
| + GLenum target) {
|
| + enum {
|
| + SAMPLER_2D,
|
| + SAMPLER_RECTANGLE_ARB,
|
| + SAMPLER_EXTERNAL_OES,
|
| + NUM_SAMPLERS
|
| + };
|
| +
|
| + // bit 0: premultiply alpha
|
| + // bit 1: unpremultiply alpha
|
| + static FragmentShaderId shader_ids[][NUM_SAMPLERS] = {
|
| + {
|
| + FRAGMENT_SHADER_COPY_TEXTURE_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
|
| + },
|
| + {
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES,
|
| + },
|
| + {
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES,
|
| + },
|
| + {
|
| + FRAGMENT_SHADER_COPY_TEXTURE_2D,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB,
|
| + FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES,
|
| + }};
|
| +
|
| + unsigned index = (premultiply_alpha ? (1 << 0) : 0) |
|
| + (unpremultiply_alpha ? (1 << 1) : 0);
|
| +
|
| switch (target) {
|
| case GL_TEXTURE_2D:
|
| - id = SAMPLER_2D;
|
| + return shader_ids[index][SAMPLER_2D];
|
| + case GL_TEXTURE_RECTANGLE_ARB:
|
| + return shader_ids[index][SAMPLER_RECTANGLE_ARB];
|
| + case GL_TEXTURE_EXTERNAL_OES:
|
| + return shader_ids[index][SAMPLER_EXTERNAL_OES];
|
| + default:
|
| break;
|
| - case GL_TEXTURE_RECTANGLE_ARB:
|
| - id = SAMPLER_RECTANGLE_ARB;
|
| - break;
|
| - case GL_TEXTURE_EXTERNAL_OES:
|
| - id = SAMPLER_EXTERNAL_OES;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - return id;
|
| -}
|
| -
|
| -// Returns the correct fragment shader id to evaluate the copy operation for
|
| -// the premultiply alpha pixel store settings and target.
|
| -ShaderId GetFragmentShaderId(bool premultiply_alpha,
|
| - bool unpremultiply_alpha,
|
| - GLenum target,
|
| - GLenum source_format,
|
| - GLenum dest_format) {
|
| - unsigned alphaIndex = 0;
|
| - unsigned targetIndex = 0;
|
| - unsigned sourceFormatIndex = 0;
|
| - unsigned destFormatIndex = 0;
|
| -
|
| - alphaIndex = (premultiply_alpha ? (1 << 0) : 0) |
|
| - (unpremultiply_alpha ? (1 << 1) : 0);
|
| -
|
| - switch (target) {
|
| - case GL_TEXTURE_2D:
|
| - targetIndex = SAMPLER_2D;
|
| - break;
|
| - case GL_TEXTURE_RECTANGLE_ARB:
|
| - targetIndex = SAMPLER_RECTANGLE_ARB;
|
| - break;
|
| - case GL_TEXTURE_EXTERNAL_OES:
|
| - targetIndex = SAMPLER_EXTERNAL_OES;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - switch (source_format) {
|
| - case GL_ALPHA:
|
| - sourceFormatIndex = S_FORMAT_ALPHA;
|
| - break;
|
| - case GL_LUMINANCE:
|
| - sourceFormatIndex = S_FORMAT_LUMINANCE;
|
| - break;
|
| - case GL_LUMINANCE_ALPHA:
|
| - sourceFormatIndex = S_FORMAT_LUMINANCE_ALPHA;
|
| - break;
|
| - case GL_RED:
|
| - sourceFormatIndex = S_FORMAT_RED;
|
| - break;
|
| - case GL_RGB:
|
| - sourceFormatIndex = S_FORMAT_RGB;
|
| - break;
|
| - case GL_RGBA:
|
| - sourceFormatIndex = S_FORMAT_RGBA;
|
| - break;
|
| - case GL_RGB8:
|
| - sourceFormatIndex = S_FORMAT_RGB8;
|
| - break;
|
| - case GL_RGBA8:
|
| - sourceFormatIndex = S_FORMAT_RGBA8;
|
| - break;
|
| - case GL_BGRA_EXT:
|
| - sourceFormatIndex = S_FORMAT_BGRA_EXT;
|
| - break;
|
| - case GL_BGRA8_EXT:
|
| - sourceFormatIndex = S_FORMAT_BGRA8_EXT;
|
| - break;
|
| - case GL_RGB_YCBCR_420V_CHROMIUM:
|
| - sourceFormatIndex = S_FORMAT_RGB_YCBCR_420V_CHROMIUM;
|
| - break;
|
| - case GL_RGB_YCBCR_422_CHROMIUM:
|
| - sourceFormatIndex = S_FORMAT_RGB_YCBCR_422_CHROMIUM;
|
| - break;
|
| - case GL_ATC_RGB_AMD:
|
| - case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD:
|
| - case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
|
| - case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
|
| - case GL_ETC1_RGB8_OES:
|
| - sourceFormatIndex = S_FORMAT_COMPRESSED;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - switch (dest_format) {
|
| - case GL_RGB:
|
| - destFormatIndex = D_FORMAT_RGB;
|
| - break;
|
| - case GL_RGBA:
|
| - destFormatIndex = D_FORMAT_RGBA;
|
| - break;
|
| - case GL_RGB8:
|
| - destFormatIndex = D_FORMAT_RGB8;
|
| - break;
|
| - case GL_RGBA8:
|
| - destFormatIndex = D_FORMAT_RGBA8;
|
| - break;
|
| - case GL_BGRA_EXT:
|
| - destFormatIndex = D_FORMAT_BGRA_EXT;
|
| - break;
|
| - case GL_BGRA8_EXT:
|
| - destFormatIndex = D_FORMAT_BGRA8_EXT;
|
| - break;
|
| - case GL_SRGB_EXT:
|
| - destFormatIndex = D_FORMAT_SRGB_EXT;
|
| - break;
|
| - case GL_SRGB_ALPHA_EXT:
|
| - destFormatIndex = D_FORMAT_SRGB_ALPHA_EXT;
|
| - break;
|
| - case GL_R8:
|
| - destFormatIndex = D_FORMAT_R8;
|
| - break;
|
| - case GL_R8UI:
|
| - destFormatIndex = D_FORMAT_R8UI;
|
| - break;
|
| - case GL_RG8:
|
| - destFormatIndex = D_FORMAT_RG8;
|
| - break;
|
| - case GL_RG8UI:
|
| - destFormatIndex = D_FORMAT_RG8UI;
|
| - break;
|
| - case GL_SRGB8:
|
| - destFormatIndex = D_FORMAT_SRGB8;
|
| - break;
|
| - case GL_RGB565:
|
| - destFormatIndex = D_FORMAT_RGB565;
|
| - break;
|
| - case GL_RGB8UI:
|
| - destFormatIndex = D_FORMAT_RGB8UI;
|
| - break;
|
| - case GL_SRGB8_ALPHA8:
|
| - destFormatIndex = D_FORMAT_SRGB8_ALPHA8;
|
| - break;
|
| - case GL_RGB5_A1:
|
| - destFormatIndex = D_FORMAT_RGB5_A1;
|
| - break;
|
| - case GL_RGBA4:
|
| - destFormatIndex = D_FORMAT_RGBA4;
|
| - break;
|
| - case GL_RGBA8UI:
|
| - destFormatIndex = D_FORMAT_RGBA8UI;
|
| - break;
|
| - case GL_RGB9_E5:
|
| - destFormatIndex = D_FORMAT_RGB9_E5;
|
| - break;
|
| - case GL_R16F:
|
| - destFormatIndex = D_FORMAT_R16F;
|
| - break;
|
| - case GL_R32F:
|
| - destFormatIndex = D_FORMAT_R32F;
|
| - break;
|
| - case GL_RG16F:
|
| - destFormatIndex = D_FORMAT_RG16F;
|
| - break;
|
| - case GL_RG32F:
|
| - destFormatIndex = D_FORMAT_RG32F;
|
| - break;
|
| - case GL_RGB16F:
|
| - destFormatIndex = D_FORMAT_RGB16F;
|
| - break;
|
| - case GL_RGB32F:
|
| - destFormatIndex = D_FORMAT_RGB32F;
|
| - break;
|
| - case GL_RGBA16F:
|
| - destFormatIndex = D_FORMAT_RGBA16F;
|
| - break;
|
| - case GL_RGBA32F:
|
| - destFormatIndex = D_FORMAT_RGBA32F;
|
| - break;
|
| - case GL_R11F_G11F_B10F:
|
| - destFormatIndex = D_FORMAT_R11F_G11F_B10F;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| -
|
| - return alphaIndex + targetIndex * 4 + sourceFormatIndex * 4 * NUM_SAMPLERS +
|
| - destFormatIndex * 4 * NUM_SAMPLERS * NUM_S_FORMAT;
|
| -}
|
| -
|
| -const char* kShaderPrecisionPreamble =
|
| - "#ifdef GL_ES\n"
|
| - "precision mediump float;\n"
|
| - "#define TexCoordPrecision mediump\n"
|
| - "#else\n"
|
| - "#define TexCoordPrecision\n"
|
| - "#endif\n";
|
| -
|
| -std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info,
|
| - GLenum target) {
|
| + }
|
| +
|
| + NOTREACHED();
|
| + return shader_ids[0][SAMPLER_2D];
|
| +}
|
| +
|
| +const char* kShaderPrecisionPreamble = "\
|
| + #ifdef GL_ES\n\
|
| + precision mediump float;\n\
|
| + #define TexCoordPrecision mediump\n\
|
| + #else\n\
|
| + #define TexCoordPrecision\n\
|
| + #endif\n";
|
| +
|
| +std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info) {
|
| std::string source;
|
|
|
| - if (gl_version_info.is_es) {
|
| - if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) {
|
| - source += "#version 300 es\n";
|
| - source +=
|
| - "#define ATTRIBUTE in\n"
|
| - "#define VARYING out\n";
|
| - } else {
|
| - source +=
|
| - "#define ATTRIBUTE attribute\n"
|
| - "#define VARYING varying\n";
|
| - }
|
| + // Preamble for core and compatibility mode.
|
| + if (gl_version_info.is_desktop_core_profile) {
|
| + source += std::string("\
|
| + #version 150\n\
|
| + #define ATTRIBUTE in\n\
|
| + #define VARYING out\n");
|
| } else {
|
| - source += "#version 150\n";
|
| - source +=
|
| - "#define ATTRIBUTE in\n"
|
| - "#define VARYING out\n";
|
| + source += std::string("\
|
| + #define ATTRIBUTE attribute\n\
|
| + #define VARYING varying\n");
|
| }
|
|
|
| // Preamble for texture precision.
|
| - source += kShaderPrecisionPreamble;
|
| + source += std::string(kShaderPrecisionPreamble);
|
|
|
| // Main shader source.
|
| - source +=
|
| - "uniform vec2 u_vertex_dest_mult;\n"
|
| - "uniform vec2 u_vertex_dest_add;\n"
|
| - "uniform vec2 u_vertex_source_mult;\n"
|
| - "uniform vec2 u_vertex_source_add;\n"
|
| - "ATTRIBUTE vec2 a_position;\n"
|
| - "VARYING TexCoordPrecision vec2 v_uv;\n"
|
| - "void main(void) {\n"
|
| - " gl_Position = vec4(0, 0, 0, 1);\n"
|
| - " gl_Position.xy =\n"
|
| - " a_position.xy * u_vertex_dest_mult + u_vertex_dest_add;\n"
|
| - " v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n"
|
| - "}\n";
|
| + source += std::string("\
|
| + uniform vec2 u_vertex_dest_mult;\n\
|
| + uniform vec2 u_vertex_dest_add;\n\
|
| + uniform vec2 u_vertex_source_mult;\n\
|
| + uniform vec2 u_vertex_source_add;\n\
|
| + ATTRIBUTE vec2 a_position;\n\
|
| + VARYING TexCoordPrecision vec2 v_uv;\n\
|
| + void main(void) {\n\
|
| + gl_Position = vec4(0, 0, 0, 1);\n\
|
| + gl_Position.xy = a_position.xy * u_vertex_dest_mult + \
|
| + u_vertex_dest_add;\n\
|
| + v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n\
|
| + }\n");
|
|
|
| return source;
|
| }
|
| @@ -333,174 +134,97 @@
|
| bool premultiply_alpha,
|
| bool unpremultiply_alpha,
|
| bool nv_egl_stream_consumer_external,
|
| - GLenum target,
|
| - GLenum source_format,
|
| - GLenum dest_format) {
|
| + GLenum target) {
|
| std::string source;
|
|
|
| // Preamble for core and compatibility mode.
|
| - if (gl_version_info.is_es) {
|
| - if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) {
|
| - source += "#version 300 es\n";
|
| - }
|
| - if (target == GL_TEXTURE_EXTERNAL_OES) {
|
| - source += "#extension GL_OES_EGL_image_external : enable\n";
|
| -
|
| - if (nv_egl_stream_consumer_external) {
|
| - source += "#extension GL_NV_EGL_stream_consumer_external : enable\n";
|
| - }
|
| - }
|
| + if (gl_version_info.is_desktop_core_profile) {
|
| + source += std::string("\
|
| + #version 150\n\
|
| + out vec4 frag_color;\n\
|
| + #define VARYING in\n\
|
| + #define FRAGCOLOR frag_color\n\
|
| + #define TextureLookup texture\n");
|
| } else {
|
| - source += "#version 150\n";
|
| - }
|
| -
|
| - // Preamble for texture precision.
|
| - source += kShaderPrecisionPreamble;
|
| -
|
| - if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(dest_format)) {
|
| - source += "#define TextureType ivec4\n";
|
| - source += "#define ZERO 0\n";
|
| - source += "#define MAX_COLOR 255\n";
|
| - if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format))
|
| - source += "#define InnerScaleValue 1\n";
|
| - else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format))
|
| - source += "#define InnerScaleValue 1u\n";
|
| - else
|
| - source += "#define InnerScaleValue 255.0\n";
|
| - source += "#define OuterScaleValue 1\n";
|
| - } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(dest_format)) {
|
| - source += "#define TextureType uvec4\n";
|
| - source += "#define ZERO 0u\n";
|
| - source += "#define MAX_COLOR 255u\n";
|
| - if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format))
|
| - source += "#define InnerScaleValue 1\n";
|
| - else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format))
|
| - source += "#define InnerScaleValue 1u\n";
|
| - else
|
| - source += "#define InnerScaleValue 255.0\n";
|
| - source += "#define OuterScaleValue 1u\n";
|
| - } else {
|
| - source += "#define TextureType vec4\n";
|
| - source += "#define ZERO 0.0\n";
|
| - source += "#define MAX_COLOR 1.0\n";
|
| - if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format)) {
|
| - source += "#define InnerScaleValue 1\n";
|
| - source += "#define OuterScaleValue (1.0 / 255.0)\n";
|
| - } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format)) {
|
| - source += "#define InnerScaleValue 1u\n";
|
| - source += "#define OuterScaleValue (1.0 / 255.0)\n";
|
| - } else {
|
| - source += "#define InnerScaleValue 1.0\n";
|
| - source += "#define OuterScaleValue 1.0\n";
|
| - }
|
| - }
|
| - if (gl_version_info.is_es2 || target == GL_TEXTURE_EXTERNAL_OES) {
|
| switch (target) {
|
| case GL_TEXTURE_2D:
|
| + source += std::string("#define TextureLookup texture2D\n");
|
| + break;
|
| + case GL_TEXTURE_RECTANGLE_ARB:
|
| + source += std::string("#define TextureLookup texture2DRect\n");
|
| + break;
|
| case GL_TEXTURE_EXTERNAL_OES:
|
| - source += "#define TextureLookup texture2D\n";
|
| + source +=
|
| + std::string("#extension GL_OES_EGL_image_external : enable\n");
|
| +
|
| + if (nv_egl_stream_consumer_external) {
|
| + source += std::string(
|
| + "#extension GL_NV_EGL_stream_consumer_external : enable\n");
|
| + }
|
| +
|
| + source += std::string("#define TextureLookup texture2D\n");
|
| break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| }
|
| -
|
| - source +=
|
| - "#define VARYING varying\n"
|
| - "#define FRAGCOLOR gl_FragColor\n";
|
| - } else {
|
| - source +=
|
| - "#define VARYING in\n"
|
| - "out TextureType frag_color;\n"
|
| - "#define FRAGCOLOR frag_color\n"
|
| - "#define TextureLookup texture\n";
|
| + source += std::string("\
|
| + #define VARYING varying\n\
|
| + #define FRAGCOLOR gl_FragColor\n");
|
| }
|
|
|
| // Preamble for sampler type.
|
| switch (target) {
|
| case GL_TEXTURE_2D:
|
| - source += "#define SamplerType sampler2D\n";
|
| + source += std::string("#define SamplerType sampler2D\n");
|
| break;
|
| case GL_TEXTURE_RECTANGLE_ARB:
|
| - source += "#define SamplerType sampler2DRect\n";
|
| + source += std::string("#define SamplerType sampler2DRect\n");
|
| break;
|
| case GL_TEXTURE_EXTERNAL_OES:
|
| - source += "#define SamplerType samplerExternalOES\n";
|
| + source += std::string("#define SamplerType samplerExternalOES\n");
|
| break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| }
|
|
|
| + // Preamble for texture precision.
|
| + source += std::string(kShaderPrecisionPreamble);
|
| +
|
| // Main shader source.
|
| - source +=
|
| - "uniform mediump SamplerType u_sampler;\n"
|
| - "uniform mat4 u_tex_coord_transform;\n"
|
| - "VARYING TexCoordPrecision vec2 v_uv;\n"
|
| - "void main(void) {\n"
|
| - " TexCoordPrecision vec4 uv =\n"
|
| - " u_tex_coord_transform * vec4(v_uv, 0, 1);\n"
|
| - " vec4 color = TextureLookup(u_sampler, uv.st);\n"
|
| - " FRAGCOLOR = TextureType(color * InnerScaleValue) * OuterScaleValue;\n";
|
| + source += std::string("\
|
| + uniform SamplerType u_sampler;\n\
|
| + uniform mat4 u_tex_coord_transform;\n\
|
| + VARYING TexCoordPrecision vec2 v_uv;\n\
|
| + void main(void) {\n\
|
| + TexCoordPrecision vec4 uv = u_tex_coord_transform * vec4(v_uv, 0, 1);\n\
|
| + FRAGCOLOR = TextureLookup(u_sampler, uv.st);\n");
|
|
|
| // Post-processing to premultiply or un-premultiply alpha.
|
| - // Check dest format has alpha channel first.
|
| - if ((gpu::gles2::GLES2Util::GetChannelsForFormat(dest_format) & 0x0008) !=
|
| - 0) {
|
| - if (premultiply_alpha) {
|
| - source += " FRAGCOLOR.rgb *= FRAGCOLOR.a;\n";
|
| - source += " FRAGCOLOR.rgb /= MAX_COLOR;\n";
|
| - }
|
| - if (unpremultiply_alpha) {
|
| - source +=
|
| - " if (FRAGCOLOR.a > ZERO) {\n"
|
| - " FRAGCOLOR.rgb /= FRAGCOLOR.a;\n"
|
| - " FRAGCOLOR.rgb *= MAX_COLOR;\n"
|
| - " }\n";
|
| - }
|
| + if (premultiply_alpha) {
|
| + source += std::string(" FRAGCOLOR.rgb *= FRAGCOLOR.a;\n");
|
| + }
|
| + if (unpremultiply_alpha) {
|
| + source += std::string("\
|
| + if (FRAGCOLOR.a > 0.0)\n\
|
| + FRAGCOLOR.rgb /= FRAGCOLOR.a;\n");
|
| }
|
|
|
| // Main function end.
|
| - source += "}\n";
|
| + source += std::string(" }\n");
|
|
|
| return source;
|
| -}
|
| -
|
| -GLenum getIntermediateFormat(GLenum format) {
|
| - switch (format) {
|
| - case GL_LUMINANCE_ALPHA:
|
| - case GL_LUMINANCE:
|
| - case GL_ALPHA:
|
| - return GL_RGBA;
|
| - case GL_SRGB_EXT:
|
| - return GL_SRGB_ALPHA_EXT;
|
| - case GL_RGB16F:
|
| - return GL_RGBA16F;
|
| - case GL_RGB9_E5:
|
| - case GL_RGB32F:
|
| - return GL_RGBA32F;
|
| - case GL_SRGB8:
|
| - return GL_SRGB8_ALPHA8;
|
| - case GL_RGB8UI:
|
| - return GL_RGBA8UI;
|
| - default:
|
| - return format;
|
| - }
|
| }
|
|
|
| void CompileShader(GLuint shader, const char* shader_source) {
|
| glShaderSource(shader, 1, &shader_source, 0);
|
| glCompileShader(shader);
|
| -#if DCHECK_IS_ON()
|
| +#ifndef NDEBUG
|
| GLint compile_status;
|
| glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
|
| - if (GL_TRUE != compile_status) {
|
| - char buffer[1024];
|
| - GLsizei length = 0;
|
| - glGetShaderInfoLog(shader, sizeof(buffer), &length, buffer);
|
| - std::string log(buffer, length);
|
| - DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure: " << log;
|
| - }
|
| + if (GL_TRUE != compile_status)
|
| + DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure.";
|
| #endif
|
| }
|
|
|
| @@ -603,8 +327,8 @@
|
| CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager()
|
| : initialized_(false),
|
| nv_egl_stream_consumer_external_(false),
|
| - vertex_shaders_(kNumVertexShaders, 0u),
|
| - fragment_shaders_(kNumFragmentShaders, 0u),
|
| + vertex_shader_(0u),
|
| + fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u),
|
| vertex_array_object_id_(0u),
|
| buffer_id_(0u),
|
| framebuffer_(0u) {}
|
| @@ -669,8 +393,7 @@
|
| glDeleteFramebuffersEXT(1, &framebuffer_);
|
| framebuffer_ = 0;
|
|
|
| - std::for_each(
|
| - vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader);
|
| + DeleteShader(vertex_shader_);
|
| std::for_each(
|
| fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader);
|
|
|
| @@ -696,14 +419,21 @@
|
| GLsizei height,
|
| bool flip_y,
|
| bool premultiply_alpha,
|
| - bool unpremultiply_alpha,
|
| - CopyTextureMethod method) {
|
| + bool unpremultiply_alpha) {
|
| bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
|
| -
|
| + // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
|
| + // format does not contain a superset of the components required by the base
|
| + // format of internalformat.
|
| + // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
|
| + bool source_format_contain_superset_of_dest_format =
|
| + (source_internal_format == dest_internal_format &&
|
| + source_internal_format != GL_BGRA_EXT) ||
|
| + (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
|
| // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
|
| // so restrict this to GL_TEXTURE_2D.
|
| if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D &&
|
| - !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) {
|
| + !flip_y && !premultiply_alpha_change &&
|
| + source_format_contain_superset_of_dest_format) {
|
| DoCopyTexImage2D(decoder,
|
| source_target,
|
| source_id,
|
| @@ -716,35 +446,10 @@
|
| return;
|
| }
|
|
|
| - GLuint dest_texture = dest_id;
|
| - GLuint intermediate_texture = 0;
|
| - if (method == DRAW_AND_COPY) {
|
| - GLenum adjusted_internal_format =
|
| - getIntermediateFormat(dest_internal_format);
|
| - glGenTextures(1, &intermediate_texture);
|
| - glBindTexture(dest_target, intermediate_texture);
|
| - GLenum format = TextureManager::ExtractFormatFromStorageFormat(
|
| - adjusted_internal_format);
|
| - GLenum type =
|
| - TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format);
|
| -
|
| - glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0,
|
| - format, type, nullptr);
|
| - dest_texture = intermediate_texture;
|
| - dest_internal_format = adjusted_internal_format;
|
| - }
|
| // Use kIdentityMatrix if no transform passed in.
|
| - DoCopyTextureWithTransform(
|
| - decoder, source_target, source_id, source_internal_format, dest_target,
|
| - dest_texture, dest_internal_format, width, height, flip_y,
|
| - premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
|
| -
|
| - if (method == DRAW_AND_COPY) {
|
| - DoCopyTexImage2D(decoder, dest_target, intermediate_texture, dest_target,
|
| - dest_id, dest_internal_format, width, height,
|
| - framebuffer_);
|
| - glDeleteTextures(1, &intermediate_texture);
|
| - }
|
| + DoCopyTextureWithTransform(decoder, source_target, source_id, dest_target,
|
| + dest_id, width, height, flip_y, premultiply_alpha,
|
| + unpremultiply_alpha, kIdentityMatrix);
|
| }
|
|
|
| void CopyTextureCHROMIUMResourceManager::DoCopySubTexture(
|
| @@ -767,8 +472,7 @@
|
| GLsizei source_height,
|
| bool flip_y,
|
| bool premultiply_alpha,
|
| - bool unpremultiply_alpha,
|
| - CopyTextureMethod method) {
|
| + bool unpremultiply_alpha) {
|
| bool use_gl_copy_tex_sub_image_2d = true;
|
| #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY)
|
| // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver,
|
| @@ -778,53 +482,29 @@
|
| use_gl_copy_tex_sub_image_2d = false;
|
| #endif
|
| bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
|
| -
|
| + // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
|
| + // format does not contain a superset of the components required by the base
|
| + // format of internalformat.
|
| + // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
|
| + bool source_format_contain_superset_of_dest_format =
|
| + (source_internal_format == dest_internal_format &&
|
| + source_internal_format != GL_BGRA_EXT) ||
|
| + (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
|
| // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
|
| // so restrict this to GL_TEXTURE_2D.
|
| if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D &&
|
| dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
|
| - method == DIRECT_COPY) {
|
| + source_format_contain_superset_of_dest_format) {
|
| DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id,
|
| xoffset, yoffset, x, y, width, height, framebuffer_);
|
| return;
|
| }
|
|
|
| - GLint dest_xoffset = xoffset;
|
| - GLint dest_yoffset = yoffset;
|
| - GLuint dest_texture = dest_id;
|
| - GLuint intermediate_texture = 0;
|
| - if (method == DRAW_AND_COPY) {
|
| - GLenum adjusted_internal_format =
|
| - getIntermediateFormat(dest_internal_format);
|
| - glGenTextures(1, &intermediate_texture);
|
| - glBindTexture(dest_target, intermediate_texture);
|
| - GLenum format = TextureManager::ExtractFormatFromStorageFormat(
|
| - adjusted_internal_format);
|
| - GLenum type =
|
| - TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format);
|
| -
|
| - glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0,
|
| - format, type, nullptr);
|
| - dest_texture = intermediate_texture;
|
| - dest_internal_format = adjusted_internal_format;
|
| - dest_xoffset = 0;
|
| - dest_yoffset = 0;
|
| - dest_width = width;
|
| - dest_height = height;
|
| - }
|
| -
|
| DoCopySubTextureWithTransform(
|
| decoder, source_target, source_id, source_internal_format, dest_target,
|
| - dest_texture, dest_internal_format, dest_xoffset, dest_yoffset, x, y,
|
| - width, height, dest_width, dest_height, source_width, source_height,
|
| - flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
|
| -
|
| - if (method == DRAW_AND_COPY) {
|
| - DoCopyTexSubImage2D(decoder, dest_target, intermediate_texture, dest_target,
|
| - dest_id, xoffset, yoffset, 0, 0, width, height,
|
| - framebuffer_);
|
| - glDeleteTextures(1, &intermediate_texture);
|
| - }
|
| + dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height,
|
| + dest_width, dest_height, source_width, source_height, flip_y,
|
| + premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
|
| }
|
|
|
| void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform(
|
| @@ -849,21 +529,18 @@
|
| bool premultiply_alpha,
|
| bool unpremultiply_alpha,
|
| const GLfloat transform_matrix[16]) {
|
| - DoCopyTextureInternal(
|
| - decoder, source_target, source_id, source_internal_format, dest_target,
|
| - dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height,
|
| - dest_width, dest_height, source_width, source_height, flip_y,
|
| - premultiply_alpha, unpremultiply_alpha, transform_matrix);
|
| + DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id,
|
| + xoffset, yoffset, x, y, width, height, dest_width, dest_height,
|
| + source_width, source_height, flip_y, premultiply_alpha,
|
| + unpremultiply_alpha, transform_matrix);
|
| }
|
|
|
| void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform(
|
| const gles2::GLES2Decoder* decoder,
|
| GLenum source_target,
|
| GLuint source_id,
|
| - GLenum source_format,
|
| GLenum dest_target,
|
| GLuint dest_id,
|
| - GLenum dest_format,
|
| GLsizei width,
|
| GLsizei height,
|
| bool flip_y,
|
| @@ -872,20 +549,18 @@
|
| const GLfloat transform_matrix[16]) {
|
| GLsizei dest_width = width;
|
| GLsizei dest_height = height;
|
| - DoCopyTextureInternal(
|
| - decoder, source_target, source_id, source_format, dest_target, dest_id,
|
| - dest_format, 0, 0, 0, 0, width, height, dest_width, dest_height, width,
|
| - height, flip_y, premultiply_alpha, unpremultiply_alpha, transform_matrix);
|
| + DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id,
|
| + 0, 0, 0, 0, width, height, dest_width, dest_height,
|
| + width, height, flip_y, premultiply_alpha,
|
| + unpremultiply_alpha, transform_matrix);
|
| }
|
|
|
| void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal(
|
| const gles2::GLES2Decoder* decoder,
|
| GLenum source_target,
|
| GLuint source_id,
|
| - GLenum source_format,
|
| GLenum dest_target,
|
| GLuint dest_id,
|
| - GLenum dest_format,
|
| GLint xoffset,
|
| GLint yoffset,
|
| GLint x,
|
| @@ -932,11 +607,8 @@
|
| glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
|
| }
|
|
|
| - ShaderId vertex_shader_id = GetVertexShaderId(source_target);
|
| - DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size());
|
| - ShaderId fragment_shader_id = GetFragmentShaderId(
|
| - premultiply_alpha, unpremultiply_alpha, source_target,
|
| - source_format, dest_format);
|
| + FragmentShaderId fragment_shader_id = GetFragmentShaderId(
|
| + premultiply_alpha, unpremultiply_alpha, source_target);
|
| DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size());
|
|
|
| ProgramMapKey key(fragment_shader_id);
|
| @@ -944,21 +616,18 @@
|
| // Create program if necessary.
|
| if (!info->program) {
|
| info->program = glCreateProgram();
|
| - GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id];
|
| - if (!*vertex_shader) {
|
| - *vertex_shader = glCreateShader(GL_VERTEX_SHADER);
|
| - std::string source =
|
| - GetVertexShaderSource(gl_version_info, source_target);
|
| - CompileShader(*vertex_shader, source.c_str());
|
| + if (!vertex_shader_) {
|
| + vertex_shader_ = glCreateShader(GL_VERTEX_SHADER);
|
| + std::string source = GetVertexShaderSource(gl_version_info);
|
| + CompileShader(vertex_shader_, source.c_str());
|
| }
|
| - glAttachShader(info->program, *vertex_shader);
|
| + glAttachShader(info->program, vertex_shader_);
|
| GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id];
|
| if (!*fragment_shader) {
|
| *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
| std::string source = GetFragmentShaderSource(
|
| gl_version_info, premultiply_alpha, unpremultiply_alpha,
|
| - nv_egl_stream_consumer_external_, source_target, source_format,
|
| - dest_format);
|
| + nv_egl_stream_consumer_external_, source_target);
|
| CompileShader(*fragment_shader, source.c_str());
|
| }
|
| glAttachShader(info->program, *fragment_shader);
|
|
|