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

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

Issue 1275773003: gpu: support GL_TEXTURE_CUBE_MAP destination target to Copy(Sub)TextureCHROMIUM. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Choose correct and expensive way Created 5 years, 4 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
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/gles2_cmd_utils.h"
10 #include "gpu/command_buffer/service/gl_utils.h" 11 #include "gpu/command_buffer/service/gl_utils.h"
11 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" 12 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
12 13
13 #define SHADER(src) \ 14 #define SHADER(src) \
14 "#ifdef GL_ES\n" \ 15 "#ifdef GL_ES\n" \
15 "precision mediump float;\n" \ 16 "precision mediump float;\n" \
16 "#define TexCoordPrecision mediump\n" \ 17 "#define TexCoordPrecision mediump\n" \
17 "#else\n" \ 18 "#else\n" \
18 "#define TexCoordPrecision\n" \ 19 "#define TexCoordPrecision\n" \
19 "#endif\n" #src 20 "#endif\n" #src
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 } 194 }
194 195
195 void DeleteShader(GLuint shader) { 196 void DeleteShader(GLuint shader) {
196 if (shader) 197 if (shader)
197 glDeleteShader(shader); 198 glDeleteShader(shader);
198 } 199 }
199 200
200 bool BindFramebufferTexture2D(GLenum target, 201 bool BindFramebufferTexture2D(GLenum target,
201 GLuint texture_id, 202 GLuint texture_id,
202 GLuint framebuffer) { 203 GLuint framebuffer) {
203 DCHECK(target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE_ARB); 204 GLenum binding_target =
205 gpu::gles2::GLES2Util::GLTextureTargetToBindingTarget(target);
206 DCHECK(binding_target == GL_TEXTURE_2D ||
207 binding_target == GL_TEXTURE_RECTANGLE_ARB ||
208 binding_target == GL_TEXTURE_CUBE_MAP);
204 glActiveTexture(GL_TEXTURE0); 209 glActiveTexture(GL_TEXTURE0);
205 glBindTexture(target, texture_id); 210 glBindTexture(binding_target, texture_id);
206 // NVidia drivers require texture settings to be a certain way 211 // NVidia drivers require texture settings to be a certain way
207 // or they won't report FRAMEBUFFER_COMPLETE. 212 // or they won't report FRAMEBUFFER_COMPLETE.
208 glTexParameterf(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 213 glTexParameterf(binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
209 glTexParameterf(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 214 glTexParameterf(binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
210 glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 215 glTexParameteri(binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
211 glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 216 glTexParameteri(binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
212 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); 217 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
213 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, 218 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
214 texture_id, 0); 219 texture_id, 0);
215 220
216 #ifndef NDEBUG 221 #ifndef NDEBUG
217 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); 222 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER);
218 if (GL_FRAMEBUFFER_COMPLETE != fb_status) { 223 if (GL_FRAMEBUFFER_COMPLETE != fb_status) {
219 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer."; 224 DLOG(ERROR) << "CopyTextureCHROMIUM: Incomplete framebuffer.";
220 return false; 225 return false;
221 } 226 }
222 #endif 227 #endif
223 return true; 228 return true;
224 } 229 }
225 230
226 void DoCopyTexImage2D(const gpu::gles2::GLES2Decoder* decoder, 231 void DoCopyTexImage2D(const gpu::gles2::GLES2Decoder* decoder,
227 GLenum source_target, 232 GLenum source_target,
228 GLuint source_id, 233 GLuint source_id,
234 GLenum dest_target,
229 GLuint dest_id, 235 GLuint dest_id,
230 GLenum dest_internal_format, 236 GLenum dest_internal_format,
231 GLsizei width, 237 GLsizei width,
232 GLsizei height, 238 GLsizei height,
233 GLuint framebuffer) { 239 GLuint framebuffer) {
234 DCHECK(source_target == GL_TEXTURE_2D || 240 DCHECK(source_target == GL_TEXTURE_2D ||
235 source_target == GL_TEXTURE_RECTANGLE_ARB); 241 source_target == GL_TEXTURE_RECTANGLE_ARB);
236 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { 242 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
237 glBindTexture(GL_TEXTURE_2D, dest_id); 243 GLenum binding_target =
238 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 244 gpu::gles2::GLES2Util::GLTextureTargetToBindingTarget(dest_target);
239 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 245 glBindTexture(binding_target, dest_id);
240 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 246 glTexParameterf(binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
241 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 247 glTexParameterf(binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
242 glCopyTexImage2D(GL_TEXTURE_2D, 0 /* level */, dest_internal_format, 248 glTexParameteri(binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
249 glTexParameteri(binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
250 glCopyTexImage2D(dest_target, 0 /* level */, dest_internal_format,
243 0 /* x */, 0 /* y */, width, height, 0 /* border */); 251 0 /* x */, 0 /* y */, width, height, 0 /* border */);
244 } 252 }
245 253
246 decoder->RestoreTextureState(source_id); 254 decoder->RestoreTextureState(source_id);
247 decoder->RestoreTextureState(dest_id); 255 decoder->RestoreTextureState(dest_id);
248 decoder->RestoreTextureUnitBindings(0); 256 decoder->RestoreTextureUnitBindings(0);
249 decoder->RestoreActiveTexture(); 257 decoder->RestoreActiveTexture();
250 decoder->RestoreFramebufferBindings(); 258 decoder->RestoreFramebufferBindings();
251 } 259 }
252 260
253 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, 261 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder,
254 GLenum source_target, 262 GLenum source_target,
255 GLuint source_id, 263 GLuint source_id,
264 GLenum dest_target,
256 GLuint dest_id, 265 GLuint dest_id,
257 GLint xoffset, 266 GLint xoffset,
258 GLint yoffset, 267 GLint yoffset,
259 GLint source_x, 268 GLint source_x,
260 GLint source_y, 269 GLint source_y,
261 GLsizei source_width, 270 GLsizei source_width,
262 GLsizei source_height, 271 GLsizei source_height,
263 GLuint framebuffer) { 272 GLuint framebuffer) {
264 DCHECK(source_target == GL_TEXTURE_2D || 273 DCHECK(source_target == GL_TEXTURE_2D ||
265 source_target == GL_TEXTURE_RECTANGLE_ARB); 274 source_target == GL_TEXTURE_RECTANGLE_ARB);
266 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { 275 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) {
267 glBindTexture(GL_TEXTURE_2D, dest_id); 276 GLenum binding_target =
268 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 277 gpu::gles2::GLES2Util::GLTextureTargetToBindingTarget(dest_target);
269 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 278 glBindTexture(binding_target, dest_id);
270 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 279 glTexParameterf(binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
271 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 280 glTexParameterf(binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
272 glCopyTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, xoffset, yoffset, 281 glTexParameteri(binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
273 source_x, source_y, source_width, source_height); 282 glTexParameteri(binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
283 glCopyTexSubImage2D(dest_target, 0 /* level */, xoffset, yoffset, source_x,
284 source_y, source_width, source_height);
274 } 285 }
275 286
276 decoder->RestoreTextureState(source_id); 287 decoder->RestoreTextureState(source_id);
277 decoder->RestoreTextureState(dest_id); 288 decoder->RestoreTextureState(dest_id);
278 decoder->RestoreTextureUnitBindings(0); 289 decoder->RestoreTextureUnitBindings(0);
279 decoder->RestoreActiveTexture(); 290 decoder->RestoreActiveTexture();
280 decoder->RestoreFramebufferBindings(); 291 decoder->RestoreFramebufferBindings();
281 } 292 }
282 293
283 } // namespace 294 } // namespace
(...skipping 26 matching lines...) Expand all
310 glGenBuffersARB(1, &buffer_id_); 321 glGenBuffersARB(1, &buffer_id_);
311 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_); 322 glBindBuffer(GL_ARRAY_BUFFER, buffer_id_);
312 const GLfloat kQuadVertices[] = {-1.0f, -1.0f, 323 const GLfloat kQuadVertices[] = {-1.0f, -1.0f,
313 1.0f, -1.0f, 324 1.0f, -1.0f,
314 1.0f, 1.0f, 325 1.0f, 1.0f,
315 -1.0f, 1.0f}; 326 -1.0f, 1.0f};
316 glBufferData( 327 glBufferData(
317 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW); 328 GL_ARRAY_BUFFER, sizeof(kQuadVertices), kQuadVertices, GL_STATIC_DRAW);
318 329
319 glGenFramebuffersEXT(1, &framebuffer_); 330 glGenFramebuffersEXT(1, &framebuffer_);
331 glGenTextures(1, &staging_testure_);
320 332
321 decoder->RestoreBufferBindings(); 333 decoder->RestoreBufferBindings();
322 334
323 initialized_ = true; 335 initialized_ = true;
324 } 336 }
325 337
326 void CopyTextureCHROMIUMResourceManager::Destroy() { 338 void CopyTextureCHROMIUMResourceManager::Destroy() {
327 if (!initialized_) 339 if (!initialized_)
328 return; 340 return;
329 341
330 glDeleteFramebuffersEXT(1, &framebuffer_); 342 glDeleteFramebuffersEXT(1, &framebuffer_);
331 framebuffer_ = 0; 343 framebuffer_ = 0;
332 344
345 glDeleteTextures(1, &staging_testure_);
346 staging_testure_ = 0;
347
333 std::for_each(vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader); 348 std::for_each(vertex_shaders_.begin(), vertex_shaders_.end(), DeleteShader);
334 std::for_each( 349 std::for_each(
335 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader); 350 fragment_shaders_.begin(), fragment_shaders_.end(), DeleteShader);
336 351
337 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end(); 352 for (ProgramMap::const_iterator it = programs_.begin(); it != programs_.end();
338 ++it) { 353 ++it) {
339 const ProgramInfo& info = it->second; 354 const ProgramInfo& info = it->second;
340 glDeleteProgram(info.program); 355 glDeleteProgram(info.program);
341 } 356 }
342 357
343 glDeleteBuffersARB(1, &buffer_id_); 358 glDeleteBuffersARB(1, &buffer_id_);
344 buffer_id_ = 0; 359 buffer_id_ = 0;
345 } 360 }
346 361
347 void CopyTextureCHROMIUMResourceManager::DoCopyTexture( 362 void CopyTextureCHROMIUMResourceManager::DoCopyTexture(
348 const gles2::GLES2Decoder* decoder, 363 const gles2::GLES2Decoder* decoder,
349 GLenum source_target, 364 GLenum source_target,
350 GLuint source_id, 365 GLuint source_id,
351 GLenum source_internal_format, 366 GLenum source_internal_format,
367 GLenum dest_target,
352 GLuint dest_id, 368 GLuint dest_id,
353 GLenum dest_internal_format, 369 GLenum dest_internal_format,
370 GLenum dest_type,
354 GLsizei width, 371 GLsizei width,
355 GLsizei height, 372 GLsizei height,
356 bool flip_y, 373 bool flip_y,
357 bool premultiply_alpha, 374 bool premultiply_alpha,
358 bool unpremultiply_alpha) { 375 bool unpremultiply_alpha,
376 bool dest_cube_complete) {
359 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; 377 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
360 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's 378 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
361 // format does not contain a superset of the components required by the base 379 // format does not contain a superset of the components required by the base
362 // format of internalformat. 380 // format of internalformat.
363 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml 381 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
364 bool source_format_contain_superset_of_dest_format = 382 bool source_format_contain_superset_of_dest_format =
365 (source_internal_format == dest_internal_format && 383 (source_internal_format == dest_internal_format &&
366 source_internal_format != GL_BGRA_EXT) || 384 source_internal_format != GL_BGRA_EXT) ||
367 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); 385 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
368 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 386 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
369 // so restrict this to GL_TEXTURE_2D. 387 // so restrict this to GL_TEXTURE_2D.
370 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && 388 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
371 source_format_contain_superset_of_dest_format) { 389 source_format_contain_superset_of_dest_format) {
372 DoCopyTexImage2D(decoder, 390 DoCopyTexImage2D(decoder, source_target, source_id, dest_target, dest_id,
373 source_target, 391 dest_internal_format, width, height, framebuffer_);
374 source_id,
375 dest_id,
376 dest_internal_format,
377 width,
378 height,
379 framebuffer_);
380 return; 392 return;
381 } 393 }
382 394
383 // Use kIdentityMatrix if no transform passed in. 395 // Use kIdentityMatrix if no transform passed in.
384 DoCopyTextureWithTransform(decoder, source_target, source_id, dest_id, width, 396 DoCopyTextureWithTransform(
385 height, flip_y, premultiply_alpha, 397 decoder, source_target, source_id, dest_target, dest_id,
386 unpremultiply_alpha, kIdentityMatrix); 398 dest_internal_format, dest_type, width, height, flip_y, premultiply_alpha,
399 unpremultiply_alpha, dest_cube_complete, kIdentityMatrix);
387 } 400 }
388 401
389 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( 402 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture(
390 const gles2::GLES2Decoder* decoder, 403 const gles2::GLES2Decoder* decoder,
391 GLenum source_target, 404 GLenum source_target,
392 GLuint source_id, 405 GLuint source_id,
393 GLenum source_internal_format, 406 GLenum source_internal_format,
407 GLenum dest_target,
394 GLuint dest_id, 408 GLuint dest_id,
395 GLenum dest_internal_format, 409 GLenum dest_internal_format,
410 GLenum dest_type,
396 GLint xoffset, 411 GLint xoffset,
397 GLint yoffset, 412 GLint yoffset,
398 GLint x, 413 GLint x,
399 GLint y, 414 GLint y,
400 GLsizei width, 415 GLsizei width,
401 GLsizei height, 416 GLsizei height,
402 GLsizei dest_width, 417 GLsizei dest_width,
403 GLsizei dest_height, 418 GLsizei dest_height,
404 GLsizei source_width, 419 GLsizei source_width,
405 GLsizei source_height, 420 GLsizei source_height,
406 bool flip_y, 421 bool flip_y,
407 bool premultiply_alpha, 422 bool premultiply_alpha,
408 bool unpremultiply_alpha) { 423 bool unpremultiply_alpha,
424 bool dest_cube_complete) {
409 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; 425 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha;
410 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's 426 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's
411 // format does not contain a superset of the components required by the base 427 // format does not contain a superset of the components required by the base
412 // format of internalformat. 428 // format of internalformat.
413 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml 429 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml
414 bool source_format_contain_superset_of_dest_format = 430 bool source_format_contain_superset_of_dest_format =
415 (source_internal_format == dest_internal_format && 431 (source_internal_format == dest_internal_format &&
416 source_internal_format != GL_BGRA_EXT) || 432 source_internal_format != GL_BGRA_EXT) ||
417 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); 433 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB);
418 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, 434 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2,
419 // so restrict this to GL_TEXTURE_2D. 435 // so restrict this to GL_TEXTURE_2D.
420 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && 436 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change &&
421 source_format_contain_superset_of_dest_format) { 437 source_format_contain_superset_of_dest_format) {
422 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, 438 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_target, dest_id,
423 yoffset, x, y, width, height, framebuffer_); 439 xoffset, yoffset, x, y, width, height, framebuffer_);
424 return; 440 return;
425 } 441 }
426 442
427 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset, 443 if (!dest_cube_complete) {
428 yoffset, x, y, width, height, dest_width, dest_height, 444 glBindTexture(GL_TEXTURE_2D, staging_testure_);
429 source_width, source_height, flip_y, premultiply_alpha, 445 glTexImage2D(GL_TEXTURE_2D, 0, dest_internal_format, width, height, 0,
430 unpremultiply_alpha, kIdentityMatrix); 446 dest_internal_format, dest_type, nullptr);
447 DoCopyTextureInternal(
448 decoder, source_target, source_id, GL_TEXTURE_2D, staging_testure_, 0,
449 0, x, y, width, height, width, height, source_width, source_height,
450 flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
451 DoCopyTexSubImage2D(decoder, GL_TEXTURE_2D, staging_testure_, dest_target,
Ken Russell (switch to Gerrit) 2015/08/18 00:33:02 The staging_texture_ will stick around after this,
dshwang 2015/08/18 14:42:01 Acknowledged.
452 dest_id, xoffset, yoffset, 0, 0, width, height,
453 framebuffer_);
454 return;
455 }
456
457 DoCopyTextureInternal(
458 decoder, source_target, source_id, dest_target, dest_id, xoffset, yoffset,
459 x, y, width, height, dest_width, dest_height, source_width, source_height,
460 flip_y, premultiply_alpha, unpremultiply_alpha, kIdentityMatrix);
431 } 461 }
432 462
433 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( 463 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform(
434 const gles2::GLES2Decoder* decoder, 464 const gles2::GLES2Decoder* decoder,
435 GLenum source_target, 465 GLenum source_target,
436 GLuint source_id, 466 GLuint source_id,
467 GLenum dest_target,
437 GLuint dest_id, 468 GLuint dest_id,
469 GLenum dest_internal_format,
470 GLenum dest_type,
438 GLsizei width, 471 GLsizei width,
439 GLsizei height, 472 GLsizei height,
440 bool flip_y, 473 bool flip_y,
441 bool premultiply_alpha, 474 bool premultiply_alpha,
442 bool unpremultiply_alpha, 475 bool unpremultiply_alpha,
476 bool dest_cube_complete,
443 const GLfloat transform_matrix[16]) { 477 const GLfloat transform_matrix[16]) {
444 GLsizei dest_width = width; 478 GLsizei dest_width = width;
445 GLsizei dest_height = height; 479 GLsizei dest_height = height;
446 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, 0, 0, 0, 0, 480
447 width, height, dest_width, dest_height, width, height, 481 if (!dest_cube_complete) {
448 flip_y, premultiply_alpha, unpremultiply_alpha, 482 // The |dest_id| texture cannot be bound to FBO. Create a staging
449 transform_matrix); 483 // GL_TEXTURE_2D texture, and copy the source texture to the staging
484 // texture, and copy the staging texture to the dest texture.
485 glBindTexture(GL_TEXTURE_2D, staging_testure_);
486 glTexImage2D(GL_TEXTURE_2D, 0, dest_internal_format, width, height, 0,
487 dest_internal_format, dest_type, nullptr);
488 DoCopyTextureInternal(decoder, source_target, source_id, GL_TEXTURE_2D,
489 staging_testure_, 0, 0, 0, 0, width, height, width,
490 height, width, height, flip_y, premultiply_alpha,
491 unpremultiply_alpha, transform_matrix);
492 DoCopyTexImage2D(decoder, GL_TEXTURE_2D, staging_testure_, dest_target,
Ken Russell (switch to Gerrit) 2015/08/18 00:33:02 Similar comment about the staging_texture_ staying
dshwang 2015/08/18 14:42:01 Acknowledged.
493 dest_id, dest_internal_format, width, height,
494 framebuffer_);
495 return;
496 }
497
498 DoCopyTextureInternal(decoder, source_target, source_id, dest_target, dest_id,
499 0, 0, 0, 0, width, height, dest_width, dest_height,
500 width, height, flip_y, premultiply_alpha,
501 unpremultiply_alpha, transform_matrix);
450 } 502 }
451 503
452 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( 504 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal(
453 const gles2::GLES2Decoder* decoder, 505 const gles2::GLES2Decoder* decoder,
454 GLenum source_target, 506 GLenum source_target,
455 GLuint source_id, 507 GLuint source_id,
508 GLenum dest_target,
456 GLuint dest_id, 509 GLuint dest_id,
457 GLint xoffset, 510 GLint xoffset,
458 GLint yoffset, 511 GLint yoffset,
459 GLint x, 512 GLint x,
460 GLint y, 513 GLint y,
461 GLsizei width, 514 GLsizei width,
462 GLsizei height, 515 GLsizei height,
463 GLsizei dest_width, 516 GLsizei dest_width,
464 GLsizei dest_height, 517 GLsizei dest_height,
465 GLsizei source_width, 518 GLsizei source_width,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 // Pass translation to the shader program. 588 // Pass translation to the shader program.
536 glUniform2f(info->vertex_translate_handle, x_translate_on_vertex, 589 glUniform2f(info->vertex_translate_handle, x_translate_on_vertex,
537 y_translate_on_vertex); 590 y_translate_on_vertex);
538 } 591 }
539 if (source_target == GL_TEXTURE_RECTANGLE_ARB) 592 if (source_target == GL_TEXTURE_RECTANGLE_ARB)
540 glUniform2f(info->half_size_handle, source_width / 2.0f, 593 glUniform2f(info->half_size_handle, source_width / 2.0f,
541 source_height / 2.0f); 594 source_height / 2.0f);
542 else 595 else
543 glUniform2f(info->half_size_handle, 0.5f, 0.5f); 596 glUniform2f(info->half_size_handle, 0.5f, 0.5f);
544 597
545 if (BindFramebufferTexture2D(GL_TEXTURE_2D, dest_id, framebuffer_)) { 598 if (BindFramebufferTexture2D(dest_target, dest_id, framebuffer_)) {
546 #ifndef NDEBUG 599 #ifndef NDEBUG
547 // glValidateProgram of MACOSX validates FBO unlike other platforms, so 600 // glValidateProgram of MACOSX validates FBO unlike other platforms, so
548 // glValidateProgram must be called after FBO binding. crbug.com/463439 601 // glValidateProgram must be called after FBO binding. crbug.com/463439
549 glValidateProgram(info->program); 602 glValidateProgram(info->program);
550 GLint validation_status; 603 GLint validation_status;
551 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status); 604 glGetProgramiv(info->program, GL_VALIDATE_STATUS, &validation_status);
552 if (GL_TRUE != validation_status) { 605 if (GL_TRUE != validation_status) {
553 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader."; 606 DLOG(ERROR) << "CopyTextureCHROMIUM: Invalid shader.";
554 return; 607 return;
555 } 608 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 decoder->RestoreTextureState(dest_id); 643 decoder->RestoreTextureState(dest_id);
591 decoder->RestoreTextureUnitBindings(0); 644 decoder->RestoreTextureUnitBindings(0);
592 decoder->RestoreActiveTexture(); 645 decoder->RestoreActiveTexture();
593 decoder->RestoreProgramBindings(); 646 decoder->RestoreProgramBindings();
594 decoder->RestoreBufferBindings(); 647 decoder->RestoreBufferBindings();
595 decoder->RestoreFramebufferBindings(); 648 decoder->RestoreFramebufferBindings();
596 decoder->RestoreGlobalState(); 649 decoder->RestoreGlobalState();
597 } 650 }
598 651
599 } // namespace gpu 652 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698