| OLD | NEW |
| 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 <GLES2/gl2ext.h> | 9 #include <GLES2/gl2ext.h> |
| 10 #include <GLES2/gles2_command_buffer.h> | 10 #include <GLES2/gles2_command_buffer.h> |
| (...skipping 1366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1377 return; | 1377 return; |
| 1378 } | 1378 } |
| 1379 | 1379 |
| 1380 GLsizei original_height = height; | 1380 GLsizei original_height = height; |
| 1381 if (padded_row_size <= max_size) { | 1381 if (padded_row_size <= max_size) { |
| 1382 // Transfer by rows. | 1382 // Transfer by rows. |
| 1383 GLint max_rows = max_size / std::max(padded_row_size, | 1383 GLint max_rows = max_size / std::max(padded_row_size, |
| 1384 static_cast<GLsizeiptr>(1)); | 1384 static_cast<GLsizeiptr>(1)); |
| 1385 while (height) { | 1385 while (height) { |
| 1386 GLint num_rows = std::min(height, max_rows); | 1386 GLint num_rows = std::min(height, max_rows); |
| 1387 GLsizeiptr part_size = num_rows * padded_row_size; | 1387 GLsizeiptr part_size = |
| 1388 (num_rows - 1) * padded_row_size + unpadded_row_size; |
| 1388 void* buffer = transfer_buffer_.Alloc(part_size); | 1389 void* buffer = transfer_buffer_.Alloc(part_size); |
| 1389 GLint y; | 1390 GLint y; |
| 1390 if (unpack_flip_y_) { | 1391 if (unpack_flip_y_) { |
| 1391 CopyRectToBufferFlipped( | 1392 CopyRectToBufferFlipped( |
| 1392 source, width, num_rows, format, type, buffer); | 1393 source, width, num_rows, format, type, buffer); |
| 1393 // GPU_DCHECK(copy_success); // can't check this because bot fails! | 1394 // GPU_DCHECK(copy_success); // can't check this because bot fails! |
| 1394 y = original_height - yoffset - num_rows; | 1395 y = original_height - yoffset - num_rows; |
| 1395 } else { | 1396 } else { |
| 1396 memcpy(buffer, source, part_size); | 1397 memcpy(buffer, source, part_size); |
| 1397 y = yoffset; | 1398 y = yoffset; |
| 1398 } | 1399 } |
| 1399 helper_->TexSubImage2D( | 1400 helper_->TexSubImage2D( |
| 1400 target, level, xoffset, y, width, num_rows, format, type, | 1401 target, level, xoffset, y, width, num_rows, format, type, |
| 1401 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); | 1402 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), internal); |
| 1402 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); | 1403 transfer_buffer_.FreePendingToken(buffer, helper_->InsertToken()); |
| 1403 yoffset += num_rows; | 1404 yoffset += num_rows; |
| 1404 source += part_size; | 1405 source += num_rows * padded_row_size; |
| 1405 height -= num_rows; | 1406 height -= num_rows; |
| 1406 } | 1407 } |
| 1407 } else { | 1408 } else { |
| 1408 // Transfer by sub rows. Because GL has no maximum texture dimensions. | 1409 // Transfer by sub rows. Because GL has no maximum texture dimensions. |
| 1409 uint32 temp; | 1410 uint32 temp; |
| 1410 GLES2Util::ComputeImageDataSize( | 1411 GLES2Util::ComputeImageDataSize( |
| 1411 1, 1, format, type, unpack_alignment_, &temp); | 1412 1, 1, format, type, unpack_alignment_, &temp); |
| 1412 GLsizeiptr element_size = temp; | 1413 GLsizeiptr element_size = temp; |
| 1413 max_size -= max_size % element_size; | 1414 max_size -= max_size % element_size; |
| 1414 GLint max_sub_row_pixels = max_size / element_size; | 1415 GLint max_sub_row_pixels = max_size / element_size; |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1734 // Transfer by rows. | 1735 // Transfer by rows. |
| 1735 // The max rows we can transfer. | 1736 // The max rows we can transfer. |
| 1736 GLint max_rows = max_size / std::max(padded_row_size, | 1737 GLint max_rows = max_size / std::max(padded_row_size, |
| 1737 static_cast<GLsizeiptr>(1)); | 1738 static_cast<GLsizeiptr>(1)); |
| 1738 while (height) { | 1739 while (height) { |
| 1739 // Compute how many rows to transfer. | 1740 // Compute how many rows to transfer. |
| 1740 GLint num_rows = std::min(height, max_rows); | 1741 GLint num_rows = std::min(height, max_rows); |
| 1741 // Compute how much space those rows will take. The last row will not | 1742 // Compute how much space those rows will take. The last row will not |
| 1742 // include padding. | 1743 // include padding. |
| 1743 GLsizeiptr part_size = | 1744 GLsizeiptr part_size = |
| 1744 unpadded_row_size + (padded_row_size * std::max(num_rows - 1, 0)); | 1745 unpadded_row_size + padded_row_size * (num_rows - 1); |
| 1745 void* buffer = transfer_buffer_.Alloc(part_size); | 1746 void* buffer = transfer_buffer_.Alloc(part_size); |
| 1746 *result = 0; // mark as failed. | 1747 *result = 0; // mark as failed. |
| 1747 helper_->ReadPixels( | 1748 helper_->ReadPixels( |
| 1748 xoffset, yoffset, width, num_rows, format, type, | 1749 xoffset, yoffset, width, num_rows, format, type, |
| 1749 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), | 1750 transfer_buffer_id_, transfer_buffer_.GetOffset(buffer), |
| 1750 result_shm_id(), result_shm_offset()); | 1751 result_shm_id(), result_shm_offset()); |
| 1751 WaitForCmd(); | 1752 WaitForCmd(); |
| 1752 if (*result != 0) { | 1753 if (*result != 0) { |
| 1753 // We have to copy 1 row at a time to avoid writing pad bytes. | 1754 // We have to copy 1 row at a time to avoid writing pad bytes. |
| 1754 const int8* src = static_cast<const int8*>(buffer); | 1755 const int8* src = static_cast<const int8*>(buffer); |
| (...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2360 if (static_cast<size_t>(bufsize) < result.size()) { | 2361 if (static_cast<size_t>(bufsize) < result.size()) { |
| 2361 SetGLError(GL_INVALID_OPERATION, | 2362 SetGLError(GL_INVALID_OPERATION, |
| 2362 "glProgramInfoCHROMIUM: bufsize is too small for result."); | 2363 "glProgramInfoCHROMIUM: bufsize is too small for result."); |
| 2363 return; | 2364 return; |
| 2364 } | 2365 } |
| 2365 memcpy(info, &result[0], result.size()); | 2366 memcpy(info, &result[0], result.size()); |
| 2366 } | 2367 } |
| 2367 | 2368 |
| 2368 } // namespace gles2 | 2369 } // namespace gles2 |
| 2369 } // namespace gpu | 2370 } // namespace gpu |
| OLD | NEW |