| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "gpu/command_buffer/common/types.h" | 10 #include "gpu/command_buffer/common/types.h" |
| 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 | 13 |
| 14 #define SHADER(src) \ | 14 #define SHADER(src) \ |
| 15 "#ifdef GL_ES\n" \ | 15 "#ifdef GL_ES\n" \ |
| 16 "precision mediump float;\n" \ | 16 "precision mediump float;\n" \ |
| 17 "#define TexCoordPrecision mediump\n" \ | 17 "#define TexCoordPrecision mediump\n" \ |
| 18 "#else\n" \ | 18 "#else\n" \ |
| 19 "#define TexCoordPrecision\n" \ | 19 "#define TexCoordPrecision\n" \ |
| 20 "#endif\n" #src | 20 "#endif\n" #src |
| 21 #define SHADER_2D(src) \ | 21 #define SHADER_2D(src) \ |
| 22 "#define SamplerType sampler2D\n" \ | 22 "#define SamplerType sampler2D\n" \ |
| 23 "#define TextureLookup texture2D\n" SHADER(src) | 23 "#define TextureLookup texture2D\n" SHADER(src) |
| 24 #define SHADER_RECTANGLE_ARB(src) \ |
| 25 "#define SamplerType samplerRect\n" \ |
| 26 "#define TextureLookup textureRect\n" SHADER(src) |
| 24 #define SHADER_EXTERNAL_OES(src) \ | 27 #define SHADER_EXTERNAL_OES(src) \ |
| 25 "#extension GL_OES_EGL_image_external : require\n" \ | 28 "#extension GL_OES_EGL_image_external : require\n" \ |
| 26 "#define SamplerType samplerExternalOES\n" \ | 29 "#define SamplerType samplerExternalOES\n" \ |
| 27 "#define TextureLookup texture2D\n" SHADER(src) | 30 "#define TextureLookup texture2D\n" SHADER(src) |
| 28 #define FRAGMENT_SHADERS(src) \ | 31 #define FRAGMENT_SHADERS(src) \ |
| 29 SHADER_2D(src), SHADER_EXTERNAL_OES(src) | 32 SHADER_2D(src), SHADER_RECTANGLE_ARB(src), SHADER_EXTERNAL_OES(src) |
| 30 | 33 |
| 31 namespace { | 34 namespace { |
| 32 | 35 |
| 33 enum VertexShaderId { | 36 enum VertexShaderId { |
| 34 VERTEX_SHADER_COPY_TEXTURE, | 37 VERTEX_SHADER_COPY_TEXTURE, |
| 35 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, | 38 VERTEX_SHADER_COPY_TEXTURE_FLIP_Y, |
| 36 NUM_VERTEX_SHADERS, | 39 NUM_VERTEX_SHADERS, |
| 37 }; | 40 }; |
| 38 | 41 |
| 39 enum FragmentShaderId { | 42 enum FragmentShaderId { |
| 40 FRAGMENT_SHADER_COPY_TEXTURE_2D, | 43 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 44 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 41 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | 45 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 42 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, | 46 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 47 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 43 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, | 48 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 44 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, | 49 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 50 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 45 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, | 51 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 46 NUM_FRAGMENT_SHADERS, | 52 NUM_FRAGMENT_SHADERS, |
| 47 }; | 53 }; |
| 48 | 54 |
| 49 const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { | 55 const char* vertex_shader_source[NUM_VERTEX_SHADERS] = { |
| 50 // VERTEX_SHADER_COPY_TEXTURE | 56 // VERTEX_SHADER_COPY_TEXTURE |
| 51 SHADER( | 57 SHADER( |
| 52 uniform mat4 u_matrix; | 58 uniform mat4 u_matrix; |
| 59 uniform vec2 u_half_size; |
| 53 attribute vec4 a_position; | 60 attribute vec4 a_position; |
| 54 varying TexCoordPrecision vec2 v_uv; | 61 varying TexCoordPrecision vec2 v_uv; |
| 55 void main(void) { | 62 void main(void) { |
| 56 gl_Position = u_matrix * a_position; | 63 gl_Position = u_matrix * a_position; |
| 57 v_uv = a_position.xy * vec2(0.5, 0.5) + vec2(0.5, 0.5); | 64 v_uv = a_position.xy * vec2(u_half_size.s, u_half_size.t) + |
| 65 vec2(u_half_size.s, u_half_size.t); |
| 58 }), | 66 }), |
| 59 // VERTEX_SHADER_COPY_TEXTURE_FLIP_Y | 67 // VERTEX_SHADER_COPY_TEXTURE_FLIP_Y |
| 60 SHADER( | 68 SHADER( |
| 61 uniform mat4 u_matrix; | 69 uniform mat4 u_matrix; |
| 70 uniform vec2 u_half_size; |
| 62 attribute vec4 a_position; | 71 attribute vec4 a_position; |
| 63 varying TexCoordPrecision vec2 v_uv; | 72 varying TexCoordPrecision vec2 v_uv; |
| 64 void main(void) { | 73 void main(void) { |
| 65 gl_Position = u_matrix * a_position; | 74 gl_Position = u_matrix * a_position; |
| 66 v_uv = a_position.xy * vec2(0.5, -0.5) + vec2(0.5, 0.5); | 75 v_uv = a_position.xy * vec2(u_half_size.s, -u_half_size.t) + |
| 76 vec2(u_half_size.s, u_half_size.t); |
| 67 }), | 77 }), |
| 68 }; | 78 }; |
| 69 | 79 |
| 70 const char* fragment_shader_source[NUM_FRAGMENT_SHADERS] = { | 80 const char* fragment_shader_source[NUM_FRAGMENT_SHADERS] = { |
| 71 // FRAGMENT_SHADER_COPY_TEXTURE_* | 81 // FRAGMENT_SHADER_COPY_TEXTURE_* |
| 72 FRAGMENT_SHADERS( | 82 FRAGMENT_SHADERS( |
| 73 uniform SamplerType u_sampler; | 83 uniform SamplerType u_sampler; |
| 74 varying TexCoordPrecision vec2 v_uv; | 84 varying TexCoordPrecision vec2 v_uv; |
| 75 void main(void) { | 85 void main(void) { |
| 76 gl_FragColor = TextureLookup(u_sampler, v_uv.st); | 86 gl_FragColor = TextureLookup(u_sampler, v_uv.st); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 107 return shader_ids[index]; | 117 return shader_ids[index]; |
| 108 } | 118 } |
| 109 | 119 |
| 110 // Returns the correct fragment shader id to evaluate the copy operation for | 120 // Returns the correct fragment shader id to evaluate the copy operation for |
| 111 // the premultiply alpha pixel store settings and target. | 121 // the premultiply alpha pixel store settings and target. |
| 112 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, | 122 FragmentShaderId GetFragmentShaderId(bool premultiply_alpha, |
| 113 bool unpremultiply_alpha, | 123 bool unpremultiply_alpha, |
| 114 GLenum target) { | 124 GLenum target) { |
| 115 enum { | 125 enum { |
| 116 SAMPLER_2D, | 126 SAMPLER_2D, |
| 127 SAMPLER_RECTANGLE_ARB, |
| 117 SAMPLER_EXTERNAL_OES, | 128 SAMPLER_EXTERNAL_OES, |
| 118 NUM_SAMPLERS | 129 NUM_SAMPLERS |
| 119 }; | 130 }; |
| 120 | 131 |
| 121 // bit 0: premultiply alpha | 132 // bit 0: premultiply alpha |
| 122 // bit 1: unpremultiply alpha | 133 // bit 1: unpremultiply alpha |
| 123 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { | 134 static FragmentShaderId shader_ids[][NUM_SAMPLERS] = { |
| 124 { | 135 { |
| 125 FRAGMENT_SHADER_COPY_TEXTURE_2D, | 136 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 137 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 126 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | 138 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 127 }, | 139 }, |
| 128 { | 140 { |
| 129 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, | 141 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_2D, |
| 142 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 130 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, | 143 FRAGMENT_SHADER_COPY_TEXTURE_PREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 131 }, | 144 }, |
| 132 { | 145 { |
| 133 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, | 146 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_2D, |
| 147 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_RECTANGLE_ARB, |
| 134 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, | 148 FRAGMENT_SHADER_COPY_TEXTURE_UNPREMULTIPLY_ALPHA_EXTERNAL_OES, |
| 135 }, | 149 }, |
| 136 { | 150 { |
| 137 FRAGMENT_SHADER_COPY_TEXTURE_2D, | 151 FRAGMENT_SHADER_COPY_TEXTURE_2D, |
| 152 FRAGMENT_SHADER_COPY_TEXTURE_RECTANGLE_ARB, |
| 138 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, | 153 FRAGMENT_SHADER_COPY_TEXTURE_EXTERNAL_OES, |
| 139 }}; | 154 }}; |
| 140 | 155 |
| 141 unsigned index = (premultiply_alpha ? (1 << 0) : 0) | | 156 unsigned index = (premultiply_alpha ? (1 << 0) : 0) | |
| 142 (unpremultiply_alpha ? (1 << 1) : 0); | 157 (unpremultiply_alpha ? (1 << 1) : 0); |
| 143 | 158 |
| 144 switch (target) { | 159 switch (target) { |
| 145 case GL_TEXTURE_2D: | 160 case GL_TEXTURE_2D: |
| 146 return shader_ids[index][SAMPLER_2D]; | 161 return shader_ids[index][SAMPLER_2D]; |
| 162 case GL_TEXTURE_RECTANGLE_ARB: |
| 163 return shader_ids[index][SAMPLER_RECTANGLE_ARB]; |
| 147 case GL_TEXTURE_EXTERNAL_OES: | 164 case GL_TEXTURE_EXTERNAL_OES: |
| 148 return shader_ids[index][SAMPLER_EXTERNAL_OES]; | 165 return shader_ids[index][SAMPLER_EXTERNAL_OES]; |
| 149 default: | 166 default: |
| 150 break; | 167 break; |
| 151 } | 168 } |
| 152 | 169 |
| 153 NOTREACHED(); | 170 NOTREACHED(); |
| 154 return shader_ids[index][SAMPLER_2D]; | 171 return shader_ids[index][SAMPLER_2D]; |
| 155 } | 172 } |
| 156 | 173 |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 GLuint source_id, | 271 GLuint source_id, |
| 255 GLuint dest_id, | 272 GLuint dest_id, |
| 256 GLint level, | 273 GLint level, |
| 257 GLsizei width, | 274 GLsizei width, |
| 258 GLsizei height, | 275 GLsizei height, |
| 259 bool flip_y, | 276 bool flip_y, |
| 260 bool premultiply_alpha, | 277 bool premultiply_alpha, |
| 261 bool unpremultiply_alpha, | 278 bool unpremultiply_alpha, |
| 262 const GLfloat transform_matrix[16]) { | 279 const GLfloat transform_matrix[16]) { |
| 263 DCHECK(source_target == GL_TEXTURE_2D || | 280 DCHECK(source_target == GL_TEXTURE_2D || |
| 281 source_target == GL_TEXTURE_RECTANGLE_ARB || |
| 264 source_target == GL_TEXTURE_EXTERNAL_OES); | 282 source_target == GL_TEXTURE_EXTERNAL_OES); |
| 265 if (!initialized_) { | 283 if (!initialized_) { |
| 266 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 284 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
| 267 return; | 285 return; |
| 268 } | 286 } |
| 269 | 287 |
| 270 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); | 288 VertexShaderId vertex_shader_id = GetVertexShaderId(flip_y); |
| 271 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); | 289 DCHECK_LT(static_cast<size_t>(vertex_shader_id), vertex_shaders_.size()); |
| 272 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; | 290 GLuint* vertex_shader = &vertex_shaders_[vertex_shader_id]; |
| 273 if (!*vertex_shader) { | 291 if (!*vertex_shader) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 293 glAttachShader(info->program, *fragment_shader); | 311 glAttachShader(info->program, *fragment_shader); |
| 294 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); | 312 glBindAttribLocation(info->program, kVertexPositionAttrib, "a_position"); |
| 295 glLinkProgram(info->program); | 313 glLinkProgram(info->program); |
| 296 #ifndef NDEBUG | 314 #ifndef NDEBUG |
| 297 GLint linked; | 315 GLint linked; |
| 298 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); | 316 glGetProgramiv(info->program, GL_LINK_STATUS, &linked); |
| 299 if (!linked) | 317 if (!linked) |
| 300 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; | 318 DLOG(ERROR) << "CopyTextureCHROMIUM: program link failure."; |
| 301 #endif | 319 #endif |
| 302 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); | 320 info->matrix_handle = glGetUniformLocation(info->program, "u_matrix"); |
| 321 info->half_size_handle = glGetUniformLocation(info->program, "u_half_size"); |
| 303 info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); | 322 info->sampler_handle = glGetUniformLocation(info->program, "u_sampler"); |
| 304 } | 323 } |
| 305 glUseProgram(info->program); | 324 glUseProgram(info->program); |
| 306 | 325 |
| 307 #ifndef NDEBUG | 326 #ifndef NDEBUG |
| 308 glValidateProgram(info->program); | 327 glValidateProgram(info->program); |
| 309 GLint validation_status; | 328 GLint validation_status; |
| 310 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); | 329 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); |
| 311 if (GL_TRUE != validation_status) { | 330 if (GL_TRUE != validation_status) { |
| 312 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; | 331 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; |
| 313 return; | 332 return; |
| 314 } | 333 } |
| 315 #endif | 334 #endif |
| 316 | 335 |
| 317 glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); | 336 glUniformMatrix4fv(info->matrix_handle, 1, GL_FALSE, transform_matrix); |
| 337 if (source_target == GL_TEXTURE_RECTANGLE_ARB) |
| 338 glUniform2f(info->half_size_handle, width / 2.0f, height / 2.0f); |
| 339 else |
| 340 glUniform2f(info->half_size_handle, 0.5f, 0.5f); |
| 318 glActiveTexture(GL_TEXTURE0); | 341 glActiveTexture(GL_TEXTURE0); |
| 319 glBindTexture(GL_TEXTURE_2D, dest_id); | 342 glBindTexture(GL_TEXTURE_2D, dest_id); |
| 320 // NVidia drivers require texture settings to be a certain way | 343 // NVidia drivers require texture settings to be a certain way |
| 321 // or they won't report FRAMEBUFFER_COMPLETE. | 344 // or they won't report FRAMEBUFFER_COMPLETE. |
| 322 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 345 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
| 323 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 346 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
| 324 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 347 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
| 325 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 348 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
| 326 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_); | 349 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer_); |
| 327 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, dest_target, | 350 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, dest_target, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 decoder->RestoreTextureState(dest_id); | 388 decoder->RestoreTextureState(dest_id); |
| 366 decoder->RestoreTextureUnitBindings(0); | 389 decoder->RestoreTextureUnitBindings(0); |
| 367 decoder->RestoreActiveTexture(); | 390 decoder->RestoreActiveTexture(); |
| 368 decoder->RestoreProgramBindings(); | 391 decoder->RestoreProgramBindings(); |
| 369 decoder->RestoreBufferBindings(); | 392 decoder->RestoreBufferBindings(); |
| 370 decoder->RestoreFramebufferBindings(); | 393 decoder->RestoreFramebufferBindings(); |
| 371 decoder->RestoreGlobalState(); | 394 decoder->RestoreGlobalState(); |
| 372 } | 395 } |
| 373 | 396 |
| 374 } // namespace gpu | 397 } // namespace gpu |
| OLD | NEW |