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 |