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 // A class to emulate GLES2 over command buffers. | 5 // A class to emulate GLES2 over command buffers. |
6 | 6 |
7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
8 | 8 |
9 #include <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
10 #include <GLES2/gl2ext.h> | 10 #include <GLES2/gl2ext.h> |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 TransferBufferInterface* transfer_buffer, | 78 TransferBufferInterface* transfer_buffer, |
79 bool bind_generates_resource, | 79 bool bind_generates_resource, |
80 bool lose_context_when_out_of_memory, | 80 bool lose_context_when_out_of_memory, |
81 bool support_client_side_arrays, | 81 bool support_client_side_arrays, |
82 GpuControl* gpu_control) | 82 GpuControl* gpu_control) |
83 : helper_(helper), | 83 : helper_(helper), |
84 transfer_buffer_(transfer_buffer), | 84 transfer_buffer_(transfer_buffer), |
85 angle_pack_reverse_row_order_status_(kUnknownExtensionStatus), | 85 angle_pack_reverse_row_order_status_(kUnknownExtensionStatus), |
86 chromium_framebuffer_multisample_(kUnknownExtensionStatus), | 86 chromium_framebuffer_multisample_(kUnknownExtensionStatus), |
87 pack_alignment_(4), | 87 pack_alignment_(4), |
| 88 pack_row_length_(0), |
| 89 pack_skip_pixels_(0), |
| 90 pack_skip_rows_(0), |
88 unpack_alignment_(4), | 91 unpack_alignment_(4), |
89 unpack_row_length_(0), | 92 unpack_row_length_(0), |
90 unpack_image_height_(0), | 93 unpack_image_height_(0), |
91 unpack_skip_rows_(0), | 94 unpack_skip_rows_(0), |
92 unpack_skip_pixels_(0), | 95 unpack_skip_pixels_(0), |
93 unpack_skip_images_(0), | 96 unpack_skip_images_(0), |
94 pack_reverse_row_order_(false), | 97 pack_reverse_row_order_(false), |
95 active_texture_unit_(0), | 98 active_texture_unit_(0), |
96 bound_framebuffer_(0), | 99 bound_framebuffer_(0), |
97 bound_read_framebuffer_(0), | 100 bound_read_framebuffer_(0), |
(...skipping 1612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1710 CheckGLError(); | 1713 CheckGLError(); |
1711 } | 1714 } |
1712 | 1715 |
1713 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { | 1716 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { |
1714 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1717 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
1715 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPixelStorei(" | 1718 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPixelStorei(" |
1716 << GLES2Util::GetStringPixelStore(pname) << ", " | 1719 << GLES2Util::GetStringPixelStore(pname) << ", " |
1717 << param << ")"); | 1720 << param << ")"); |
1718 switch (pname) { | 1721 switch (pname) { |
1719 case GL_PACK_ALIGNMENT: | 1722 case GL_PACK_ALIGNMENT: |
1720 pack_alignment_ = param; | 1723 pack_alignment_ = param; |
1721 break; | 1724 break; |
| 1725 case GL_PACK_ROW_LENGTH: |
| 1726 pack_row_length_ = param; |
| 1727 break; |
| 1728 case GL_PACK_SKIP_PIXELS: |
| 1729 pack_skip_pixels_ = param; |
| 1730 break; |
| 1731 case GL_PACK_SKIP_ROWS: |
| 1732 pack_skip_rows_ = param; |
| 1733 break; |
1722 case GL_UNPACK_ALIGNMENT: | 1734 case GL_UNPACK_ALIGNMENT: |
1723 unpack_alignment_ = param; | 1735 unpack_alignment_ = param; |
1724 break; | 1736 break; |
1725 case GL_UNPACK_ROW_LENGTH_EXT: | 1737 case GL_UNPACK_ROW_LENGTH_EXT: |
1726 unpack_row_length_ = param; | 1738 unpack_row_length_ = param; |
1727 return; | 1739 return; |
1728 case GL_UNPACK_IMAGE_HEIGHT: | 1740 case GL_UNPACK_IMAGE_HEIGHT: |
1729 unpack_image_height_ = param; | 1741 unpack_image_height_ = param; |
1730 return; | 1742 return; |
1731 case GL_UNPACK_SKIP_ROWS_EXT: | 1743 case GL_UNPACK_SKIP_ROWS_EXT: |
1732 unpack_skip_rows_ = param; | 1744 unpack_skip_rows_ = param; |
1733 return; | 1745 return; |
1734 case GL_UNPACK_SKIP_PIXELS_EXT: | 1746 case GL_UNPACK_SKIP_PIXELS_EXT: |
1735 unpack_skip_pixels_ = param; | 1747 unpack_skip_pixels_ = param; |
1736 return; | 1748 return; |
1737 case GL_UNPACK_SKIP_IMAGES: | 1749 case GL_UNPACK_SKIP_IMAGES: |
1738 unpack_skip_images_ = param; | 1750 unpack_skip_images_ = param; |
1739 return; | 1751 return; |
1740 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: | 1752 case GL_PACK_REVERSE_ROW_ORDER_ANGLE: |
1741 pack_reverse_row_order_ = | 1753 pack_reverse_row_order_ = |
1742 IsAnglePackReverseRowOrderAvailable() ? (param != 0) : false; | 1754 IsAnglePackReverseRowOrderAvailable() ? (param != 0) : false; |
1743 break; | 1755 break; |
1744 default: | 1756 default: |
1745 break; | 1757 break; |
1746 } | 1758 } |
1747 helper_->PixelStorei(pname, param); | 1759 helper_->PixelStorei(pname, param); |
1748 CheckGLError(); | 1760 CheckGLError(); |
1749 } | 1761 } |
1750 | 1762 |
1751 void GLES2Implementation::VertexAttribIPointer( | 1763 void GLES2Implementation::VertexAttribIPointer( |
1752 GLuint index, GLint size, GLenum type, GLsizei stride, const void* ptr) { | 1764 GLuint index, GLint size, GLenum type, GLsizei stride, const void* ptr) { |
1753 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 1765 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
1754 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribIPointer(" | 1766 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribIPointer(" |
1755 << index << ", " | 1767 << index << ", " |
(...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3465 uint32 temp_size; | 3477 uint32 temp_size; |
3466 uint32 unpadded_row_size; | 3478 uint32 unpadded_row_size; |
3467 uint32 padded_row_size; | 3479 uint32 padded_row_size; |
3468 if (!GLES2Util::ComputeImageDataSizes( | 3480 if (!GLES2Util::ComputeImageDataSizes( |
3469 width, 2, 1, format, type, pack_alignment_, &temp_size, | 3481 width, 2, 1, format, type, pack_alignment_, &temp_size, |
3470 &unpadded_row_size, &padded_row_size)) { | 3482 &unpadded_row_size, &padded_row_size)) { |
3471 SetGLError(GL_INVALID_VALUE, "glReadPixels", "size too large."); | 3483 SetGLError(GL_INVALID_VALUE, "glReadPixels", "size too large."); |
3472 return; | 3484 return; |
3473 } | 3485 } |
3474 | 3486 |
| 3487 if (bound_pixel_pack_buffer_) { |
| 3488 // TODO(zmo): Need to handle the case of reading into a PIXEL_PACK_BUFFER |
| 3489 // in ES3. For now, generate a GL error. |
| 3490 SetGLError(GL_INVALID_OPERATION, "glReadPixels", |
| 3491 "ReadPixels to a pixel pack buffer isn't implemented"); |
| 3492 return; |
| 3493 } |
| 3494 |
3475 if (bound_pixel_pack_transfer_buffer_id_) { | 3495 if (bound_pixel_pack_transfer_buffer_id_) { |
3476 GLuint offset = ToGLuint(pixels); | 3496 GLuint offset = ToGLuint(pixels); |
3477 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( | 3497 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( |
3478 bound_pixel_pack_transfer_buffer_id_, | 3498 bound_pixel_pack_transfer_buffer_id_, |
3479 "glReadPixels", offset, padded_row_size * height); | 3499 "glReadPixels", offset, padded_row_size * height); |
3480 if (buffer && buffer->shm_id() != -1) { | 3500 if (buffer && buffer->shm_id() != -1) { |
3481 helper_->ReadPixels(xoffset, yoffset, width, height, format, type, | 3501 helper_->ReadPixels(xoffset, yoffset, width, height, format, type, |
3482 buffer->shm_id(), buffer->shm_offset(), | 3502 buffer->shm_id(), buffer->shm_offset(), |
3483 0, 0, true); | 3503 0, 0, true); |
3484 CheckGLError(); | 3504 CheckGLError(); |
3485 } | 3505 } |
3486 return; | 3506 return; |
3487 } | 3507 } |
3488 | 3508 |
3489 if (!pixels) { | 3509 if (!pixels) { |
3490 SetGLError(GL_INVALID_OPERATION, "glReadPixels", "pixels = NULL"); | 3510 SetGLError(GL_INVALID_OPERATION, "glReadPixels", "pixels = NULL"); |
3491 return; | 3511 return; |
3492 } | 3512 } |
3493 | 3513 |
| 3514 // compute the advance bytes per row for the dst pixels |
| 3515 uint32 dst_padded_row_size; |
| 3516 if (pack_row_length_ > 0) { |
| 3517 if (!GLES2Util::ComputeImagePaddedRowSize( |
| 3518 pack_row_length_, format, type, pack_alignment_, |
| 3519 &dst_padded_row_size)) { |
| 3520 SetGLError( |
| 3521 GL_INVALID_VALUE, "glReadPixels", "pack row length too large"); |
| 3522 return; |
| 3523 } |
| 3524 } else { |
| 3525 dst_padded_row_size = padded_row_size; |
| 3526 } |
| 3527 |
| 3528 // Advance pixels pointer past the skip rows and skip pixels |
| 3529 dest += pack_skip_rows_ * dst_padded_row_size; |
| 3530 if (pack_skip_pixels_) { |
| 3531 uint32 group_size = GLES2Util::ComputeImageGroupSize(format, type); |
| 3532 dest += pack_skip_pixels_ * group_size; |
| 3533 } |
| 3534 |
3494 // Transfer by rows. | 3535 // Transfer by rows. |
3495 // The max rows we can transfer. | 3536 // The max rows we can transfer. |
3496 while (height) { | 3537 while (height) { |
3497 GLsizei desired_size = padded_row_size * (height - 1) + unpadded_row_size; | 3538 GLsizei desired_size = padded_row_size * (height - 1) + unpadded_row_size; |
3498 ScopedTransferBufferPtr buffer(desired_size, helper_, transfer_buffer_); | 3539 ScopedTransferBufferPtr buffer(desired_size, helper_, transfer_buffer_); |
3499 if (!buffer.valid()) { | 3540 if (!buffer.valid()) { |
3500 return; | 3541 return; |
3501 } | 3542 } |
3502 GLint num_rows = ComputeNumRowsThatFitInBuffer( | 3543 GLint num_rows = ComputeNumRowsThatFitInBuffer( |
3503 padded_row_size, unpadded_row_size, buffer.size(), height); | 3544 padded_row_size, unpadded_row_size, buffer.size(), height); |
(...skipping 10 matching lines...) Expand all Loading... |
3514 buffer.shm_id(), buffer.offset(), | 3555 buffer.shm_id(), buffer.offset(), |
3515 GetResultShmId(), GetResultShmOffset(), | 3556 GetResultShmId(), GetResultShmOffset(), |
3516 false); | 3557 false); |
3517 WaitForCmd(); | 3558 WaitForCmd(); |
3518 if (*result != 0) { | 3559 if (*result != 0) { |
3519 // when doing a y-flip we have to iterate through top-to-bottom chunks | 3560 // when doing a y-flip we have to iterate through top-to-bottom chunks |
3520 // of the dst. The service side handles reversing the rows within a | 3561 // of the dst. The service side handles reversing the rows within a |
3521 // chunk. | 3562 // chunk. |
3522 int8* rows_dst; | 3563 int8* rows_dst; |
3523 if (pack_reverse_row_order_) { | 3564 if (pack_reverse_row_order_) { |
3524 rows_dst = dest + (height - num_rows) * padded_row_size; | 3565 rows_dst = dest + (height - num_rows) * dst_padded_row_size; |
3525 } else { | 3566 } else { |
3526 rows_dst = dest; | 3567 rows_dst = dest; |
3527 } | 3568 } |
3528 // We have to copy 1 row at a time to avoid writing pad bytes. | 3569 // We have to copy 1 row at a time to avoid writing pad bytes. |
3529 const int8* src = static_cast<const int8*>(buffer.address()); | 3570 const int8* src = static_cast<const int8*>(buffer.address()); |
3530 for (GLint yy = 0; yy < num_rows; ++yy) { | 3571 for (GLint yy = 0; yy < num_rows; ++yy) { |
3531 memcpy(rows_dst, src, unpadded_row_size); | 3572 memcpy(rows_dst, src, unpadded_row_size); |
3532 rows_dst += padded_row_size; | 3573 rows_dst += dst_padded_row_size; |
3533 src += padded_row_size; | 3574 src += padded_row_size; |
3534 } | 3575 } |
3535 if (!pack_reverse_row_order_) { | 3576 if (!pack_reverse_row_order_) { |
3536 dest = rows_dst; | 3577 dest = rows_dst; |
3537 } | 3578 } |
3538 } | 3579 } |
3539 // If it was not marked as successful exit. | 3580 // If it was not marked as successful exit. |
3540 if (*result == 0) { | 3581 if (*result == 0) { |
3541 return; | 3582 return; |
3542 } | 3583 } |
(...skipping 2847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6390 CheckGLError(); | 6431 CheckGLError(); |
6391 } | 6432 } |
6392 | 6433 |
6393 // Include the auto-generated part of this file. We split this because it means | 6434 // Include the auto-generated part of this file. We split this because it means |
6394 // we can easily edit the non-auto generated parts right here in this file | 6435 // we can easily edit the non-auto generated parts right here in this file |
6395 // instead of having to edit some template or the code generator. | 6436 // instead of having to edit some template or the code generator. |
6396 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 6437 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
6397 | 6438 |
6398 } // namespace gles2 | 6439 } // namespace gles2 |
6399 } // namespace gpu | 6440 } // namespace gpu |
OLD | NEW |