Chromium Code Reviews| Index: gpu/command_buffer/client/gles2_implementation.cc |
| diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc |
| index fbc92d58939c8c39999c73c2d3a23393820a936c..0a5f5fc8ceb616786b783df1899d25f14dce928a 100644 |
| --- a/gpu/command_buffer/client/gles2_implementation.cc |
| +++ b/gpu/command_buffer/client/gles2_implementation.cc |
| @@ -2236,8 +2236,7 @@ void GLES2Implementation::ReadPixels( |
| if (buffer && buffer->shm_id() != -1) { |
| helper_->ReadPixels(xoffset, yoffset, width, height, format, type, |
| buffer->shm_id(), buffer->shm_offset(), |
| - 0, 0); |
| - buffer->set_transfer_ready_token(helper_->InsertToken()); |
| + 0, 0, true); |
| CheckGLError(); |
| } |
| return; |
| @@ -2269,7 +2268,8 @@ void GLES2Implementation::ReadPixels( |
| helper_->ReadPixels( |
| xoffset, yoffset, width, num_rows, format, type, |
| buffer.shm_id(), buffer.offset(), |
| - GetResultShmId(), GetResultShmOffset()); |
| + GetResultShmId(), GetResultShmOffset(), |
| + false); |
| WaitForCmd(); |
| if (*result != 0) { |
| // when doing a y-flip we have to iterate through top-to-bottom chunks |
| @@ -3181,10 +3181,12 @@ void GLES2Implementation::DeleteQueriesEXTHelper( |
| // TODO(gman): Consider making this faster by putting pending quereies |
| // on some queue to be removed when they are finished. |
| + // TODO(hubbe): Consider using signalQuery callback to delete pending |
| + // queries. |
| bool query_pending = false; |
| for (GLsizei ii = 0; ii < n; ++ii) { |
| QueryTracker::Query* query = query_tracker_->GetQuery(queries[ii]); |
| - if (query && query->Pending()) { |
| + if (query && !query->CheckResultsAvailable(helper_)) { |
| query_pending = true; |
| break; |
| } |
| @@ -3192,15 +3194,30 @@ void GLES2Implementation::DeleteQueriesEXTHelper( |
| if (query_pending) { |
| WaitForCmd(); |
| + |
| + query_pending = false; |
| + for (GLsizei ii = 0; ii < n; ++ii) { |
| + QueryTracker::Query* query = query_tracker_->GetQuery(queries[ii]); |
| + if (query && !query->CheckResultsAvailable(helper_)) { |
| + query_pending = true; |
| + break; |
| + } |
| + } |
| + if (query_pending) { |
| + // Some queries may still not be done even after the GPU process |
| + // has sent the command to the driver. When this happens we need |
| + // to use glFinish() to wait for the query to finish. |
| + // Moral of this story: Don't delete pending queries! |
| + helper_->Finish(); |
|
piman
2013/06/26 22:17:08
Why do we need to do this?
DeleteQueries + WaitFor
hubbe
2013/06/28 22:17:49
That does sound perfectly reasonable, but then why
piman
2013/06/28 23:35:46
I think you accidentally a word, and I don't under
hubbe
2013/06/29 00:13:56
Ok, I'm changing it. Seems to work in my tests at
|
| + WaitForCmd(); |
| + } |
| } |
| for (GLsizei ii = 0; ii < n; ++ii) { |
| QueryTracker::Query* query = query_tracker_->GetQuery(queries[ii]); |
| - if (query && query->Pending()) { |
| - if (!query->CheckResultsAvailable(helper_)) { |
| - // Should only get here on context lost. |
| - MustBeContextLost(); |
| - } |
| + if (query && !query->CheckResultsAvailable(helper_)) { |
| + // Should only get here on context lost. |
| + MustBeContextLost(); |
| } |
| query_tracker_->RemoveQuery(queries[ii], helper_->IsContextLost()); |
| } |