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

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

Issue 706173005: Enable asynchronous glReadPixels on Windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add mechanism to propagate service-side glMapBuffer errors + tests. Created 6 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
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_decoder.h" 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 7520 matching lines...) Expand 10 before | Expand all | Expand 10 after
7531 } 7531 }
7532 GLES2Util::ComputeImageDataSizes( 7532 GLES2Util::ComputeImageDataSizes(
7533 width, height, format, type, state_.pack_alignment, &pixels_size, 7533 width, height, format, type, state_.pack_alignment, &pixels_size,
7534 NULL, NULL); 7534 NULL, NULL);
7535 void* pixels = GetSharedMemoryAs<void*>( 7535 void* pixels = GetSharedMemoryAs<void*>(
7536 c.pixels_shm_id, c.pixels_shm_offset, pixels_size); 7536 c.pixels_shm_id, c.pixels_shm_offset, pixels_size);
7537 if (!pixels) { 7537 if (!pixels) {
7538 if (buffer != 0) { 7538 if (buffer != 0) {
7539 glDeleteBuffersARB(1, &buffer); 7539 glDeleteBuffersARB(1, &buffer);
7540 } 7540 }
7541 if (result)
7542 *result = GL_INVALID_VALUE;
7541 return; 7543 return;
7542 } 7544 }
7543 7545
7544 if (buffer != 0) { 7546 if (buffer != 0) { // Asynchronous readback path.
7545 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); 7547 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
7546 void* data; 7548 void* data;
7547 if (features().map_buffer_range) { 7549 if (features().map_buffer_range) {
7548 data = glMapBufferRange( 7550 data = glMapBufferRange(
7549 GL_PIXEL_PACK_BUFFER_ARB, 0, pixels_size, GL_MAP_READ_BIT); 7551 GL_PIXEL_PACK_BUFFER_ARB, 0, pixels_size, GL_MAP_READ_BIT);
7550 } else { 7552 } else {
7551 data = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY); 7553 data = glMapBuffer(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY);
7552 } 7554 }
7553 memcpy(pixels, data, pixels_size); 7555 if (result)
7556 *result = glGetError();
7557 if (data)
7558 memcpy(pixels, data, pixels_size);
7554 // GL_PIXEL_PACK_BUFFER_ARB is currently unused, so we don't 7559 // GL_PIXEL_PACK_BUFFER_ARB is currently unused, so we don't
7555 // have to restore the state. 7560 // have to restore the state.
7556 glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB); 7561 glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);
7557 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 7562 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
7558 glDeleteBuffersARB(1, &buffer); 7563 glDeleteBuffersARB(1, &buffer);
7559 } 7564 if (!data)
7560 7565 return;
7561 if (result != NULL) {
7562 *result = true;
7563 } 7566 }
7564 7567
7565 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); 7568 GLenum read_format = GetBoundReadFrameBufferInternalFormat();
7566 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); 7569 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format);
7567 if ((channels_exist & 0x0008) == 0 && 7570 if ((channels_exist & 0x0008) == 0 &&
7568 workarounds().clear_alpha_in_readpixels) { 7571 workarounds().clear_alpha_in_readpixels) {
7569 // Set the alpha to 255 because some drivers are buggy in this regard. 7572 // Set the alpha to 255 because some drivers are buggy in this regard.
7570 uint32 temp_size; 7573 uint32 temp_size;
7571 7574
7572 uint32 unpadded_row_size; 7575 uint32 unpadded_row_size;
7573 uint32 padded_row_size; 7576 uint32 padded_row_size;
7574 if (!GLES2Util::ComputeImageDataSizes( 7577 if (!GLES2Util::ComputeImageDataSizes(
7575 width, 2, format, type, state_.pack_alignment, &temp_size, 7578 width, 2, format, type, state_.pack_alignment, &temp_size,
7576 &unpadded_row_size, &padded_row_size)) { 7579 &unpadded_row_size, &padded_row_size)) {
7580 if (result)
7581 *result = GL_INVALID_VALUE;
7577 return; 7582 return;
7578 } 7583 }
7579 7584
7580 uint32 channel_count = 0; 7585 uint32 channel_count = 0;
7581 uint32 alpha_channel = 0; 7586 uint32 alpha_channel = 0;
7582 switch (format) { 7587 switch (format) {
7583 case GL_RGBA: 7588 case GL_RGBA:
7584 case GL_BGRA_EXT: 7589 case GL_BGRA_EXT:
7585 channel_count = 4; 7590 channel_count = 4;
7586 alpha_channel = 3; 7591 alpha_channel = 3;
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
7744 glReadPixels( 7749 glReadPixels(
7745 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); 7750 read_x, ry, read_width, 1, format, type, dst + dest_row_offset);
7746 } 7751 }
7747 dst += padded_row_size; 7752 dst += padded_row_size;
7748 } 7753 }
7749 } else { 7754 } else {
7750 if (async && features().use_async_readpixels) { 7755 if (async && features().use_async_readpixels) {
7751 GLuint buffer = 0; 7756 GLuint buffer = 0;
7752 glGenBuffersARB(1, &buffer); 7757 glGenBuffersARB(1, &buffer);
7753 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer); 7758 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, buffer);
7754 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, GL_STREAM_READ); 7759 // For ANGLE client version 2, GL_STREAM_READ is not available.
7760 const GLenum usage_hint =
7761 features().is_angle ? GL_STATIC_DRAW : GL_STREAM_READ;
7762 glBufferData(GL_PIXEL_PACK_BUFFER_ARB, pixels_size, NULL, usage_hint);
7755 GLenum error = glGetError(); 7763 GLenum error = glGetError();
7756 if (error == GL_NO_ERROR) { 7764 if (error == GL_NO_ERROR) {
7757 glReadPixels(x, y, width, height, format, type, 0); 7765 glReadPixels(x, y, width, height, format, type, 0);
7758 pending_readpixel_fences_.push(linked_ptr<FenceCallback>( 7766 error = glGetError();
7759 new FenceCallback())); 7767 if (result)
7760 WaitForReadPixels(base::Bind( 7768 *result = error;
7761 &GLES2DecoderImpl::FinishReadPixels, 7769 if (error == GL_NO_ERROR) {
7762 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr 7770 pending_readpixel_fences_.push(linked_ptr<FenceCallback>(
7763 <GLES2DecoderImpl>(this), 7771 new FenceCallback()));
7764 c, buffer)); 7772 WaitForReadPixels(base::Bind(
7773 &GLES2DecoderImpl::FinishReadPixels,
7774 base::internal::SupportsWeakPtrBase::StaticAsWeakPtr
7775 <GLES2DecoderImpl>(this),
7776 c, buffer));
7777 }
7765 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 7778 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
7766 return error::kNoError; 7779 return error::kNoError;
7767 } else { 7780 } else {
7768 // On error, unbind pack buffer and fall through to sync readpixels 7781 // On error, unbind pack buffer and fall through to sync readpixels
7769 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0); 7782 glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);
7770 glDeleteBuffersARB(1, &buffer); 7783 glDeleteBuffersARB(1, &buffer);
7771 } 7784 }
7772 } 7785 }
7773 glReadPixels(x, y, width, height, format, type, pixels); 7786 glReadPixels(x, y, width, height, format, type, pixels);
7774 } 7787 }
7775 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); 7788 const GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels");
7776 if (error == GL_NO_ERROR) { 7789 if (result)
7777 if (result != NULL) { 7790 *result = error;
7778 *result = true; 7791 if (error == GL_NO_ERROR)
7779 }
7780 FinishReadPixels(c, 0); 7792 FinishReadPixels(c, 0);
7781 }
7782 7793
7783 return error::kNoError; 7794 return error::kNoError;
7784 } 7795 }
7785 7796
7786 error::Error GLES2DecoderImpl::HandlePixelStorei(uint32 immediate_data_size, 7797 error::Error GLES2DecoderImpl::HandlePixelStorei(uint32 immediate_data_size,
7787 const void* cmd_data) { 7798 const void* cmd_data) {
7788 const gles2::cmds::PixelStorei& c = 7799 const gles2::cmds::PixelStorei& c =
7789 *static_cast<const gles2::cmds::PixelStorei*>(cmd_data); 7800 *static_cast<const gles2::cmds::PixelStorei*>(cmd_data);
7790 GLenum pname = c.pname; 7801 GLenum pname = c.pname;
7791 GLenum param = c.param; 7802 GLenum param = c.param;
(...skipping 3670 matching lines...) Expand 10 before | Expand all | Expand 10 after
11462 } 11473 }
11463 } 11474 }
11464 11475
11465 // Include the auto-generated part of this file. We split this because it means 11476 // Include the auto-generated part of this file. We split this because it means
11466 // we can easily edit the non-auto generated parts right here in this file 11477 // we can easily edit the non-auto generated parts right here in this file
11467 // instead of having to edit some template or the code generator. 11478 // instead of having to edit some template or the code generator.
11468 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 11479 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
11469 11480
11470 } // namespace gles2 11481 } // namespace gles2
11471 } // namespace gpu 11482 } // namespace gpu
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698