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/service/gl_utils.h" | 10 #include "gpu/command_buffer/service/gl_utils.h" |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 decoder->RestoreActiveTexture(); | 243 decoder->RestoreActiveTexture(); |
244 decoder->RestoreFramebufferBindings(); | 244 decoder->RestoreFramebufferBindings(); |
245 } | 245 } |
246 | 246 |
247 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, | 247 void DoCopyTexSubImage2D(const gpu::gles2::GLES2Decoder* decoder, |
248 GLenum source_target, | 248 GLenum source_target, |
249 GLuint source_id, | 249 GLuint source_id, |
250 GLuint dest_id, | 250 GLuint dest_id, |
251 GLint xoffset, | 251 GLint xoffset, |
252 GLint yoffset, | 252 GLint yoffset, |
| 253 GLint source_x, |
| 254 GLint source_y, |
253 GLsizei source_width, | 255 GLsizei source_width, |
254 GLsizei source_height, | 256 GLsizei source_height, |
255 GLuint framebuffer) { | 257 GLuint framebuffer) { |
256 DCHECK(source_target == GL_TEXTURE_2D || | 258 DCHECK(source_target == GL_TEXTURE_2D || |
257 source_target == GL_TEXTURE_RECTANGLE_ARB); | 259 source_target == GL_TEXTURE_RECTANGLE_ARB); |
258 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { | 260 if (BindFramebufferTexture2D(source_target, source_id, framebuffer)) { |
259 glBindTexture(GL_TEXTURE_2D, dest_id); | 261 glBindTexture(GL_TEXTURE_2D, dest_id); |
260 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 262 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
261 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 263 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
262 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 264 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
263 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 265 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
264 glCopyTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, xoffset, yoffset, | 266 glCopyTexSubImage2D(GL_TEXTURE_2D, 0 /* level */, xoffset, yoffset, |
265 0 /* x */, 0 /* y */, source_width, source_height); | 267 source_x, source_y, source_width, source_height); |
266 } | 268 } |
267 | 269 |
268 decoder->RestoreTextureState(source_id); | 270 decoder->RestoreTextureState(source_id); |
269 decoder->RestoreTextureState(dest_id); | 271 decoder->RestoreTextureState(dest_id); |
270 decoder->RestoreTextureUnitBindings(0); | 272 decoder->RestoreTextureUnitBindings(0); |
271 decoder->RestoreActiveTexture(); | 273 decoder->RestoreActiveTexture(); |
272 decoder->RestoreFramebufferBindings(); | 274 decoder->RestoreFramebufferBindings(); |
273 } | 275 } |
274 | 276 |
275 // Copy from SkMatrix44::preTranslate | 277 // Copy from SkMatrix44::preTranslate |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 | 393 |
392 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( | 394 void CopyTextureCHROMIUMResourceManager::DoCopySubTexture( |
393 const gles2::GLES2Decoder* decoder, | 395 const gles2::GLES2Decoder* decoder, |
394 GLenum source_target, | 396 GLenum source_target, |
395 GLuint source_id, | 397 GLuint source_id, |
396 GLenum source_internal_format, | 398 GLenum source_internal_format, |
397 GLuint dest_id, | 399 GLuint dest_id, |
398 GLenum dest_internal_format, | 400 GLenum dest_internal_format, |
399 GLint xoffset, | 401 GLint xoffset, |
400 GLint yoffset, | 402 GLint yoffset, |
| 403 GLint x, |
| 404 GLint y, |
| 405 GLsizei width, |
| 406 GLsizei height, |
401 GLsizei dest_width, | 407 GLsizei dest_width, |
402 GLsizei dest_height, | 408 GLsizei dest_height, |
403 GLsizei source_width, | 409 GLsizei source_width, |
404 GLsizei source_height, | 410 GLsizei source_height, |
405 bool flip_y, | 411 bool flip_y, |
406 bool premultiply_alpha, | 412 bool premultiply_alpha, |
407 bool unpremultiply_alpha) { | 413 bool unpremultiply_alpha) { |
408 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; | 414 bool premultiply_alpha_change = premultiply_alpha ^ unpremultiply_alpha; |
409 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's | 415 // GL_INVALID_OPERATION is generated if the currently bound framebuffer's |
410 // format does not contain a superset of the components required by the base | 416 // format does not contain a superset of the components required by the base |
411 // format of internalformat. | 417 // format of internalformat. |
412 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml | 418 // https://www.khronos.org/opengles/sdk/docs/man/xhtml/glCopyTexImage2D.xml |
413 bool source_format_contain_superset_of_dest_format = | 419 bool source_format_contain_superset_of_dest_format = |
414 (source_internal_format == dest_internal_format && | 420 (source_internal_format == dest_internal_format && |
415 source_internal_format != GL_BGRA_EXT) || | 421 source_internal_format != GL_BGRA_EXT) || |
416 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); | 422 (source_internal_format == GL_RGBA && dest_internal_format == GL_RGB); |
417 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, | 423 // GL_TEXTURE_RECTANGLE_ARB on FBO is supported by OpenGL, not GLES2, |
418 // so restrict this to GL_TEXTURE_2D. | 424 // so restrict this to GL_TEXTURE_2D. |
419 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && | 425 if (source_target == GL_TEXTURE_2D && !flip_y && !premultiply_alpha_change && |
420 source_format_contain_superset_of_dest_format) { | 426 source_format_contain_superset_of_dest_format) { |
421 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, | 427 DoCopyTexSubImage2D(decoder, source_target, source_id, dest_id, xoffset, |
422 yoffset, source_width, source_height, framebuffer_); | 428 yoffset, x, y, width, height, framebuffer_); |
423 return; | 429 return; |
424 } | 430 } |
425 | 431 |
426 // Use kIdentityMatrix if no transform passed in. | 432 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset - x, |
427 DoCopySubTextureWithTransform( | 433 yoffset - y, dest_width, dest_height, source_width, |
428 decoder, source_target, source_id, dest_id, xoffset, yoffset, dest_width, | 434 source_height, flip_y, premultiply_alpha, |
429 dest_height, source_width, source_height, flip_y, premultiply_alpha, | 435 unpremultiply_alpha, kIdentityMatrix, xoffset, yoffset, |
430 unpremultiply_alpha, kIdentityMatrix); | 436 width, height); |
431 } | 437 } |
432 | 438 |
433 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( | 439 void CopyTextureCHROMIUMResourceManager::DoCopyTextureWithTransform( |
434 const gles2::GLES2Decoder* decoder, | 440 const gles2::GLES2Decoder* decoder, |
435 GLenum source_target, | 441 GLenum source_target, |
436 GLuint source_id, | 442 GLuint source_id, |
437 GLuint dest_id, | 443 GLuint dest_id, |
438 GLsizei width, | 444 GLsizei width, |
439 GLsizei height, | 445 GLsizei height, |
440 bool flip_y, | 446 bool flip_y, |
441 bool premultiply_alpha, | 447 bool premultiply_alpha, |
442 bool unpremultiply_alpha, | 448 bool unpremultiply_alpha, |
443 const GLfloat transform_matrix[16]) { | 449 const GLfloat transform_matrix[16]) { |
444 GLsizei dest_width = width; | 450 GLsizei dest_width = width; |
445 GLsizei dest_height = height; | 451 GLsizei dest_height = height; |
446 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, 0, 0, | 452 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, 0, 0, |
447 dest_width, dest_height, width, height, flip_y, | 453 dest_width, dest_height, width, height, flip_y, |
448 premultiply_alpha, unpremultiply_alpha, | 454 premultiply_alpha, unpremultiply_alpha, |
449 transform_matrix); | 455 transform_matrix, 0, 0, dest_width, dest_height); |
450 } | |
451 | |
452 void CopyTextureCHROMIUMResourceManager::DoCopySubTextureWithTransform( | |
453 const gles2::GLES2Decoder* decoder, | |
454 GLenum source_target, | |
455 GLuint source_id, | |
456 GLuint dest_id, | |
457 GLint xoffset, | |
458 GLint yoffset, | |
459 GLsizei dest_width, | |
460 GLsizei dest_height, | |
461 GLsizei source_width, | |
462 GLsizei source_height, | |
463 bool flip_y, | |
464 bool premultiply_alpha, | |
465 bool unpremultiply_alpha, | |
466 const GLfloat transform_matrix[16]) { | |
467 DoCopyTextureInternal(decoder, source_target, source_id, dest_id, xoffset, | |
468 yoffset, dest_width, dest_height, source_width, | |
469 source_height, flip_y, premultiply_alpha, | |
470 unpremultiply_alpha, transform_matrix); | |
471 } | 456 } |
472 | 457 |
473 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( | 458 void CopyTextureCHROMIUMResourceManager::DoCopyTextureInternal( |
474 const gles2::GLES2Decoder* decoder, | 459 const gles2::GLES2Decoder* decoder, |
475 GLenum source_target, | 460 GLenum source_target, |
476 GLuint source_id, | 461 GLuint source_id, |
477 GLuint dest_id, | 462 GLuint dest_id, |
478 GLint xoffset, | 463 GLint xoffset, |
479 GLint yoffset, | 464 GLint yoffset, |
480 GLsizei dest_width, | 465 GLsizei dest_width, |
481 GLsizei dest_height, | 466 GLsizei dest_height, |
482 GLsizei source_width, | 467 GLsizei source_width, |
483 GLsizei source_height, | 468 GLsizei source_height, |
484 bool flip_y, | 469 bool flip_y, |
485 bool premultiply_alpha, | 470 bool premultiply_alpha, |
486 bool unpremultiply_alpha, | 471 bool unpremultiply_alpha, |
487 const GLfloat transform_matrix[16]) { | 472 const GLfloat transform_matrix[16], |
| 473 GLint scissor_x, |
| 474 GLint scissor_y, |
| 475 GLsizei scissor_width, |
| 476 GLsizei scissor_height) { |
488 DCHECK(source_target == GL_TEXTURE_2D || | 477 DCHECK(source_target == GL_TEXTURE_2D || |
489 source_target == GL_TEXTURE_RECTANGLE_ARB || | 478 source_target == GL_TEXTURE_RECTANGLE_ARB || |
490 source_target == GL_TEXTURE_EXTERNAL_OES); | 479 source_target == GL_TEXTURE_EXTERNAL_OES); |
491 DCHECK(xoffset >= 0 && xoffset + source_width <= dest_width); | 480 DCHECK(xoffset >= 0 && xoffset + source_width <= dest_width); |
492 DCHECK(yoffset >= 0 && yoffset + source_height <= dest_height); | 481 DCHECK(yoffset >= 0 && yoffset + source_height <= dest_height); |
493 if (!initialized_) { | 482 if (!initialized_) { |
494 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; | 483 DLOG(ERROR) << "CopyTextureCHROMIUM: Uninitialized manager."; |
495 return; | 484 return; |
496 } | 485 } |
497 | 486 |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 | 562 |
574 glUniform1i(info->sampler_handle, 0); | 563 glUniform1i(info->sampler_handle, 0); |
575 | 564 |
576 glBindTexture(source_target, source_id); | 565 glBindTexture(source_target, source_id); |
577 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 566 glTexParameterf(source_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
578 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | 567 glTexParameterf(source_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
579 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | 568 glTexParameteri(source_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); |
580 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | 569 glTexParameteri(source_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); |
581 | 570 |
582 glDisable(GL_DEPTH_TEST); | 571 glDisable(GL_DEPTH_TEST); |
583 glDisable(GL_SCISSOR_TEST); | |
584 glDisable(GL_STENCIL_TEST); | 572 glDisable(GL_STENCIL_TEST); |
585 glDisable(GL_CULL_FACE); | 573 glDisable(GL_CULL_FACE); |
586 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | 574 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); |
587 glDepthMask(GL_FALSE); | 575 glDepthMask(GL_FALSE); |
588 glDisable(GL_BLEND); | 576 glDisable(GL_BLEND); |
589 | 577 |
| 578 glEnable(GL_SCISSOR_TEST); |
| 579 glScissor(scissor_x, scissor_y, scissor_width, scissor_height); |
590 glViewport(0, 0, dest_width, dest_height); | 580 glViewport(0, 0, dest_width, dest_height); |
591 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); | 581 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
592 } | 582 } |
593 | 583 |
594 decoder->RestoreAllAttributes(); | 584 decoder->RestoreAllAttributes(); |
595 decoder->RestoreTextureState(source_id); | 585 decoder->RestoreTextureState(source_id); |
596 decoder->RestoreTextureState(dest_id); | 586 decoder->RestoreTextureState(dest_id); |
597 decoder->RestoreTextureUnitBindings(0); | 587 decoder->RestoreTextureUnitBindings(0); |
598 decoder->RestoreActiveTexture(); | 588 decoder->RestoreActiveTexture(); |
599 decoder->RestoreProgramBindings(); | 589 decoder->RestoreProgramBindings(); |
600 decoder->RestoreBufferBindings(); | 590 decoder->RestoreBufferBindings(); |
601 decoder->RestoreFramebufferBindings(); | 591 decoder->RestoreFramebufferBindings(); |
602 decoder->RestoreGlobalState(); | 592 decoder->RestoreGlobalState(); |
603 } | 593 } |
604 | 594 |
605 } // namespace gpu | 595 } // namespace gpu |
OLD | NEW |