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 #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> |
11 #include <map> | 11 #include <map> |
12 #include <stack> | 12 #include <stack> |
13 #include <string> | 13 #include <string> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "base/at_exit.h" | 16 #include "base/at_exit.h" |
17 #include "base/bind.h" | 17 #include "base/bind.h" |
| 18 #include "base/callback_helpers.h" |
18 #include "base/command_line.h" | 19 #include "base/command_line.h" |
19 #include "base/debug/trace_event.h" | 20 #include "base/debug/trace_event.h" |
20 #include "base/debug/trace_event_synthetic_delay.h" | 21 #include "base/debug/trace_event_synthetic_delay.h" |
21 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
| 23 #include "base/numerics/safe_math.h" |
22 #include "base/strings/string_number_conversions.h" | 24 #include "base/strings/string_number_conversions.h" |
23 #include "base/strings/string_split.h" | 25 #include "base/strings/string_split.h" |
24 #include "build/build_config.h" | 26 #include "build/build_config.h" |
25 #define GLES2_GPU_SERVICE 1 | 27 #define GLES2_GPU_SERVICE 1 |
26 #include "gpu/command_buffer/common/debug_marker_manager.h" | 28 #include "gpu/command_buffer/common/debug_marker_manager.h" |
27 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 29 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
28 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 30 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
29 #include "gpu/command_buffer/common/id_allocator.h" | 31 #include "gpu/command_buffer/common/id_allocator.h" |
30 #include "gpu/command_buffer/common/mailbox.h" | 32 #include "gpu/command_buffer/common/mailbox.h" |
31 #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" | 33 #include "gpu/command_buffer/service/async_pixel_transfer_delegate.h" |
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 | 513 |
512 struct FenceCallback { | 514 struct FenceCallback { |
513 explicit FenceCallback() | 515 explicit FenceCallback() |
514 : fence(gfx::GLFence::Create()) { | 516 : fence(gfx::GLFence::Create()) { |
515 DCHECK(fence); | 517 DCHECK(fence); |
516 } | 518 } |
517 std::vector<base::Closure> callbacks; | 519 std::vector<base::Closure> callbacks; |
518 scoped_ptr<gfx::GLFence> fence; | 520 scoped_ptr<gfx::GLFence> fence; |
519 }; | 521 }; |
520 | 522 |
| 523 class AsyncUploadTokenCompletionObserver |
| 524 : public AsyncPixelTransferCompletionObserver { |
| 525 public: |
| 526 explicit AsyncUploadTokenCompletionObserver(uint32 async_upload_token) |
| 527 : async_upload_token_(async_upload_token) { |
| 528 } |
| 529 |
| 530 virtual void DidComplete(const AsyncMemoryParams& mem_params) OVERRIDE { |
| 531 DCHECK(mem_params.buffer()); |
| 532 void* data = mem_params.GetDataAddress(); |
| 533 AsyncUploadSync* sync = static_cast<AsyncUploadSync*>(data); |
| 534 sync->SetAsyncUploadToken(async_upload_token_); |
| 535 } |
| 536 |
| 537 private: |
| 538 virtual ~AsyncUploadTokenCompletionObserver() { |
| 539 } |
| 540 |
| 541 uint32 async_upload_token_; |
| 542 |
| 543 DISALLOW_COPY_AND_ASSIGN(AsyncUploadTokenCompletionObserver); |
| 544 }; |
| 545 |
521 // } // anonymous namespace. | 546 // } // anonymous namespace. |
522 | 547 |
523 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, | 548 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, |
524 uint32* service_texture_id) { | 549 uint32* service_texture_id) { |
525 return false; | 550 return false; |
526 } | 551 } |
527 | 552 |
528 GLES2Decoder::GLES2Decoder() | 553 GLES2Decoder::GLES2Decoder() |
529 : initialized_(false), | 554 : initialized_(false), |
530 debug_(false), | 555 debug_(false), |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); | 731 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); |
707 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 732 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
708 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 733 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
709 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 734 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
710 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 735 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
711 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); | 736 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); |
712 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); | 737 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); |
713 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); | 738 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
714 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); | 739 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
715 | 740 |
| 741 // Helper for async upload token completion notification callback. |
| 742 base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token, |
| 743 uint32 sync_data_shm_id, |
| 744 uint32 sync_data_shm_offset); |
| 745 |
| 746 |
| 747 |
716 // Workarounds | 748 // Workarounds |
717 void OnFboChanged() const; | 749 void OnFboChanged() const; |
718 void OnUseFramebuffer() const; | 750 void OnUseFramebuffer() const; |
719 | 751 |
720 // TODO(gman): Cache these pointers? | 752 // TODO(gman): Cache these pointers? |
721 BufferManager* buffer_manager() { | 753 BufferManager* buffer_manager() { |
722 return group_->buffer_manager(); | 754 return group_->buffer_manager(); |
723 } | 755 } |
724 | 756 |
725 RenderbufferManager* renderbuffer_manager() { | 757 RenderbufferManager* renderbuffer_manager() { |
(...skipping 9596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10322 if (!texture_ref || | 10354 if (!texture_ref || |
10323 async_pixel_transfer_manager_->AsyncTransferIsInProgress(texture_ref)) { | 10355 async_pixel_transfer_manager_->AsyncTransferIsInProgress(texture_ref)) { |
10324 LOCAL_SET_GL_ERROR( | 10356 LOCAL_SET_GL_ERROR( |
10325 GL_INVALID_OPERATION, | 10357 GL_INVALID_OPERATION, |
10326 function_name, "transfer already in progress"); | 10358 function_name, "transfer already in progress"); |
10327 return false; | 10359 return false; |
10328 } | 10360 } |
10329 return true; | 10361 return true; |
10330 } | 10362 } |
10331 | 10363 |
| 10364 base::Closure GLES2DecoderImpl::AsyncUploadTokenCompletionClosure( |
| 10365 uint32 async_upload_token, |
| 10366 uint32 sync_data_shm_id, |
| 10367 uint32 sync_data_shm_offset) { |
| 10368 scoped_refptr<gpu::Buffer> buffer = GetSharedMemoryBuffer(sync_data_shm_id); |
| 10369 if (!buffer || !buffer->GetDataAddress(sync_data_shm_offset, |
| 10370 sizeof(AsyncUploadSync))) |
| 10371 return base::Closure(); |
| 10372 |
| 10373 AsyncMemoryParams mem_params(buffer, |
| 10374 sync_data_shm_offset, |
| 10375 sizeof(AsyncUploadSync)); |
| 10376 |
| 10377 scoped_refptr<AsyncUploadTokenCompletionObserver> observer( |
| 10378 new AsyncUploadTokenCompletionObserver(async_upload_token)); |
| 10379 |
| 10380 return base::Bind( |
| 10381 &AsyncPixelTransferManager::AsyncNotifyCompletion, |
| 10382 base::Unretained(GetAsyncPixelTransferManager()), |
| 10383 mem_params, |
| 10384 observer); |
| 10385 } |
| 10386 |
10332 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( | 10387 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
10333 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { | 10388 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
10334 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); | 10389 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
10335 GLenum target = static_cast<GLenum>(c.target); | 10390 GLenum target = static_cast<GLenum>(c.target); |
10336 GLint level = static_cast<GLint>(c.level); | 10391 GLint level = static_cast<GLint>(c.level); |
10337 // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use | 10392 // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use |
10338 // unsigned integer for internalformat. | 10393 // unsigned integer for internalformat. |
10339 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 10394 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
10340 GLsizei width = static_cast<GLsizei>(c.width); | 10395 GLsizei width = static_cast<GLsizei>(c.width); |
10341 GLsizei height = static_cast<GLsizei>(c.height); | 10396 GLsizei height = static_cast<GLsizei>(c.height); |
10342 GLint border = static_cast<GLint>(c.border); | 10397 GLint border = static_cast<GLint>(c.border); |
10343 GLenum format = static_cast<GLenum>(c.format); | 10398 GLenum format = static_cast<GLenum>(c.format); |
10344 GLenum type = static_cast<GLenum>(c.type); | 10399 GLenum type = static_cast<GLenum>(c.type); |
10345 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); | 10400 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
10346 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); | 10401 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
10347 uint32 pixels_size; | 10402 uint32 pixels_size; |
| 10403 uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
| 10404 uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
| 10405 uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 10406 |
| 10407 base::ScopedClosureRunner scoped_completion_callback; |
| 10408 if (async_upload_token) { |
| 10409 base::Closure completion_closure = |
| 10410 AsyncUploadTokenCompletionClosure(async_upload_token, |
| 10411 sync_data_shm_id, |
| 10412 sync_data_shm_offset); |
| 10413 if (completion_closure.is_null()) |
| 10414 return error::kInvalidArguments; |
| 10415 |
| 10416 scoped_completion_callback.Reset(completion_closure); |
| 10417 } |
10348 | 10418 |
10349 // TODO(epenner): Move this and copies of this memory validation | 10419 // TODO(epenner): Move this and copies of this memory validation |
10350 // into ValidateTexImage2D step. | 10420 // into ValidateTexImage2D step. |
10351 if (!GLES2Util::ComputeImageDataSizes( | 10421 if (!GLES2Util::ComputeImageDataSizes( |
10352 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, | 10422 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, |
10353 NULL)) { | 10423 NULL)) { |
10354 return error::kOutOfBounds; | 10424 return error::kOutOfBounds; |
10355 } | 10425 } |
10356 const void* pixels = NULL; | 10426 const void* pixels = NULL; |
10357 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 10427 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10424 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { | 10494 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { |
10425 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); | 10495 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); |
10426 GLenum target = static_cast<GLenum>(c.target); | 10496 GLenum target = static_cast<GLenum>(c.target); |
10427 GLint level = static_cast<GLint>(c.level); | 10497 GLint level = static_cast<GLint>(c.level); |
10428 GLint xoffset = static_cast<GLint>(c.xoffset); | 10498 GLint xoffset = static_cast<GLint>(c.xoffset); |
10429 GLint yoffset = static_cast<GLint>(c.yoffset); | 10499 GLint yoffset = static_cast<GLint>(c.yoffset); |
10430 GLsizei width = static_cast<GLsizei>(c.width); | 10500 GLsizei width = static_cast<GLsizei>(c.width); |
10431 GLsizei height = static_cast<GLsizei>(c.height); | 10501 GLsizei height = static_cast<GLsizei>(c.height); |
10432 GLenum format = static_cast<GLenum>(c.format); | 10502 GLenum format = static_cast<GLenum>(c.format); |
10433 GLenum type = static_cast<GLenum>(c.type); | 10503 GLenum type = static_cast<GLenum>(c.type); |
| 10504 uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
| 10505 uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
| 10506 uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 10507 |
| 10508 base::ScopedClosureRunner scoped_completion_callback; |
| 10509 if (async_upload_token) { |
| 10510 base::Closure completion_closure = |
| 10511 AsyncUploadTokenCompletionClosure(async_upload_token, |
| 10512 sync_data_shm_id, |
| 10513 sync_data_shm_offset); |
| 10514 if (completion_closure.is_null()) |
| 10515 return error::kInvalidArguments; |
| 10516 |
| 10517 scoped_completion_callback.Reset(completion_closure); |
| 10518 } |
10434 | 10519 |
10435 // TODO(epenner): Move this and copies of this memory validation | 10520 // TODO(epenner): Move this and copies of this memory validation |
10436 // into ValidateTexSubImage2D step. | 10521 // into ValidateTexSubImage2D step. |
10437 uint32 data_size; | 10522 uint32 data_size; |
10438 if (!GLES2Util::ComputeImageDataSizes( | 10523 if (!GLES2Util::ComputeImageDataSizes( |
10439 width, height, format, type, state_.unpack_alignment, &data_size, | 10524 width, height, format, type, state_.unpack_alignment, &data_size, |
10440 NULL, NULL)) { | 10525 NULL, NULL)) { |
10441 return error::kOutOfBounds; | 10526 return error::kOutOfBounds; |
10442 } | 10527 } |
10443 const void* pixels = GetSharedMemoryAs<const void*>( | 10528 const void* pixels = GetSharedMemoryAs<const void*>( |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10526 LOCAL_SET_GL_ERROR( | 10611 LOCAL_SET_GL_ERROR( |
10527 GL_INVALID_OPERATION, | 10612 GL_INVALID_OPERATION, |
10528 "glWaitAsyncTexImage2DCHROMIUM", "No async transfer started"); | 10613 "glWaitAsyncTexImage2DCHROMIUM", "No async transfer started"); |
10529 return error::kNoError; | 10614 return error::kNoError; |
10530 } | 10615 } |
10531 delegate->WaitForTransferCompletion(); | 10616 delegate->WaitForTransferCompletion(); |
10532 ProcessFinishedAsyncTransfers(); | 10617 ProcessFinishedAsyncTransfers(); |
10533 return error::kNoError; | 10618 return error::kNoError; |
10534 } | 10619 } |
10535 | 10620 |
| 10621 error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( |
| 10622 uint32 immediate_data_size, const cmds::WaitAllAsyncTexImage2DCHROMIUM& c) { |
| 10623 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); |
| 10624 |
| 10625 GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); |
| 10626 ProcessFinishedAsyncTransfers(); |
| 10627 return error::kNoError; |
| 10628 } |
| 10629 |
10536 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( | 10630 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( |
10537 TextureRef* texture_ref) { | 10631 TextureRef* texture_ref) { |
10538 Texture* texture = texture_ref->texture(); | 10632 Texture* texture = texture_ref->texture(); |
10539 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10633 DoDidUseTexImageIfNeeded(texture, texture->target()); |
10540 } | 10634 } |
10541 | 10635 |
10542 // Include the auto-generated part of this file. We split this because it means | 10636 // Include the auto-generated part of this file. We split this because it means |
10543 // we can easily edit the non-auto generated parts right here in this file | 10637 // we can easily edit the non-auto generated parts right here in this file |
10544 // instead of having to edit some template or the code generator. | 10638 // instead of having to edit some template or the code generator. |
10545 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10639 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10546 | 10640 |
10547 } // namespace gles2 | 10641 } // namespace gles2 |
10548 } // namespace gpu | 10642 } // namespace gpu |
OLD | NEW |