Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(299)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc

Issue 254753002: gpu: Add support for GL_TEXTURE_RECTANGLE_ARB target to CHROMIUM_copy_texture. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698