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 void* data = static_cast<int8*>(mem_params.shared_memory->memory()) + |
| 532 mem_params.shm_data_offset; |
| 533 AsyncUploadSync* sync = static_cast<AsyncUploadSync*>(data); |
| 534 sync->SetAsyncUploadToken(async_upload_token_); |
| 535 } |
| 536 |
| 537 private: |
| 538 uint32 async_upload_token_; |
| 539 |
| 540 DISALLOW_COPY_AND_ASSIGN(AsyncUploadTokenCompletionObserver); |
| 541 }; |
| 542 |
521 // } // anonymous namespace. | 543 // } // anonymous namespace. |
522 | 544 |
523 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, | 545 bool GLES2Decoder::GetServiceTextureId(uint32 client_texture_id, |
524 uint32* service_texture_id) { | 546 uint32* service_texture_id) { |
525 return false; | 547 return false; |
526 } | 548 } |
527 | 549 |
528 GLES2Decoder::GLES2Decoder() | 550 GLES2Decoder::GLES2Decoder() |
529 : initialized_(false), | 551 : initialized_(false), |
530 debug_(false), | 552 debug_(false), |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); | 724 void DeleteBuffersHelper(GLsizei n, const GLuint* client_ids); |
703 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 725 bool GenFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
704 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); | 726 void DeleteFramebuffersHelper(GLsizei n, const GLuint* client_ids); |
705 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 727 bool GenRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
706 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); | 728 void DeleteRenderbuffersHelper(GLsizei n, const GLuint* client_ids); |
707 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); | 729 bool GenQueriesEXTHelper(GLsizei n, const GLuint* client_ids); |
708 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); | 730 void DeleteQueriesEXTHelper(GLsizei n, const GLuint* client_ids); |
709 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); | 731 bool GenVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
710 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); | 732 void DeleteVertexArraysOESHelper(GLsizei n, const GLuint* client_ids); |
711 | 733 |
| 734 // Helper for async upload token completion notification callback. |
| 735 base::Closure AsyncUploadTokenCompletionClosure(uint32 async_upload_token, |
| 736 uint32 sync_data_shm_id, |
| 737 uint32 sync_data_shm_offset); |
| 738 |
| 739 |
| 740 |
712 // Workarounds | 741 // Workarounds |
713 void OnFboChanged() const; | 742 void OnFboChanged() const; |
714 void OnUseFramebuffer() const; | 743 void OnUseFramebuffer() const; |
715 | 744 |
716 // TODO(gman): Cache these pointers? | 745 // TODO(gman): Cache these pointers? |
717 BufferManager* buffer_manager() { | 746 BufferManager* buffer_manager() { |
718 return group_->buffer_manager(); | 747 return group_->buffer_manager(); |
719 } | 748 } |
720 | 749 |
721 RenderbufferManager* renderbuffer_manager() { | 750 RenderbufferManager* renderbuffer_manager() { |
(...skipping 9589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10311 if (!texture_ref || | 10340 if (!texture_ref || |
10312 async_pixel_transfer_manager_->AsyncTransferIsInProgress(texture_ref)) { | 10341 async_pixel_transfer_manager_->AsyncTransferIsInProgress(texture_ref)) { |
10313 LOCAL_SET_GL_ERROR( | 10342 LOCAL_SET_GL_ERROR( |
10314 GL_INVALID_OPERATION, | 10343 GL_INVALID_OPERATION, |
10315 function_name, "transfer already in progress"); | 10344 function_name, "transfer already in progress"); |
10316 return false; | 10345 return false; |
10317 } | 10346 } |
10318 return true; | 10347 return true; |
10319 } | 10348 } |
10320 | 10349 |
| 10350 base::Closure GLES2DecoderImpl::AsyncUploadTokenCompletionClosure( |
| 10351 uint32 async_upload_token, |
| 10352 uint32 sync_data_shm_id, |
| 10353 uint32 sync_data_shm_offset) { |
| 10354 AsyncMemoryParams mem_params; |
| 10355 gpu::Buffer buffer = GetSharedMemoryBuffer(sync_data_shm_id); |
| 10356 if (!buffer.shared_memory) |
| 10357 return base::Closure(); |
| 10358 mem_params.shared_memory = buffer.shared_memory; |
| 10359 mem_params.shm_size = buffer.size; |
| 10360 mem_params.shm_data_offset = sync_data_shm_offset; |
| 10361 mem_params.shm_data_size = sizeof(AsyncUploadSync); |
| 10362 |
| 10363 base::CheckedNumeric<uint32> end = mem_params.shm_data_offset; |
| 10364 end += mem_params.shm_data_size; |
| 10365 if (!end.IsValid() || end.ValueOrDie() > mem_params.shm_size) |
| 10366 return base::Closure(); |
| 10367 |
| 10368 scoped_refptr<AsyncUploadTokenCompletionObserver> observer( |
| 10369 new AsyncUploadTokenCompletionObserver(async_upload_token)); |
| 10370 |
| 10371 return base::Bind( |
| 10372 &AsyncPixelTransferManager::AsyncNotifyCompletion, |
| 10373 base::Unretained(GetAsyncPixelTransferManager()), |
| 10374 mem_params, |
| 10375 observer); |
| 10376 } |
| 10377 |
10321 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( | 10378 error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
10322 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { | 10379 uint32 immediate_data_size, const cmds::AsyncTexImage2DCHROMIUM& c) { |
10323 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); | 10380 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM"); |
10324 GLenum target = static_cast<GLenum>(c.target); | 10381 GLenum target = static_cast<GLenum>(c.target); |
10325 GLint level = static_cast<GLint>(c.level); | 10382 GLint level = static_cast<GLint>(c.level); |
10326 // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use | 10383 // TODO(kloveless): Change HandleAsyncTexImage2DCHROMIUM command to use |
10327 // unsigned integer for internalformat. | 10384 // unsigned integer for internalformat. |
10328 GLenum internal_format = static_cast<GLenum>(c.internalformat); | 10385 GLenum internal_format = static_cast<GLenum>(c.internalformat); |
10329 GLsizei width = static_cast<GLsizei>(c.width); | 10386 GLsizei width = static_cast<GLsizei>(c.width); |
10330 GLsizei height = static_cast<GLsizei>(c.height); | 10387 GLsizei height = static_cast<GLsizei>(c.height); |
10331 GLint border = static_cast<GLint>(c.border); | 10388 GLint border = static_cast<GLint>(c.border); |
10332 GLenum format = static_cast<GLenum>(c.format); | 10389 GLenum format = static_cast<GLenum>(c.format); |
10333 GLenum type = static_cast<GLenum>(c.type); | 10390 GLenum type = static_cast<GLenum>(c.type); |
10334 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); | 10391 uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
10335 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); | 10392 uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
10336 uint32 pixels_size; | 10393 uint32 pixels_size; |
| 10394 uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
| 10395 uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
| 10396 uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 10397 |
| 10398 base::ScopedClosureRunner scoped_completion_callback; |
| 10399 if (async_upload_token) { |
| 10400 base::Closure completion_closure = |
| 10401 AsyncUploadTokenCompletionClosure(async_upload_token, |
| 10402 sync_data_shm_id, |
| 10403 sync_data_shm_offset); |
| 10404 if (completion_closure.is_null()) |
| 10405 return error::kInvalidArguments; |
| 10406 |
| 10407 scoped_completion_callback.Reset(completion_closure); |
| 10408 } |
10337 | 10409 |
10338 // TODO(epenner): Move this and copies of this memory validation | 10410 // TODO(epenner): Move this and copies of this memory validation |
10339 // into ValidateTexImage2D step. | 10411 // into ValidateTexImage2D step. |
10340 if (!GLES2Util::ComputeImageDataSizes( | 10412 if (!GLES2Util::ComputeImageDataSizes( |
10341 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, | 10413 width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, |
10342 NULL)) { | 10414 NULL)) { |
10343 return error::kOutOfBounds; | 10415 return error::kOutOfBounds; |
10344 } | 10416 } |
10345 const void* pixels = NULL; | 10417 const void* pixels = NULL; |
10346 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { | 10418 if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10421 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { | 10493 uint32 immediate_data_size, const cmds::AsyncTexSubImage2DCHROMIUM& c) { |
10422 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); | 10494 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM"); |
10423 GLenum target = static_cast<GLenum>(c.target); | 10495 GLenum target = static_cast<GLenum>(c.target); |
10424 GLint level = static_cast<GLint>(c.level); | 10496 GLint level = static_cast<GLint>(c.level); |
10425 GLint xoffset = static_cast<GLint>(c.xoffset); | 10497 GLint xoffset = static_cast<GLint>(c.xoffset); |
10426 GLint yoffset = static_cast<GLint>(c.yoffset); | 10498 GLint yoffset = static_cast<GLint>(c.yoffset); |
10427 GLsizei width = static_cast<GLsizei>(c.width); | 10499 GLsizei width = static_cast<GLsizei>(c.width); |
10428 GLsizei height = static_cast<GLsizei>(c.height); | 10500 GLsizei height = static_cast<GLsizei>(c.height); |
10429 GLenum format = static_cast<GLenum>(c.format); | 10501 GLenum format = static_cast<GLenum>(c.format); |
10430 GLenum type = static_cast<GLenum>(c.type); | 10502 GLenum type = static_cast<GLenum>(c.type); |
| 10503 uint32 async_upload_token = static_cast<uint32>(c.async_upload_token); |
| 10504 uint32 sync_data_shm_id = static_cast<uint32>(c.sync_data_shm_id); |
| 10505 uint32 sync_data_shm_offset = static_cast<uint32>(c.sync_data_shm_offset); |
| 10506 |
| 10507 base::ScopedClosureRunner scoped_completion_callback; |
| 10508 if (async_upload_token) { |
| 10509 base::Closure completion_closure = |
| 10510 AsyncUploadTokenCompletionClosure(async_upload_token, |
| 10511 sync_data_shm_id, |
| 10512 sync_data_shm_offset); |
| 10513 if (completion_closure.is_null()) |
| 10514 return error::kInvalidArguments; |
| 10515 |
| 10516 scoped_completion_callback.Reset(completion_closure); |
| 10517 } |
10431 | 10518 |
10432 // TODO(epenner): Move this and copies of this memory validation | 10519 // TODO(epenner): Move this and copies of this memory validation |
10433 // into ValidateTexSubImage2D step. | 10520 // into ValidateTexSubImage2D step. |
10434 uint32 data_size; | 10521 uint32 data_size; |
10435 if (!GLES2Util::ComputeImageDataSizes( | 10522 if (!GLES2Util::ComputeImageDataSizes( |
10436 width, height, format, type, state_.unpack_alignment, &data_size, | 10523 width, height, format, type, state_.unpack_alignment, &data_size, |
10437 NULL, NULL)) { | 10524 NULL, NULL)) { |
10438 return error::kOutOfBounds; | 10525 return error::kOutOfBounds; |
10439 } | 10526 } |
10440 const void* pixels = GetSharedMemoryAs<const void*>( | 10527 const void* pixels = GetSharedMemoryAs<const void*>( |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10531 LOCAL_SET_GL_ERROR( | 10618 LOCAL_SET_GL_ERROR( |
10532 GL_INVALID_OPERATION, | 10619 GL_INVALID_OPERATION, |
10533 "glWaitAsyncTexImage2DCHROMIUM", "No async transfer started"); | 10620 "glWaitAsyncTexImage2DCHROMIUM", "No async transfer started"); |
10534 return error::kNoError; | 10621 return error::kNoError; |
10535 } | 10622 } |
10536 delegate->WaitForTransferCompletion(); | 10623 delegate->WaitForTransferCompletion(); |
10537 ProcessFinishedAsyncTransfers(); | 10624 ProcessFinishedAsyncTransfers(); |
10538 return error::kNoError; | 10625 return error::kNoError; |
10539 } | 10626 } |
10540 | 10627 |
| 10628 error::Error GLES2DecoderImpl::HandleWaitAllAsyncTexImage2DCHROMIUM( |
| 10629 uint32 immediate_data_size, const cmds::WaitAllAsyncTexImage2DCHROMIUM& c) { |
| 10630 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleWaitAsyncTexImage2DCHROMIUM"); |
| 10631 |
| 10632 GetAsyncPixelTransferManager()->WaitAllAsyncTexImage2D(); |
| 10633 ProcessFinishedAsyncTransfers(); |
| 10634 return error::kNoError; |
| 10635 } |
| 10636 |
10541 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( | 10637 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( |
10542 TextureRef* texture_ref) { | 10638 TextureRef* texture_ref) { |
10543 Texture* texture = texture_ref->texture(); | 10639 Texture* texture = texture_ref->texture(); |
10544 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10640 DoDidUseTexImageIfNeeded(texture, texture->target()); |
10545 } | 10641 } |
10546 | 10642 |
10547 // Include the auto-generated part of this file. We split this because it means | 10643 // Include the auto-generated part of this file. We split this because it means |
10548 // we can easily edit the non-auto generated parts right here in this file | 10644 // we can easily edit the non-auto generated parts right here in this file |
10549 // instead of having to edit some template or the code generator. | 10645 // instead of having to edit some template or the code generator. |
10550 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10646 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10551 | 10647 |
10552 } // namespace gles2 | 10648 } // namespace gles2 |
10553 } // namespace gpu | 10649 } // namespace gpu |
OLD | NEW |