| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| 11 #include "gpu/command_buffer/service/gl_utils.h" | 11 #include "gpu/command_buffer/service/gl_utils.h" |
| 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
| 13 #include "gpu/command_buffer/service/texture_manager.h" | |
| 14 #include "ui/gl/gl_version_info.h" | 13 #include "ui/gl/gl_version_info.h" |
| 15 | 14 |
| 16 namespace { | 15 namespace { |
| 17 | 16 |
| 18 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | 17 const GLfloat kIdentityMatrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, |
| 19 0.0f, 1.0f, 0.0f, 0.0f, | 18 0.0f, 1.0f, 0.0f, 0.0f, |
| 20 0.0f, 0.0f, 1.0f, 0.0f, | 19 0.0f, 0.0f, 1.0f, 0.0f, |
| 21 0.0f, 0.0f, 0.0f, 1.0f}; | 20 0.0f, 0.0f, 0.0f, 1.0f}; |
| 22 | 21 |
| 23 enum { | 22 enum FragmentShaderId { |
| 24 SAMPLER_2D, | 23 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 25 SAMPLER_RECTANGLE_ARB, | 24 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 26 SAMPLER_EXTERNAL_OES, | 25 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 27 NUM_SAMPLERS | 26 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 27 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 28 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 29 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 30 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 31 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 32 NUM_FRAGMENT_SHADERS, |
| 28 }; | 33 }; |
| 29 | 34 |
| 30 enum { | |
| 31 S_FORMAT_ALPHA, | |
| 32 S_FORMAT_LUMINANCE, | |
| 33 S_FORMAT_LUMINANCE_ALPHA, | |
| 34 S_FORMAT_RED, | |
| 35 S_FORMAT_RGB, | |
| 36 S_FORMAT_RGBA, | |
| 37 S_FORMAT_RGB8, | |
| 38 S_FORMAT_RGBA8, | |
| 39 S_FORMAT_BGRA_EXT, | |
| 40 S_FORMAT_BGRA8_EXT, | |
| 41 S_FORMAT_RGB_YCBCR_420V_CHROMIUM, | |
| 42 S_FORMAT_RGB_YCBCR_422_CHROMIUM, | |
| 43 S_FORMAT_COMPRESSED, | |
| 44 NUM_S_FORMAT | |
| 45 }; | |
| 46 | |
| 47 enum { | |
| 48 D_FORMAT_RGB, | |
| 49 D_FORMAT_RGBA, | |
| 50 D_FORMAT_RGB8, | |
| 51 D_FORMAT_RGBA8, | |
| 52 D_FORMAT_BGRA_EXT, | |
| 53 D_FORMAT_BGRA8_EXT, | |
| 54 D_FORMAT_SRGB_EXT, | |
| 55 D_FORMAT_SRGB_ALPHA_EXT, | |
| 56 D_FORMAT_R8, | |
| 57 D_FORMAT_R8UI, | |
| 58 D_FORMAT_RG8, | |
| 59 D_FORMAT_RG8UI, | |
| 60 D_FORMAT_SRGB8, | |
| 61 D_FORMAT_RGB565, | |
| 62 D_FORMAT_RGB8UI, | |
| 63 D_FORMAT_SRGB8_ALPHA8, | |
| 64 D_FORMAT_RGB5_A1, | |
| 65 D_FORMAT_RGBA4, | |
| 66 D_FORMAT_RGBA8UI, | |
| 67 D_FORMAT_RGB9_E5, | |
| 68 D_FORMAT_R16F, | |
| 69 D_FORMAT_R32F, | |
| 70 D_FORMAT_RG16F, | |
| 71 D_FORMAT_RG32F, | |
| 72 D_FORMAT_RGB16F, | |
| 73 D_FORMAT_RGB32F, | |
| 74 D_FORMAT_RGBA16F, | |
| 75 D_FORMAT_RGBA32F, | |
| 76 D_FORMAT_R11F_G11F_B10F, | |
| 77 NUM_D_FORMAT | |
| 78 }; | |
| 79 | |
| 80 const unsigned kNumVertexShaders = NUM_SAMPLERS; | |
| 81 const unsigned kNumFragmentShaders = | |
| 82 4 * NUM_SAMPLERS * NUM_S_FORMAT * NUM_D_FORMAT; | |
| 83 | |
| 84 typedef unsigned ShaderId; | |
| 85 | |
| 86 ShaderId GetVertexShaderId(GLenum target) { | |
| 87 ShaderId id = 0; | |
| 88 switch (target) { | |
| 89 case GL_TEXTURE_2D: | |
| 90 id = SAMPLER_2D; | |
| 91 break; | |
| 92 case GL_TEXTURE_RECTANGLE_ARB: | |
| 93 id = SAMPLER_RECTANGLE_ARB; | |
| 94 break; | |
| 95 case GL_TEXTURE_EXTERNAL_OES: | |
| 96 id = SAMPLER_EXTERNAL_OES; | |
| 97 break; | |
| 98 default: | |
| 99 NOTREACHED(); | |
| 100 break; | |
| 101 } | |
| 102 return id; | |
| 103 } | |
| 104 | |
| 105 // Returns the correct fragment shader id to evaluate the copy operation for | 35 // Returns the correct fragment shader id to evaluate the copy operation for |
| 106 // the premultiply alpha pixel store settings and target. | 36 // the premultiply alpha pixel store settings and target. |
| 107 ShaderId GetFragmentShaderId(bool premultiply_alpha, | 37 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
| 108 bool unpremultiply_alpha, | 38 bool unpremultiply_alpha, |
| 109 GLenum target, | 39 GLenum target) { |
| 110 GLenum source_format, | 40 enum { |
| 111 GLenum dest_format) { | 41 SAMPLER_2D, |
| 112 unsigned alphaIndex = 0; | 42 SAMPLER_RECTANGLE_ARB, |
| 113 unsigned targetIndex = 0; | 43 SAMPLER_EXTERNAL_OES, |
| 114 unsigned sourceFormatIndex = 0; | 44 NUM_SAMPLERS |
| 115 unsigned destFormatIndex = 0; | 45 }; |
| 116 | 46 |
| 117 alphaIndex = (premultiply_alpha ? (1 << 0) : 0) | | 47 // bit 0: premultiply alpha |
| 118 (unpremultiply_alpha ? (1 << 1) : 0); | 48 // bit 1: unpremultiply alpha |
| 49 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { |
| 50 { |
| 51 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 52 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 53 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 54 }, |
| 55 { |
| 56 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 57 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 58 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 59 }, |
| 60 { |
| 61 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 62 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 63 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 64 }, |
| 65 { |
| 66 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 67 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 68 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 69 }}; |
| 70 |
| 71 unsigned index = (premultiply_alpha ? (1 << 0) : 0) | |
| 72 (unpremultiply_alpha ? (1 << 1) : 0); |
| 119 | 73 |
| 120 switch (target) { | 74 switch (target) { |
| 121 case GL_TEXTURE_2D: | 75 case GL_TEXTURE_2D: |
| 122 targetIndex = SAMPLER_2D; | 76 return shader_ids[index][SAMPLER_2D]; |
| 123 break; | |
| 124 case GL_TEXTURE_RECTANGLE_ARB: | 77 case GL_TEXTURE_RECTANGLE_ARB: |
| 125 targetIndex = SAMPLER_RECTANGLE_ARB; | 78 return shader_ids[index][SAMPLER_RECTANGLE_ARB]; |
| 126 break; | |
| 127 case GL_TEXTURE_EXTERNAL_OES: | 79 case GL_TEXTURE_EXTERNAL_OES: |
| 128 targetIndex = SAMPLER_EXTERNAL_OES; | 80 return shader_ids[index][SAMPLER_EXTERNAL_OES]; |
| 129 break; | |
| 130 default: | 81 default: |
| 131 NOTREACHED(); | |
| 132 break; | 82 break; |
| 133 } | 83 } |
| 134 | 84 |
| 135 switch (source_format) { | 85 NOTREACHED(); |
| 136 case GL_ALPHA: | 86 return shader_ids[0][SAMPLER_2D]; |
| 137 sourceFormatIndex = S_FORMAT_ALPHA; | |
| 138 break; | |
| 139 case GL_LUMINANCE: | |
| 140 sourceFormatIndex = S_FORMAT_LUMINANCE; | |
| 141 break; | |
| 142 case GL_LUMINANCE_ALPHA: | |
| 143 sourceFormatIndex = S_FORMAT_LUMINANCE_ALPHA; | |
| 144 break; | |
| 145 case GL_RED: | |
| 146 sourceFormatIndex = S_FORMAT_RED; | |
| 147 break; | |
| 148 case GL_RGB: | |
| 149 sourceFormatIndex = S_FORMAT_RGB; | |
| 150 break; | |
| 151 case GL_RGBA: | |
| 152 sourceFormatIndex = S_FORMAT_RGBA; | |
| 153 break; | |
| 154 case GL_RGB8: | |
| 155 sourceFormatIndex = S_FORMAT_RGB8; | |
| 156 break; | |
| 157 case GL_RGBA8: | |
| 158 sourceFormatIndex = S_FORMAT_RGBA8; | |
| 159 break; | |
| 160 case GL_BGRA_EXT: | |
| 161 sourceFormatIndex = S_FORMAT_BGRA_EXT; | |
| 162 break; | |
| 163 case GL_BGRA8_EXT: | |
| 164 sourceFormatIndex = S_FORMAT_BGRA8_EXT; | |
| 165 break; | |
| 166 case GL_RGB_YCBCR_420V_CHROMIUM: | |
| 167 sourceFormatIndex = S_FORMAT_RGB_YCBCR_420V_CHROMIUM; | |
| 168 break; | |
| 169 case GL_RGB_YCBCR_422_CHROMIUM: | |
| 170 sourceFormatIndex = S_FORMAT_RGB_YCBCR_422_CHROMIUM; | |
| 171 break; | |
| 172 case GL_ATC_RGB_AMD: | |
| 173 case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: | |
| 174 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: | |
| 175 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: | |
| 176 case GL_ETC1_RGB8_OES: | |
| 177 sourceFormatIndex = S_FORMAT_COMPRESSED; | |
| 178 break; | |
| 179 default: | |
| 180 NOTREACHED(); | |
| 181 break; | |
| 182 } | |
| 183 | |
| 184 switch (dest_format) { | |
| 185 case GL_RGB: | |
| 186 destFormatIndex = D_FORMAT_RGB; | |
| 187 break; | |
| 188 case GL_RGBA: | |
| 189 destFormatIndex = D_FORMAT_RGBA; | |
| 190 break; | |
| 191 case GL_RGB8: | |
| 192 destFormatIndex = D_FORMAT_RGB8; | |
| 193 break; | |
| 194 case GL_RGBA8: | |
| 195 destFormatIndex = D_FORMAT_RGBA8; | |
| 196 break; | |
| 197 case GL_BGRA_EXT: | |
| 198 destFormatIndex = D_FORMAT_BGRA_EXT; | |
| 199 break; | |
| 200 case GL_BGRA8_EXT: | |
| 201 destFormatIndex = D_FORMAT_BGRA8_EXT; | |
| 202 break; | |
| 203 case GL_SRGB_EXT: | |
| 204 destFormatIndex = D_FORMAT_SRGB_EXT; | |
| 205 break; | |
| 206 case GL_SRGB_ALPHA_EXT: | |
| 207 destFormatIndex = D_FORMAT_SRGB_ALPHA_EXT; | |
| 208 break; | |
| 209 case GL_R8: | |
| 210 destFormatIndex = D_FORMAT_R8; | |
| 211 break; | |
| 212 case GL_R8UI: | |
| 213 destFormatIndex = D_FORMAT_R8UI; | |
| 214 break; | |
| 215 case GL_RG8: | |
| 216 destFormatIndex = D_FORMAT_RG8; | |
| 217 break; | |
| 218 case GL_RG8UI: | |
| 219 destFormatIndex = D_FORMAT_RG8UI; | |
| 220 break; | |
| 221 case GL_SRGB8: | |
| 222 destFormatIndex = D_FORMAT_SRGB8; | |
| 223 break; | |
| 224 case GL_RGB565: | |
| 225 destFormatIndex = D_FORMAT_RGB565; | |
| 226 break; | |
| 227 case GL_RGB8UI: | |
| 228 destFormatIndex = D_FORMAT_RGB8UI; | |
| 229 break; | |
| 230 case GL_SRGB8_ALPHA8: | |
| 231 destFormatIndex = D_FORMAT_SRGB8_ALPHA8; | |
| 232 break; | |
| 233 case GL_RGB5_A1: | |
| 234 destFormatIndex = D_FORMAT_RGB5_A1; | |
| 235 break; | |
| 236 case GL_RGBA4: | |
| 237 destFormatIndex = D_FORMAT_RGBA4; | |
| 238 break; | |
| 239 case GL_RGBA8UI: | |
| 240 destFormatIndex = D_FORMAT_RGBA8UI; | |
| 241 break; | |
| 242 case GL_RGB9_E5: | |
| 243 destFormatIndex = D_FORMAT_RGB9_E5; | |
| 244 break; | |
| 245 case GL_R16F: | |
| 246 destFormatIndex = D_FORMAT_R16F; | |
| 247 break; | |
| 248 case GL_R32F: | |
| 249 destFormatIndex = D_FORMAT_R32F; | |
| 250 break; | |
| 251 case GL_RG16F: | |
| 252 destFormatIndex = D_FORMAT_RG16F; | |
| 253 break; | |
| 254 case GL_RG32F: | |
| 255 destFormatIndex = D_FORMAT_RG32F; | |
| 256 break; | |
| 257 case GL_RGB16F: | |
| 258 destFormatIndex = D_FORMAT_RGB16F; | |
| 259 break; | |
| 260 case GL_RGB32F: | |
| 261 destFormatIndex = D_FORMAT_RGB32F; | |
| 262 break; | |
| 263 case GL_RGBA16F: | |
| 264 destFormatIndex = D_FORMAT_RGBA16F; | |
| 265 break; | |
| 266 case GL_RGBA32F: | |
| 267 destFormatIndex = D_FORMAT_RGBA32F; | |
| 268 break; | |
| 269 case GL_R11F_G11F_B10F: | |
| 270 destFormatIndex = D_FORMAT_R11F_G11F_B10F; | |
| 271 break; | |
| 272 default: | |
| 273 NOTREACHED(); | |
| 274 break; | |
| 275 } | |
| 276 | |
| 277 return alphaIndex + targetIndex * 4 + sourceFormatIndex * 4 * NUM_SAMPLERS + | |
| 278 destFormatIndex * 4 * NUM_SAMPLERS * NUM_S_FORMAT; | |
| 279 } | 87 } |
| 280 | 88 |
| 281 const char* kShaderPrecisionPreamble = | 89 const char* kShaderPrecisionPreamble = "\ |
| 282 "#ifdef GL_ES\n" | 90 #ifdef GL_ES\n\ |
| 283 "precision mediump float;\n" | 91 precision mediump float;\n\ |
| 284 "#define TexCoordPrecision mediump\n" | 92 #define TexCoordPrecision mediump\n\ |
| 285 "#else\n" | 93 #else\n\ |
| 286 "#define TexCoordPrecision\n" | 94 #define TexCoordPrecision\n\ |
| 287 "#endif\n"; | 95 #endif\n"; |
| 288 | 96 |
| 289 std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info, | 97 std::string GetVertexShaderSource(const gl::GLVersionInfo& gl_version_info) { |
| 290 GLenum target) { | |
| 291 std::string source; | 98 std::string source; |
| 292 | 99 |
| 293 if (gl_version_info.is_es) { | 100 // Preamble for core and compatibility mode. |
| 294 if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) { | 101 if (gl_version_info.is_desktop_core_profile) { |
| 295 source += "#version 300 es\n"; | 102 source += std::string("\ |
| 296 source += | 103 #version 150\n\ |
| 297 "#define ATTRIBUTE in\n" | 104 #define ATTRIBUTE in\n\ |
| 298 "#define VARYING out\n"; | 105 #define VARYING out\n"); |
| 299 } else { | |
| 300 source += | |
| 301 "#define ATTRIBUTE attribute\n" | |
| 302 "#define VARYING varying\n"; | |
| 303 } | |
| 304 } else { | 106 } else { |
| 305 source += "#version 150\n"; | 107 source += std::string("\ |
| 306 source += | 108 #define ATTRIBUTE attribute\n\ |
| 307 "#define ATTRIBUTE in\n" | 109 #define VARYING varying\n"); |
| 308 "#define VARYING out\n"; | |
| 309 } | 110 } |
| 310 | 111 |
| 311 // Preamble for texture precision. | 112 // Preamble for texture precision. |
| 312 source += kShaderPrecisionPreamble; | 113 source += std::string(kShaderPrecisionPreamble); |
| 313 | 114 |
| 314 // Main shader source. | 115 // Main shader source. |
| 315 source += | 116 source += std::string("\ |
| 316 "uniform vec2 u_vertex_dest_mult;\n" | 117 uniform vec2 u_vertex_dest_mult;\n\ |
| 317 "uniform vec2 u_vertex_dest_add;\n" | 118 uniform vec2 u_vertex_dest_add;\n\ |
| 318 "uniform vec2 u_vertex_source_mult;\n" | 119 uniform vec2 u_vertex_source_mult;\n\ |
| 319 "uniform vec2 u_vertex_source_add;\n" | 120 uniform vec2 u_vertex_source_add;\n\ |
| 320 "ATTRIBUTE vec2 a_position;\n" | 121 ATTRIBUTE vec2 a_position;\n\ |
| 321 "VARYING TexCoordPrecision vec2 v_uv;\n" | 122 VARYING TexCoordPrecision vec2 v_uv;\n\ |
| 322 "void main(void) {\n" | 123 void main(void) {\n\ |
| 323 " gl_Position = vec4(0, 0, 0, 1);\n" | 124 gl_Position = vec4(0, 0, 0, 1);\n\ |
| 324 " gl_Position.xy =\n" | 125 gl_Position.xy = a_position.xy * u_vertex_dest_mult + \ |
| 325 " a_position.xy * u_vertex_dest_mult + u_vertex_dest_add;\n" | 126 u_vertex_dest_add;\n\ |
| 326 " v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n" | 127 v_uv = a_position.xy * u_vertex_source_mult + u_vertex_source_add;\n\ |
| 327 "}\n"; | 128 }\n"); |
| 328 | 129 |
| 329 return source; | 130 return source; |
| 330 } | 131 } |
| 331 | 132 |
| 332 std::string GetFragmentShaderSource(const gl::GLVersionInfo& gl_version_info, | 133 std::string GetFragmentShaderSource(const gl::GLVersionInfo& gl_version_info, |
| 333 bool premultiply_alpha, | 134 bool premultiply_alpha, |
| 334 bool unpremultiply_alpha, | 135 bool unpremultiply_alpha, |
| 335 bool nv_egl_stream_consumer_external, | 136 bool nv_egl_stream_consumer_external, |
| 336 GLenum target, | 137 GLenum target) { |
| 337 GLenum source_format, | |
| 338 GLenum dest_format) { | |
| 339 std::string source; | 138 std::string source; |
| 340 | 139 |
| 341 // Preamble for core and compatibility mode. | 140 // Preamble for core and compatibility mode. |
| 342 if (gl_version_info.is_es) { | 141 if (gl_version_info.is_desktop_core_profile) { |
| 343 if (gl_version_info.is_es3 && target != GL_TEXTURE_EXTERNAL_OES) { | 142 source += std::string("\ |
| 344 source += "#version 300 es\n"; | 143 #version 150\n\ |
| 345 } | 144 out vec4 frag_color;\n\ |
| 346 if (target == GL_TEXTURE_EXTERNAL_OES) { | 145 #define VARYING in\n\ |
| 347 source += "#extension GL_OES_EGL_image_external : enable\n"; | 146 #define FRAGCOLOR frag_color\n\ |
| 348 | 147 #define TextureLookup texture\n"); |
| 349 if (nv_egl_stream_consumer_external) { | |
| 350 source += "#extension GL_NV_EGL_stream_consumer_external : enable\n"; | |
| 351 } | |
| 352 } | |
| 353 } else { | 148 } else { |
| 354 source += "#version 150\n"; | |
| 355 } | |
| 356 | |
| 357 // Preamble for texture precision. | |
| 358 source += kShaderPrecisionPreamble; | |
| 359 | |
| 360 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(dest_format)) { | |
| 361 source += "#define TextureType ivec4\n"; | |
| 362 source += "#define ZERO 0\n"; | |
| 363 source += "#define MAX_COLOR 255\n"; | |
| 364 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format)) | |
| 365 source += "#define InnerScaleValue 1\n"; | |
| 366 else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format)) | |
| 367 source += "#define InnerScaleValue 1u\n"; | |
| 368 else | |
| 369 source += "#define InnerScaleValue 255.0\n"; | |
| 370 source += "#define OuterScaleValue 1\n"; | |
| 371 } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(dest_format)) { | |
| 372 source += "#define TextureType uvec4\n"; | |
| 373 source += "#define ZERO 0u\n"; | |
| 374 source += "#define MAX_COLOR 255u\n"; | |
| 375 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format)) | |
| 376 source += "#define InnerScaleValue 1\n"; | |
| 377 else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format)) | |
| 378 source += "#define InnerScaleValue 1u\n"; | |
| 379 else | |
| 380 source += "#define InnerScaleValue 255.0\n"; | |
| 381 source += "#define OuterScaleValue 1u\n"; | |
| 382 } else { | |
| 383 source += "#define TextureType vec4\n"; | |
| 384 source += "#define ZERO 0.0\n"; | |
| 385 source += "#define MAX_COLOR 1.0\n"; | |
| 386 if (gpu::gles2::GLES2Util::IsSignedIntegerFormat(source_format)) { | |
| 387 source += "#define InnerScaleValue 1\n"; | |
| 388 source += "#define OuterScaleValue (1.0 / 255.0)\n"; | |
| 389 } else if (gpu::gles2::GLES2Util::IsUnsignedIntegerFormat(source_format)) { | |
| 390 source += "#define InnerScaleValue 1u\n"; | |
| 391 source += "#define OuterScaleValue (1.0 / 255.0)\n"; | |
| 392 } else { | |
| 393 source += "#define InnerScaleValue 1.0\n"; | |
| 394 source += "#define OuterScaleValue 1.0\n"; | |
| 395 } | |
| 396 } | |
| 397 if (gl_version_info.is_es2 || target == GL_TEXTURE_EXTERNAL_OES) { | |
| 398 switch (target) { | 149 switch (target) { |
| 399 case GL_TEXTURE_2D: | 150 case GL_TEXTURE_2D: |
| 151 source += std::string("#define TextureLookup texture2D\n"); |
| 152 break; |
| 153 case GL_TEXTURE_RECTANGLE_ARB: |
| 154 source += std::string("#define TextureLookup texture2DRect\n"); |
| 155 break; |
| 400 case GL_TEXTURE_EXTERNAL_OES: | 156 case GL_TEXTURE_EXTERNAL_OES: |
| 401 source += "#define TextureLookup texture2D\n"; | 157 source += |
| 158 std::string("#extension GL_OES_EGL_image_external : enable\n"); |
| 159 |
| 160 if (nv_egl_stream_consumer_external) { |
| 161 source += std::string( |
| 162 "#extension GL_NV_EGL_stream_consumer_external : enable\n"); |
| 163 } |
| 164 |
| 165 source += std::string("#define TextureLookup texture2D\n"); |
| 402 break; | 166 break; |
| 403 default: | 167 default: |
| 404 NOTREACHED(); | 168 NOTREACHED(); |
| 405 break; | 169 break; |
| 406 } | 170 } |
| 407 | 171 source += std::string("\ |
| 408 source += | 172 #define VARYING varying\n\ |
| 409 "#define VARYING varying\n" | 173 #define FRAGCOLOR gl_FragColor\n"); |
| 410 "#define FRAGCOLOR gl_FragColor\n"; | |
| 411 } else { | |
| 412 source += | |
| 413 "#define VARYING in\n" | |
| 414 "out TextureType frag_color;\n" | |
| 415 "#define FRAGCOLOR frag_color\n" | |
| 416 "#define TextureLookup texture\n"; | |
| 417 } | 174 } |
| 418 | 175 |
| 419 // Preamble for sampler type. | 176 // Preamble for sampler type. |
| 420 switch (target) { | 177 switch (target) { |
| 421 case GL_TEXTURE_2D: | 178 case GL_TEXTURE_2D: |
| 422 source += "#define SamplerType sampler2D\n"; | 179 source += std::string("#define SamplerType sampler2D\n"); |
| 423 break; | 180 break; |
| 424 case GL_TEXTURE_RECTANGLE_ARB: | 181 case GL_TEXTURE_RECTANGLE_ARB: |
| 425 source += "#define SamplerType sampler2DRect\n"; | 182 source += std::string("#define SamplerType sampler2DRect\n"); |
| 426 break; | 183 break; |
| 427 case GL_TEXTURE_EXTERNAL_OES: | 184 case GL_TEXTURE_EXTERNAL_OES: |
| 428 source += "#define SamplerType samplerExternalOES\n"; | 185 source += std::string("#define SamplerType samplerExternalOES\n"); |
| 429 break; | 186 break; |
| 430 default: | 187 default: |
| 431 NOTREACHED(); | 188 NOTREACHED(); |
| 432 break; | 189 break; |
| 433 } | 190 } |
| 434 | 191 |
| 192 // Preamble for texture precision. |
| 193 source += std::string(kShaderPrecisionPreamble); |
| 194 |
| 435 // Main shader source. | 195 // Main shader source. |
| 436 source += | 196 source += std::string("\ |
| 437 "uniform mediump SamplerType u_sampler;\n" | 197 uniform SamplerType u_sampler;\n\ |
| 438 "uniform mat4 u_tex_coord_transform;\n" | 198 uniform mat4 u_tex_coord_transform;\n\ |
| 439 "VARYING TexCoordPrecision vec2 v_uv;\n" | 199 VARYING TexCoordPrecision vec2 v_uv;\n\ |
| 440 "void main(void) {\n" | 200 void main(void) {\n\ |
| 441 " TexCoordPrecision vec4 uv =\n" | 201 TexCoordPrecision vec4 uv = u_tex_coord_transform * vec4(v_uv, 0, 1);\n\ |
| 442 " u_tex_coord_transform * vec4(v_uv, 0, 1);\n" | 202 FRAGCOLOR = TextureLookup(u_sampler, uv.st);\n"); |
| 443 " vec4 color = TextureLookup(u_sampler, uv.st);\n" | |
| 444 " FRAGCOLOR = TextureType(color * InnerScaleValue) * OuterScaleValue;\n"; | |
| 445 | 203 |
| 446 // Post-processing to premultiply or un-premultiply alpha. | 204 // Post-processing to premultiply or un-premultiply alpha. |
| 447 // Check dest format has alpha channel first. | 205 if (premultiply_alpha) { |
| 448 if ((gpu::gles2::GLES2Util::GetChannelsForFormat(dest_format) & 0x0008) != | 206 source += std::string(" FRAGCOLOR.rgb *= FRAGCOLOR.a;\n"); |
| 449 0) { | 207 } |
| 450 if (premultiply_alpha) { | 208 if (unpremultiply_alpha) { |
| 451 source += " FRAGCOLOR.rgb *= FRAGCOLOR.a;\n"; | 209 source += std::string("\ |
| 452 source += " FRAGCOLOR.rgb /= MAX_COLOR;\n"; | 210 if (FRAGCOLOR.a > 0.0)\n\ |
| 453 } | 211 FRAGCOLOR.rgb /= FRAGCOLOR.a;\n"); |
| 454 if (unpremultiply_alpha) { | |
| 455 source += | |
| 456 " if (FRAGCOLOR.a > ZERO) {\n" | |
| 457 " FRAGCOLOR.rgb /= FRAGCOLOR.a;\n" | |
| 458 " FRAGCOLOR.rgb *= MAX_COLOR;\n" | |
| 459 " }\n"; | |
| 460 } | |
| 461 } | 212 } |
| 462 | 213 |
| 463 // Main function end. | 214 // Main function end. |
| 464 source += "}\n"; | 215 source += std::string(" }\n"); |
| 465 | 216 |
| 466 return source; | 217 return source; |
| 467 } | 218 } |
| 468 | 219 |
| 469 GLenum getIntermediateFormat(GLenum format) { | |
| 470 switch (format) { | |
| 471 case GL_LUMINANCE_ALPHA: | |
| 472 case GL_LUMINANCE: | |
| 473 case GL_ALPHA: | |
| 474 return GL_RGBA; | |
| 475 case GL_SRGB_EXT: | |
| 476 return GL_SRGB_ALPHA_EXT; | |
| 477 case GL_RGB16F: | |
| 478 return GL_RGBA16F; | |
| 479 case GL_RGB9_E5: | |
| 480 case GL_RGB32F: | |
| 481 return GL_RGBA32F; | |
| 482 case GL_SRGB8: | |
| 483 return GL_SRGB8_ALPHA8; | |
| 484 case GL_RGB8UI: | |
| 485 return GL_RGBA8UI; | |
| 486 default: | |
| 487 return format; | |
| 488 } | |
| 489 } | |
| 490 | |
| 491 void CompileShader(GLuint shader, const char* shader_source) { | 220 void CompileShader(GLuint shader, const char* shader_source) { |
| 492 glShaderSource(shader, 1, &shader_source, 0); | 221 glShaderSource(shader, 1, &shader_source, 0); |
| 493 glCompileShader(shader); | 222 glCompileShader(shader); |
| 494 #if DCHECK_IS_ON() | 223 #ifndef NDEBUG |
| 495 GLint compile_status; | 224 GLint compile_status; |
| 496 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); | 225 glGetShaderiv(shader, GL_COMPILE_STATUS, &compile_status); |
| 497 if (GL_TRUE != compile_status) { | 226 if (GL_TRUE != compile_status) |
| 498 char buffer[1024]; | 227 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure."; |
| 499 GLsizei length = 0; | |
| 500 glGetShaderInfoLog(shader, sizeof(buffer), &length, buffer); | |
| 501 std::string log(buffer, length); | |
| 502 DLOG(ERROR) << "CopyTextureCHROMIUM: shader compilation failure: " << log; | |
| 503 } | |
| 504 #endif | 228 #endif |
| 505 } | 229 } |
| 506 | 230 |
| 507 void DeleteShader(GLuint shader) { | 231 void DeleteShader(GLuint shader) { |
| 508 if (shader) | 232 if (shader) |
| 509 glDeleteShader(shader); | 233 glDeleteShader(shader); |
| 510 } | 234 } |
| 511 | 235 |
| 512 bool BindFramebufferTexture2D(GLenum target, | 236 bool BindFramebufferTexture2D(GLenum target, |
| 513 GLuint texture_id, | 237 GLuint texture_id, |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 596 } | 320 } |
| 597 | 321 |
| 598 } // namespace | 322 } // namespace |
| 599 | 323 |
| 600 namespace gpu { | 324 namespace gpu { |
| 601 namespace gles2 { | 325 namespace gles2 { |
| 602 | 326 |
| 603 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() | 327 CopyTextureCHROMIUMResourceManager::CopyTextureCHROMIUMResourceManager() |
| 604 : initialized_(false), | 328 : initialized_(false), |
| 605 nv_egl_stream_consumer_external_(false), | 329 nv_egl_stream_consumer_external_(false), |
| 606 vertex_shaders_(kNumVertexShaders, 0u), | 330 vertex_shader_(0u), |
| 607 fragment_shaders_(kNumFragmentShaders, 0u), | 331 fragment_shaders_(NUM_FRAGMENT_SHADERS, 0u), |
| 608 vertex_array_object_id_(0u), | 332 vertex_array_object_id_(0u), |
| 609 buffer_id_(0u), | 333 buffer_id_(0u), |
| 610 framebuffer_(0u) {} | 334 framebuffer_(0u) {} |
| 611 | 335 |
| 612 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() { | 336 CopyTextureCHROMIUMResourceManager::~CopyTextureCHROMIUMResourceManager() { |
| 613 // |buffer_id_| and |framebuffer_| can be not-null because when GPU context is | 337 // |buffer_id_| and |framebuffer_| can be not-null because when GPU context is |
| 614 // lost, this class can be deleted without releasing resources like | 338 // lost, this class can be deleted without releasing resources like |
| 615 // GLES2DecoderImpl. | 339 // GLES2DecoderImpl. |
| 616 } | 340 } |
| 617 | 341 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 662 return; | 386 return; |
| 663 | 387 |
| 664 if (vertex_array_object_id_) { | 388 if (vertex_array_object_id_) { |
| 665 glDeleteVertexArraysOES(1, &vertex_array_object_id_); | 389 glDeleteVertexArraysOES(1, &vertex_array_object_id_); |
| 666 vertex_array_object_id_ = 0; | 390 vertex_array_object_id_ = 0; |
| 667 } | 391 } |
| 668 | 392 |
| 669 glDeleteFramebuffersEXT(1, &framebuffer_); | 393 glDeleteFramebuffersEXT(1, &framebuffer_); |
| 670 framebuffer_ = 0; | 394 framebuffer_ = 0; |
| 671 | 395 |
| 672 std::for_each( | 396 DeleteShader(vertex_shader_); |
| 673 vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader); | |
| 674 std::for_each( | 397 std::for_each( |
| 675 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); | 398 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); |
| 676 | 399 |
| 677 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); | 400 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); |
| 678 ++it) { | 401 ++it) { |
| 679 const ProgramInfo& info = it->second; | 402 const ProgramInfo& info = it->second; |
| 680 glDeleteProgram(info.program); | 403 glDeleteProgram(info.program); |
| 681 } | 404 } |
| 682 | 405 |
| 683 glDeleteBuffersARB(1, &buffer_id_); | 406 glDeleteBuffersARB(1, &buffer_id_); |
| 684 buffer_id_ = 0; | 407 buffer_id_ = 0; |
| 685 } | 408 } |
| 686 | 409 |
| 687 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( | 410 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( |
| 688 const gles2::GLES2Decoder* decoder, | 411 const gles2::GLES2Decoder* decoder, |
| 689 GLenum source_target, | 412 GLenum source_target, |
| 690 GLuint source_id, | 413 GLuint source_id, |
| 691 GLenum source_internal_format, | 414 GLenum source_internal_format, |
| 692 GLenum dest_target, | 415 GLenum dest_target, |
| 693 GLuint dest_id, | 416 GLuint dest_id, |
| 694 GLenum dest_internal_format, | 417 GLenum dest_internal_format, |
| 695 GLsizei width, | 418 GLsizei width, |
| 696 GLsizei height, | 419 GLsizei height, |
| 697 bool flip_y, | 420 bool flip_y, |
| 698 bool premultiply_alpha, | 421 bool premultiply_alpha, |
| 699 bool unpremultiply_alpha, | 422 bool unpremultiply_alpha) { |
| 700 CopyTextureMethod method) { | |
| 701 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 423 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 702 | 424 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
| 425 // format does not contain a superset of the components required by the base |
| 426 // format of internalformat. |
| 427 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
| 428 bool source_format_contain_superset_of_dest_format = |
| 429 (source_internal_format == dest_internal_format && |
| 430 source_internal_format != GL_BGRA_EXT) || |
| 431 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); |
| 703 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 432 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
| 704 // so restrict this to GL_TEXTURE_2D. | 433 // so restrict this to GL_TEXTURE_2D. |
| 705 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && | 434 if (source_target == GL_TEXTURE_2D && dest_target == GL_TEXTURE_2D && |
| 706 !flip_y && !premultiply_alpha_change && method == DIRECT_COPY) { | 435 !flip_y && !premultiply_alpha_change && |
| 436 source_format_contain_superset_of_dest_format) { |
| 707 DoCopyTexImage2D(decoder, | 437 DoCopyTexImage2D(decoder, |
| 708 source_target, | 438 source_target, |
| 709 source_id, | 439 source_id, |
| 710 dest_target, | 440 dest_target, |
| 711 dest_id, | 441 dest_id, |
| 712 dest_internal_format, | 442 dest_internal_format, |
| 713 width, | 443 width, |
| 714 height, | 444 height, |
| 715 framebuffer_); | 445 framebuffer_); |
| 716 return; | 446 return; |
| 717 } | 447 } |
| 718 | 448 |
| 719 GLuint dest_texture = dest_id; | |
| 720 GLuint intermediate_texture = 0; | |
| 721 if (method == DRAW_AND_COPY) { | |
| 722 GLenum adjusted_internal_format = | |
| 723 getIntermediateFormat(dest_internal_format); | |
| 724 glGenTextures(1, &intermediate_texture); | |
| 725 glBindTexture(dest_target, intermediate_texture); | |
| 726 GLenum format = TextureManager::ExtractFormatFromStorageFormat( | |
| 727 adjusted_internal_format); | |
| 728 GLenum type = | |
| 729 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); | |
| 730 | |
| 731 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, | |
| 732 format, type, nullptr); | |
| 733 dest_texture = intermediate_texture; | |
| 734 dest_internal_format = adjusted_internal_format; | |
| 735 } | |
| 736 // Use kIdentityMatrix if no transform passed in. | 449 // Use kIdentityMatrix if no transform passed in. |
| 737 DoCopyTextureWithTransform( | 450 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_target, |
| 738 decoder, source_target, source_id, source_internal_format, dest_target, | 451 dest_id, width, height, flip_y, premultiply_alpha, |
| 739 dest_texture, dest_internal_format, width, height, flip_y, | 452 unpremultiply_alpha, kIdentityMatrix); |
| 740 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); | |
| 741 | |
| 742 if (method == DRAW_AND_COPY) { | |
| 743 DoCopyTexImage2D(decoder, dest_target, intermediate_texture, dest_target, | |
| 744 dest_id, dest_internal_format, width, height, | |
| 745 framebuffer_); | |
| 746 glDeleteTextures(1, &intermediate_texture); | |
| 747 } | |
| 748 } | 453 } |
| 749 | 454 |
| 750 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( | 455 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( |
| 751 const gles2::GLES2Decoder* decoder, | 456 const gles2::GLES2Decoder* decoder, |
| 752 GLenum source_target, | 457 GLenum source_target, |
| 753 GLuint source_id, | 458 GLuint source_id, |
| 754 GLenum source_internal_format, | 459 GLenum source_internal_format, |
| 755 GLenum dest_target, | 460 GLenum dest_target, |
| 756 GLuint dest_id, | 461 GLuint dest_id, |
| 757 GLenum dest_internal_format, | 462 GLenum dest_internal_format, |
| 758 GLint xoffset, | 463 GLint xoffset, |
| 759 GLint yoffset, | 464 GLint yoffset, |
| 760 GLint x, | 465 GLint x, |
| 761 GLint y, | 466 GLint y, |
| 762 GLsizei width, | 467 GLsizei width, |
| 763 GLsizei height, | 468 GLsizei height, |
| 764 GLsizei dest_width, | 469 GLsizei dest_width, |
| 765 GLsizei dest_height, | 470 GLsizei dest_height, |
| 766 GLsizei source_width, | 471 GLsizei source_width, |
| 767 GLsizei source_height, | 472 GLsizei source_height, |
| 768 bool flip_y, | 473 bool flip_y, |
| 769 bool premultiply_alpha, | 474 bool premultiply_alpha, |
| 770 bool unpremultiply_alpha, | 475 bool unpremultiply_alpha) { |
| 771 CopyTextureMethod method) { | |
| 772 bool use_gl_copy_tex_sub_image_2d = true; | 476 bool use_gl_copy_tex_sub_image_2d = true; |
| 773 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) | 477 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
| 774 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, | 478 // glDrawArrays is faster than glCopyTexSubImage2D on IA Mesa driver, |
| 775 // although opposite in Android. | 479 // although opposite in Android. |
| 776 // TODO(dshwang): After Mesa fixes this issue, remove this hack. | 480 // TODO(dshwang): After Mesa fixes this issue, remove this hack. |
| 777 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198 | 481 // https://bugs.freedesktop.org/show_bug.cgi?id=98478 crbug.com/535198 |
| 778 use_gl_copy_tex_sub_image_2d = false; | 482 use_gl_copy_tex_sub_image_2d = false; |
| 779 #endif | 483 #endif |
| 780 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 484 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
| 781 | 485 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
| 486 // format does not contain a superset of the components required by the base |
| 487 // format of internalformat. |
| 488 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
| 489 bool source_format_contain_superset_of_dest_format = |
| 490 (source_internal_format == dest_internal_format && |
| 491 source_internal_format != GL_BGRA_EXT) || |
| 492 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); |
| 782 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 493 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
| 783 // so restrict this to GL_TEXTURE_2D. | 494 // so restrict this to GL_TEXTURE_2D. |
| 784 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && | 495 if (use_gl_copy_tex_sub_image_2d && source_target == GL_TEXTURE_2D && |
| 785 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 496 dest_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && |
| 786 method == DIRECT_COPY) { | 497 source_format_contain_superset_of_dest_format) { |
| 787 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id, | 498 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id, |
| 788 xoffset, yoffset, x, y, width, height, framebuffer_); | 499 xoffset, yoffset, x, y, width, height, framebuffer_); |
| 789 return; | 500 return; |
| 790 } | 501 } |
| 791 | 502 |
| 792 GLint dest_xoffset = xoffset; | |
| 793 GLint dest_yoffset = yoffset; | |
| 794 GLuint dest_texture = dest_id; | |
| 795 GLuint intermediate_texture = 0; | |
| 796 if (method == DRAW_AND_COPY) { | |
| 797 GLenum adjusted_internal_format = | |
| 798 getIntermediateFormat(dest_internal_format); | |
| 799 glGenTextures(1, &intermediate_texture); | |
| 800 glBindTexture(dest_target, intermediate_texture); | |
| 801 GLenum format = TextureManager::ExtractFormatFromStorageFormat( | |
| 802 adjusted_internal_format); | |
| 803 GLenum type = | |
| 804 TextureManager::ExtractTypeFromStorageFormat(adjusted_internal_format); | |
| 805 | |
| 806 glTexImage2D(dest_target, 0, adjusted_internal_format, width, height, 0, | |
| 807 format, type, nullptr); | |
| 808 dest_texture = intermediate_texture; | |
| 809 dest_internal_format = adjusted_internal_format; | |
| 810 dest_xoffset = 0; | |
| 811 dest_yoffset = 0; | |
| 812 dest_width = width; | |
| 813 dest_height = height; | |
| 814 } | |
| 815 | |
| 816 DoCopySubTextureWithTransform( | 503 DoCopySubTextureWithTransform( |
| 817 decoder, source_target, source_id, source_internal_format, dest_target, | 504 decoder, source_target, source_id, source_internal_format, dest_target, |
| 818 dest_texture, dest_internal_format, dest_xoffset, dest_yoffset, x, y, | 505 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height, |
| 819 width, height, dest_width, dest_height, source_width, source_height, | 506 dest_width, dest_height, source_width, source_height, flip_y, |
| 820 flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); | 507 premultiply_alpha, unpremultiply_alpha, kIdentityMatrix); |
| 821 | |
| 822 if (method == DRAW_AND_COPY) { | |
| 823 DoCopyTexSubImage2D(decoder, dest_target, intermediate_texture, dest_target, | |
| 824 dest_id, xoffset, yoffset, 0, 0, width, height, | |
| 825 framebuffer_); | |
| 826 glDeleteTextures(1, &intermediate_texture); | |
| 827 } | |
| 828 } | 508 } |
| 829 | 509 |
| 830 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( | 510 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( |
| 831 const gles2::GLES2Decoder* decoder, | 511 const gles2::GLES2Decoder* decoder, |
| 832 GLenum source_target, | 512 GLenum source_target, |
| 833 GLuint source_id, | 513 GLuint source_id, |
| 834 GLenum source_internal_format, | 514 GLenum source_internal_format, |
| 835 GLenum dest_target, | 515 GLenum dest_target, |
| 836 GLuint dest_id, | 516 GLuint dest_id, |
| 837 GLenum dest_internal_format, | 517 GLenum dest_internal_format, |
| 838 GLint xoffset, | 518 GLint xoffset, |
| 839 GLint yoffset, | 519 GLint yoffset, |
| 840 GLint x, | 520 GLint x, |
| 841 GLint y, | 521 GLint y, |
| 842 GLsizei width, | 522 GLsizei width, |
| 843 GLsizei height, | 523 GLsizei height, |
| 844 GLsizei dest_width, | 524 GLsizei dest_width, |
| 845 GLsizei dest_height, | 525 GLsizei dest_height, |
| 846 GLsizei source_width, | 526 GLsizei source_width, |
| 847 GLsizei source_height, | 527 GLsizei source_height, |
| 848 bool flip_y, | 528 bool flip_y, |
| 849 bool premultiply_alpha, | 529 bool premultiply_alpha, |
| 850 bool unpremultiply_alpha, | 530 bool unpremultiply_alpha, |
| 851 const GLfloat transform_matrix[16]) { | 531 const GLfloat transform_matrix[16]) { |
| 852 DoCopyTextureInternal( | 532 DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id, |
| 853 decoder, source_target, source_id, source_internal_format, dest_target, | 533 xoffset, yoffset, x, y, width, height, dest_width, dest_height, |
| 854 dest_id, dest_internal_format, xoffset, yoffset, x, y, width, height, | 534 source_width, source_height, flip_y, premultiply_alpha, |
| 855 dest_width, dest_height, source_width, source_height, flip_y, | 535 unpremultiply_alpha, transform_matrix); |
| 856 premultiply_alpha, unpremultiply_alpha, transform_matrix); | |
| 857 } | 536 } |
| 858 | 537 |
| 859 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( | 538 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
| 860 const gles2::GLES2Decoder* decoder, | 539 const gles2::GLES2Decoder* decoder, |
| 861 GLenum source_target, | 540 GLenum source_target, |
| 862 GLuint source_id, | 541 GLuint source_id, |
| 863 GLenum source_format, | |
| 864 GLenum dest_target, | 542 GLenum dest_target, |
| 865 GLuint dest_id, | 543 GLuint dest_id, |
| 866 GLenum dest_format, | |
| 867 GLsizei width, | 544 GLsizei width, |
| 868 GLsizei height, | 545 GLsizei height, |
| 869 bool flip_y, | 546 bool flip_y, |
| 870 bool premultiply_alpha, | 547 bool premultiply_alpha, |
| 871 bool unpremultiply_alpha, | 548 bool unpremultiply_alpha, |
| 872 const GLfloat transform_matrix[16]) { | 549 const GLfloat transform_matrix[16]) { |
| 873 GLsizei dest_width = width; | 550 GLsizei dest_width = width; |
| 874 GLsizei dest_height = height; | 551 GLsizei dest_height = height; |
| 875 DoCopyTextureInternal( | 552 DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id, |
| 876 decoder, source_target, source_id, source_format, dest_target, dest_id, | 553 0, 0, 0, 0, width, height, dest_width, dest_height, |
| 877 dest_format, 0, 0, 0, 0, width, height, dest_width, dest_height, width, | 554 width, height, flip_y, premultiply_alpha, |
| 878 height, flip_y, premultiply_alpha, unpremultiply_alpha, transform_matrix); | 555 unpremultiply_alpha, transform_matrix); |
| 879 } | 556 } |
| 880 | 557 |
| 881 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( | 558 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( |
| 882 const gles2::GLES2Decoder* decoder, | 559 const gles2::GLES2Decoder* decoder, |
| 883 GLenum source_target, | 560 GLenum source_target, |
| 884 GLuint source_id, | 561 GLuint source_id, |
| 885 GLenum source_format, | |
| 886 GLenum dest_target, | 562 GLenum dest_target, |
| 887 GLuint dest_id, | 563 GLuint dest_id, |
| 888 GLenum dest_format, | |
| 889 GLint xoffset, | 564 GLint xoffset, |
| 890 GLint yoffset, | 565 GLint yoffset, |
| 891 GLint x, | 566 GLint x, |
| 892 GLint y, | 567 GLint y, |
| 893 GLsizei width, | 568 GLsizei width, |
| 894 GLsizei height, | 569 GLsizei height, |
| 895 GLsizei dest_width, | 570 GLsizei dest_width, |
| 896 GLsizei dest_height, | 571 GLsizei dest_height, |
| 897 GLsizei source_width, | 572 GLsizei source_width, |
| 898 GLsizei source_height, | 573 GLsizei source_height, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 925 glBindVertexArrayOES(vertex_array_object_id_); | 600 glBindVertexArrayOES(vertex_array_object_id_); |
| 926 } else { | 601 } else { |
| 927 if (!gl_version_info.is_desktop_core_profile) { | 602 if (!gl_version_info.is_desktop_core_profile) { |
| 928 decoder->ClearAllAttributes(); | 603 decoder->ClearAllAttributes(); |
| 929 } | 604 } |
| 930 glEnableVertexAttribArray(kVertexPositionAttrib); | 605 glEnableVertexAttribArray(kVertexPositionAttrib); |
| 931 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); | 606 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); |
| 932 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); | 607 glVertexAttribPointer(kVertexPositionAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); |
| 933 } | 608 } |
| 934 | 609 |
| 935 ShaderId vertex_shader_id = GetVertexShaderId(source_target); | 610 FragmentShaderId fragment_shader_id = GetFragmentShaderId( |
| 936 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); | 611 premultiply_alpha, unpremultiply_alpha, source_target); |
| 937 ShaderId fragment_shader_id = GetFragmentShaderId( | |
| 938 premultiply_alpha, unpremultiply_alpha, source_target, | |
| 939 source_format, dest_format); | |
| 940 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); | 612 DCHECK_LT(static_cast<size_t>(fragment_shader_id), fragment_shaders_.size()); |
| 941 | 613 |
| 942 ProgramMapKey key(fragment_shader_id); | 614 ProgramMapKey key(fragment_shader_id); |
| 943 ProgramInfo* info = &programs_[key]; | 615 ProgramInfo* info = &programs_[key]; |
| 944 // Create program if necessary. | 616 // Create program if necessary. |
| 945 if (!info->program) { | 617 if (!info->program) { |
| 946 info->program = glCreateProgram(); | 618 info->program = glCreateProgram(); |
| 947 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; | 619 if (!vertex_shader_) { |
| 948 if (!*vertex_shader) { | 620 vertex_shader_ = glCreateShader(GL_VERTEX_SHADER); |
| 949 *vertex_shader = glCreateShader(GL_VERTEX_SHADER); | 621 std::string source = GetVertexShaderSource(gl_version_info); |
| 950 std::string source = | 622 CompileShader(vertex_shader_, source.c_str()); |
| 951 GetVertexShaderSource(gl_version_info, source_target); | |
| 952 CompileShader(*vertex_shader, source.c_str()); | |
| 953 } | 623 } |
| 954 glAttachShader(info->program, *vertex_shader); | 624 glAttachShader(info->program, vertex_shader_); |
| 955 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; | 625 GLuint* fragment_shader = &fragment_shaders_[fragment_shader_id]; |
| 956 if (!*fragment_shader) { | 626 if (!*fragment_shader) { |
| 957 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); | 627 *fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); |
| 958 std::string source = GetFragmentShaderSource( | 628 std::string source = GetFragmentShaderSource( |
| 959 gl_version_info, premultiply_alpha, unpremultiply_alpha, | 629 gl_version_info, premultiply_alpha, unpremultiply_alpha, |
| 960 nv_egl_stream_consumer_external_, source_target, source_format, | 630 nv_egl_stream_consumer_external_, source_target); |
| 961 dest_format); | |
| 962 CompileShader(*fragment_shader, source.c_str()); | 631 CompileShader(*fragment_shader, source.c_str()); |
| 963 } | 632 } |
| 964 glAttachShader(info->program, *fragment_shader); | 633 glAttachShader(info->program, *fragment_shader); |
| 965 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); | 634 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); |
| 966 glLinkProgram(info->program); | 635 glLinkProgram(info->program); |
| 967 #ifndef NDEBUG | 636 #ifndef NDEBUG |
| 968 GLint linked; | 637 GLint linked; |
| 969 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); | 638 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); |
| 970 if (!linked) | 639 if (!linked) |
| 971 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; | 640 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1102 decoder->RestoreTextureUnitBindings(0); | 771 decoder->RestoreTextureUnitBindings(0); |
| 1103 decoder->RestoreActiveTexture(); | 772 decoder->RestoreActiveTexture(); |
| 1104 decoder->RestoreProgramBindings(); | 773 decoder->RestoreProgramBindings(); |
| 1105 decoder->RestoreBufferBindings(); | 774 decoder->RestoreBufferBindings(); |
| 1106 decoder->RestoreFramebufferBindings(); | 775 decoder->RestoreFramebufferBindings(); |
| 1107 decoder->RestoreGlobalState(); | 776 decoder->RestoreGlobalState(); |
| 1108 } | 777 } |
| 1109 | 778 |
| 1110 } // namespace gles2 | 779 } // namespace gles2 |
| 1111 } // namespace gpu | 780 } // namespace gpu |
| OLD | NEW |