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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 8587040: Fix for GL_CHROMIUM_flipy in TexSubImage2D (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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
« no previous file with comments | « no previous file | gpu/command_buffer/client/gles2_implementation_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "../client/gles2_implementation.h" 7 #include "../client/gles2_implementation.h"
8 8
9 #include <set> 9 #include <set>
10 #include <queue> 10 #include <queue>
(...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after
1562 width, 2, format, type, unpack_alignment_, &temp_size)) { 1562 width, 2, format, type, unpack_alignment_, &temp_size)) {
1563 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large"); 1563 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large");
1564 return; 1564 return;
1565 } 1565 }
1566 GLsizeiptr padded_row_size = temp_size - unpadded_row_size; 1566 GLsizeiptr padded_row_size = temp_size - unpadded_row_size;
1567 if (padded_row_size < 0 || unpadded_row_size < 0) { 1567 if (padded_row_size < 0 || unpadded_row_size < 0) {
1568 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large"); 1568 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D: size to large");
1569 return; 1569 return;
1570 } 1570 }
1571 1571
1572 GLsizei original_height = height; 1572 GLint original_yoffset = yoffset;
1573 if (padded_row_size <= max_size) { 1573 if (padded_row_size <= max_size) {
1574 // Transfer by rows. 1574 // Transfer by rows.
1575 GLint max_rows = max_size / std::max(padded_row_size, 1575 GLint max_rows = max_size / std::max(padded_row_size,
1576 static_cast<GLsizeiptr>(1)); 1576 static_cast<GLsizeiptr>(1));
1577 while (height) { 1577 while (height) {
1578 GLint num_rows = std::min(height, max_rows); 1578 GLint num_rows = std::min(height, max_rows);
1579 GLsizeiptr part_size = 1579 GLsizeiptr part_size =
1580 (num_rows - 1) * padded_row_size + unpadded_row_size; 1580 (num_rows - 1) * padded_row_size + unpadded_row_size;
1581 void* buffer = transfer_buffer_.Alloc(part_size); 1581 void* buffer = transfer_buffer_.Alloc(part_size);
1582 GLint y; 1582 GLint y;
1583 if (unpack_flip_y_) { 1583 if (unpack_flip_y_) {
1584 CopyRectToBufferFlipped( 1584 CopyRectToBufferFlipped(
1585 source, width, num_rows, format, type, buffer); 1585 source, width, num_rows, format, type, buffer);
1586 // GPU_DCHECK(copy_success); // can't check this because bot fails! 1586 // GPU_DCHECK(copy_success); // can't check this because bot fails!
1587 y = original_height - yoffset - num_rows; 1587 y = original_yoffset + height - num_rows;
1588 } else { 1588 } else {
1589 memcpy(buffer, source, part_size); 1589 memcpy(buffer, source, part_size);
1590 y = yoffset; 1590 y = yoffset;
1591 } 1591 }
1592 helper_->TexSubImage2D( 1592 helper_->TexSubImage2D(
1593 target, level, xoffset, y, width, num_rows, format, type, 1593 target, level, xoffset, y, width, num_rows, format, type,
1594 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); 1594 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal);
1595 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); 1595 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
1596 yoffset += num_rows; 1596 yoffset += num_rows;
1597 source += num_rows * padded_row_size; 1597 source += num_rows * padded_row_size;
1598 height -= num_rows; 1598 height -= num_rows;
1599 } 1599 }
1600 } else { 1600 } else {
1601 // Transfer by sub rows. Because GL has no maximum texture dimensions. 1601 // Transfer by sub rows. Because GL has no maximum texture dimensions.
1602 uint32 temp; 1602 uint32 temp;
1603 GLES2Util::ComputeImageDataSize( 1603 GLES2Util::ComputeImageDataSize(
1604 1, 1, format, type, unpack_alignment_, &temp); 1604 1, 1, format, type, unpack_alignment_, &temp);
1605 GLsizeiptr element_size = temp; 1605 GLsizeiptr element_size = temp;
1606 max_size -= max_size % element_size; 1606 max_size -= max_size % element_size;
1607 GLint max_sub_row_pixels = max_size / element_size; 1607 GLint max_sub_row_pixels = max_size / element_size;
1608 for (; height; --height) { 1608 for (; height; --height) {
1609 GLint temp_width = width; 1609 GLint temp_width = width;
1610 GLint temp_xoffset = xoffset; 1610 GLint temp_xoffset = xoffset;
1611 const int8* row_source = source; 1611 const int8* row_source = source;
1612 while (temp_width) { 1612 while (temp_width) {
1613 GLint num_pixels = std::min(width, max_sub_row_pixels); 1613 GLint num_pixels = std::min(width, max_sub_row_pixels);
1614 GLsizeiptr part_size = num_pixels * element_size; 1614 GLsizeiptr part_size = num_pixels * element_size;
1615 void* buffer = transfer_buffer_.Alloc(part_size); 1615 void* buffer = transfer_buffer_.Alloc(part_size);
1616 memcpy(buffer, row_source, part_size); 1616 memcpy(buffer, row_source, part_size);
1617 GLint y = unpack_flip_y_ ? (original_height - yoffset - 1) : yoffset; 1617 GLint y = unpack_flip_y_ ? (original_yoffset + height - 1) : yoffset;
1618 helper_->TexSubImage2D( 1618 helper_->TexSubImage2D(
1619 target, level, temp_xoffset, y, num_pixels, 1, format, type, 1619 target, level, temp_xoffset, y, num_pixels, 1, format, type,
1620 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); 1620 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal);
1621 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); 1621 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken());
1622 row_source += part_size; 1622 row_source += part_size;
1623 temp_xoffset += num_pixels; 1623 temp_xoffset += num_pixels;
1624 temp_width -= num_pixels; 1624 temp_width -= num_pixels;
1625 } 1625 }
1626 ++yoffset; 1626 ++yoffset;
1627 source += padded_row_size; 1627 source += padded_row_size;
(...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after
2660 helper_->PostSubBufferCHROMIUM(x, y, width, height); 2660 helper_->PostSubBufferCHROMIUM(x, y, width, height);
2661 helper_->CommandBufferHelper::Flush(); 2661 helper_->CommandBufferHelper::Flush();
2662 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { 2662 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) {
2663 helper_->WaitForToken(swap_buffers_tokens_.front()); 2663 helper_->WaitForToken(swap_buffers_tokens_.front());
2664 swap_buffers_tokens_.pop(); 2664 swap_buffers_tokens_.pop();
2665 } 2665 }
2666 } 2666 }
2667 2667
2668 } // namespace gles2 2668 } // namespace gles2
2669 } // namespace gpu 2669 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/client/gles2_implementation_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698