| 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 #include <GLES2/gles2_command_buffer.h> | 8 #include <GLES2/gles2_command_buffer.h> |
| 9 #include "../client/mapped_memory.h" | 9 #include "../client/mapped_memory.h" |
| 10 #include "../common/gles2_cmd_utils.h" | 10 #include "../common/gles2_cmd_utils.h" |
| 11 #include "../common/id_allocator.h" | 11 #include "../common/id_allocator.h" |
| 12 #include "../common/trace_event.h" | 12 #include "gpu/common/gpu_trace_event.h" |
| 13 | 13 |
| 14 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 14 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 15 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 15 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
| 16 #endif | 16 #endif |
| 17 | 17 |
| 18 namespace gpu { | 18 namespace gpu { |
| 19 namespace gles2 { | 19 namespace gles2 { |
| 20 | 20 |
| 21 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. | 21 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. |
| 22 static GLuint ToGLuint(const void* ptr) { | 22 static GLuint ToGLuint(const void* ptr) { |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 #endif | 484 #endif |
| 485 } | 485 } |
| 486 | 486 |
| 487 GLES2Implementation::~GLES2Implementation() { | 487 GLES2Implementation::~GLES2Implementation() { |
| 488 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 488 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 489 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); | 489 DeleteBuffers(arraysize(reserved_ids_), &reserved_ids_[0]); |
| 490 #endif | 490 #endif |
| 491 } | 491 } |
| 492 | 492 |
| 493 void GLES2Implementation::WaitForCmd() { | 493 void GLES2Implementation::WaitForCmd() { |
| 494 TRACE_EVENT0("gpu", "GLES2::WaitForCmd"); | 494 GPU_TRACE_EVENT0("gpu", "GLES2::WaitForCmd"); |
| 495 helper_->CommandBufferHelper::Finish(); | 495 helper_->CommandBufferHelper::Finish(); |
| 496 } | 496 } |
| 497 | 497 |
| 498 GLenum GLES2Implementation::GetError() { | 498 GLenum GLES2Implementation::GetError() { |
| 499 return GetGLError(); | 499 return GetGLError(); |
| 500 } | 500 } |
| 501 | 501 |
| 502 GLenum GLES2Implementation::GetGLError() { | 502 GLenum GLES2Implementation::GetGLError() { |
| 503 TRACE_EVENT0("gpu", "GLES2::GetGLError"); | 503 GPU_TRACE_EVENT0("gpu", "GLES2::GetGLError"); |
| 504 // Check the GL error first, then our wrapped error. | 504 // Check the GL error first, then our wrapped error. |
| 505 typedef gles2::GetError::Result Result; | 505 typedef gles2::GetError::Result Result; |
| 506 Result* result = GetResultAs<Result*>(); | 506 Result* result = GetResultAs<Result*>(); |
| 507 *result = GL_NO_ERROR; | 507 *result = GL_NO_ERROR; |
| 508 helper_->GetError(result_shm_id(), result_shm_offset()); | 508 helper_->GetError(result_shm_id(), result_shm_offset()); |
| 509 WaitForCmd(); | 509 WaitForCmd(); |
| 510 GLenum error = *result; | 510 GLenum error = *result; |
| 511 if (error == GL_NO_ERROR && error_bits_ != 0) { | 511 if (error == GL_NO_ERROR && error_bits_ != 0) { |
| 512 for (uint32 mask = 1; mask != 0; mask = mask << 1) { | 512 for (uint32 mask = 1; mask != 0; mask = mask << 1) { |
| 513 if ((error_bits_ & mask) != 0) { | 513 if ((error_bits_ & mask) != 0) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 526 | 526 |
| 527 void GLES2Implementation::SetGLError(GLenum error, const char* msg) { | 527 void GLES2Implementation::SetGLError(GLenum error, const char* msg) { |
| 528 if (msg) { | 528 if (msg) { |
| 529 last_error_ = msg; | 529 last_error_ = msg; |
| 530 } | 530 } |
| 531 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); | 531 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); |
| 532 } | 532 } |
| 533 | 533 |
| 534 void GLES2Implementation::GetBucketContents(uint32 bucket_id, | 534 void GLES2Implementation::GetBucketContents(uint32 bucket_id, |
| 535 std::vector<int8>* data) { | 535 std::vector<int8>* data) { |
| 536 TRACE_EVENT0("gpu", "GLES2::GetBucketContents"); | 536 GPU_TRACE_EVENT0("gpu", "GLES2::GetBucketContents"); |
| 537 GPU_DCHECK(data); | 537 GPU_DCHECK(data); |
| 538 typedef cmd::GetBucketSize::Result Result; | 538 typedef cmd::GetBucketSize::Result Result; |
| 539 Result* result = GetResultAs<Result*>(); | 539 Result* result = GetResultAs<Result*>(); |
| 540 *result = 0; | 540 *result = 0; |
| 541 helper_->GetBucketSize(bucket_id, result_shm_id(), result_shm_offset()); | 541 helper_->GetBucketSize(bucket_id, result_shm_id(), result_shm_offset()); |
| 542 WaitForCmd(); | 542 WaitForCmd(); |
| 543 uint32 size = *result; | 543 uint32 size = *result; |
| 544 data->resize(size); | 544 data->resize(size); |
| 545 if (size > 0u) { | 545 if (size > 0u) { |
| 546 uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); | 546 uint32 max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 667 | 667 |
| 668 void GLES2Implementation::Flush() { | 668 void GLES2Implementation::Flush() { |
| 669 // Insert the cmd to call glFlush | 669 // Insert the cmd to call glFlush |
| 670 helper_->Flush(); | 670 helper_->Flush(); |
| 671 // Flush our command buffer | 671 // Flush our command buffer |
| 672 // (tell the service to execute up to the flush cmd.) | 672 // (tell the service to execute up to the flush cmd.) |
| 673 helper_->CommandBufferHelper::Flush(); | 673 helper_->CommandBufferHelper::Flush(); |
| 674 } | 674 } |
| 675 | 675 |
| 676 void GLES2Implementation::Finish() { | 676 void GLES2Implementation::Finish() { |
| 677 TRACE_EVENT0("gpu", "GLES2::Finish"); | 677 GPU_TRACE_EVENT0("gpu", "GLES2::Finish"); |
| 678 // Insert the cmd to call glFinish | 678 // Insert the cmd to call glFinish |
| 679 helper_->Finish(); | 679 helper_->Finish(); |
| 680 // Finish our command buffer | 680 // Finish our command buffer |
| 681 // (tell the service to execute up to the Finish cmd and wait for it to | 681 // (tell the service to execute up to the Finish cmd and wait for it to |
| 682 // execute.) | 682 // execute.) |
| 683 helper_->CommandBufferHelper::Finish(); | 683 helper_->CommandBufferHelper::Finish(); |
| 684 } | 684 } |
| 685 | 685 |
| 686 void GLES2Implementation::SwapBuffers() { | 686 void GLES2Implementation::SwapBuffers() { |
| 687 // TODO(piman): Strictly speaking we'd want to insert the token after the | 687 // TODO(piman): Strictly speaking we'd want to insert the token after the |
| (...skipping 22 matching lines...) Expand all Loading... |
| 710 swap_buffers_tokens_.pop(); | 710 swap_buffers_tokens_.pop(); |
| 711 } | 711 } |
| 712 helper_->CopyTextureToParentTextureCHROMIUM(client_child_id, | 712 helper_->CopyTextureToParentTextureCHROMIUM(client_child_id, |
| 713 client_parent_id); | 713 client_parent_id); |
| 714 swap_buffers_tokens_.push(helper_->InsertToken()); | 714 swap_buffers_tokens_.push(helper_->InsertToken()); |
| 715 Flush(); | 715 Flush(); |
| 716 } | 716 } |
| 717 | 717 |
| 718 void GLES2Implementation::GenSharedIdsCHROMIUM( | 718 void GLES2Implementation::GenSharedIdsCHROMIUM( |
| 719 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { | 719 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { |
| 720 TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM"); | 720 GPU_TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM"); |
| 721 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 721 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); |
| 722 helper_->GenSharedIdsCHROMIUM(namespace_id, id_offset, n, | 722 helper_->GenSharedIdsCHROMIUM(namespace_id, id_offset, n, |
| 723 transfer_buffer_id_, | 723 transfer_buffer_id_, |
| 724 transfer_buffer_.GetOffset(id_buffer)); | 724 transfer_buffer_.GetOffset(id_buffer)); |
| 725 WaitForCmd(); | 725 WaitForCmd(); |
| 726 memcpy(ids, id_buffer, sizeof(*ids) * n); | 726 memcpy(ids, id_buffer, sizeof(*ids) * n); |
| 727 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 727 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 728 } | 728 } |
| 729 | 729 |
| 730 void GLES2Implementation::DeleteSharedIdsCHROMIUM( | 730 void GLES2Implementation::DeleteSharedIdsCHROMIUM( |
| 731 GLuint namespace_id, GLsizei n, const GLuint* ids) { | 731 GLuint namespace_id, GLsizei n, const GLuint* ids) { |
| 732 TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM"); | 732 GPU_TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM"); |
| 733 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 733 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); |
| 734 memcpy(id_buffer, ids, sizeof(*ids) * n); | 734 memcpy(id_buffer, ids, sizeof(*ids) * n); |
| 735 helper_->DeleteSharedIdsCHROMIUM(namespace_id, n, | 735 helper_->DeleteSharedIdsCHROMIUM(namespace_id, n, |
| 736 transfer_buffer_id_, | 736 transfer_buffer_id_, |
| 737 transfer_buffer_.GetOffset(id_buffer)); | 737 transfer_buffer_.GetOffset(id_buffer)); |
| 738 WaitForCmd(); | 738 WaitForCmd(); |
| 739 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 739 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 740 } | 740 } |
| 741 | 741 |
| 742 void GLES2Implementation::RegisterSharedIdsCHROMIUM( | 742 void GLES2Implementation::RegisterSharedIdsCHROMIUM( |
| 743 GLuint namespace_id, GLsizei n, const GLuint* ids) { | 743 GLuint namespace_id, GLsizei n, const GLuint* ids) { |
| 744 TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM"); | 744 GPU_TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM"); |
| 745 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); | 745 GLint* id_buffer = transfer_buffer_.AllocTyped<GLint>(n); |
| 746 memcpy(id_buffer, ids, sizeof(*ids) * n); | 746 memcpy(id_buffer, ids, sizeof(*ids) * n); |
| 747 helper_->RegisterSharedIdsCHROMIUM(namespace_id, n, | 747 helper_->RegisterSharedIdsCHROMIUM(namespace_id, n, |
| 748 transfer_buffer_id_, | 748 transfer_buffer_id_, |
| 749 transfer_buffer_.GetOffset(id_buffer)); | 749 transfer_buffer_.GetOffset(id_buffer)); |
| 750 WaitForCmd(); | 750 WaitForCmd(); |
| 751 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); | 751 transfer_buffer_.FreePendingToken(id_buffer, helper_->InsertToken()); |
| 752 } | 752 } |
| 753 | 753 |
| 754 void GLES2Implementation::BindAttribLocation( | 754 void GLES2Implementation::BindAttribLocation( |
| 755 GLuint program, GLuint index, const char* name) { | 755 GLuint program, GLuint index, const char* name) { |
| 756 SetBucketAsString(kResultBucketId, name); | 756 SetBucketAsString(kResultBucketId, name); |
| 757 helper_->BindAttribLocationBucket(program, index, kResultBucketId); | 757 helper_->BindAttribLocationBucket(program, index, kResultBucketId); |
| 758 helper_->SetBucketSize(kResultBucketId, 0); | 758 helper_->SetBucketSize(kResultBucketId, 0); |
| 759 } | 759 } |
| 760 | 760 |
| 761 void GLES2Implementation::GetVertexAttribPointerv( | 761 void GLES2Implementation::GetVertexAttribPointerv( |
| 762 GLuint index, GLenum pname, void** ptr) { | 762 GLuint index, GLenum pname, void** ptr) { |
| 763 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 763 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 764 // If it's a client side buffer the client has the data. | 764 // If it's a client side buffer the client has the data. |
| 765 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) { | 765 if (client_side_buffer_helper_->GetAttribPointer(index, pname, ptr)) { |
| 766 return; | 766 return; |
| 767 } | 767 } |
| 768 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 768 #endif // defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 769 | 769 |
| 770 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribPointerv"); | 770 GPU_TRACE_EVENT0("gpu", "GLES2::GetVertexAttribPointerv"); |
| 771 typedef gles2::GetVertexAttribPointerv::Result Result; | 771 typedef gles2::GetVertexAttribPointerv::Result Result; |
| 772 Result* result = GetResultAs<Result*>(); | 772 Result* result = GetResultAs<Result*>(); |
| 773 result->SetNumResults(0); | 773 result->SetNumResults(0); |
| 774 helper_->GetVertexAttribPointerv( | 774 helper_->GetVertexAttribPointerv( |
| 775 index, pname, result_shm_id(), result_shm_offset()); | 775 index, pname, result_shm_id(), result_shm_offset()); |
| 776 WaitForCmd(); | 776 WaitForCmd(); |
| 777 result->CopyResult(ptr); | 777 result->CopyResult(ptr); |
| 778 } | 778 } |
| 779 | 779 |
| 780 GLint GLES2Implementation::GetAttribLocation( | 780 GLint GLES2Implementation::GetAttribLocation( |
| 781 GLuint program, const char* name) { | 781 GLuint program, const char* name) { |
| 782 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); | 782 GPU_TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); |
| 783 typedef GetAttribLocationBucket::Result Result; | 783 typedef GetAttribLocationBucket::Result Result; |
| 784 Result* result = GetResultAs<Result*>(); | 784 Result* result = GetResultAs<Result*>(); |
| 785 *result = -1; | 785 *result = -1; |
| 786 SetBucketAsCString(kResultBucketId, name); | 786 SetBucketAsCString(kResultBucketId, name); |
| 787 helper_->GetAttribLocationBucket(program, kResultBucketId, | 787 helper_->GetAttribLocationBucket(program, kResultBucketId, |
| 788 result_shm_id(), result_shm_offset()); | 788 result_shm_id(), result_shm_offset()); |
| 789 WaitForCmd(); | 789 WaitForCmd(); |
| 790 helper_->SetBucketSize(kResultBucketId, 0); | 790 helper_->SetBucketSize(kResultBucketId, 0); |
| 791 return *result; | 791 return *result; |
| 792 } | 792 } |
| 793 | 793 |
| 794 GLint GLES2Implementation::GetUniformLocation( | 794 GLint GLES2Implementation::GetUniformLocation( |
| 795 GLuint program, const char* name) { | 795 GLuint program, const char* name) { |
| 796 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); | 796 GPU_TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); |
| 797 typedef GetUniformLocationBucket::Result Result; | 797 typedef GetUniformLocationBucket::Result Result; |
| 798 Result* result = GetResultAs<Result*>(); | 798 Result* result = GetResultAs<Result*>(); |
| 799 *result = -1; | 799 *result = -1; |
| 800 SetBucketAsCString(kResultBucketId, name); | 800 SetBucketAsCString(kResultBucketId, name); |
| 801 helper_->GetUniformLocationBucket(program, kResultBucketId, | 801 helper_->GetUniformLocationBucket(program, kResultBucketId, |
| 802 result_shm_id(), result_shm_offset()); | 802 result_shm_id(), result_shm_offset()); |
| 803 WaitForCmd(); | 803 WaitForCmd(); |
| 804 helper_->SetBucketSize(kResultBucketId, 0); | 804 helper_->SetBucketSize(kResultBucketId, 0); |
| 805 return *result; | 805 return *result; |
| 806 } | 806 } |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1097 } | 1097 } |
| 1098 } | 1098 } |
| 1099 | 1099 |
| 1100 void GLES2Implementation::GetActiveAttrib( | 1100 void GLES2Implementation::GetActiveAttrib( |
| 1101 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, | 1101 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
| 1102 GLenum* type, char* name) { | 1102 GLenum* type, char* name) { |
| 1103 if (bufsize < 0) { | 1103 if (bufsize < 0) { |
| 1104 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); | 1104 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib: bufsize < 0"); |
| 1105 return; | 1105 return; |
| 1106 } | 1106 } |
| 1107 TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); | 1107 GPU_TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); |
| 1108 // Clear the bucket so if we the command fails nothing will be in it. | 1108 // Clear the bucket so if we the command fails nothing will be in it. |
| 1109 helper_->SetBucketSize(kResultBucketId, 0); | 1109 helper_->SetBucketSize(kResultBucketId, 0); |
| 1110 typedef gles2::GetActiveAttrib::Result Result; | 1110 typedef gles2::GetActiveAttrib::Result Result; |
| 1111 Result* result = static_cast<Result*>(result_buffer_); | 1111 Result* result = static_cast<Result*>(result_buffer_); |
| 1112 // Set as failed so if the command fails we'll recover. | 1112 // Set as failed so if the command fails we'll recover. |
| 1113 result->success = false; | 1113 result->success = false; |
| 1114 helper_->GetActiveAttrib(program, index, kResultBucketId, | 1114 helper_->GetActiveAttrib(program, index, kResultBucketId, |
| 1115 result_shm_id(), result_shm_offset()); | 1115 result_shm_id(), result_shm_offset()); |
| 1116 WaitForCmd(); | 1116 WaitForCmd(); |
| 1117 if (result->success) { | 1117 if (result->success) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1138 } | 1138 } |
| 1139 } | 1139 } |
| 1140 | 1140 |
| 1141 void GLES2Implementation::GetActiveUniform( | 1141 void GLES2Implementation::GetActiveUniform( |
| 1142 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, | 1142 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, |
| 1143 GLenum* type, char* name) { | 1143 GLenum* type, char* name) { |
| 1144 if (bufsize < 0) { | 1144 if (bufsize < 0) { |
| 1145 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); | 1145 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform: bufsize < 0"); |
| 1146 return; | 1146 return; |
| 1147 } | 1147 } |
| 1148 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); | 1148 GPU_TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); |
| 1149 // Clear the bucket so if we the command fails nothing will be in it. | 1149 // Clear the bucket so if we the command fails nothing will be in it. |
| 1150 helper_->SetBucketSize(kResultBucketId, 0); | 1150 helper_->SetBucketSize(kResultBucketId, 0); |
| 1151 typedef gles2::GetActiveUniform::Result Result; | 1151 typedef gles2::GetActiveUniform::Result Result; |
| 1152 Result* result = static_cast<Result*>(result_buffer_); | 1152 Result* result = static_cast<Result*>(result_buffer_); |
| 1153 // Set as failed so if the command fails we'll recover. | 1153 // Set as failed so if the command fails we'll recover. |
| 1154 result->success = false; | 1154 result->success = false; |
| 1155 helper_->GetActiveUniform(program, index, kResultBucketId, | 1155 helper_->GetActiveUniform(program, index, kResultBucketId, |
| 1156 result_shm_id(), result_shm_offset()); | 1156 result_shm_id(), result_shm_offset()); |
| 1157 WaitForCmd(); | 1157 WaitForCmd(); |
| 1158 if (result->success) { | 1158 if (result->success) { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1178 } | 1178 } |
| 1179 } | 1179 } |
| 1180 } | 1180 } |
| 1181 | 1181 |
| 1182 void GLES2Implementation::GetAttachedShaders( | 1182 void GLES2Implementation::GetAttachedShaders( |
| 1183 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { | 1183 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { |
| 1184 if (maxcount < 0) { | 1184 if (maxcount < 0) { |
| 1185 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: maxcount < 0"); | 1185 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders: maxcount < 0"); |
| 1186 return; | 1186 return; |
| 1187 } | 1187 } |
| 1188 TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders"); | 1188 GPU_TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders"); |
| 1189 typedef gles2::GetAttachedShaders::Result Result; | 1189 typedef gles2::GetAttachedShaders::Result Result; |
| 1190 uint32 size = Result::ComputeSize(maxcount); | 1190 uint32 size = Result::ComputeSize(maxcount); |
| 1191 Result* result = transfer_buffer_.AllocTyped<Result>(size); | 1191 Result* result = transfer_buffer_.AllocTyped<Result>(size); |
| 1192 result->SetNumResults(0); | 1192 result->SetNumResults(0); |
| 1193 helper_->GetAttachedShaders( | 1193 helper_->GetAttachedShaders( |
| 1194 program, | 1194 program, |
| 1195 transfer_buffer_id_, | 1195 transfer_buffer_id_, |
| 1196 transfer_buffer_.GetOffset(result), | 1196 transfer_buffer_.GetOffset(result), |
| 1197 size); | 1197 size); |
| 1198 int32 token = helper_->InsertToken(); | 1198 int32 token = helper_->InsertToken(); |
| 1199 WaitForCmd(); | 1199 WaitForCmd(); |
| 1200 if (count) { | 1200 if (count) { |
| 1201 *count = result->GetNumResults(); | 1201 *count = result->GetNumResults(); |
| 1202 } | 1202 } |
| 1203 result->CopyResult(shaders); | 1203 result->CopyResult(shaders); |
| 1204 transfer_buffer_.FreePendingToken(result, token); | 1204 transfer_buffer_.FreePendingToken(result, token); |
| 1205 } | 1205 } |
| 1206 | 1206 |
| 1207 void GLES2Implementation::GetShaderPrecisionFormat( | 1207 void GLES2Implementation::GetShaderPrecisionFormat( |
| 1208 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { | 1208 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { |
| 1209 TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat"); | 1209 GPU_TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat"); |
| 1210 typedef gles2::GetShaderPrecisionFormat::Result Result; | 1210 typedef gles2::GetShaderPrecisionFormat::Result Result; |
| 1211 Result* result = static_cast<Result*>(result_buffer_); | 1211 Result* result = static_cast<Result*>(result_buffer_); |
| 1212 result->success = false; | 1212 result->success = false; |
| 1213 helper_->GetShaderPrecisionFormat( | 1213 helper_->GetShaderPrecisionFormat( |
| 1214 shadertype, precisiontype, result_shm_id(), result_shm_offset()); | 1214 shadertype, precisiontype, result_shm_id(), result_shm_offset()); |
| 1215 WaitForCmd(); | 1215 WaitForCmd(); |
| 1216 if (result->success) { | 1216 if (result->success) { |
| 1217 if (range) { | 1217 if (range) { |
| 1218 range[0] = result->min_range; | 1218 range[0] = result->min_range; |
| 1219 range[1] = result->max_range; | 1219 range[1] = result->max_range; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 string_set.insert(str); | 1251 string_set.insert(str); |
| 1252 GPU_DCHECK(insert_result.second); | 1252 GPU_DCHECK(insert_result.second); |
| 1253 result = insert_result.first->c_str(); | 1253 result = insert_result.first->c_str(); |
| 1254 } | 1254 } |
| 1255 } | 1255 } |
| 1256 return reinterpret_cast<const GLubyte*>(result); | 1256 return reinterpret_cast<const GLubyte*>(result); |
| 1257 } | 1257 } |
| 1258 | 1258 |
| 1259 void GLES2Implementation::GetUniformfv( | 1259 void GLES2Implementation::GetUniformfv( |
| 1260 GLuint program, GLint location, GLfloat* params) { | 1260 GLuint program, GLint location, GLfloat* params) { |
| 1261 TRACE_EVENT0("gpu", "GLES2::GetUniformfv"); | 1261 GPU_TRACE_EVENT0("gpu", "GLES2::GetUniformfv"); |
| 1262 typedef gles2::GetUniformfv::Result Result; | 1262 typedef gles2::GetUniformfv::Result Result; |
| 1263 Result* result = static_cast<Result*>(result_buffer_); | 1263 Result* result = static_cast<Result*>(result_buffer_); |
| 1264 result->SetNumResults(0); | 1264 result->SetNumResults(0); |
| 1265 helper_->GetUniformfv( | 1265 helper_->GetUniformfv( |
| 1266 program, location, result_shm_id(), result_shm_offset()); | 1266 program, location, result_shm_id(), result_shm_offset()); |
| 1267 WaitForCmd(); | 1267 WaitForCmd(); |
| 1268 result->CopyResult(params); | 1268 result->CopyResult(params); |
| 1269 } | 1269 } |
| 1270 | 1270 |
| 1271 void GLES2Implementation::GetUniformiv( | 1271 void GLES2Implementation::GetUniformiv( |
| 1272 GLuint program, GLint location, GLint* params) { | 1272 GLuint program, GLint location, GLint* params) { |
| 1273 TRACE_EVENT0("gpu", "GLES2::GetUniformiv"); | 1273 GPU_TRACE_EVENT0("gpu", "GLES2::GetUniformiv"); |
| 1274 typedef gles2::GetUniformiv::Result Result; | 1274 typedef gles2::GetUniformiv::Result Result; |
| 1275 Result* result = static_cast<Result*>(result_buffer_); | 1275 Result* result = static_cast<Result*>(result_buffer_); |
| 1276 result->SetNumResults(0); | 1276 result->SetNumResults(0); |
| 1277 helper_->GetUniformiv( | 1277 helper_->GetUniformiv( |
| 1278 program, location, result_shm_id(), result_shm_offset()); | 1278 program, location, result_shm_id(), result_shm_offset()); |
| 1279 WaitForCmd(); | 1279 WaitForCmd(); |
| 1280 static_cast<gles2::GetUniformfv::Result*>(result_buffer_)->CopyResult(params); | 1280 static_cast<gles2::GetUniformfv::Result*>(result_buffer_)->CopyResult(params); |
| 1281 } | 1281 } |
| 1282 | 1282 |
| 1283 void GLES2Implementation::ReadPixels( | 1283 void GLES2Implementation::ReadPixels( |
| 1284 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, | 1284 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, |
| 1285 GLenum type, void* pixels) { | 1285 GLenum type, void* pixels) { |
| 1286 if (width < 0 || height < 0) { | 1286 if (width < 0 || height < 0) { |
| 1287 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0"); | 1287 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions < 0"); |
| 1288 return; | 1288 return; |
| 1289 } | 1289 } |
| 1290 if (width == 0 || height == 0) { | 1290 if (width == 0 || height == 0) { |
| 1291 return; | 1291 return; |
| 1292 } | 1292 } |
| 1293 | 1293 |
| 1294 // glReadPixel pads the size of each row of pixels by an amount specified by | 1294 // glReadPixel pads the size of each row of pixels by an amount specified by |
| 1295 // glPixelStorei. So, we have to take that into account both in the fact that | 1295 // glPixelStorei. So, we have to take that into account both in the fact that |
| 1296 // the pixels returned from the ReadPixel command will include that padding | 1296 // the pixels returned from the ReadPixel command will include that padding |
| 1297 // and that when we copy the results to the user's buffer we need to not | 1297 // and that when we copy the results to the user's buffer we need to not |
| 1298 // write those padding bytes but leave them as they are. | 1298 // write those padding bytes but leave them as they are. |
| 1299 | 1299 |
| 1300 TRACE_EVENT0("gpu", "GLES2::ReadPixels"); | 1300 GPU_TRACE_EVENT0("gpu", "GLES2::ReadPixels"); |
| 1301 typedef gles2::ReadPixels::Result Result; | 1301 typedef gles2::ReadPixels::Result Result; |
| 1302 Result* result = static_cast<Result*>(result_buffer_); | 1302 Result* result = static_cast<Result*>(result_buffer_); |
| 1303 int8* dest = reinterpret_cast<int8*>(pixels); | 1303 int8* dest = reinterpret_cast<int8*>(pixels); |
| 1304 GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); | 1304 GLsizeiptr max_size = transfer_buffer_.GetLargestFreeOrPendingSize(); |
| 1305 uint32 temp_size; | 1305 uint32 temp_size; |
| 1306 if (!GLES2Util::ComputeImageDataSize( | 1306 if (!GLES2Util::ComputeImageDataSize( |
| 1307 width, 1, format, type, pack_alignment_, &temp_size)) { | 1307 width, 1, format, type, pack_alignment_, &temp_size)) { |
| 1308 SetGLError(GL_INVALID_VALUE, "glReadPixels: size too large."); | 1308 SetGLError(GL_INVALID_VALUE, "glReadPixels: size too large."); |
| 1309 return; | 1309 return; |
| 1310 } | 1310 } |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 | 1530 |
| 1531 void GLES2Implementation::GetVertexAttribfv( | 1531 void GLES2Implementation::GetVertexAttribfv( |
| 1532 GLuint index, GLenum pname, GLfloat* params) { | 1532 GLuint index, GLenum pname, GLfloat* params) { |
| 1533 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 1533 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 1534 uint32 value = 0; | 1534 uint32 value = 0; |
| 1535 if (GetVertexAttribHelper(index, pname, &value)) { | 1535 if (GetVertexAttribHelper(index, pname, &value)) { |
| 1536 *params = static_cast<float>(value); | 1536 *params = static_cast<float>(value); |
| 1537 return; | 1537 return; |
| 1538 } | 1538 } |
| 1539 #endif | 1539 #endif |
| 1540 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv"); | 1540 GPU_TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv"); |
| 1541 typedef GetVertexAttribfv::Result Result; | 1541 typedef GetVertexAttribfv::Result Result; |
| 1542 Result* result = GetResultAs<Result*>(); | 1542 Result* result = GetResultAs<Result*>(); |
| 1543 result->SetNumResults(0); | 1543 result->SetNumResults(0); |
| 1544 helper_->GetVertexAttribfv( | 1544 helper_->GetVertexAttribfv( |
| 1545 index, pname, result_shm_id(), result_shm_offset()); | 1545 index, pname, result_shm_id(), result_shm_offset()); |
| 1546 WaitForCmd(); | 1546 WaitForCmd(); |
| 1547 result->CopyResult(params); | 1547 result->CopyResult(params); |
| 1548 } | 1548 } |
| 1549 | 1549 |
| 1550 void GLES2Implementation::GetVertexAttribiv( | 1550 void GLES2Implementation::GetVertexAttribiv( |
| 1551 GLuint index, GLenum pname, GLint* params) { | 1551 GLuint index, GLenum pname, GLint* params) { |
| 1552 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 1552 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
| 1553 uint32 value = 0; | 1553 uint32 value = 0; |
| 1554 if (GetVertexAttribHelper(index, pname, &value)) { | 1554 if (GetVertexAttribHelper(index, pname, &value)) { |
| 1555 *params = value; | 1555 *params = value; |
| 1556 return; | 1556 return; |
| 1557 } | 1557 } |
| 1558 #endif | 1558 #endif |
| 1559 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv"); | 1559 GPU_TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv"); |
| 1560 typedef GetVertexAttribiv::Result Result; | 1560 typedef GetVertexAttribiv::Result Result; |
| 1561 Result* result = GetResultAs<Result*>(); | 1561 Result* result = GetResultAs<Result*>(); |
| 1562 result->SetNumResults(0); | 1562 result->SetNumResults(0); |
| 1563 helper_->GetVertexAttribiv( | 1563 helper_->GetVertexAttribiv( |
| 1564 index, pname, result_shm_id(), result_shm_offset()); | 1564 index, pname, result_shm_id(), result_shm_offset()); |
| 1565 WaitForCmd(); | 1565 WaitForCmd(); |
| 1566 result->CopyResult(params); | 1566 result->CopyResult(params); |
| 1567 } | 1567 } |
| 1568 | 1568 |
| 1569 GLboolean GLES2Implementation::CommandBufferEnableCHROMIUM( | 1569 GLboolean GLES2Implementation::CommandBufferEnableCHROMIUM( |
| 1570 const char* feature) { | 1570 const char* feature) { |
| 1571 TRACE_EVENT0("gpu", "GLES2::CommandBufferEnableCHROMIUM"); | 1571 GPU_TRACE_EVENT0("gpu", "GLES2::CommandBufferEnableCHROMIUM"); |
| 1572 typedef CommandBufferEnableCHROMIUM::Result Result; | 1572 typedef CommandBufferEnableCHROMIUM::Result Result; |
| 1573 Result* result = GetResultAs<Result*>(); | 1573 Result* result = GetResultAs<Result*>(); |
| 1574 *result = 0; | 1574 *result = 0; |
| 1575 SetBucketAsCString(kResultBucketId, feature); | 1575 SetBucketAsCString(kResultBucketId, feature); |
| 1576 helper_->CommandBufferEnableCHROMIUM( | 1576 helper_->CommandBufferEnableCHROMIUM( |
| 1577 kResultBucketId, result_shm_id(), result_shm_offset()); | 1577 kResultBucketId, result_shm_id(), result_shm_offset()); |
| 1578 WaitForCmd(); | 1578 WaitForCmd(); |
| 1579 helper_->SetBucketSize(kResultBucketId, 0); | 1579 helper_->SetBucketSize(kResultBucketId, 0); |
| 1580 return *result; | 1580 return *result; |
| 1581 } | 1581 } |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1707 } | 1707 } |
| 1708 | 1708 |
| 1709 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) { | 1709 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) { |
| 1710 SetBucketAsCString(kResultBucketId, extension); | 1710 SetBucketAsCString(kResultBucketId, extension); |
| 1711 helper_->RequestExtensionCHROMIUM(kResultBucketId); | 1711 helper_->RequestExtensionCHROMIUM(kResultBucketId); |
| 1712 helper_->SetBucketSize(kResultBucketId, 0); | 1712 helper_->SetBucketSize(kResultBucketId, 0); |
| 1713 } | 1713 } |
| 1714 | 1714 |
| 1715 } // namespace gles2 | 1715 } // namespace gles2 |
| 1716 } // namespace gpu | 1716 } // namespace gpu |
| OLD | NEW |