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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 90333003: Remove --enable-gpu-service-logging and --enable-gpu-client-logging (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years 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 | Annotate | Revision Log
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 // A class to emulate GLES2 over command buffers. 5 // A class to emulate GLES2 over command buffers.
6 6
7 #include "gpu/command_buffer/client/gles2_implementation.h" 7 #include "gpu/command_buffer/client/gles2_implementation.h"
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 12 matching lines...) Expand all
23 #include "gpu/command_buffer/client/vertex_array_object_manager.h" 23 #include "gpu/command_buffer/client/vertex_array_object_manager.h"
24 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 24 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
25 #include "gpu/command_buffer/common/gpu_control.h" 25 #include "gpu/command_buffer/common/gpu_control.h"
26 #include "gpu/command_buffer/common/trace_event.h" 26 #include "gpu/command_buffer/common/trace_event.h"
27 #include "ui/gfx/gpu_memory_buffer.h" 27 #include "ui/gfx/gpu_memory_buffer.h"
28 28
29 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 29 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
30 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS 30 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS
31 #endif 31 #endif
32 32
33 #if defined(GPU_CLIENT_DEBUG)
34 #include "ui/gl/gl_switches.h"
35 #include "base/command_line.h"
36 #endif
37
38 namespace gpu { 33 namespace gpu {
39 namespace gles2 { 34 namespace gles2 {
40 35
41 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint. 36 // A 32-bit and 64-bit compatible way of converting a pointer to a GLuint.
42 static GLuint ToGLuint(const void* ptr) { 37 static GLuint ToGLuint(const void* ptr) {
43 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr)); 38 return static_cast<GLuint>(reinterpret_cast<size_t>(ptr));
44 } 39 }
45 40
46 #if !defined(_MSC_VER) 41 #if !defined(_MSC_VER)
47 const size_t GLES2Implementation::kMaxSizeOfSimpleResult; 42 const size_t GLES2Implementation::kMaxSizeOfSimpleResult;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 pack_reverse_row_order_(false), 95 pack_reverse_row_order_(false),
101 active_texture_unit_(0), 96 active_texture_unit_(0),
102 bound_framebuffer_(0), 97 bound_framebuffer_(0),
103 bound_read_framebuffer_(0), 98 bound_read_framebuffer_(0),
104 bound_renderbuffer_(0), 99 bound_renderbuffer_(0),
105 current_program_(0), 100 current_program_(0),
106 bound_array_buffer_id_(0), 101 bound_array_buffer_id_(0),
107 bound_pixel_pack_transfer_buffer_id_(0), 102 bound_pixel_pack_transfer_buffer_id_(0),
108 bound_pixel_unpack_transfer_buffer_id_(0), 103 bound_pixel_unpack_transfer_buffer_id_(0),
109 error_bits_(0), 104 error_bits_(0),
110 debug_(false),
111 use_count_(0), 105 use_count_(0),
112 current_query_(NULL), 106 current_query_(NULL),
113 error_message_callback_(NULL), 107 error_message_callback_(NULL),
114 gpu_control_(gpu_control), 108 gpu_control_(gpu_control),
115 weak_ptr_factory_(this) { 109 weak_ptr_factory_(this) {
116 DCHECK(helper); 110 DCHECK(helper);
117 DCHECK(transfer_buffer); 111 DCHECK(transfer_buffer);
118 DCHECK(gpu_control); 112 DCHECK(gpu_control);
119 113
120 char temp[128]; 114 char temp[128];
121 sprintf(temp, "%p", static_cast<void*>(this)); 115 sprintf(temp, "%p", static_cast<void*>(this));
122 this_in_hex_ = std::string(temp); 116 this_in_hex_ = std::string(temp);
123 117
124 GPU_CLIENT_LOG_CODE_BLOCK({
125 debug_ = CommandLine::ForCurrentProcess()->HasSwitch(
126 switches::kEnableGPUClientLogging);
127 });
128
129 share_group_ = 118 share_group_ =
130 (share_group ? share_group : new ShareGroup(bind_generates_resource)); 119 (share_group ? share_group : new ShareGroup(bind_generates_resource));
131 120
132 memset(&reserved_ids_, 0, sizeof(reserved_ids_)); 121 memset(&reserved_ids_, 0, sizeof(reserved_ids_));
133 } 122 }
134 123
135 bool GLES2Implementation::Initialize( 124 bool GLES2Implementation::Initialize(
136 unsigned int starting_transfer_buffer_size, 125 unsigned int starting_transfer_buffer_size,
137 unsigned int min_transfer_buffer_size, 126 unsigned int min_transfer_buffer_size,
138 unsigned int max_transfer_buffer_size, 127 unsigned int max_transfer_buffer_size,
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 &chromium_framebuffer_multisample_); 382 &chromium_framebuffer_multisample_);
394 } 383 }
395 384
396 const std::string& GLES2Implementation::GetLogPrefix() const { 385 const std::string& GLES2Implementation::GetLogPrefix() const {
397 const std::string& prefix(debug_marker_manager_.GetMarker()); 386 const std::string& prefix(debug_marker_manager_.GetMarker());
398 return prefix.empty() ? this_in_hex_ : prefix; 387 return prefix.empty() ? this_in_hex_ : prefix;
399 } 388 }
400 389
401 GLenum GLES2Implementation::GetError() { 390 GLenum GLES2Implementation::GetError() {
402 GPU_CLIENT_SINGLE_THREAD_CHECK(); 391 GPU_CLIENT_SINGLE_THREAD_CHECK();
403 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetError()");
404 GLenum err = GetGLError(); 392 GLenum err = GetGLError();
405 GPU_CLIENT_LOG("returned " << GLES2Util::GetStringError(err));
406 return err; 393 return err;
407 } 394 }
408 395
409 GLenum GLES2Implementation::GetClientSideGLError() { 396 GLenum GLES2Implementation::GetClientSideGLError() {
410 if (error_bits_ == 0) { 397 if (error_bits_ == 0) {
411 return GL_NO_ERROR; 398 return GL_NO_ERROR;
412 } 399 }
413 400
414 GLenum error = GL_NO_ERROR; 401 GLenum error = GL_NO_ERROR;
415 for (uint32 mask = 1; mask != 0; mask = mask << 1) { 402 for (uint32 mask = 1; mask != 0; mask = mask << 1) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 } 438 }
452 } 439 }
453 // NOTE: Calling GetGLError overwrites data in the result buffer. 440 // NOTE: Calling GetGLError overwrites data in the result buffer.
454 void GLES2Implementation::CheckGLError() { 441 void GLES2Implementation::CheckGLError() {
455 FailGLError(GetGLError()); 442 FailGLError(GetGLError());
456 } 443 }
457 #endif // defined(GPU_CLIENT_FAIL_GL_ERRORS) 444 #endif // defined(GPU_CLIENT_FAIL_GL_ERRORS)
458 445
459 void GLES2Implementation::SetGLError( 446 void GLES2Implementation::SetGLError(
460 GLenum error, const char* function_name, const char* msg) { 447 GLenum error, const char* function_name, const char* msg) {
461 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] Client Synthesized Error: "
462 << GLES2Util::GetStringError(error) << ": "
463 << function_name << ": " << msg);
464 FailGLError(error); 448 FailGLError(error);
465 if (msg) { 449 if (msg) {
466 last_error_ = msg; 450 last_error_ = msg;
467 } 451 }
468 if (error_message_callback_) { 452 if (error_message_callback_) {
469 std::string temp(GLES2Util::GetStringError(error) + " : " + 453 std::string temp(GLES2Util::GetStringError(error) + " : " +
470 function_name + ": " + (msg ? msg : "")); 454 function_name + ": " + (msg ? msg : ""));
471 error_message_callback_->OnErrorMessage(temp.c_str(), 0); 455 error_message_callback_->OnErrorMessage(temp.c_str(), 0);
472 } 456 }
473 error_bits_ |= GLES2Util::GLErrorToErrorBit(error); 457 error_bits_ |= GLES2Util::GLErrorToErrorBit(error);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 561
578 void GLES2Implementation::SetBucketAsString( 562 void GLES2Implementation::SetBucketAsString(
579 uint32 bucket_id, const std::string& str) { 563 uint32 bucket_id, const std::string& str) {
580 // NOTE: strings are passed NULL terminated. That means the empty 564 // NOTE: strings are passed NULL terminated. That means the empty
581 // string will have a size of 1 and no-string will have a size of 0 565 // string will have a size of 1 and no-string will have a size of 0
582 SetBucketContents(bucket_id, str.c_str(), str.size() + 1); 566 SetBucketContents(bucket_id, str.c_str(), str.size() + 1);
583 } 567 }
584 568
585 void GLES2Implementation::Disable(GLenum cap) { 569 void GLES2Implementation::Disable(GLenum cap) {
586 GPU_CLIENT_SINGLE_THREAD_CHECK(); 570 GPU_CLIENT_SINGLE_THREAD_CHECK();
587 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDisable("
588 << GLES2Util::GetStringCapability(cap) << ")");
589 bool changed = false; 571 bool changed = false;
590 if (!state_.SetCapabilityState(cap, false, &changed) || changed) { 572 if (!state_.SetCapabilityState(cap, false, &changed) || changed) {
591 helper_->Disable(cap); 573 helper_->Disable(cap);
592 } 574 }
593 CheckGLError(); 575 CheckGLError();
594 } 576 }
595 577
596 void GLES2Implementation::Enable(GLenum cap) { 578 void GLES2Implementation::Enable(GLenum cap) {
597 GPU_CLIENT_SINGLE_THREAD_CHECK(); 579 GPU_CLIENT_SINGLE_THREAD_CHECK();
598 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEnable("
599 << GLES2Util::GetStringCapability(cap) << ")");
600 bool changed = false; 580 bool changed = false;
601 if (!state_.SetCapabilityState(cap, true, &changed) || changed) { 581 if (!state_.SetCapabilityState(cap, true, &changed) || changed) {
602 helper_->Enable(cap); 582 helper_->Enable(cap);
603 } 583 }
604 CheckGLError(); 584 CheckGLError();
605 } 585 }
606 586
607 GLboolean GLES2Implementation::IsEnabled(GLenum cap) { 587 GLboolean GLES2Implementation::IsEnabled(GLenum cap) {
608 GPU_CLIENT_SINGLE_THREAD_CHECK(); 588 GPU_CLIENT_SINGLE_THREAD_CHECK();
609 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glIsEnabled("
610 << GLES2Util::GetStringCapability(cap) << ")");
611 bool state = false; 589 bool state = false;
612 if (!state_.GetEnabled(cap, &state)) { 590 if (!state_.GetEnabled(cap, &state)) {
613 typedef cmds::IsEnabled::Result Result; 591 typedef cmds::IsEnabled::Result Result;
614 Result* result = GetResultAs<Result*>(); 592 Result* result = GetResultAs<Result*>();
615 if (!result) { 593 if (!result) {
616 return GL_FALSE; 594 return GL_FALSE;
617 } 595 }
618 *result = 0; 596 *result = 0;
619 helper_->IsEnabled(cap, GetResultShmId(), GetResultShmOffset()); 597 helper_->IsEnabled(cap, GetResultShmId(), GetResultShmOffset());
620 WaitForCmd(); 598 WaitForCmd();
621 state = (*result) != 0; 599 state = (*result) != 0;
622 } 600 }
623 601
624 GPU_CLIENT_LOG("returned " << state);
625 CheckGLError(); 602 CheckGLError();
626 return state; 603 return state;
627 } 604 }
628 605
629 bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) { 606 bool GLES2Implementation::GetHelper(GLenum pname, GLint* params) {
630 switch (pname) { 607 switch (pname) {
631 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 608 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
632 *params = static_state_.int_state.max_combined_texture_image_units; 609 *params = static_state_.int_state.max_combined_texture_image_units;
633 return true; 610 return true;
634 case GL_MAX_CUBE_MAP_TEXTURE_SIZE: 611 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 *result = 0; 740 *result = 0;
764 helper_->GetMaxValueInBufferCHROMIUM( 741 helper_->GetMaxValueInBufferCHROMIUM(
765 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset()); 742 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset());
766 WaitForCmd(); 743 WaitForCmd();
767 return *result; 744 return *result;
768 } 745 }
769 746
770 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUM( 747 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUM(
771 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { 748 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) {
772 GPU_CLIENT_SINGLE_THREAD_CHECK(); 749 GPU_CLIENT_SINGLE_THREAD_CHECK();
773 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetMaxValueInBufferCHROMIUM("
774 << buffer_id << ", " << count << ", "
775 << GLES2Util::GetStringGetMaxIndexType(type)
776 << ", " << offset << ")");
777 GLuint result = GetMaxValueInBufferCHROMIUMHelper( 750 GLuint result = GetMaxValueInBufferCHROMIUMHelper(
778 buffer_id, count, type, offset); 751 buffer_id, count, type, offset);
779 GPU_CLIENT_LOG("returned " << result);
780 CheckGLError(); 752 CheckGLError();
781 return result; 753 return result;
782 } 754 }
783 755
784 void GLES2Implementation::RestoreElementAndArrayBuffers(bool restore) { 756 void GLES2Implementation::RestoreElementAndArrayBuffers(bool restore) {
785 if (restore) { 757 if (restore) {
786 RestoreArrayBuffer(restore); 758 RestoreArrayBuffer(restore);
787 // Restore the element array binding. 759 // Restore the element array binding.
788 // We only need to restore it if it wasn't a client side array. 760 // We only need to restore it if it wasn't a client side array.
789 if (vertex_array_object_manager_->bound_element_array_buffer() == 0) { 761 if (vertex_array_object_manager_->bound_element_array_buffer() == 0) {
790 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 762 helper_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
791 } 763 }
792 } 764 }
793 } 765 }
794 766
795 void GLES2Implementation::RestoreArrayBuffer(bool restore) { 767 void GLES2Implementation::RestoreArrayBuffer(bool restore) {
796 if (restore) { 768 if (restore) {
797 // Restore the user's current binding. 769 // Restore the user's current binding.
798 helper_->BindBuffer(GL_ARRAY_BUFFER, bound_array_buffer_id_); 770 helper_->BindBuffer(GL_ARRAY_BUFFER, bound_array_buffer_id_);
799 } 771 }
800 } 772 }
801 773
802 void GLES2Implementation::DrawElements( 774 void GLES2Implementation::DrawElements(
803 GLenum mode, GLsizei count, GLenum type, const void* indices) { 775 GLenum mode, GLsizei count, GLenum type, const void* indices) {
804 GPU_CLIENT_SINGLE_THREAD_CHECK(); 776 GPU_CLIENT_SINGLE_THREAD_CHECK();
805 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawElements("
806 << GLES2Util::GetStringDrawMode(mode) << ", "
807 << count << ", "
808 << GLES2Util::GetStringIndexType(type) << ", "
809 << static_cast<const void*>(indices) << ")");
810 if (count < 0) { 777 if (count < 0) {
811 SetGLError(GL_INVALID_VALUE, "glDrawElements", "count less than 0."); 778 SetGLError(GL_INVALID_VALUE, "glDrawElements", "count less than 0.");
812 return; 779 return;
813 } 780 }
814 if (count == 0) { 781 if (count == 0) {
815 return; 782 return;
816 } 783 }
817 GLuint offset = 0; 784 GLuint offset = 0;
818 bool simulated = false; 785 bool simulated = false;
819 if (!vertex_array_object_manager_->SetupSimulatedIndexAndClientSideBuffers( 786 if (!vertex_array_object_manager_->SetupSimulatedIndexAndClientSideBuffers(
820 "glDrawElements", this, helper_, count, type, 0, indices, 787 "glDrawElements", this, helper_, count, type, 0, indices,
821 &offset, &simulated)) { 788 &offset, &simulated)) {
822 return; 789 return;
823 } 790 }
824 helper_->DrawElements(mode, count, type, offset); 791 helper_->DrawElements(mode, count, type, offset);
825 RestoreElementAndArrayBuffers(simulated); 792 RestoreElementAndArrayBuffers(simulated);
826 CheckGLError(); 793 CheckGLError();
827 } 794 }
828 795
829 void GLES2Implementation::Flush() { 796 void GLES2Implementation::Flush() {
830 GPU_CLIENT_SINGLE_THREAD_CHECK(); 797 GPU_CLIENT_SINGLE_THREAD_CHECK();
831 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFlush()");
832 // Insert the cmd to call glFlush 798 // Insert the cmd to call glFlush
833 helper_->Flush(); 799 helper_->Flush();
834 // Flush our command buffer 800 // Flush our command buffer
835 // (tell the service to execute up to the flush cmd.) 801 // (tell the service to execute up to the flush cmd.)
836 helper_->CommandBufferHelper::Flush(); 802 helper_->CommandBufferHelper::Flush();
837 } 803 }
838 804
839 void GLES2Implementation::ShallowFlushCHROMIUM() { 805 void GLES2Implementation::ShallowFlushCHROMIUM() {
840 GPU_CLIENT_SINGLE_THREAD_CHECK(); 806 GPU_CLIENT_SINGLE_THREAD_CHECK();
841 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShallowFlushCHROMIUM()");
842 // Flush our command buffer 807 // Flush our command buffer
843 // (tell the service to execute up to the flush cmd.) 808 // (tell the service to execute up to the flush cmd.)
844 helper_->CommandBufferHelper::Flush(); 809 helper_->CommandBufferHelper::Flush();
845 } 810 }
846 811
847 void GLES2Implementation::Finish() { 812 void GLES2Implementation::Finish() {
848 GPU_CLIENT_SINGLE_THREAD_CHECK(); 813 GPU_CLIENT_SINGLE_THREAD_CHECK();
849 FinishHelper(); 814 FinishHelper();
850 } 815 }
851 816
852 void GLES2Implementation::ShallowFinishCHROMIUM() { 817 void GLES2Implementation::ShallowFinishCHROMIUM() {
853 GPU_CLIENT_SINGLE_THREAD_CHECK(); 818 GPU_CLIENT_SINGLE_THREAD_CHECK();
854 // Flush our command buffer (tell the service to execute up to the flush cmd 819 // Flush our command buffer (tell the service to execute up to the flush cmd
855 // and don't return until it completes). 820 // and don't return until it completes).
856 helper_->CommandBufferHelper::Finish(); 821 helper_->CommandBufferHelper::Finish();
857 } 822 }
858 823
859 bool GLES2Implementation::MustBeContextLost() { 824 bool GLES2Implementation::MustBeContextLost() {
860 bool context_lost = helper_->IsContextLost(); 825 bool context_lost = helper_->IsContextLost();
861 if (!context_lost) { 826 if (!context_lost) {
862 WaitForCmd(); 827 WaitForCmd();
863 context_lost = helper_->IsContextLost(); 828 context_lost = helper_->IsContextLost();
864 } 829 }
865 CHECK(context_lost); 830 CHECK(context_lost);
866 return context_lost; 831 return context_lost;
867 } 832 }
868 833
869 void GLES2Implementation::FinishHelper() { 834 void GLES2Implementation::FinishHelper() {
870 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glFinish()");
871 TRACE_EVENT0("gpu", "GLES2::Finish"); 835 TRACE_EVENT0("gpu", "GLES2::Finish");
872 // Insert the cmd to call glFinish 836 // Insert the cmd to call glFinish
873 helper_->Finish(); 837 helper_->Finish();
874 // Finish our command buffer 838 // Finish our command buffer
875 // (tell the service to execute up to the Finish cmd and wait for it to 839 // (tell the service to execute up to the Finish cmd and wait for it to
876 // execute.) 840 // execute.)
877 helper_->CommandBufferHelper::Finish(); 841 helper_->CommandBufferHelper::Finish();
878 } 842 }
879 843
880 void GLES2Implementation::SwapBuffers() { 844 void GLES2Implementation::SwapBuffers() {
881 GPU_CLIENT_SINGLE_THREAD_CHECK(); 845 GPU_CLIENT_SINGLE_THREAD_CHECK();
882 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glSwapBuffers()");
883 // TODO(piman): Strictly speaking we'd want to insert the token after the 846 // TODO(piman): Strictly speaking we'd want to insert the token after the
884 // swap, but the state update with the updated token might not have happened 847 // swap, but the state update with the updated token might not have happened
885 // by the time the SwapBuffer callback gets called, forcing us to synchronize 848 // by the time the SwapBuffer callback gets called, forcing us to synchronize
886 // with the GPU process more than needed. So instead, make it happen before. 849 // with the GPU process more than needed. So instead, make it happen before.
887 // All it means is that we could be slightly looser on the kMaxSwapBuffers 850 // All it means is that we could be slightly looser on the kMaxSwapBuffers
888 // semantics if the client doesn't use the callback mechanism, and by chance 851 // semantics if the client doesn't use the callback mechanism, and by chance
889 // the scheduler yields between the InsertToken and the SwapBuffers. 852 // the scheduler yields between the InsertToken and the SwapBuffers.
890 swap_buffers_tokens_.push(helper_->InsertToken()); 853 swap_buffers_tokens_.push(helper_->InsertToken());
891 helper_->SwapBuffers(); 854 helper_->SwapBuffers();
892 helper_->CommandBufferHelper::Flush(); 855 helper_->CommandBufferHelper::Flush();
893 // Wait if we added too many swap buffers. Add 1 to kMaxSwapBuffers to 856 // Wait if we added too many swap buffers. Add 1 to kMaxSwapBuffers to
894 // compensate for TODO above. 857 // compensate for TODO above.
895 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { 858 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) {
896 helper_->WaitForToken(swap_buffers_tokens_.front()); 859 helper_->WaitForToken(swap_buffers_tokens_.front());
897 swap_buffers_tokens_.pop(); 860 swap_buffers_tokens_.pop();
898 } 861 }
899 } 862 }
900 863
901 void GLES2Implementation::GenSharedIdsCHROMIUM( 864 void GLES2Implementation::GenSharedIdsCHROMIUM(
902 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) { 865 GLuint namespace_id, GLuint id_offset, GLsizei n, GLuint* ids) {
903 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenSharedIdsCHROMIUM("
904 << namespace_id << ", " << id_offset << ", " << n << ", " <<
905 static_cast<void*>(ids) << ")");
906 TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM"); 866 TRACE_EVENT0("gpu", "GLES2::GenSharedIdsCHROMIUM");
907 GLsizei num = n; 867 GLsizei num = n;
908 GLuint* dst = ids; 868 GLuint* dst = ids;
909 while (num) { 869 while (num) {
910 ScopedTransferBufferArray<GLint> id_buffer(num, helper_, transfer_buffer_); 870 ScopedTransferBufferArray<GLint> id_buffer(num, helper_, transfer_buffer_);
911 if (!id_buffer.valid()) { 871 if (!id_buffer.valid()) {
912 return; 872 return;
913 } 873 }
914 helper_->GenSharedIdsCHROMIUM( 874 helper_->GenSharedIdsCHROMIUM(
915 namespace_id, id_offset, id_buffer.num_elements(), 875 namespace_id, id_offset, id_buffer.num_elements(),
916 id_buffer.shm_id(), id_buffer.offset()); 876 id_buffer.shm_id(), id_buffer.offset());
917 WaitForCmd(); 877 WaitForCmd();
918 memcpy(dst, id_buffer.address(), sizeof(*dst) * id_buffer.num_elements()); 878 memcpy(dst, id_buffer.address(), sizeof(*dst) * id_buffer.num_elements());
919 num -= id_buffer.num_elements(); 879 num -= id_buffer.num_elements();
920 dst += id_buffer.num_elements(); 880 dst += id_buffer.num_elements();
921 } 881 }
922 GPU_CLIENT_LOG_CODE_BLOCK({
923 for (GLsizei i = 0; i < n; ++i) {
924 GPU_CLIENT_LOG(" " << i << ": " << namespace_id << ", " << ids[i]);
925 }
926 });
927 } 882 }
928 883
929 void GLES2Implementation::DeleteSharedIdsCHROMIUM( 884 void GLES2Implementation::DeleteSharedIdsCHROMIUM(
930 GLuint namespace_id, GLsizei n, const GLuint* ids) { 885 GLuint namespace_id, GLsizei n, const GLuint* ids) {
931 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDeleteSharedIdsCHROMIUM("
932 << namespace_id << ", " << n << ", "
933 << static_cast<const void*>(ids) << ")");
934 GPU_CLIENT_LOG_CODE_BLOCK({
935 for (GLsizei i = 0; i < n; ++i) {
936 GPU_CLIENT_LOG(" " << i << ": " << namespace_id << ", " << ids[i]);
937 }
938 });
939 TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM"); 886 TRACE_EVENT0("gpu", "GLES2::DeleteSharedIdsCHROMIUM");
940 while (n) { 887 while (n) {
941 ScopedTransferBufferArray<GLint> id_buffer(n, helper_, transfer_buffer_); 888 ScopedTransferBufferArray<GLint> id_buffer(n, helper_, transfer_buffer_);
942 if (!id_buffer.valid()) { 889 if (!id_buffer.valid()) {
943 return; 890 return;
944 } 891 }
945 memcpy(id_buffer.address(), ids, sizeof(*ids) * id_buffer.num_elements()); 892 memcpy(id_buffer.address(), ids, sizeof(*ids) * id_buffer.num_elements());
946 helper_->DeleteSharedIdsCHROMIUM( 893 helper_->DeleteSharedIdsCHROMIUM(
947 namespace_id, id_buffer.num_elements(), 894 namespace_id, id_buffer.num_elements(),
948 id_buffer.shm_id(), id_buffer.offset()); 895 id_buffer.shm_id(), id_buffer.offset());
949 WaitForCmd(); 896 WaitForCmd();
950 n -= id_buffer.num_elements(); 897 n -= id_buffer.num_elements();
951 ids += id_buffer.num_elements(); 898 ids += id_buffer.num_elements();
952 } 899 }
953 } 900 }
954 901
955 void GLES2Implementation::RegisterSharedIdsCHROMIUM( 902 void GLES2Implementation::RegisterSharedIdsCHROMIUM(
956 GLuint namespace_id, GLsizei n, const GLuint* ids) { 903 GLuint namespace_id, GLsizei n, const GLuint* ids) {
957 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRegisterSharedIdsCHROMIUM("
958 << namespace_id << ", " << n << ", "
959 << static_cast<const void*>(ids) << ")");
960 GPU_CLIENT_LOG_CODE_BLOCK({
961 for (GLsizei i = 0; i < n; ++i) {
962 GPU_CLIENT_LOG(" " << i << ": " << namespace_id << ", " << ids[i]);
963 }
964 });
965 TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM"); 904 TRACE_EVENT0("gpu", "GLES2::RegisterSharedIdsCHROMIUM");
966 while (n) { 905 while (n) {
967 ScopedTransferBufferArray<GLint> id_buffer(n, helper_, transfer_buffer_); 906 ScopedTransferBufferArray<GLint> id_buffer(n, helper_, transfer_buffer_);
968 if (!id_buffer.valid()) { 907 if (!id_buffer.valid()) {
969 return; 908 return;
970 } 909 }
971 memcpy(id_buffer.address(), ids, sizeof(*ids) * id_buffer.num_elements()); 910 memcpy(id_buffer.address(), ids, sizeof(*ids) * id_buffer.num_elements());
972 helper_->RegisterSharedIdsCHROMIUM( 911 helper_->RegisterSharedIdsCHROMIUM(
973 namespace_id, id_buffer.num_elements(), 912 namespace_id, id_buffer.num_elements(),
974 id_buffer.shm_id(), id_buffer.offset()); 913 id_buffer.shm_id(), id_buffer.offset());
975 WaitForCmd(); 914 WaitForCmd();
976 n -= id_buffer.num_elements(); 915 n -= id_buffer.num_elements();
977 ids += id_buffer.num_elements(); 916 ids += id_buffer.num_elements();
978 } 917 }
979 } 918 }
980 919
981 void GLES2Implementation::BindAttribLocation( 920 void GLES2Implementation::BindAttribLocation(
982 GLuint program, GLuint index, const char* name) { 921 GLuint program, GLuint index, const char* name) {
983 GPU_CLIENT_SINGLE_THREAD_CHECK(); 922 GPU_CLIENT_SINGLE_THREAD_CHECK();
984 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindAttribLocation("
985 << program << ", " << index << ", " << name << ")");
986 SetBucketAsString(kResultBucketId, name); 923 SetBucketAsString(kResultBucketId, name);
987 helper_->BindAttribLocationBucket(program, index, kResultBucketId); 924 helper_->BindAttribLocationBucket(program, index, kResultBucketId);
988 helper_->SetBucketSize(kResultBucketId, 0); 925 helper_->SetBucketSize(kResultBucketId, 0);
989 CheckGLError(); 926 CheckGLError();
990 } 927 }
991 928
992 void GLES2Implementation::BindUniformLocationCHROMIUM( 929 void GLES2Implementation::BindUniformLocationCHROMIUM(
993 GLuint program, GLint location, const char* name) { 930 GLuint program, GLint location, const char* name) {
994 GPU_CLIENT_SINGLE_THREAD_CHECK(); 931 GPU_CLIENT_SINGLE_THREAD_CHECK();
995 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindUniformLocationCHROMIUM("
996 << program << ", " << location << ", " << name << ")");
997 SetBucketAsString(kResultBucketId, name); 932 SetBucketAsString(kResultBucketId, name);
998 helper_->BindUniformLocationCHROMIUMBucket( 933 helper_->BindUniformLocationCHROMIUMBucket(
999 program, location, kResultBucketId); 934 program, location, kResultBucketId);
1000 helper_->SetBucketSize(kResultBucketId, 0); 935 helper_->SetBucketSize(kResultBucketId, 0);
1001 CheckGLError(); 936 CheckGLError();
1002 } 937 }
1003 938
1004 void GLES2Implementation::GetVertexAttribPointerv( 939 void GLES2Implementation::GetVertexAttribPointerv(
1005 GLuint index, GLenum pname, void** ptr) { 940 GLuint index, GLenum pname, void** ptr) {
1006 GPU_CLIENT_SINGLE_THREAD_CHECK(); 941 GPU_CLIENT_SINGLE_THREAD_CHECK();
1007 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetVertexAttribPointer("
1008 << index << ", " << GLES2Util::GetStringVertexPointer(pname) << ", "
1009 << static_cast<void*>(ptr) << ")");
1010 GPU_CLIENT_LOG_CODE_BLOCK(int32 num_results = 1);
1011 if (!vertex_array_object_manager_->GetAttribPointer(index, pname, ptr)) { 942 if (!vertex_array_object_manager_->GetAttribPointer(index, pname, ptr)) {
1012 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribPointerv"); 943 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribPointerv");
1013 typedef cmds::GetVertexAttribPointerv::Result Result; 944 typedef cmds::GetVertexAttribPointerv::Result Result;
1014 Result* result = GetResultAs<Result*>(); 945 Result* result = GetResultAs<Result*>();
1015 if (!result) { 946 if (!result) {
1016 return; 947 return;
1017 } 948 }
1018 result->SetNumResults(0); 949 result->SetNumResults(0);
1019 helper_->GetVertexAttribPointerv( 950 helper_->GetVertexAttribPointerv(
1020 index, pname, GetResultShmId(), GetResultShmOffset()); 951 index, pname, GetResultShmId(), GetResultShmOffset());
1021 WaitForCmd(); 952 WaitForCmd();
1022 result->CopyResult(ptr); 953 result->CopyResult(ptr);
1023 GPU_CLIENT_LOG_CODE_BLOCK(num_results = result->GetNumResults());
1024 } 954 }
1025 GPU_CLIENT_LOG_CODE_BLOCK({
1026 for (int32 i = 0; i < num_results; ++i) {
1027 GPU_CLIENT_LOG(" " << i << ": " << ptr[i]);
1028 }
1029 });
1030 CheckGLError(); 955 CheckGLError();
1031 } 956 }
1032 957
1033 bool GLES2Implementation::DeleteProgramHelper(GLuint program) { 958 bool GLES2Implementation::DeleteProgramHelper(GLuint program) {
1034 if (!GetIdHandler(id_namespaces::kProgramsAndShaders)->FreeIds( 959 if (!GetIdHandler(id_namespaces::kProgramsAndShaders)->FreeIds(
1035 this, 1, &program, &GLES2Implementation::DeleteProgramStub)) { 960 this, 1, &program, &GLES2Implementation::DeleteProgramStub)) {
1036 SetGLError( 961 SetGLError(
1037 GL_INVALID_VALUE, 962 GL_INVALID_VALUE,
1038 "glDeleteProgram", "id not created by this context."); 963 "glDeleteProgram", "id not created by this context.");
1039 return false; 964 return false;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 helper_->GetAttribLocationBucket( 1007 helper_->GetAttribLocationBucket(
1083 program, kResultBucketId, GetResultShmId(), GetResultShmOffset()); 1008 program, kResultBucketId, GetResultShmId(), GetResultShmOffset());
1084 WaitForCmd(); 1009 WaitForCmd();
1085 helper_->SetBucketSize(kResultBucketId, 0); 1010 helper_->SetBucketSize(kResultBucketId, 0);
1086 return *result; 1011 return *result;
1087 } 1012 }
1088 1013
1089 GLint GLES2Implementation::GetAttribLocation( 1014 GLint GLES2Implementation::GetAttribLocation(
1090 GLuint program, const char* name) { 1015 GLuint program, const char* name) {
1091 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1016 GPU_CLIENT_SINGLE_THREAD_CHECK();
1092 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetAttribLocation(" << program
1093 << ", " << name << ")");
1094 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation"); 1017 TRACE_EVENT0("gpu", "GLES2::GetAttribLocation");
1095 GLint loc = share_group_->program_info_manager()->GetAttribLocation( 1018 GLint loc = share_group_->program_info_manager()->GetAttribLocation(
1096 this, program, name); 1019 this, program, name);
1097 GPU_CLIENT_LOG("returned " << loc);
1098 CheckGLError(); 1020 CheckGLError();
1099 return loc; 1021 return loc;
1100 } 1022 }
1101 1023
1102 GLint GLES2Implementation::GetUniformLocationHelper( 1024 GLint GLES2Implementation::GetUniformLocationHelper(
1103 GLuint program, const char* name) { 1025 GLuint program, const char* name) {
1104 typedef cmds::GetUniformLocationBucket::Result Result; 1026 typedef cmds::GetUniformLocationBucket::Result Result;
1105 Result* result = GetResultAs<Result*>(); 1027 Result* result = GetResultAs<Result*>();
1106 if (!result) { 1028 if (!result) {
1107 return -1; 1029 return -1;
1108 } 1030 }
1109 *result = -1; 1031 *result = -1;
1110 SetBucketAsCString(kResultBucketId, name); 1032 SetBucketAsCString(kResultBucketId, name);
1111 helper_->GetUniformLocationBucket(program, kResultBucketId, 1033 helper_->GetUniformLocationBucket(program, kResultBucketId,
1112 GetResultShmId(), GetResultShmOffset()); 1034 GetResultShmId(), GetResultShmOffset());
1113 WaitForCmd(); 1035 WaitForCmd();
1114 helper_->SetBucketSize(kResultBucketId, 0); 1036 helper_->SetBucketSize(kResultBucketId, 0);
1115 return *result; 1037 return *result;
1116 } 1038 }
1117 1039
1118 GLint GLES2Implementation::GetUniformLocation( 1040 GLint GLES2Implementation::GetUniformLocation(
1119 GLuint program, const char* name) { 1041 GLuint program, const char* name) {
1120 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1042 GPU_CLIENT_SINGLE_THREAD_CHECK();
1121 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetUniformLocation(" << program
1122 << ", " << name << ")");
1123 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation"); 1043 TRACE_EVENT0("gpu", "GLES2::GetUniformLocation");
1124 GLint loc = share_group_->program_info_manager()->GetUniformLocation( 1044 GLint loc = share_group_->program_info_manager()->GetUniformLocation(
1125 this, program, name); 1045 this, program, name);
1126 GPU_CLIENT_LOG("returned " << loc);
1127 CheckGLError(); 1046 CheckGLError();
1128 return loc; 1047 return loc;
1129 } 1048 }
1130 1049
1131 void GLES2Implementation::UseProgram(GLuint program) { 1050 void GLES2Implementation::UseProgram(GLuint program) {
1132 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1051 GPU_CLIENT_SINGLE_THREAD_CHECK();
1133 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUseProgram(" << program << ")");
1134 if (current_program_ != program) { 1052 if (current_program_ != program) {
1135 current_program_ = program; 1053 current_program_ = program;
1136 helper_->UseProgram(program); 1054 helper_->UseProgram(program);
1137 } 1055 }
1138 CheckGLError(); 1056 CheckGLError();
1139 } 1057 }
1140 1058
1141 bool GLES2Implementation::GetProgramivHelper( 1059 bool GLES2Implementation::GetProgramivHelper(
1142 GLuint program, GLenum pname, GLint* params) { 1060 GLuint program, GLenum pname, GLint* params) {
1143 bool got_value = share_group_->program_info_manager()->GetProgramiv( 1061 bool got_value = share_group_->program_info_manager()->GetProgramiv(
1144 this, program, pname, params); 1062 this, program, pname, params);
1145 GPU_CLIENT_LOG_CODE_BLOCK({
1146 if (got_value) {
1147 GPU_CLIENT_LOG(" 0: " << *params);
1148 }
1149 });
1150 return got_value; 1063 return got_value;
1151 } 1064 }
1152 1065
1153 void GLES2Implementation::LinkProgram(GLuint program) { 1066 void GLES2Implementation::LinkProgram(GLuint program) {
1154 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1067 GPU_CLIENT_SINGLE_THREAD_CHECK();
1155 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glLinkProgram(" << program << ")");
1156 helper_->LinkProgram(program); 1068 helper_->LinkProgram(program);
1157 share_group_->program_info_manager()->CreateInfo(program); 1069 share_group_->program_info_manager()->CreateInfo(program);
1158 CheckGLError(); 1070 CheckGLError();
1159 } 1071 }
1160 1072
1161 void GLES2Implementation::ShaderBinary( 1073 void GLES2Implementation::ShaderBinary(
1162 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary, 1074 GLsizei n, const GLuint* shaders, GLenum binaryformat, const void* binary,
1163 GLsizei length) { 1075 GLsizei length) {
1164 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1076 GPU_CLIENT_SINGLE_THREAD_CHECK();
1165 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShaderBinary(" << n << ", "
1166 << static_cast<const void*>(shaders) << ", "
1167 << GLES2Util::GetStringEnum(binaryformat) << ", "
1168 << static_cast<const void*>(binary) << ", "
1169 << length << ")");
1170 if (n < 0) { 1077 if (n < 0) {
1171 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0."); 1078 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "n < 0.");
1172 return; 1079 return;
1173 } 1080 }
1174 if (length < 0) { 1081 if (length < 0) {
1175 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0."); 1082 SetGLError(GL_INVALID_VALUE, "glShaderBinary", "length < 0.");
1176 return; 1083 return;
1177 } 1084 }
1178 // TODO(gman): ShaderBinary should use buckets. 1085 // TODO(gman): ShaderBinary should use buckets.
1179 unsigned int shader_id_size = n * sizeof(*shaders); 1086 unsigned int shader_id_size = n * sizeof(*shaders);
(...skipping 13 matching lines...) Expand all
1193 buffer.offset(), 1100 buffer.offset(),
1194 binaryformat, 1101 binaryformat,
1195 buffer.shm_id(), 1102 buffer.shm_id(),
1196 buffer.offset() + shader_id_size, 1103 buffer.offset() + shader_id_size,
1197 length); 1104 length);
1198 CheckGLError(); 1105 CheckGLError();
1199 } 1106 }
1200 1107
1201 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) { 1108 void GLES2Implementation::PixelStorei(GLenum pname, GLint param) {
1202 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1109 GPU_CLIENT_SINGLE_THREAD_CHECK();
1203 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPixelStorei("
1204 << GLES2Util::GetStringPixelStore(pname) << ", "
1205 << param << ")");
1206 switch (pname) { 1110 switch (pname) {
1207 case GL_PACK_ALIGNMENT: 1111 case GL_PACK_ALIGNMENT:
1208 pack_alignment_ = param; 1112 pack_alignment_ = param;
1209 break; 1113 break;
1210 case GL_UNPACK_ALIGNMENT: 1114 case GL_UNPACK_ALIGNMENT:
1211 unpack_alignment_ = param; 1115 unpack_alignment_ = param;
1212 break; 1116 break;
1213 case GL_UNPACK_ROW_LENGTH: 1117 case GL_UNPACK_ROW_LENGTH:
1214 unpack_row_length_ = param; 1118 unpack_row_length_ = param;
1215 return; 1119 return;
(...skipping 15 matching lines...) Expand all
1231 } 1135 }
1232 helper_->PixelStorei(pname, param); 1136 helper_->PixelStorei(pname, param);
1233 CheckGLError(); 1137 CheckGLError();
1234 } 1138 }
1235 1139
1236 1140
1237 void GLES2Implementation::VertexAttribPointer( 1141 void GLES2Implementation::VertexAttribPointer(
1238 GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, 1142 GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,
1239 const void* ptr) { 1143 const void* ptr) {
1240 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1144 GPU_CLIENT_SINGLE_THREAD_CHECK();
1241 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribPointer("
1242 << index << ", "
1243 << size << ", "
1244 << GLES2Util::GetStringVertexAttribType(type) << ", "
1245 << GLES2Util::GetStringBool(normalized) << ", "
1246 << stride << ", "
1247 << static_cast<const void*>(ptr) << ")");
1248 // Record the info on the client side. 1145 // Record the info on the client side.
1249 if (!vertex_array_object_manager_->SetAttribPointer( 1146 if (!vertex_array_object_manager_->SetAttribPointer(
1250 bound_array_buffer_id_, index, size, type, normalized, stride, ptr)) { 1147 bound_array_buffer_id_, index, size, type, normalized, stride, ptr)) {
1251 SetGLError(GL_INVALID_OPERATION, "glVertexAttribPointer", 1148 SetGLError(GL_INVALID_OPERATION, "glVertexAttribPointer",
1252 "client side arrays are not allowed in vertex array objects."); 1149 "client side arrays are not allowed in vertex array objects.");
1253 return; 1150 return;
1254 } 1151 }
1255 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1152 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1256 if (bound_array_buffer_id_ != 0) { 1153 if (bound_array_buffer_id_ != 0) {
1257 // Only report NON client side buffers to the service. 1154 // Only report NON client side buffers to the service.
1258 helper_->VertexAttribPointer(index, size, type, normalized, stride, 1155 helper_->VertexAttribPointer(index, size, type, normalized, stride,
1259 ToGLuint(ptr)); 1156 ToGLuint(ptr));
1260 } 1157 }
1261 #else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1158 #else // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1262 helper_->VertexAttribPointer(index, size, type, normalized, stride, 1159 helper_->VertexAttribPointer(index, size, type, normalized, stride,
1263 ToGLuint(ptr)); 1160 ToGLuint(ptr));
1264 #endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) 1161 #endif // !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS)
1265 CheckGLError(); 1162 CheckGLError();
1266 } 1163 }
1267 1164
1268 void GLES2Implementation::VertexAttribDivisorANGLE( 1165 void GLES2Implementation::VertexAttribDivisorANGLE(
1269 GLuint index, GLuint divisor) { 1166 GLuint index, GLuint divisor) {
1270 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1167 GPU_CLIENT_SINGLE_THREAD_CHECK();
1271 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glVertexAttribDivisorANGLE("
1272 << index << ", "
1273 << divisor << ") ");
1274 // Record the info on the client side. 1168 // Record the info on the client side.
1275 vertex_array_object_manager_->SetAttribDivisor(index, divisor); 1169 vertex_array_object_manager_->SetAttribDivisor(index, divisor);
1276 helper_->VertexAttribDivisorANGLE(index, divisor); 1170 helper_->VertexAttribDivisorANGLE(index, divisor);
1277 CheckGLError(); 1171 CheckGLError();
1278 } 1172 }
1279 1173
1280 void GLES2Implementation::ShaderSource( 1174 void GLES2Implementation::ShaderSource(
1281 GLuint shader, GLsizei count, const GLchar* const* source, const GLint* leng th) { 1175 GLuint shader, GLsizei count, const GLchar* const* source, const GLint* leng th) {
1282 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1176 GPU_CLIENT_SINGLE_THREAD_CHECK();
1283 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glShaderSource("
1284 << shader << ", " << count << ", "
1285 << static_cast<const void*>(source) << ", "
1286 << static_cast<const void*>(length) << ")");
1287 GPU_CLIENT_LOG_CODE_BLOCK({
1288 for (GLsizei ii = 0; ii < count; ++ii) {
1289 if (source[ii]) {
1290 if (length && length[ii] >= 0) {
1291 std::string str(source[ii], length[ii]);
1292 GPU_CLIENT_LOG(" " << ii << ": ---\n" << str << "\n---");
1293 } else {
1294 GPU_CLIENT_LOG(" " << ii << ": ---\n" << source[ii] << "\n---");
1295 }
1296 } else {
1297 GPU_CLIENT_LOG(" " << ii << ": NULL");
1298 }
1299 }
1300 });
1301 if (count < 0) { 1177 if (count < 0) {
1302 SetGLError(GL_INVALID_VALUE, "glShaderSource", "count < 0"); 1178 SetGLError(GL_INVALID_VALUE, "glShaderSource", "count < 0");
1303 return; 1179 return;
1304 } 1180 }
1305 if (shader == 0) { 1181 if (shader == 0) {
1306 SetGLError(GL_INVALID_VALUE, "glShaderSource", "shader == 0"); 1182 SetGLError(GL_INVALID_VALUE, "glShaderSource", "shader == 0");
1307 return; 1183 return;
1308 } 1184 }
1309 1185
1310 // Compute the total size. 1186 // Compute the total size.
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1405 1281
1406 // Make the buffer with BufferData then send via BufferSubData 1282 // Make the buffer with BufferData then send via BufferSubData
1407 helper_->BufferData(target, size, 0, 0, usage); 1283 helper_->BufferData(target, size, 0, 0, usage);
1408 BufferSubDataHelperImpl(target, 0, size, data, &buffer); 1284 BufferSubDataHelperImpl(target, 0, size, data, &buffer);
1409 CheckGLError(); 1285 CheckGLError();
1410 } 1286 }
1411 1287
1412 void GLES2Implementation::BufferData( 1288 void GLES2Implementation::BufferData(
1413 GLenum target, GLsizeiptr size, const void* data, GLenum usage) { 1289 GLenum target, GLsizeiptr size, const void* data, GLenum usage) {
1414 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1290 GPU_CLIENT_SINGLE_THREAD_CHECK();
1415 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBufferData("
1416 << GLES2Util::GetStringBufferTarget(target) << ", "
1417 << size << ", "
1418 << static_cast<const void*>(data) << ", "
1419 << GLES2Util::GetStringBufferUsage(usage) << ")");
1420 BufferDataHelper(target, size, data, usage); 1291 BufferDataHelper(target, size, data, usage);
1421 CheckGLError(); 1292 CheckGLError();
1422 } 1293 }
1423 1294
1424 void GLES2Implementation::BufferSubDataHelper( 1295 void GLES2Implementation::BufferSubDataHelper(
1425 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { 1296 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) {
1426 if (size == 0) { 1297 if (size == 0) {
1427 return; 1298 return;
1428 } 1299 }
1429 1300
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 offset += buffer->size(); 1350 offset += buffer->size();
1480 source += buffer->size(); 1351 source += buffer->size();
1481 size -= buffer->size(); 1352 size -= buffer->size();
1482 buffer->Release(); 1353 buffer->Release();
1483 } 1354 }
1484 } 1355 }
1485 1356
1486 void GLES2Implementation::BufferSubData( 1357 void GLES2Implementation::BufferSubData(
1487 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) { 1358 GLenum target, GLintptr offset, GLsizeiptr size, const void* data) {
1488 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1359 GPU_CLIENT_SINGLE_THREAD_CHECK();
1489 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBufferSubData("
1490 << GLES2Util::GetStringBufferTarget(target) << ", "
1491 << offset << ", " << size << ", "
1492 << static_cast<const void*>(data) << ")");
1493 BufferSubDataHelper(target, offset, size, data); 1360 BufferSubDataHelper(target, offset, size, data);
1494 CheckGLError(); 1361 CheckGLError();
1495 } 1362 }
1496 1363
1497 bool GLES2Implementation::GetBoundPixelTransferBuffer( 1364 bool GLES2Implementation::GetBoundPixelTransferBuffer(
1498 GLenum target, 1365 GLenum target,
1499 const char* function_name, 1366 const char* function_name,
1500 GLuint* buffer_id) { 1367 GLuint* buffer_id) {
1501 *buffer_id = 0; 1368 *buffer_id = 0;
1502 1369
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 SetGLError(GL_INVALID_VALUE, function_name, "unpack size to large"); 1404 SetGLError(GL_INVALID_VALUE, function_name, "unpack size to large");
1538 return NULL; 1405 return NULL;
1539 } 1406 }
1540 return buffer; 1407 return buffer;
1541 } 1408 }
1542 1409
1543 void GLES2Implementation::CompressedTexImage2D( 1410 void GLES2Implementation::CompressedTexImage2D(
1544 GLenum target, GLint level, GLenum internalformat, GLsizei width, 1411 GLenum target, GLint level, GLenum internalformat, GLsizei width,
1545 GLsizei height, GLint border, GLsizei image_size, const void* data) { 1412 GLsizei height, GLint border, GLsizei image_size, const void* data) {
1546 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1413 GPU_CLIENT_SINGLE_THREAD_CHECK();
1547 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompressedTexImage2D("
1548 << GLES2Util::GetStringTextureTarget(target) << ", "
1549 << level << ", "
1550 << GLES2Util::GetStringCompressedTextureFormat(internalformat) << ", "
1551 << width << ", " << height << ", " << border << ", "
1552 << image_size << ", "
1553 << static_cast<const void*>(data) << ")");
1554 if (width < 0 || height < 0 || level < 0) { 1414 if (width < 0 || height < 0 || level < 0) {
1555 SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D", "dimension < 0"); 1415 SetGLError(GL_INVALID_VALUE, "glCompressedTexImage2D", "dimension < 0");
1556 return; 1416 return;
1557 } 1417 }
1558 if (height == 0 || width == 0) { 1418 if (height == 0 || width == 0) {
1559 return; 1419 return;
1560 } 1420 }
1561 // If there's a pixel unpack buffer bound use it when issuing 1421 // If there's a pixel unpack buffer bound use it when issuing
1562 // CompressedTexImage2D. 1422 // CompressedTexImage2D.
1563 if (bound_pixel_unpack_transfer_buffer_id_) { 1423 if (bound_pixel_unpack_transfer_buffer_id_) {
(...skipping 16 matching lines...) Expand all
1580 // and we don't have to wait for the result so from the client's perspective 1440 // and we don't have to wait for the result so from the client's perspective
1581 // it's cheap. 1441 // it's cheap.
1582 helper_->SetBucketSize(kResultBucketId, 0); 1442 helper_->SetBucketSize(kResultBucketId, 0);
1583 CheckGLError(); 1443 CheckGLError();
1584 } 1444 }
1585 1445
1586 void GLES2Implementation::CompressedTexSubImage2D( 1446 void GLES2Implementation::CompressedTexSubImage2D(
1587 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 1447 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
1588 GLsizei height, GLenum format, GLsizei image_size, const void* data) { 1448 GLsizei height, GLenum format, GLsizei image_size, const void* data) {
1589 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1449 GPU_CLIENT_SINGLE_THREAD_CHECK();
1590 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCompressedTexSubImage2D("
1591 << GLES2Util::GetStringTextureTarget(target) << ", "
1592 << level << ", "
1593 << xoffset << ", " << yoffset << ", "
1594 << width << ", " << height << ", "
1595 << GLES2Util::GetStringCompressedTextureFormat(format) << ", "
1596 << image_size << ", "
1597 << static_cast<const void*>(data) << ")");
1598 if (width < 0 || height < 0 || level < 0) { 1450 if (width < 0 || height < 0 || level < 0) {
1599 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "dimension < 0"); 1451 SetGLError(GL_INVALID_VALUE, "glCompressedTexSubImage2D", "dimension < 0");
1600 return; 1452 return;
1601 } 1453 }
1602 // If there's a pixel unpack buffer bound use it when issuing 1454 // If there's a pixel unpack buffer bound use it when issuing
1603 // CompressedTexSubImage2D. 1455 // CompressedTexSubImage2D.
1604 if (bound_pixel_unpack_transfer_buffer_id_) { 1456 if (bound_pixel_unpack_transfer_buffer_id_) {
1605 GLuint offset = ToGLuint(data); 1457 GLuint offset = ToGLuint(data);
1606 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid( 1458 BufferTracker::Buffer* buffer = GetBoundPixelUnpackTransferBufferIfValid(
1607 bound_pixel_unpack_transfer_buffer_id_, 1459 bound_pixel_unpack_transfer_buffer_id_,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 } 1510 }
1659 } 1511 }
1660 1512
1661 } // anonymous namespace 1513 } // anonymous namespace
1662 1514
1663 void GLES2Implementation::TexImage2D( 1515 void GLES2Implementation::TexImage2D(
1664 GLenum target, GLint level, GLint internalformat, GLsizei width, 1516 GLenum target, GLint level, GLint internalformat, GLsizei width,
1665 GLsizei height, GLint border, GLenum format, GLenum type, 1517 GLsizei height, GLint border, GLenum format, GLenum type,
1666 const void* pixels) { 1518 const void* pixels) {
1667 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1519 GPU_CLIENT_SINGLE_THREAD_CHECK();
1668 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D("
1669 << GLES2Util::GetStringTextureTarget(target) << ", "
1670 << level << ", "
1671 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
1672 << width << ", " << height << ", " << border << ", "
1673 << GLES2Util::GetStringTextureFormat(format) << ", "
1674 << GLES2Util::GetStringPixelType(type) << ", "
1675 << static_cast<const void*>(pixels) << ")");
1676 if (level < 0 || height < 0 || width < 0) { 1520 if (level < 0 || height < 0 || width < 0) {
1677 SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0"); 1521 SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0");
1678 return; 1522 return;
1679 } 1523 }
1680 uint32 size; 1524 uint32 size;
1681 uint32 unpadded_row_size; 1525 uint32 unpadded_row_size;
1682 uint32 padded_row_size; 1526 uint32 padded_row_size;
1683 if (!GLES2Util::ComputeImageDataSizes( 1527 if (!GLES2Util::ComputeImageDataSizes(
1684 width, height, format, type, unpack_alignment_, &size, 1528 width, height, format, type, unpack_alignment_, &size,
1685 &unpadded_row_size, &padded_row_size)) { 1529 &unpadded_row_size, &padded_row_size)) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 TexSubImage2DImpl( 1603 TexSubImage2DImpl(
1760 target, level, 0, 0, width, height, format, type, unpadded_row_size, 1604 target, level, 0, 0, width, height, format, type, unpadded_row_size,
1761 pixels, src_padded_row_size, GL_TRUE, &buffer, padded_row_size); 1605 pixels, src_padded_row_size, GL_TRUE, &buffer, padded_row_size);
1762 CheckGLError(); 1606 CheckGLError();
1763 } 1607 }
1764 1608
1765 void GLES2Implementation::TexSubImage2D( 1609 void GLES2Implementation::TexSubImage2D(
1766 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 1610 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
1767 GLsizei height, GLenum format, GLenum type, const void* pixels) { 1611 GLsizei height, GLenum format, GLenum type, const void* pixels) {
1768 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1612 GPU_CLIENT_SINGLE_THREAD_CHECK();
1769 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexSubImage2D("
1770 << GLES2Util::GetStringTextureTarget(target) << ", "
1771 << level << ", "
1772 << xoffset << ", " << yoffset << ", "
1773 << width << ", " << height << ", "
1774 << GLES2Util::GetStringTextureFormat(format) << ", "
1775 << GLES2Util::GetStringPixelType(type) << ", "
1776 << static_cast<const void*>(pixels) << ")");
1777 1613
1778 if (level < 0 || height < 0 || width < 0) { 1614 if (level < 0 || height < 0 || width < 0) {
1779 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "dimension < 0"); 1615 SetGLError(GL_INVALID_VALUE, "glTexSubImage2D", "dimension < 0");
1780 return; 1616 return;
1781 } 1617 }
1782 if (height == 0 || width == 0) { 1618 if (height == 0 || width == 0) {
1783 return; 1619 return;
1784 } 1620 }
1785 1621
1786 uint32 temp_size; 1622 uint32 temp_size;
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 } 1764 }
1929 } 1765 }
1930 } 1766 }
1931 return result->success != 0; 1767 return result->success != 0;
1932 } 1768 }
1933 1769
1934 void GLES2Implementation::GetActiveAttrib( 1770 void GLES2Implementation::GetActiveAttrib(
1935 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, 1771 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
1936 GLenum* type, char* name) { 1772 GLenum* type, char* name) {
1937 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1773 GPU_CLIENT_SINGLE_THREAD_CHECK();
1938 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetActiveAttrib("
1939 << program << ", " << index << ", " << bufsize << ", "
1940 << static_cast<const void*>(length) << ", "
1941 << static_cast<const void*>(size) << ", "
1942 << static_cast<const void*>(type) << ", "
1943 << static_cast<const void*>(name) << ", ");
1944 if (bufsize < 0) { 1774 if (bufsize < 0) {
1945 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "bufsize < 0"); 1775 SetGLError(GL_INVALID_VALUE, "glGetActiveAttrib", "bufsize < 0");
1946 return; 1776 return;
1947 } 1777 }
1948 TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib"); 1778 TRACE_EVENT0("gpu", "GLES2::GetActiveAttrib");
1949 bool success = share_group_->program_info_manager()->GetActiveAttrib( 1779 share_group_->program_info_manager()->GetActiveAttrib(
1950 this, program, index, bufsize, length, size, type, name); 1780 this, program, index, bufsize, length, size, type, name);
1951 if (success) {
1952 if (size) {
1953 GPU_CLIENT_LOG(" size: " << *size);
1954 }
1955 if (type) {
1956 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type));
1957 }
1958 if (name) {
1959 GPU_CLIENT_LOG(" name: " << name);
1960 }
1961 }
1962 CheckGLError(); 1781 CheckGLError();
1963 } 1782 }
1964 1783
1965 bool GLES2Implementation::GetActiveUniformHelper( 1784 bool GLES2Implementation::GetActiveUniformHelper(
1966 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, 1785 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
1967 GLenum* type, char* name) { 1786 GLenum* type, char* name) {
1968 // Clear the bucket so if the command fails nothing will be in it. 1787 // Clear the bucket so if the command fails nothing will be in it.
1969 helper_->SetBucketSize(kResultBucketId, 0); 1788 helper_->SetBucketSize(kResultBucketId, 0);
1970 typedef cmds::GetActiveUniform::Result Result; 1789 typedef cmds::GetActiveUniform::Result Result;
1971 Result* result = GetResultAs<Result*>(); 1790 Result* result = GetResultAs<Result*>();
(...skipping 27 matching lines...) Expand all
1999 } 1818 }
2000 } 1819 }
2001 } 1820 }
2002 return result->success != 0; 1821 return result->success != 0;
2003 } 1822 }
2004 1823
2005 void GLES2Implementation::GetActiveUniform( 1824 void GLES2Implementation::GetActiveUniform(
2006 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, 1825 GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size,
2007 GLenum* type, char* name) { 1826 GLenum* type, char* name) {
2008 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1827 GPU_CLIENT_SINGLE_THREAD_CHECK();
2009 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetActiveUniform("
2010 << program << ", " << index << ", " << bufsize << ", "
2011 << static_cast<const void*>(length) << ", "
2012 << static_cast<const void*>(size) << ", "
2013 << static_cast<const void*>(type) << ", "
2014 << static_cast<const void*>(name) << ", ");
2015 if (bufsize < 0) { 1828 if (bufsize < 0) {
2016 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "bufsize < 0"); 1829 SetGLError(GL_INVALID_VALUE, "glGetActiveUniform", "bufsize < 0");
2017 return; 1830 return;
2018 } 1831 }
2019 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform"); 1832 TRACE_EVENT0("gpu", "GLES2::GetActiveUniform");
2020 bool success = share_group_->program_info_manager()->GetActiveUniform( 1833 share_group_->program_info_manager()->GetActiveUniform(
2021 this, program, index, bufsize, length, size, type, name); 1834 this, program, index, bufsize, length, size, type, name);
2022 if (success) {
2023 if (size) {
2024 GPU_CLIENT_LOG(" size: " << *size);
2025 }
2026 if (type) {
2027 GPU_CLIENT_LOG(" type: " << GLES2Util::GetStringEnum(*type));
2028 }
2029 if (name) {
2030 GPU_CLIENT_LOG(" name: " << name);
2031 }
2032 }
2033 CheckGLError(); 1835 CheckGLError();
2034 } 1836 }
2035 1837
2036 void GLES2Implementation::GetAttachedShaders( 1838 void GLES2Implementation::GetAttachedShaders(
2037 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) { 1839 GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders) {
2038 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1840 GPU_CLIENT_SINGLE_THREAD_CHECK();
2039 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetAttachedShaders("
2040 << program << ", " << maxcount << ", "
2041 << static_cast<const void*>(count) << ", "
2042 << static_cast<const void*>(shaders) << ", ");
2043 if (maxcount < 0) { 1841 if (maxcount < 0) {
2044 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders", "maxcount < 0"); 1842 SetGLError(GL_INVALID_VALUE, "glGetAttachedShaders", "maxcount < 0");
2045 return; 1843 return;
2046 } 1844 }
2047 TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders"); 1845 TRACE_EVENT0("gpu", "GLES2::GetAttachedShaders");
2048 typedef cmds::GetAttachedShaders::Result Result; 1846 typedef cmds::GetAttachedShaders::Result Result;
2049 uint32 size = Result::ComputeSize(maxcount); 1847 uint32 size = Result::ComputeSize(maxcount);
2050 Result* result = static_cast<Result*>(transfer_buffer_->Alloc(size)); 1848 Result* result = static_cast<Result*>(transfer_buffer_->Alloc(size));
2051 if (!result) { 1849 if (!result) {
2052 return; 1850 return;
2053 } 1851 }
2054 result->SetNumResults(0); 1852 result->SetNumResults(0);
2055 helper_->GetAttachedShaders( 1853 helper_->GetAttachedShaders(
2056 program, 1854 program,
2057 transfer_buffer_->GetShmId(), 1855 transfer_buffer_->GetShmId(),
2058 transfer_buffer_->GetOffset(result), 1856 transfer_buffer_->GetOffset(result),
2059 size); 1857 size);
2060 int32 token = helper_->InsertToken(); 1858 int32 token = helper_->InsertToken();
2061 WaitForCmd(); 1859 WaitForCmd();
2062 if (count) { 1860 if (count) {
2063 *count = result->GetNumResults(); 1861 *count = result->GetNumResults();
2064 } 1862 }
2065 result->CopyResult(shaders); 1863 result->CopyResult(shaders);
2066 GPU_CLIENT_LOG_CODE_BLOCK({
2067 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2068 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2069 }
2070 });
2071 transfer_buffer_->FreePendingToken(result, token); 1864 transfer_buffer_->FreePendingToken(result, token);
2072 CheckGLError(); 1865 CheckGLError();
2073 } 1866 }
2074 1867
2075 void GLES2Implementation::GetShaderPrecisionFormat( 1868 void GLES2Implementation::GetShaderPrecisionFormat(
2076 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) { 1869 GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision) {
2077 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1870 GPU_CLIENT_SINGLE_THREAD_CHECK();
2078 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetShaderPrecisionFormat("
2079 << GLES2Util::GetStringShaderType(shadertype) << ", "
2080 << GLES2Util::GetStringShaderPrecision(precisiontype) << ", "
2081 << static_cast<const void*>(range) << ", "
2082 << static_cast<const void*>(precision) << ", ");
2083 TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat"); 1871 TRACE_EVENT0("gpu", "GLES2::GetShaderPrecisionFormat");
2084 typedef cmds::GetShaderPrecisionFormat::Result Result; 1872 typedef cmds::GetShaderPrecisionFormat::Result Result;
2085 Result* result = GetResultAs<Result*>(); 1873 Result* result = GetResultAs<Result*>();
2086 if (!result) { 1874 if (!result) {
2087 return; 1875 return;
2088 } 1876 }
2089 1877
2090 GLStaticState::ShaderPrecisionKey key(shadertype, precisiontype); 1878 GLStaticState::ShaderPrecisionKey key(shadertype, precisiontype);
2091 GLStaticState::ShaderPrecisionMap::iterator i = 1879 GLStaticState::ShaderPrecisionMap::iterator i =
2092 static_state_.shader_precisions.find(key); 1880 static_state_.shader_precisions.find(key);
2093 if (i != static_state_.shader_precisions.end()) { 1881 if (i != static_state_.shader_precisions.end()) {
2094 *result = i->second; 1882 *result = i->second;
2095 } else { 1883 } else {
2096 result->success = false; 1884 result->success = false;
2097 helper_->GetShaderPrecisionFormat( 1885 helper_->GetShaderPrecisionFormat(
2098 shadertype, precisiontype, GetResultShmId(), GetResultShmOffset()); 1886 shadertype, precisiontype, GetResultShmId(), GetResultShmOffset());
2099 WaitForCmd(); 1887 WaitForCmd();
2100 if (result->success) 1888 if (result->success)
2101 static_state_.shader_precisions[key] = *result; 1889 static_state_.shader_precisions[key] = *result;
2102 } 1890 }
2103 1891
2104 if (result->success) { 1892 if (result->success) {
2105 if (range) { 1893 if (range) {
2106 range[0] = result->min_range; 1894 range[0] = result->min_range;
2107 range[1] = result->max_range; 1895 range[1] = result->max_range;
2108 GPU_CLIENT_LOG(" min_range: " << range[0]);
2109 GPU_CLIENT_LOG(" min_range: " << range[1]);
2110 } 1896 }
2111 if (precision) { 1897 if (precision) {
2112 precision[0] = result->precision; 1898 precision[0] = result->precision;
2113 GPU_CLIENT_LOG(" min_range: " << precision[0]);
2114 } 1899 }
2115 } 1900 }
2116 CheckGLError(); 1901 CheckGLError();
2117 } 1902 }
2118 1903
2119 const GLubyte* GLES2Implementation::GetStringHelper(GLenum name) { 1904 const GLubyte* GLES2Implementation::GetStringHelper(GLenum name) {
2120 const char* result = NULL; 1905 const char* result = NULL;
2121 // Clears the bucket so if the command fails nothing will be in it. 1906 // Clears the bucket so if the command fails nothing will be in it.
2122 helper_->SetBucketSize(kResultBucketId, 0); 1907 helper_->SetBucketSize(kResultBucketId, 0);
2123 helper_->GetString(name, kResultBucketId); 1908 helper_->GetString(name, kResultBucketId);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2160 string_set.insert(str); 1945 string_set.insert(str);
2161 DCHECK(insert_result.second); 1946 DCHECK(insert_result.second);
2162 result = insert_result.first->c_str(); 1947 result = insert_result.first->c_str();
2163 } 1948 }
2164 } 1949 }
2165 return reinterpret_cast<const GLubyte*>(result); 1950 return reinterpret_cast<const GLubyte*>(result);
2166 } 1951 }
2167 1952
2168 const GLubyte* GLES2Implementation::GetString(GLenum name) { 1953 const GLubyte* GLES2Implementation::GetString(GLenum name) {
2169 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1954 GPU_CLIENT_SINGLE_THREAD_CHECK();
2170 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetString("
2171 << GLES2Util::GetStringStringType(name) << ")");
2172 TRACE_EVENT0("gpu", "GLES2::GetString"); 1955 TRACE_EVENT0("gpu", "GLES2::GetString");
2173 const GLubyte* result = GetStringHelper(name); 1956 const GLubyte* result = GetStringHelper(name);
2174 GPU_CLIENT_LOG(" returned " << reinterpret_cast<const char*>(result));
2175 CheckGLError(); 1957 CheckGLError();
2176 return result; 1958 return result;
2177 } 1959 }
2178 1960
2179 void GLES2Implementation::GetUniformfv( 1961 void GLES2Implementation::GetUniformfv(
2180 GLuint program, GLint location, GLfloat* params) { 1962 GLuint program, GLint location, GLfloat* params) {
2181 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1963 GPU_CLIENT_SINGLE_THREAD_CHECK();
2182 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetUniformfv("
2183 << program << ", " << location << ", "
2184 << static_cast<const void*>(params) << ")");
2185 TRACE_EVENT0("gpu", "GLES2::GetUniformfv"); 1964 TRACE_EVENT0("gpu", "GLES2::GetUniformfv");
2186 typedef cmds::GetUniformfv::Result Result; 1965 typedef cmds::GetUniformfv::Result Result;
2187 Result* result = GetResultAs<Result*>(); 1966 Result* result = GetResultAs<Result*>();
2188 if (!result) { 1967 if (!result) {
2189 return; 1968 return;
2190 } 1969 }
2191 result->SetNumResults(0); 1970 result->SetNumResults(0);
2192 helper_->GetUniformfv( 1971 helper_->GetUniformfv(
2193 program, location, GetResultShmId(), GetResultShmOffset()); 1972 program, location, GetResultShmId(), GetResultShmOffset());
2194 WaitForCmd(); 1973 WaitForCmd();
2195 result->CopyResult(params); 1974 result->CopyResult(params);
2196 GPU_CLIENT_LOG_CODE_BLOCK({
2197 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2198 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2199 }
2200 });
2201 CheckGLError(); 1975 CheckGLError();
2202 } 1976 }
2203 1977
2204 void GLES2Implementation::GetUniformiv( 1978 void GLES2Implementation::GetUniformiv(
2205 GLuint program, GLint location, GLint* params) { 1979 GLuint program, GLint location, GLint* params) {
2206 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1980 GPU_CLIENT_SINGLE_THREAD_CHECK();
2207 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetUniformiv("
2208 << program << ", " << location << ", "
2209 << static_cast<const void*>(params) << ")");
2210 TRACE_EVENT0("gpu", "GLES2::GetUniformiv"); 1981 TRACE_EVENT0("gpu", "GLES2::GetUniformiv");
2211 typedef cmds::GetUniformiv::Result Result; 1982 typedef cmds::GetUniformiv::Result Result;
2212 Result* result = GetResultAs<Result*>(); 1983 Result* result = GetResultAs<Result*>();
2213 if (!result) { 1984 if (!result) {
2214 return; 1985 return;
2215 } 1986 }
2216 result->SetNumResults(0); 1987 result->SetNumResults(0);
2217 helper_->GetUniformiv( 1988 helper_->GetUniformiv(
2218 program, location, GetResultShmId(), GetResultShmOffset()); 1989 program, location, GetResultShmId(), GetResultShmOffset());
2219 WaitForCmd(); 1990 WaitForCmd();
2220 GetResultAs<cmds::GetUniformfv::Result*>()->CopyResult(params); 1991 GetResultAs<cmds::GetUniformfv::Result*>()->CopyResult(params);
2221 GPU_CLIENT_LOG_CODE_BLOCK({
2222 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2223 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2224 }
2225 });
2226 CheckGLError(); 1992 CheckGLError();
2227 } 1993 }
2228 1994
2229 void GLES2Implementation::ReadPixels( 1995 void GLES2Implementation::ReadPixels(
2230 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, 1996 GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format,
2231 GLenum type, void* pixels) { 1997 GLenum type, void* pixels) {
2232 GPU_CLIENT_SINGLE_THREAD_CHECK(); 1998 GPU_CLIENT_SINGLE_THREAD_CHECK();
2233 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReadPixels("
2234 << xoffset << ", " << yoffset << ", "
2235 << width << ", " << height << ", "
2236 << GLES2Util::GetStringReadPixelFormat(format) << ", "
2237 << GLES2Util::GetStringPixelType(type) << ", "
2238 << static_cast<const void*>(pixels) << ")");
2239 if (width < 0 || height < 0) { 1999 if (width < 0 || height < 0) {
2240 SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0"); 2000 SetGLError(GL_INVALID_VALUE, "glReadPixels", "dimensions < 0");
2241 return; 2001 return;
2242 } 2002 }
2243 if (width == 0 || height == 0) { 2003 if (width == 0 || height == 0) {
2244 return; 2004 return;
2245 } 2005 }
2246 2006
2247 // glReadPixel pads the size of each row of pixels by an amount specified by 2007 // glReadPixel pads the size of each row of pixels by an amount specified by
2248 // glPixelStorei. So, we have to take that into account both in the fact that 2008 // glPixelStorei. So, we have to take that into account both in the fact that
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2333 return; 2093 return;
2334 } 2094 }
2335 yoffset += num_rows; 2095 yoffset += num_rows;
2336 height -= num_rows; 2096 height -= num_rows;
2337 } 2097 }
2338 CheckGLError(); 2098 CheckGLError();
2339 } 2099 }
2340 2100
2341 void GLES2Implementation::ActiveTexture(GLenum texture) { 2101 void GLES2Implementation::ActiveTexture(GLenum texture) {
2342 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2102 GPU_CLIENT_SINGLE_THREAD_CHECK();
2343 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glActiveTexture("
2344 << GLES2Util::GetStringEnum(texture) << ")");
2345 GLuint texture_index = texture - GL_TEXTURE0; 2103 GLuint texture_index = texture - GL_TEXTURE0;
2346 if (texture_index >= static_cast<GLuint>( 2104 if (texture_index >= static_cast<GLuint>(
2347 static_state_.int_state.max_combined_texture_image_units)) { 2105 static_state_.int_state.max_combined_texture_image_units)) {
2348 SetGLErrorInvalidEnum( 2106 SetGLErrorInvalidEnum(
2349 "glActiveTexture", texture, "texture"); 2107 "glActiveTexture", texture, "texture");
2350 return; 2108 return;
2351 } 2109 }
2352 2110
2353 active_texture_unit_ = texture_index; 2111 active_texture_unit_ = texture_index;
2354 helper_->ActiveTexture(texture); 2112 helper_->ActiveTexture(texture);
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
2655 helper_->DeleteVertexArraysOESImmediate(n, arrays); 2413 helper_->DeleteVertexArraysOESImmediate(n, arrays);
2656 } 2414 }
2657 2415
2658 void GLES2Implementation::DeleteTexturesStub( 2416 void GLES2Implementation::DeleteTexturesStub(
2659 GLsizei n, const GLuint* textures) { 2417 GLsizei n, const GLuint* textures) {
2660 helper_->DeleteTexturesImmediate(n, textures); 2418 helper_->DeleteTexturesImmediate(n, textures);
2661 } 2419 }
2662 2420
2663 void GLES2Implementation::DisableVertexAttribArray(GLuint index) { 2421 void GLES2Implementation::DisableVertexAttribArray(GLuint index) {
2664 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2422 GPU_CLIENT_SINGLE_THREAD_CHECK();
2665 GPU_CLIENT_LOG(
2666 "[" << GetLogPrefix() << "] glDisableVertexAttribArray(" << index << ")");
2667 vertex_array_object_manager_->SetAttribEnable(index, false); 2423 vertex_array_object_manager_->SetAttribEnable(index, false);
2668 helper_->DisableVertexAttribArray(index); 2424 helper_->DisableVertexAttribArray(index);
2669 CheckGLError(); 2425 CheckGLError();
2670 } 2426 }
2671 2427
2672 void GLES2Implementation::EnableVertexAttribArray(GLuint index) { 2428 void GLES2Implementation::EnableVertexAttribArray(GLuint index) {
2673 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2429 GPU_CLIENT_SINGLE_THREAD_CHECK();
2674 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEnableVertexAttribArray("
2675 << index << ")");
2676 vertex_array_object_manager_->SetAttribEnable(index, true); 2430 vertex_array_object_manager_->SetAttribEnable(index, true);
2677 helper_->EnableVertexAttribArray(index); 2431 helper_->EnableVertexAttribArray(index);
2678 CheckGLError(); 2432 CheckGLError();
2679 } 2433 }
2680 2434
2681 void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) { 2435 void GLES2Implementation::DrawArrays(GLenum mode, GLint first, GLsizei count) {
2682 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2436 GPU_CLIENT_SINGLE_THREAD_CHECK();
2683 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArrays("
2684 << GLES2Util::GetStringDrawMode(mode) << ", "
2685 << first << ", " << count << ")");
2686 if (count < 0) { 2437 if (count < 0) {
2687 SetGLError(GL_INVALID_VALUE, "glDrawArrays", "count < 0"); 2438 SetGLError(GL_INVALID_VALUE, "glDrawArrays", "count < 0");
2688 return; 2439 return;
2689 } 2440 }
2690 bool simulated = false; 2441 bool simulated = false;
2691 if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers( 2442 if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers(
2692 "glDrawArrays", this, helper_, first + count, 0, &simulated)) { 2443 "glDrawArrays", this, helper_, first + count, 0, &simulated)) {
2693 return; 2444 return;
2694 } 2445 }
2695 helper_->DrawArrays(mode, first, count); 2446 helper_->DrawArrays(mode, first, count);
2696 RestoreArrayBuffer(simulated); 2447 RestoreArrayBuffer(simulated);
2697 CheckGLError(); 2448 CheckGLError();
2698 } 2449 }
2699 2450
2700 void GLES2Implementation::GetVertexAttribfv( 2451 void GLES2Implementation::GetVertexAttribfv(
2701 GLuint index, GLenum pname, GLfloat* params) { 2452 GLuint index, GLenum pname, GLfloat* params) {
2702 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2453 GPU_CLIENT_SINGLE_THREAD_CHECK();
2703 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetVertexAttribfv("
2704 << index << ", "
2705 << GLES2Util::GetStringVertexAttribute(pname) << ", "
2706 << static_cast<const void*>(params) << ")");
2707 uint32 value = 0; 2454 uint32 value = 0;
2708 if (vertex_array_object_manager_->GetVertexAttrib(index, pname, &value)) { 2455 if (vertex_array_object_manager_->GetVertexAttrib(index, pname, &value)) {
2709 *params = static_cast<float>(value); 2456 *params = static_cast<float>(value);
2710 return; 2457 return;
2711 } 2458 }
2712 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv"); 2459 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribfv");
2713 typedef cmds::GetVertexAttribfv::Result Result; 2460 typedef cmds::GetVertexAttribfv::Result Result;
2714 Result* result = GetResultAs<Result*>(); 2461 Result* result = GetResultAs<Result*>();
2715 if (!result) { 2462 if (!result) {
2716 return; 2463 return;
2717 } 2464 }
2718 result->SetNumResults(0); 2465 result->SetNumResults(0);
2719 helper_->GetVertexAttribfv( 2466 helper_->GetVertexAttribfv(
2720 index, pname, GetResultShmId(), GetResultShmOffset()); 2467 index, pname, GetResultShmId(), GetResultShmOffset());
2721 WaitForCmd(); 2468 WaitForCmd();
2722 result->CopyResult(params); 2469 result->CopyResult(params);
2723 GPU_CLIENT_LOG_CODE_BLOCK({
2724 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2725 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2726 }
2727 });
2728 CheckGLError(); 2470 CheckGLError();
2729 } 2471 }
2730 2472
2731 void GLES2Implementation::GetVertexAttribiv( 2473 void GLES2Implementation::GetVertexAttribiv(
2732 GLuint index, GLenum pname, GLint* params) { 2474 GLuint index, GLenum pname, GLint* params) {
2733 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2475 GPU_CLIENT_SINGLE_THREAD_CHECK();
2734 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetVertexAttribiv("
2735 << index << ", "
2736 << GLES2Util::GetStringVertexAttribute(pname) << ", "
2737 << static_cast<const void*>(params) << ")");
2738 uint32 value = 0; 2476 uint32 value = 0;
2739 if (vertex_array_object_manager_->GetVertexAttrib(index, pname, &value)) { 2477 if (vertex_array_object_manager_->GetVertexAttrib(index, pname, &value)) {
2740 *params = value; 2478 *params = value;
2741 return; 2479 return;
2742 } 2480 }
2743 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv"); 2481 TRACE_EVENT0("gpu", "GLES2::GetVertexAttribiv");
2744 typedef cmds::GetVertexAttribiv::Result Result; 2482 typedef cmds::GetVertexAttribiv::Result Result;
2745 Result* result = GetResultAs<Result*>(); 2483 Result* result = GetResultAs<Result*>();
2746 if (!result) { 2484 if (!result) {
2747 return; 2485 return;
2748 } 2486 }
2749 result->SetNumResults(0); 2487 result->SetNumResults(0);
2750 helper_->GetVertexAttribiv( 2488 helper_->GetVertexAttribiv(
2751 index, pname, GetResultShmId(), GetResultShmOffset()); 2489 index, pname, GetResultShmId(), GetResultShmOffset());
2752 WaitForCmd(); 2490 WaitForCmd();
2753 result->CopyResult(params); 2491 result->CopyResult(params);
2754 GPU_CLIENT_LOG_CODE_BLOCK({
2755 for (int32 i = 0; i < result->GetNumResults(); ++i) {
2756 GPU_CLIENT_LOG(" " << i << ": " << result->GetData()[i]);
2757 }
2758 });
2759 CheckGLError(); 2492 CheckGLError();
2760 } 2493 }
2761 2494
2762 GLboolean GLES2Implementation::EnableFeatureCHROMIUM( 2495 GLboolean GLES2Implementation::EnableFeatureCHROMIUM(
2763 const char* feature) { 2496 const char* feature) {
2764 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2497 GPU_CLIENT_SINGLE_THREAD_CHECK();
2765 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glEnableFeatureCHROMIUM("
2766 << feature << ")");
2767 TRACE_EVENT0("gpu", "GLES2::EnableFeatureCHROMIUM"); 2498 TRACE_EVENT0("gpu", "GLES2::EnableFeatureCHROMIUM");
2768 typedef cmds::EnableFeatureCHROMIUM::Result Result; 2499 typedef cmds::EnableFeatureCHROMIUM::Result Result;
2769 Result* result = GetResultAs<Result*>(); 2500 Result* result = GetResultAs<Result*>();
2770 if (!result) { 2501 if (!result) {
2771 return false; 2502 return false;
2772 } 2503 }
2773 *result = 0; 2504 *result = 0;
2774 SetBucketAsCString(kResultBucketId, feature); 2505 SetBucketAsCString(kResultBucketId, feature);
2775 helper_->EnableFeatureCHROMIUM( 2506 helper_->EnableFeatureCHROMIUM(
2776 kResultBucketId, GetResultShmId(), GetResultShmOffset()); 2507 kResultBucketId, GetResultShmId(), GetResultShmOffset());
2777 WaitForCmd(); 2508 WaitForCmd();
2778 helper_->SetBucketSize(kResultBucketId, 0); 2509 helper_->SetBucketSize(kResultBucketId, 0);
2779 GPU_CLIENT_LOG(" returned " << GLES2Util::GetStringBool(*result));
2780 return *result; 2510 return *result;
2781 } 2511 }
2782 2512
2783 void* GLES2Implementation::MapBufferSubDataCHROMIUM( 2513 void* GLES2Implementation::MapBufferSubDataCHROMIUM(
2784 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) { 2514 GLuint target, GLintptr offset, GLsizeiptr size, GLenum access) {
2785 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2515 GPU_CLIENT_SINGLE_THREAD_CHECK();
2786 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapBufferSubDataCHROMIUM("
2787 << target << ", " << offset << ", " << size << ", "
2788 << GLES2Util::GetStringEnum(access) << ")");
2789 // NOTE: target is NOT checked because the service will check it 2516 // NOTE: target is NOT checked because the service will check it
2790 // and we don't know what targets are valid. 2517 // and we don't know what targets are valid.
2791 if (access != GL_WRITE_ONLY) { 2518 if (access != GL_WRITE_ONLY) {
2792 SetGLErrorInvalidEnum( 2519 SetGLErrorInvalidEnum(
2793 "glMapBufferSubDataCHROMIUM", access, "access"); 2520 "glMapBufferSubDataCHROMIUM", access, "access");
2794 return NULL; 2521 return NULL;
2795 } 2522 }
2796 if (offset < 0 || size < 0) { 2523 if (offset < 0 || size < 0) {
2797 SetGLError(GL_INVALID_VALUE, "glMapBufferSubDataCHROMIUM", "bad range"); 2524 SetGLError(GL_INVALID_VALUE, "glMapBufferSubDataCHROMIUM", "bad range");
2798 return NULL; 2525 return NULL;
2799 } 2526 }
2800 int32 shm_id; 2527 int32 shm_id;
2801 unsigned int shm_offset; 2528 unsigned int shm_offset;
2802 void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset); 2529 void* mem = mapped_memory_->Alloc(size, &shm_id, &shm_offset);
2803 if (!mem) { 2530 if (!mem) {
2804 SetGLError(GL_OUT_OF_MEMORY, "glMapBufferSubDataCHROMIUM", "out of memory"); 2531 SetGLError(GL_OUT_OF_MEMORY, "glMapBufferSubDataCHROMIUM", "out of memory");
2805 return NULL; 2532 return NULL;
2806 } 2533 }
2807 2534
2808 std::pair<MappedBufferMap::iterator, bool> result = 2535 std::pair<MappedBufferMap::iterator, bool> result =
2809 mapped_buffers_.insert(std::make_pair( 2536 mapped_buffers_.insert(std::make_pair(
2810 mem, 2537 mem,
2811 MappedBuffer( 2538 MappedBuffer(
2812 access, shm_id, mem, shm_offset, target, offset, size))); 2539 access, shm_id, mem, shm_offset, target, offset, size)));
2813 DCHECK(result.second); 2540 DCHECK(result.second);
2814 GPU_CLIENT_LOG(" returned " << mem);
2815 return mem; 2541 return mem;
2816 } 2542 }
2817 2543
2818 void GLES2Implementation::UnmapBufferSubDataCHROMIUM(const void* mem) { 2544 void GLES2Implementation::UnmapBufferSubDataCHROMIUM(const void* mem) {
2819 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2545 GPU_CLIENT_SINGLE_THREAD_CHECK();
2820 GPU_CLIENT_LOG(
2821 "[" << GetLogPrefix() << "] glUnmapBufferSubDataCHROMIUM(" << mem << ")");
2822 MappedBufferMap::iterator it = mapped_buffers_.find(mem); 2546 MappedBufferMap::iterator it = mapped_buffers_.find(mem);
2823 if (it == mapped_buffers_.end()) { 2547 if (it == mapped_buffers_.end()) {
2824 SetGLError( 2548 SetGLError(
2825 GL_INVALID_VALUE, "UnmapBufferSubDataCHROMIUM", "buffer not mapped"); 2549 GL_INVALID_VALUE, "UnmapBufferSubDataCHROMIUM", "buffer not mapped");
2826 return; 2550 return;
2827 } 2551 }
2828 const MappedBuffer& mb = it->second; 2552 const MappedBuffer& mb = it->second;
2829 helper_->BufferSubData( 2553 helper_->BufferSubData(
2830 mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset); 2554 mb.target, mb.offset, mb.size, mb.shm_id, mb.shm_offset);
2831 mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken()); 2555 mapped_memory_->FreePendingToken(mb.shm_memory, helper_->InsertToken());
2832 mapped_buffers_.erase(it); 2556 mapped_buffers_.erase(it);
2833 CheckGLError(); 2557 CheckGLError();
2834 } 2558 }
2835 2559
2836 void* GLES2Implementation::MapTexSubImage2DCHROMIUM( 2560 void* GLES2Implementation::MapTexSubImage2DCHROMIUM(
2837 GLenum target, 2561 GLenum target,
2838 GLint level, 2562 GLint level,
2839 GLint xoffset, 2563 GLint xoffset,
2840 GLint yoffset, 2564 GLint yoffset,
2841 GLsizei width, 2565 GLsizei width,
2842 GLsizei height, 2566 GLsizei height,
2843 GLenum format, 2567 GLenum format,
2844 GLenum type, 2568 GLenum type,
2845 GLenum access) { 2569 GLenum access) {
2846 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2570 GPU_CLIENT_SINGLE_THREAD_CHECK();
2847 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapTexSubImage2DCHROMIUM("
2848 << target << ", " << level << ", "
2849 << xoffset << ", " << yoffset << ", "
2850 << width << ", " << height << ", "
2851 << GLES2Util::GetStringTextureFormat(format) << ", "
2852 << GLES2Util::GetStringPixelType(type) << ", "
2853 << GLES2Util::GetStringEnum(access) << ")");
2854 if (access != GL_WRITE_ONLY) { 2571 if (access != GL_WRITE_ONLY) {
2855 SetGLErrorInvalidEnum( 2572 SetGLErrorInvalidEnum(
2856 "glMapTexSubImage2DCHROMIUM", access, "access"); 2573 "glMapTexSubImage2DCHROMIUM", access, "access");
2857 return NULL; 2574 return NULL;
2858 } 2575 }
2859 // NOTE: target is NOT checked because the service will check it 2576 // NOTE: target is NOT checked because the service will check it
2860 // and we don't know what targets are valid. 2577 // and we don't know what targets are valid.
2861 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) { 2578 if (level < 0 || xoffset < 0 || yoffset < 0 || width < 0 || height < 0) {
2862 SetGLError( 2579 SetGLError(
2863 GL_INVALID_VALUE, "glMapTexSubImage2DCHROMIUM", "bad dimensions"); 2580 GL_INVALID_VALUE, "glMapTexSubImage2DCHROMIUM", "bad dimensions");
(...skipping 14 matching lines...) Expand all
2878 return NULL; 2595 return NULL;
2879 } 2596 }
2880 2597
2881 std::pair<MappedTextureMap::iterator, bool> result = 2598 std::pair<MappedTextureMap::iterator, bool> result =
2882 mapped_textures_.insert(std::make_pair( 2599 mapped_textures_.insert(std::make_pair(
2883 mem, 2600 mem,
2884 MappedTexture( 2601 MappedTexture(
2885 access, shm_id, mem, shm_offset, 2602 access, shm_id, mem, shm_offset,
2886 target, level, xoffset, yoffset, width, height, format, type))); 2603 target, level, xoffset, yoffset, width, height, format, type)));
2887 DCHECK(result.second); 2604 DCHECK(result.second);
2888 GPU_CLIENT_LOG(" returned " << mem);
2889 return mem; 2605 return mem;
2890 } 2606 }
2891 2607
2892 void GLES2Implementation::UnmapTexSubImage2DCHROMIUM(const void* mem) { 2608 void GLES2Implementation::UnmapTexSubImage2DCHROMIUM(const void* mem) {
2893 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2609 GPU_CLIENT_SINGLE_THREAD_CHECK();
2894 GPU_CLIENT_LOG(
2895 "[" << GetLogPrefix() << "] glUnmapTexSubImage2DCHROMIUM(" << mem << ")");
2896 MappedTextureMap::iterator it = mapped_textures_.find(mem); 2610 MappedTextureMap::iterator it = mapped_textures_.find(mem);
2897 if (it == mapped_textures_.end()) { 2611 if (it == mapped_textures_.end()) {
2898 SetGLError( 2612 SetGLError(
2899 GL_INVALID_VALUE, "UnmapTexSubImage2DCHROMIUM", "texture not mapped"); 2613 GL_INVALID_VALUE, "UnmapTexSubImage2DCHROMIUM", "texture not mapped");
2900 return; 2614 return;
2901 } 2615 }
2902 const MappedTexture& mt = it->second; 2616 const MappedTexture& mt = it->second;
2903 helper_->TexSubImage2D( 2617 helper_->TexSubImage2D(
2904 mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height, 2618 mt.target, mt.level, mt.xoffset, mt.yoffset, mt.width, mt.height,
2905 mt.format, mt.type, mt.shm_id, mt.shm_offset, GL_FALSE); 2619 mt.format, mt.type, mt.shm_id, mt.shm_offset, GL_FALSE);
2906 mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken()); 2620 mapped_memory_->FreePendingToken(mt.shm_memory, helper_->InsertToken());
2907 mapped_textures_.erase(it); 2621 mapped_textures_.erase(it);
2908 CheckGLError(); 2622 CheckGLError();
2909 } 2623 }
2910 2624
2911 void GLES2Implementation::ResizeCHROMIUM(GLuint width, GLuint height, 2625 void GLES2Implementation::ResizeCHROMIUM(GLuint width, GLuint height,
2912 float scale_factor) { 2626 float scale_factor) {
2913 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2627 GPU_CLIENT_SINGLE_THREAD_CHECK();
2914 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glResizeCHROMIUM("
2915 << width << ", " << height << ", " << scale_factor << ")");
2916 helper_->ResizeCHROMIUM(width, height, scale_factor); 2628 helper_->ResizeCHROMIUM(width, height, scale_factor);
2917 CheckGLError(); 2629 CheckGLError();
2918 } 2630 }
2919 2631
2920 const GLchar* GLES2Implementation::GetRequestableExtensionsCHROMIUM() { 2632 const GLchar* GLES2Implementation::GetRequestableExtensionsCHROMIUM() {
2921 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2633 GPU_CLIENT_SINGLE_THREAD_CHECK();
2922 GPU_CLIENT_LOG("[" << GetLogPrefix()
2923 << "] glGetRequestableExtensionsCHROMIUM()");
2924 TRACE_EVENT0("gpu", 2634 TRACE_EVENT0("gpu",
2925 "GLES2Implementation::GetRequestableExtensionsCHROMIUM()"); 2635 "GLES2Implementation::GetRequestableExtensionsCHROMIUM()");
2926 const char* result = NULL; 2636 const char* result = NULL;
2927 // Clear the bucket so if the command fails nothing will be in it. 2637 // Clear the bucket so if the command fails nothing will be in it.
2928 helper_->SetBucketSize(kResultBucketId, 0); 2638 helper_->SetBucketSize(kResultBucketId, 0);
2929 helper_->GetRequestableExtensionsCHROMIUM(kResultBucketId); 2639 helper_->GetRequestableExtensionsCHROMIUM(kResultBucketId);
2930 std::string str; 2640 std::string str;
2931 if (GetBucketAsString(kResultBucketId, &str)) { 2641 if (GetBucketAsString(kResultBucketId, &str)) {
2932 // The set of requestable extensions shrinks as we enable 2642 // The set of requestable extensions shrinks as we enable
2933 // them. Because we don't know when the client will stop referring 2643 // them. Because we don't know when the client will stop referring
2934 // to a previous one it queries (see GetString) we need to cache 2644 // to a previous one it queries (see GetString) we need to cache
2935 // the unique results. 2645 // the unique results.
2936 std::set<std::string>::const_iterator sit = 2646 std::set<std::string>::const_iterator sit =
2937 requestable_extensions_set_.find(str); 2647 requestable_extensions_set_.find(str);
2938 if (sit != requestable_extensions_set_.end()) { 2648 if (sit != requestable_extensions_set_.end()) {
2939 result = sit->c_str(); 2649 result = sit->c_str();
2940 } else { 2650 } else {
2941 std::pair<std::set<std::string>::const_iterator, bool> insert_result = 2651 std::pair<std::set<std::string>::const_iterator, bool> insert_result =
2942 requestable_extensions_set_.insert(str); 2652 requestable_extensions_set_.insert(str);
2943 DCHECK(insert_result.second); 2653 DCHECK(insert_result.second);
2944 result = insert_result.first->c_str(); 2654 result = insert_result.first->c_str();
2945 } 2655 }
2946 } 2656 }
2947 GPU_CLIENT_LOG(" returned " << result);
2948 return reinterpret_cast<const GLchar*>(result); 2657 return reinterpret_cast<const GLchar*>(result);
2949 } 2658 }
2950 2659
2951 // TODO(gman): Remove this command. It's here for WebGL but is incompatible 2660 // TODO(gman): Remove this command. It's here for WebGL but is incompatible
2952 // with VirtualGL contexts. 2661 // with VirtualGL contexts.
2953 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) { 2662 void GLES2Implementation::RequestExtensionCHROMIUM(const char* extension) {
2954 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2663 GPU_CLIENT_SINGLE_THREAD_CHECK();
2955 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRequestExtensionCHROMIUM("
2956 << extension << ")");
2957 SetBucketAsCString(kResultBucketId, extension); 2664 SetBucketAsCString(kResultBucketId, extension);
2958 helper_->RequestExtensionCHROMIUM(kResultBucketId); 2665 helper_->RequestExtensionCHROMIUM(kResultBucketId);
2959 helper_->SetBucketSize(kResultBucketId, 0); 2666 helper_->SetBucketSize(kResultBucketId, 0);
2960 2667
2961 struct ExtensionCheck { 2668 struct ExtensionCheck {
2962 const char* extension; 2669 const char* extension;
2963 ExtensionStatus* status; 2670 ExtensionStatus* status;
2964 }; 2671 };
2965 const ExtensionCheck checks[] = { 2672 const ExtensionCheck checks[] = {
2966 { 2673 {
(...skipping 10 matching lines...) Expand all
2977 const ExtensionCheck& check = checks[ii]; 2684 const ExtensionCheck& check = checks[ii];
2978 if (*check.status == kUnavailableExtensionStatus && 2685 if (*check.status == kUnavailableExtensionStatus &&
2979 !strcmp(extension, check.extension)) { 2686 !strcmp(extension, check.extension)) {
2980 *check.status = kUnknownExtensionStatus; 2687 *check.status = kUnknownExtensionStatus;
2981 } 2688 }
2982 } 2689 }
2983 } 2690 }
2984 2691
2985 void GLES2Implementation::RateLimitOffscreenContextCHROMIUM() { 2692 void GLES2Implementation::RateLimitOffscreenContextCHROMIUM() {
2986 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2693 GPU_CLIENT_SINGLE_THREAD_CHECK();
2987 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glRateLimitOffscreenCHROMIUM()");
2988 // Wait if this would add too many rate limit tokens. 2694 // Wait if this would add too many rate limit tokens.
2989 if (rate_limit_tokens_.size() == kMaxSwapBuffers) { 2695 if (rate_limit_tokens_.size() == kMaxSwapBuffers) {
2990 helper_->WaitForToken(rate_limit_tokens_.front()); 2696 helper_->WaitForToken(rate_limit_tokens_.front());
2991 rate_limit_tokens_.pop(); 2697 rate_limit_tokens_.pop();
2992 } 2698 }
2993 rate_limit_tokens_.push(helper_->InsertToken()); 2699 rate_limit_tokens_.push(helper_->InsertToken());
2994 } 2700 }
2995 2701
2996 void GLES2Implementation::GetMultipleIntegervCHROMIUM( 2702 void GLES2Implementation::GetMultipleIntegervCHROMIUM(
2997 const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) { 2703 const GLenum* pnames, GLuint count, GLint* results, GLsizeiptr size) {
2998 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2704 GPU_CLIENT_SINGLE_THREAD_CHECK();
2999 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetMultipleIntegervCHROMIUM("
3000 << static_cast<const void*>(pnames) << ", "
3001 << count << ", " << results << ", "
3002 << size << ")");
3003 GPU_CLIENT_LOG_CODE_BLOCK({
3004 for (GLuint i = 0; i < count; ++i) {
3005 GPU_CLIENT_LOG(
3006 " " << i << ": " << GLES2Util::GetStringGLState(pnames[i]));
3007 }
3008 });
3009 2705
3010 GetMultipleIntegervState state(pnames, count, results, size); 2706 GetMultipleIntegervState state(pnames, count, results, size);
3011 if (!GetMultipleIntegervSetup(&state)) { 2707 if (!GetMultipleIntegervSetup(&state)) {
3012 return; 2708 return;
3013 } 2709 }
3014 state.buffer = transfer_buffer_->Alloc(state.transfer_buffer_size_needed); 2710 state.buffer = transfer_buffer_->Alloc(state.transfer_buffer_size_needed);
3015 if (!state.buffer) { 2711 if (!state.buffer) {
3016 SetGLError(GL_OUT_OF_MEMORY, "glGetMultipleIntegervCHROMIUM", 2712 SetGLError(GL_OUT_OF_MEMORY, "glGetMultipleIntegervCHROMIUM",
3017 "Transfer buffer allocation failed."); 2713 "Transfer buffer allocation failed.");
3018 return; 2714 return;
3019 } 2715 }
3020 GetMultipleIntegervRequest(&state); 2716 GetMultipleIntegervRequest(&state);
3021 WaitForCmd(); 2717 WaitForCmd();
3022 GetMultipleIntegervOnCompleted(&state); 2718 GetMultipleIntegervOnCompleted(&state);
3023 2719
3024 GPU_CLIENT_LOG(" returned");
3025 GPU_CLIENT_LOG_CODE_BLOCK({
3026 for (int i = 0; i < state.num_results; ++i) {
3027 GPU_CLIENT_LOG(" " << i << ": " << (results[i]));
3028 }
3029 });
3030
3031 // TODO(gman): We should be able to free without a token. 2720 // TODO(gman): We should be able to free without a token.
3032 transfer_buffer_->FreePendingToken(state.buffer, helper_->InsertToken()); 2721 transfer_buffer_->FreePendingToken(state.buffer, helper_->InsertToken());
3033 CheckGLError(); 2722 CheckGLError();
3034 } 2723 }
3035 2724
3036 bool GLES2Implementation::GetMultipleIntegervSetup( 2725 bool GLES2Implementation::GetMultipleIntegervSetup(
3037 GetMultipleIntegervState* state) { 2726 GetMultipleIntegervState* state) {
3038 state->num_results = 0; 2727 state->num_results = 0;
3039 for (GLuint ii = 0; ii < state->pnames_count; ++ii) { 2728 for (GLuint ii = 0; ii < state->pnames_count; ++ii) {
3040 int num = util_.GLGetNumValuesReturned(state->pnames[ii]); 2729 int num = util_.GLGetNumValuesReturned(state->pnames[ii]);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3156 if (static_cast<size_t>(bufsize) < result.size()) { 2845 if (static_cast<size_t>(bufsize) < result.size()) {
3157 SetGLError(GL_INVALID_OPERATION, 2846 SetGLError(GL_INVALID_OPERATION,
3158 "glProgramInfoCHROMIUM", "bufsize is too small for result."); 2847 "glProgramInfoCHROMIUM", "bufsize is too small for result.");
3159 return; 2848 return;
3160 } 2849 }
3161 memcpy(info, &result[0], result.size()); 2850 memcpy(info, &result[0], result.size());
3162 } 2851 }
3163 2852
3164 GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) { 2853 GLuint GLES2Implementation::CreateStreamTextureCHROMIUM(GLuint texture) {
3165 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2854 GPU_CLIENT_SINGLE_THREAD_CHECK();
3166 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] CreateStreamTextureCHROMIUM("
3167 << texture << ")");
3168 TRACE_EVENT0("gpu", "GLES2::CreateStreamTextureCHROMIUM"); 2855 TRACE_EVENT0("gpu", "GLES2::CreateStreamTextureCHROMIUM");
3169 typedef cmds::CreateStreamTextureCHROMIUM::Result Result; 2856 typedef cmds::CreateStreamTextureCHROMIUM::Result Result;
3170 Result* result = GetResultAs<Result*>(); 2857 Result* result = GetResultAs<Result*>();
3171 if (!result) { 2858 if (!result) {
3172 return GL_ZERO; 2859 return GL_ZERO;
3173 } 2860 }
3174 *result = GL_ZERO; 2861 *result = GL_ZERO;
3175 2862
3176 helper_->CreateStreamTextureCHROMIUM(texture, 2863 helper_->CreateStreamTextureCHROMIUM(texture,
3177 GetResultShmId(), 2864 GetResultShmId(),
3178 GetResultShmOffset()); 2865 GetResultShmOffset());
3179 WaitForCmd(); 2866 WaitForCmd();
3180 GLuint result_value = *result; 2867 GLuint result_value = *result;
3181 CheckGLError(); 2868 CheckGLError();
3182 return result_value; 2869 return result_value;
3183 } 2870 }
3184 2871
3185 void GLES2Implementation::DestroyStreamTextureCHROMIUM(GLuint texture) { 2872 void GLES2Implementation::DestroyStreamTextureCHROMIUM(GLuint texture) {
3186 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2873 GPU_CLIENT_SINGLE_THREAD_CHECK();
3187 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] DestroyStreamTextureCHROMIUM("
3188 << texture << ")");
3189 TRACE_EVENT0("gpu", "GLES2::DestroyStreamTextureCHROMIUM"); 2874 TRACE_EVENT0("gpu", "GLES2::DestroyStreamTextureCHROMIUM");
3190 helper_->DestroyStreamTextureCHROMIUM(texture); 2875 helper_->DestroyStreamTextureCHROMIUM(texture);
3191 CheckGLError(); 2876 CheckGLError();
3192 } 2877 }
3193 2878
3194 void GLES2Implementation::PostSubBufferCHROMIUM( 2879 void GLES2Implementation::PostSubBufferCHROMIUM(
3195 GLint x, GLint y, GLint width, GLint height) { 2880 GLint x, GLint y, GLint width, GLint height) {
3196 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2881 GPU_CLIENT_SINGLE_THREAD_CHECK();
3197 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] PostSubBufferCHROMIUM("
3198 << x << ", " << y << ", " << width << ", " << height << ")");
3199 TRACE_EVENT2("gpu", "GLES2::PostSubBufferCHROMIUM", 2882 TRACE_EVENT2("gpu", "GLES2::PostSubBufferCHROMIUM",
3200 "width", width, "height", height); 2883 "width", width, "height", height);
3201 2884
3202 // Same flow control as GLES2Implementation::SwapBuffers (see comments there). 2885 // Same flow control as GLES2Implementation::SwapBuffers (see comments there).
3203 swap_buffers_tokens_.push(helper_->InsertToken()); 2886 swap_buffers_tokens_.push(helper_->InsertToken());
3204 helper_->PostSubBufferCHROMIUM(x, y, width, height); 2887 helper_->PostSubBufferCHROMIUM(x, y, width, height);
3205 helper_->CommandBufferHelper::Flush(); 2888 helper_->CommandBufferHelper::Flush();
3206 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) { 2889 if (swap_buffers_tokens_.size() > kMaxSwapBuffers + 1) {
3207 helper_->WaitForToken(swap_buffers_tokens_.front()); 2890 helper_->WaitForToken(swap_buffers_tokens_.front());
3208 swap_buffers_tokens_.pop(); 2891 swap_buffers_tokens_.pop();
(...skipping 17 matching lines...) Expand all
3226 helper_->DeleteQueriesEXTImmediate(n, queries); 2909 helper_->DeleteQueriesEXTImmediate(n, queries);
3227 } 2910 }
3228 2911
3229 // TODO(gman): Remove this. Queries are not shared resources. 2912 // TODO(gman): Remove this. Queries are not shared resources.
3230 void GLES2Implementation::DeleteQueriesStub( 2913 void GLES2Implementation::DeleteQueriesStub(
3231 GLsizei /* n */, const GLuint* /* queries */) { 2914 GLsizei /* n */, const GLuint* /* queries */) {
3232 } 2915 }
3233 2916
3234 GLboolean GLES2Implementation::IsQueryEXT(GLuint id) { 2917 GLboolean GLES2Implementation::IsQueryEXT(GLuint id) {
3235 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2918 GPU_CLIENT_SINGLE_THREAD_CHECK();
3236 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] IsQueryEXT(" << id << ")");
3237 2919
3238 // TODO(gman): To be spec compliant IDs from other contexts sharing 2920 // TODO(gman): To be spec compliant IDs from other contexts sharing
3239 // resources need to return true here even though you can't share 2921 // resources need to return true here even though you can't share
3240 // queries across contexts? 2922 // queries across contexts?
3241 return query_tracker_->GetQuery(id) != NULL; 2923 return query_tracker_->GetQuery(id) != NULL;
3242 } 2924 }
3243 2925
3244 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { 2926 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) {
3245 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2927 GPU_CLIENT_SINGLE_THREAD_CHECK();
3246 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT("
3247 << GLES2Util::GetStringQueryTarget(target)
3248 << ", " << id << ")");
3249 2928
3250 // if any outstanding queries INV_OP 2929 // if any outstanding queries INV_OP
3251 if (current_query_) { 2930 if (current_query_) {
3252 SetGLError( 2931 SetGLError(
3253 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); 2932 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress");
3254 return; 2933 return;
3255 } 2934 }
3256 2935
3257 // id = 0 INV_OP 2936 // id = 0 INV_OP
3258 if (id == 0) { 2937 if (id == 0) {
(...skipping 18 matching lines...) Expand all
3277 } 2956 }
3278 2957
3279 current_query_ = query; 2958 current_query_ = query;
3280 2959
3281 query->Begin(this); 2960 query->Begin(this);
3282 CheckGLError(); 2961 CheckGLError();
3283 } 2962 }
3284 2963
3285 void GLES2Implementation::EndQueryEXT(GLenum target) { 2964 void GLES2Implementation::EndQueryEXT(GLenum target) {
3286 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2965 GPU_CLIENT_SINGLE_THREAD_CHECK();
3287 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT("
3288 << GLES2Util::GetStringQueryTarget(target) << ")");
3289 // Don't do anything if the context is lost. 2966 // Don't do anything if the context is lost.
3290 if (helper_->IsContextLost()) { 2967 if (helper_->IsContextLost()) {
3291 return; 2968 return;
3292 } 2969 }
3293 2970
3294 if (!current_query_) { 2971 if (!current_query_) {
3295 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query"); 2972 SetGLError(GL_INVALID_OPERATION, "glEndQueryEXT", "no active query");
3296 return; 2973 return;
3297 } 2974 }
3298 2975
3299 if (current_query_->target() != target) { 2976 if (current_query_->target() != target) {
3300 SetGLError(GL_INVALID_OPERATION, 2977 SetGLError(GL_INVALID_OPERATION,
3301 "glEndQueryEXT", "target does not match active query"); 2978 "glEndQueryEXT", "target does not match active query");
3302 return; 2979 return;
3303 } 2980 }
3304 2981
3305 current_query_->End(this); 2982 current_query_->End(this);
3306 current_query_ = NULL; 2983 current_query_ = NULL;
3307 CheckGLError(); 2984 CheckGLError();
3308 } 2985 }
3309 2986
3310 void GLES2Implementation::GetQueryivEXT( 2987 void GLES2Implementation::GetQueryivEXT(
3311 GLenum target, GLenum pname, GLint* params) { 2988 GLenum target, GLenum pname, GLint* params) {
3312 GPU_CLIENT_SINGLE_THREAD_CHECK(); 2989 GPU_CLIENT_SINGLE_THREAD_CHECK();
3313 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT("
3314 << GLES2Util::GetStringQueryTarget(target) << ", "
3315 << GLES2Util::GetStringQueryParameter(pname) << ", "
3316 << static_cast<const void*>(params) << ")");
3317 2990
3318 if (pname != GL_CURRENT_QUERY_EXT) { 2991 if (pname != GL_CURRENT_QUERY_EXT) {
3319 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); 2992 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname");
3320 return; 2993 return;
3321 } 2994 }
3322 *params = (current_query_ && current_query_->target() == target) ? 2995 *params = (current_query_ && current_query_->target() == target) ?
3323 current_query_->id() : 0; 2996 current_query_->id() : 0;
3324 GPU_CLIENT_LOG(" " << *params);
3325 CheckGLError(); 2997 CheckGLError();
3326 } 2998 }
3327 2999
3328 void GLES2Implementation::GetQueryObjectuivEXT( 3000 void GLES2Implementation::GetQueryObjectuivEXT(
3329 GLuint id, GLenum pname, GLuint* params) { 3001 GLuint id, GLenum pname, GLuint* params) {
3330 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3002 GPU_CLIENT_SINGLE_THREAD_CHECK();
3331 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", "
3332 << GLES2Util::GetStringQueryObjectParameter(pname) << ", "
3333 << static_cast<const void*>(params) << ")");
3334 3003
3335 QueryTracker::Query* query = query_tracker_->GetQuery(id); 3004 QueryTracker::Query* query = query_tracker_->GetQuery(id);
3336 if (!query) { 3005 if (!query) {
3337 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); 3006 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id");
3338 return; 3007 return;
3339 } 3008 }
3340 3009
3341 if (query == current_query_) { 3010 if (query == current_query_) {
3342 SetGLError( 3011 SetGLError(
3343 GL_INVALID_OPERATION, 3012 GL_INVALID_OPERATION,
(...skipping 20 matching lines...) Expand all
3364 } 3033 }
3365 *params = query->GetResult(); 3034 *params = query->GetResult();
3366 break; 3035 break;
3367 case GL_QUERY_RESULT_AVAILABLE_EXT: 3036 case GL_QUERY_RESULT_AVAILABLE_EXT:
3368 *params = query->CheckResultsAvailable(helper_); 3037 *params = query->CheckResultsAvailable(helper_);
3369 break; 3038 break;
3370 default: 3039 default:
3371 SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname"); 3040 SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname");
3372 break; 3041 break;
3373 } 3042 }
3374 GPU_CLIENT_LOG(" " << *params);
3375 CheckGLError(); 3043 CheckGLError();
3376 } 3044 }
3377 3045
3378 void GLES2Implementation::DrawArraysInstancedANGLE( 3046 void GLES2Implementation::DrawArraysInstancedANGLE(
3379 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { 3047 GLenum mode, GLint first, GLsizei count, GLsizei primcount) {
3380 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3048 GPU_CLIENT_SINGLE_THREAD_CHECK();
3381 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE("
3382 << GLES2Util::GetStringDrawMode(mode) << ", "
3383 << first << ", " << count << ", " << primcount << ")");
3384 if (count < 0) { 3049 if (count < 0) {
3385 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0"); 3050 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0");
3386 return; 3051 return;
3387 } 3052 }
3388 if (primcount < 0) { 3053 if (primcount < 0) {
3389 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "primcount < 0"); 3054 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "primcount < 0");
3390 return; 3055 return;
3391 } 3056 }
3392 if (primcount == 0) { 3057 if (primcount == 0) {
3393 return; 3058 return;
3394 } 3059 }
3395 bool simulated = false; 3060 bool simulated = false;
3396 if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers( 3061 if (!vertex_array_object_manager_->SetupSimulatedClientSideBuffers(
3397 "glDrawArraysInstancedANGLE", this, helper_, first + count, primcount, 3062 "glDrawArraysInstancedANGLE", this, helper_, first + count, primcount,
3398 &simulated)) { 3063 &simulated)) {
3399 return; 3064 return;
3400 } 3065 }
3401 helper_->DrawArraysInstancedANGLE(mode, first, count, primcount); 3066 helper_->DrawArraysInstancedANGLE(mode, first, count, primcount);
3402 RestoreArrayBuffer(simulated); 3067 RestoreArrayBuffer(simulated);
3403 CheckGLError(); 3068 CheckGLError();
3404 } 3069 }
3405 3070
3406 void GLES2Implementation::DrawElementsInstancedANGLE( 3071 void GLES2Implementation::DrawElementsInstancedANGLE(
3407 GLenum mode, GLsizei count, GLenum type, const void* indices, 3072 GLenum mode, GLsizei count, GLenum type, const void* indices,
3408 GLsizei primcount) { 3073 GLsizei primcount) {
3409 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3074 GPU_CLIENT_SINGLE_THREAD_CHECK();
3410 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawElementsInstancedANGLE("
3411 << GLES2Util::GetStringDrawMode(mode) << ", "
3412 << count << ", "
3413 << GLES2Util::GetStringIndexType(type) << ", "
3414 << static_cast<const void*>(indices) << ", "
3415 << primcount << ")");
3416 if (count < 0) { 3075 if (count < 0) {
3417 SetGLError(GL_INVALID_VALUE, 3076 SetGLError(GL_INVALID_VALUE,
3418 "glDrawElementsInstancedANGLE", "count less than 0."); 3077 "glDrawElementsInstancedANGLE", "count less than 0.");
3419 return; 3078 return;
3420 } 3079 }
3421 if (count == 0) { 3080 if (count == 0) {
3422 return; 3081 return;
3423 } 3082 }
3424 if (primcount < 0) { 3083 if (primcount < 0) {
3425 SetGLError(GL_INVALID_VALUE, 3084 SetGLError(GL_INVALID_VALUE,
(...skipping 11 matching lines...) Expand all
3437 return; 3096 return;
3438 } 3097 }
3439 helper_->DrawElementsInstancedANGLE(mode, count, type, offset, primcount); 3098 helper_->DrawElementsInstancedANGLE(mode, count, type, offset, primcount);
3440 RestoreElementAndArrayBuffers(simulated); 3099 RestoreElementAndArrayBuffers(simulated);
3441 CheckGLError(); 3100 CheckGLError();
3442 } 3101 }
3443 3102
3444 void GLES2Implementation::GenMailboxCHROMIUM( 3103 void GLES2Implementation::GenMailboxCHROMIUM(
3445 GLbyte* mailbox) { 3104 GLbyte* mailbox) {
3446 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3105 GPU_CLIENT_SINGLE_THREAD_CHECK();
3447 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGenMailboxCHROMIUM("
3448 << static_cast<const void*>(mailbox) << ")");
3449 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM"); 3106 TRACE_EVENT0("gpu", "GLES2::GenMailboxCHROMIUM");
3450 3107
3451 std::vector<gpu::Mailbox> names; 3108 std::vector<gpu::Mailbox> names;
3452 if (!gpu_control_->GenerateMailboxNames(1, &names)) { 3109 if (!gpu_control_->GenerateMailboxNames(1, &names)) {
3453 SetGLError(GL_OUT_OF_MEMORY, "glGenMailboxCHROMIUM", "Generate failed."); 3110 SetGLError(GL_OUT_OF_MEMORY, "glGenMailboxCHROMIUM", "Generate failed.");
3454 return; 3111 return;
3455 } 3112 }
3456 memcpy(mailbox, names[0].name, GL_MAILBOX_SIZE_CHROMIUM); 3113 memcpy(mailbox, names[0].name, GL_MAILBOX_SIZE_CHROMIUM);
3457 } 3114 }
3458 3115
3459 void GLES2Implementation::PushGroupMarkerEXT( 3116 void GLES2Implementation::PushGroupMarkerEXT(
3460 GLsizei length, const GLchar* marker) { 3117 GLsizei length, const GLchar* marker) {
3461 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3118 GPU_CLIENT_SINGLE_THREAD_CHECK();
3462 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPushGroupMarkerEXT("
3463 << length << ", " << marker << ")");
3464 if (!marker) { 3119 if (!marker) {
3465 marker = ""; 3120 marker = "";
3466 } 3121 }
3467 SetBucketAsString( 3122 SetBucketAsString(
3468 kResultBucketId, 3123 kResultBucketId,
3469 (length ? std::string(marker, length) : std::string(marker))); 3124 (length ? std::string(marker, length) : std::string(marker)));
3470 helper_->PushGroupMarkerEXT(kResultBucketId); 3125 helper_->PushGroupMarkerEXT(kResultBucketId);
3471 helper_->SetBucketSize(kResultBucketId, 0); 3126 helper_->SetBucketSize(kResultBucketId, 0);
3472 debug_marker_manager_.PushGroup( 3127 debug_marker_manager_.PushGroup(
3473 length ? std::string(marker, length) : std::string(marker)); 3128 length ? std::string(marker, length) : std::string(marker));
3474 } 3129 }
3475 3130
3476 void GLES2Implementation::InsertEventMarkerEXT( 3131 void GLES2Implementation::InsertEventMarkerEXT(
3477 GLsizei length, const GLchar* marker) { 3132 GLsizei length, const GLchar* marker) {
3478 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3133 GPU_CLIENT_SINGLE_THREAD_CHECK();
3479 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertEventMarkerEXT("
3480 << length << ", " << marker << ")");
3481 if (!marker) { 3134 if (!marker) {
3482 marker = ""; 3135 marker = "";
3483 } 3136 }
3484 SetBucketAsString( 3137 SetBucketAsString(
3485 kResultBucketId, 3138 kResultBucketId,
3486 (length ? std::string(marker, length) : std::string(marker))); 3139 (length ? std::string(marker, length) : std::string(marker)));
3487 helper_->InsertEventMarkerEXT(kResultBucketId); 3140 helper_->InsertEventMarkerEXT(kResultBucketId);
3488 helper_->SetBucketSize(kResultBucketId, 0); 3141 helper_->SetBucketSize(kResultBucketId, 0);
3489 debug_marker_manager_.SetMarker( 3142 debug_marker_manager_.SetMarker(
3490 length ? std::string(marker, length) : std::string(marker)); 3143 length ? std::string(marker, length) : std::string(marker));
3491 } 3144 }
3492 3145
3493 void GLES2Implementation::PopGroupMarkerEXT() { 3146 void GLES2Implementation::PopGroupMarkerEXT() {
3494 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3147 GPU_CLIENT_SINGLE_THREAD_CHECK();
3495 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glPopGroupMarkerEXT()");
3496 helper_->PopGroupMarkerEXT(); 3148 helper_->PopGroupMarkerEXT();
3497 debug_marker_manager_.PopGroup(); 3149 debug_marker_manager_.PopGroup();
3498 } 3150 }
3499 3151
3500 void GLES2Implementation::TraceBeginCHROMIUM(const char* name) { 3152 void GLES2Implementation::TraceBeginCHROMIUM(const char* name) {
3501 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3153 GPU_CLIENT_SINGLE_THREAD_CHECK();
3502 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTraceBeginCHROMIUM("
3503 << name << ")");
3504 if (current_trace_name_.get()) { 3154 if (current_trace_name_.get()) {
3505 SetGLError(GL_INVALID_OPERATION, "glTraceBeginCHROMIUM", 3155 SetGLError(GL_INVALID_OPERATION, "glTraceBeginCHROMIUM",
3506 "trace already running"); 3156 "trace already running");
3507 return; 3157 return;
3508 } 3158 }
3509 TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", name, this); 3159 TRACE_EVENT_COPY_ASYNC_BEGIN0("gpu", name, this);
3510 SetBucketAsCString(kResultBucketId, name); 3160 SetBucketAsCString(kResultBucketId, name);
3511 helper_->TraceBeginCHROMIUM(kResultBucketId); 3161 helper_->TraceBeginCHROMIUM(kResultBucketId);
3512 helper_->SetBucketSize(kResultBucketId, 0); 3162 helper_->SetBucketSize(kResultBucketId, 0);
3513 current_trace_name_.reset(new std::string(name)); 3163 current_trace_name_.reset(new std::string(name));
3514 } 3164 }
3515 3165
3516 void GLES2Implementation::TraceEndCHROMIUM() { 3166 void GLES2Implementation::TraceEndCHROMIUM() {
3517 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3167 GPU_CLIENT_SINGLE_THREAD_CHECK();
3518 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTraceEndCHROMIUM(" << ")");
3519 if (!current_trace_name_.get()) { 3168 if (!current_trace_name_.get()) {
3520 SetGLError(GL_INVALID_OPERATION, "glTraceEndCHROMIUM", 3169 SetGLError(GL_INVALID_OPERATION, "glTraceEndCHROMIUM",
3521 "missing begin trace"); 3170 "missing begin trace");
3522 return; 3171 return;
3523 } 3172 }
3524 helper_->TraceEndCHROMIUM(); 3173 helper_->TraceEndCHROMIUM();
3525 TRACE_EVENT_COPY_ASYNC_END0("gpu", current_trace_name_->c_str(), this); 3174 TRACE_EVENT_COPY_ASYNC_END0("gpu", current_trace_name_->c_str(), this);
3526 current_trace_name_.reset(); 3175 current_trace_name_.reset();
3527 } 3176 }
3528 3177
3529 void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) { 3178 void* GLES2Implementation::MapBufferCHROMIUM(GLuint target, GLenum access) {
3530 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3179 GPU_CLIENT_SINGLE_THREAD_CHECK();
3531 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapBufferCHROMIUM("
3532 << target << ", " << GLES2Util::GetStringEnum(access) << ")");
3533 switch (target) { 3180 switch (target) {
3534 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: 3181 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
3535 if (access != GL_READ_ONLY) { 3182 if (access != GL_READ_ONLY) {
3536 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode"); 3183 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
3537 return NULL; 3184 return NULL;
3538 } 3185 }
3539 break; 3186 break;
3540 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: 3187 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
3541 if (access != GL_WRITE_ONLY) { 3188 if (access != GL_WRITE_ONLY) {
3542 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode"); 3189 SetGLError(GL_INVALID_ENUM, "glMapBufferCHROMIUM", "bad access mode");
(...skipping 23 matching lines...) Expand all
3566 // TODO(hubbe): AsyncTex(Sub)Image2dCHROMIUM does not currently work 3213 // TODO(hubbe): AsyncTex(Sub)Image2dCHROMIUM does not currently work
3567 // with this method of synchronization. Until this is fixed, 3214 // with this method of synchronization. Until this is fixed,
3568 // MapBufferCHROMIUM will not block even if the transfer is not ready 3215 // MapBufferCHROMIUM will not block even if the transfer is not ready
3569 // for these calls. 3216 // for these calls.
3570 if (buffer->transfer_ready_token()) { 3217 if (buffer->transfer_ready_token()) {
3571 helper_->WaitForToken(buffer->transfer_ready_token()); 3218 helper_->WaitForToken(buffer->transfer_ready_token());
3572 buffer->set_transfer_ready_token(0); 3219 buffer->set_transfer_ready_token(0);
3573 } 3220 }
3574 buffer->set_mapped(true); 3221 buffer->set_mapped(true);
3575 3222
3576 GPU_CLIENT_LOG(" returned " << buffer->address());
3577 CheckGLError(); 3223 CheckGLError();
3578 return buffer->address(); 3224 return buffer->address();
3579 } 3225 }
3580 3226
3581 GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) { 3227 GLboolean GLES2Implementation::UnmapBufferCHROMIUM(GLuint target) {
3582 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3228 GPU_CLIENT_SINGLE_THREAD_CHECK();
3583 GPU_CLIENT_LOG(
3584 "[" << GetLogPrefix() << "] glUnmapBufferCHROMIUM(" << target << ")");
3585 GLuint buffer_id; 3229 GLuint buffer_id;
3586 if (!GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id)) { 3230 if (!GetBoundPixelTransferBuffer(target, "glMapBufferCHROMIUM", &buffer_id)) {
3587 SetGLError(GL_INVALID_ENUM, "glUnmapBufferCHROMIUM", "invalid target"); 3231 SetGLError(GL_INVALID_ENUM, "glUnmapBufferCHROMIUM", "invalid target");
3588 } 3232 }
3589 if (!buffer_id) { 3233 if (!buffer_id) {
3590 return false; 3234 return false;
3591 } 3235 }
3592 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id); 3236 BufferTracker::Buffer* buffer = buffer_tracker_->GetBuffer(buffer_id);
3593 if (!buffer) { 3237 if (!buffer) {
3594 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "invalid buffer"); 3238 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "invalid buffer");
3595 return false; 3239 return false;
3596 } 3240 }
3597 if (!buffer->mapped()) { 3241 if (!buffer->mapped()) {
3598 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "not mapped"); 3242 SetGLError(GL_INVALID_OPERATION, "glUnmapBufferCHROMIUM", "not mapped");
3599 return false; 3243 return false;
3600 } 3244 }
3601 buffer->set_mapped(false); 3245 buffer->set_mapped(false);
3602 CheckGLError(); 3246 CheckGLError();
3603 return true; 3247 return true;
3604 } 3248 }
3605 3249
3606 void GLES2Implementation::AsyncTexImage2DCHROMIUM( 3250 void GLES2Implementation::AsyncTexImage2DCHROMIUM(
3607 GLenum target, GLint level, GLint internalformat, GLsizei width, 3251 GLenum target, GLint level, GLint internalformat, GLsizei width,
3608 GLsizei height, GLint border, GLenum format, GLenum type, 3252 GLsizei height, GLint border, GLenum format, GLenum type,
3609 const void* pixels) { 3253 const void* pixels) {
3610 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3254 GPU_CLIENT_SINGLE_THREAD_CHECK();
3611 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glTexImage2D("
3612 << GLES2Util::GetStringTextureTarget(target) << ", "
3613 << level << ", "
3614 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
3615 << width << ", " << height << ", " << border << ", "
3616 << GLES2Util::GetStringTextureFormat(format) << ", "
3617 << GLES2Util::GetStringPixelType(type) << ", "
3618 << static_cast<const void*>(pixels) << ")");
3619 if (level < 0 || height < 0 || width < 0) { 3255 if (level < 0 || height < 0 || width < 0) {
3620 SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0"); 3256 SetGLError(GL_INVALID_VALUE, "glTexImage2D", "dimension < 0");
3621 return; 3257 return;
3622 } 3258 }
3623 uint32 size; 3259 uint32 size;
3624 uint32 unpadded_row_size; 3260 uint32 unpadded_row_size;
3625 uint32 padded_row_size; 3261 uint32 padded_row_size;
3626 if (!GLES2Util::ComputeImageDataSizes( 3262 if (!GLES2Util::ComputeImageDataSizes(
3627 width, height, format, type, unpack_alignment_, &size, 3263 width, height, format, type, unpack_alignment_, &size,
3628 &unpadded_row_size, &padded_row_size)) { 3264 &unpadded_row_size, &padded_row_size)) {
(...skipping 21 matching lines...) Expand all
3650 helper_->AsyncTexImage2DCHROMIUM( 3286 helper_->AsyncTexImage2DCHROMIUM(
3651 target, level, internalformat, width, height, border, format, type, 3287 target, level, internalformat, width, height, border, format, type,
3652 buffer->shm_id(), buffer->shm_offset() + offset); 3288 buffer->shm_id(), buffer->shm_offset() + offset);
3653 } 3289 }
3654 } 3290 }
3655 3291
3656 void GLES2Implementation::AsyncTexSubImage2DCHROMIUM( 3292 void GLES2Implementation::AsyncTexSubImage2DCHROMIUM(
3657 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, 3293 GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width,
3658 GLsizei height, GLenum format, GLenum type, const void* pixels) { 3294 GLsizei height, GLenum format, GLenum type, const void* pixels) {
3659 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3295 GPU_CLIENT_SINGLE_THREAD_CHECK();
3660 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glAsyncTexSubImage2DCHROMIUM("
3661 << GLES2Util::GetStringTextureTarget(target) << ", "
3662 << level << ", "
3663 << xoffset << ", " << yoffset << ", "
3664 << width << ", " << height << ", "
3665 << GLES2Util::GetStringTextureFormat(format) << ", "
3666 << GLES2Util::GetStringPixelType(type) << ", "
3667 << static_cast<const void*>(pixels) << ")");
3668 if (level < 0 || height < 0 || width < 0) { 3296 if (level < 0 || height < 0 || width < 0) {
3669 SetGLError( 3297 SetGLError(
3670 GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "dimension < 0"); 3298 GL_INVALID_VALUE, "glAsyncTexSubImage2DCHROMIUM", "dimension < 0");
3671 return; 3299 return;
3672 } 3300 }
3673 3301
3674 uint32 size; 3302 uint32 size;
3675 uint32 unpadded_row_size; 3303 uint32 unpadded_row_size;
3676 uint32 padded_row_size; 3304 uint32 padded_row_size;
3677 if (!GLES2Util::ComputeImageDataSizes( 3305 if (!GLES2Util::ComputeImageDataSizes(
(...skipping 14 matching lines...) Expand all
3692 "glAsyncTexSubImage2DCHROMIUM", offset, size); 3320 "glAsyncTexSubImage2DCHROMIUM", offset, size);
3693 if (buffer && buffer->shm_id() != -1) { 3321 if (buffer && buffer->shm_id() != -1) {
3694 helper_->AsyncTexSubImage2DCHROMIUM( 3322 helper_->AsyncTexSubImage2DCHROMIUM(
3695 target, level, xoffset, yoffset, width, height, format, type, 3323 target, level, xoffset, yoffset, width, height, format, type,
3696 buffer->shm_id(), buffer->shm_offset() + offset); 3324 buffer->shm_id(), buffer->shm_offset() + offset);
3697 } 3325 }
3698 } 3326 }
3699 3327
3700 void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) { 3328 void GLES2Implementation::WaitAsyncTexImage2DCHROMIUM(GLenum target) {
3701 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3329 GPU_CLIENT_SINGLE_THREAD_CHECK();
3702 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glWaitAsyncTexImage2DCHROMIUM("
3703 << GLES2Util::GetStringTextureTarget(target) << ")");
3704 helper_->WaitAsyncTexImage2DCHROMIUM(target); 3330 helper_->WaitAsyncTexImage2DCHROMIUM(target);
3705 CheckGLError(); 3331 CheckGLError();
3706 } 3332 }
3707 3333
3708 GLuint GLES2Implementation::InsertSyncPointCHROMIUM() { 3334 GLuint GLES2Implementation::InsertSyncPointCHROMIUM() {
3709 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3335 GPU_CLIENT_SINGLE_THREAD_CHECK();
3710 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glInsertSyncPointCHROMIUM");
3711 helper_->CommandBufferHelper::Flush(); 3336 helper_->CommandBufferHelper::Flush();
3712 return gpu_control_->InsertSyncPoint(); 3337 return gpu_control_->InsertSyncPoint();
3713 } 3338 }
3714 3339
3715 GLuint GLES2Implementation::CreateImageCHROMIUMHelper( 3340 GLuint GLES2Implementation::CreateImageCHROMIUMHelper(
3716 GLsizei width, GLsizei height, GLenum internalformat) { 3341 GLsizei width, GLsizei height, GLenum internalformat) {
3717 if (width <= 0) { 3342 if (width <= 0) {
3718 SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "width <= 0"); 3343 SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "width <= 0");
3719 return 0; 3344 return 0;
3720 } 3345 }
(...skipping 12 matching lines...) Expand all
3733 if (buffer_id == 0) { 3358 if (buffer_id == 0) {
3734 SetGLError(GL_OUT_OF_MEMORY, "glCreateImageCHROMIUM", "out of GPU memory."); 3359 SetGLError(GL_OUT_OF_MEMORY, "glCreateImageCHROMIUM", "out of GPU memory.");
3735 return 0; 3360 return 0;
3736 } 3361 }
3737 return buffer_id; 3362 return buffer_id;
3738 } 3363 }
3739 3364
3740 GLuint GLES2Implementation::CreateImageCHROMIUM( 3365 GLuint GLES2Implementation::CreateImageCHROMIUM(
3741 GLsizei width, GLsizei height, GLenum internalformat) { 3366 GLsizei width, GLsizei height, GLenum internalformat) {
3742 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3367 GPU_CLIENT_SINGLE_THREAD_CHECK();
3743 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM("
3744 << width << ", "
3745 << height << ", "
3746 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ")");
3747 GLuint image_id = CreateImageCHROMIUMHelper(width, height, internalformat); 3368 GLuint image_id = CreateImageCHROMIUMHelper(width, height, internalformat);
3748 CheckGLError(); 3369 CheckGLError();
3749 return image_id; 3370 return image_id;
3750 } 3371 }
3751 3372
3752 void GLES2Implementation::DestroyImageCHROMIUMHelper(GLuint image_id) { 3373 void GLES2Implementation::DestroyImageCHROMIUMHelper(GLuint image_id) {
3753 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( 3374 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(
3754 image_id); 3375 image_id);
3755 if (!gpu_buffer) { 3376 if (!gpu_buffer) {
3756 SetGLError(GL_INVALID_OPERATION, "glDestroyImageCHROMIUM", "invalid image"); 3377 SetGLError(GL_INVALID_OPERATION, "glDestroyImageCHROMIUM", "invalid image");
3757 return; 3378 return;
3758 } 3379 }
3759 3380
3760 // Flush the command stream to make sure all pending commands 3381 // Flush the command stream to make sure all pending commands
3761 // that may refer to the image_id are executed on the service side. 3382 // that may refer to the image_id are executed on the service side.
3762 helper_->CommandBufferHelper::Flush(); 3383 helper_->CommandBufferHelper::Flush();
3763 gpu_memory_buffer_tracker_->RemoveBuffer(image_id); 3384 gpu_memory_buffer_tracker_->RemoveBuffer(image_id);
3764 } 3385 }
3765 3386
3766 void GLES2Implementation::DestroyImageCHROMIUM(GLuint image_id) { 3387 void GLES2Implementation::DestroyImageCHROMIUM(GLuint image_id) {
3767 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3388 GPU_CLIENT_SINGLE_THREAD_CHECK();
3768 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDestroyImageCHROMIUM("
3769 << image_id << ")");
3770 DestroyImageCHROMIUMHelper(image_id); 3389 DestroyImageCHROMIUMHelper(image_id);
3771 CheckGLError(); 3390 CheckGLError();
3772 } 3391 }
3773 3392
3774 void GLES2Implementation::UnmapImageCHROMIUMHelper(GLuint image_id) { 3393 void GLES2Implementation::UnmapImageCHROMIUMHelper(GLuint image_id) {
3775 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( 3394 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(
3776 image_id); 3395 image_id);
3777 if (!gpu_buffer) { 3396 if (!gpu_buffer) {
3778 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "invalid image"); 3397 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "invalid image");
3779 return; 3398 return;
3780 } 3399 }
3781 3400
3782 if (!gpu_buffer->IsMapped()) { 3401 if (!gpu_buffer->IsMapped()) {
3783 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "not mapped"); 3402 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "not mapped");
3784 return; 3403 return;
3785 } 3404 }
3786 gpu_buffer->Unmap(); 3405 gpu_buffer->Unmap();
3787 } 3406 }
3788 3407
3789 void GLES2Implementation::UnmapImageCHROMIUM(GLuint image_id) { 3408 void GLES2Implementation::UnmapImageCHROMIUM(GLuint image_id) {
3790 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3409 GPU_CLIENT_SINGLE_THREAD_CHECK();
3791 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUnmapImageCHROMIUM("
3792 << image_id << ")");
3793
3794 UnmapImageCHROMIUMHelper(image_id); 3410 UnmapImageCHROMIUMHelper(image_id);
3795 CheckGLError(); 3411 CheckGLError();
3796 } 3412 }
3797 3413
3798 void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id, 3414 void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id,
3799 GLenum access) { 3415 GLenum access) {
3800 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( 3416 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(
3801 image_id); 3417 image_id);
3802 if (!gpu_buffer) { 3418 if (!gpu_buffer) {
3803 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "invalid image"); 3419 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "invalid image");
(...skipping 22 matching lines...) Expand all
3826 } 3442 }
3827 3443
3828 void* mapped_buffer = NULL; 3444 void* mapped_buffer = NULL;
3829 gpu_buffer->Map(mode, &mapped_buffer); 3445 gpu_buffer->Map(mode, &mapped_buffer);
3830 return mapped_buffer; 3446 return mapped_buffer;
3831 } 3447 }
3832 3448
3833 void* GLES2Implementation::MapImageCHROMIUM( 3449 void* GLES2Implementation::MapImageCHROMIUM(
3834 GLuint image_id, GLenum access) { 3450 GLuint image_id, GLenum access) {
3835 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3451 GPU_CLIENT_SINGLE_THREAD_CHECK();
3836 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glMapImageCHROMIUM("
3837 << image_id << ", "
3838 << GLES2Util::GetStringEnum(access) << ")");
3839
3840 void* mapped = MapImageCHROMIUMHelper(image_id, access); 3452 void* mapped = MapImageCHROMIUMHelper(image_id, access);
3841 CheckGLError(); 3453 CheckGLError();
3842 return mapped; 3454 return mapped;
3843 } 3455 }
3844 3456
3845 void GLES2Implementation::GetImageParameterivCHROMIUMHelper( 3457 void GLES2Implementation::GetImageParameterivCHROMIUMHelper(
3846 GLuint image_id, GLenum pname, GLint* params) { 3458 GLuint image_id, GLenum pname, GLint* params) {
3847 if (pname != GL_IMAGE_ROWBYTES_CHROMIUM) { 3459 if (pname != GL_IMAGE_ROWBYTES_CHROMIUM) {
3848 SetGLError(GL_INVALID_ENUM, "glGetImageParameterivCHROMIUM", 3460 SetGLError(GL_INVALID_ENUM, "glGetImageParameterivCHROMIUM",
3849 "invalid parameter"); 3461 "invalid parameter");
3850 return; 3462 return;
3851 } 3463 }
3852 3464
3853 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( 3465 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(
3854 image_id); 3466 image_id);
3855 if (!gpu_buffer) { 3467 if (!gpu_buffer) {
3856 SetGLError(GL_INVALID_OPERATION, "glGetImageParameterivCHROMIUM", 3468 SetGLError(GL_INVALID_OPERATION, "glGetImageParameterivCHROMIUM",
3857 "invalid image"); 3469 "invalid image");
3858 return; 3470 return;
3859 } 3471 }
3860 3472
3861 *params = gpu_buffer->GetStride(); 3473 *params = gpu_buffer->GetStride();
3862 } 3474 }
3863 3475
3864 void GLES2Implementation::GetImageParameterivCHROMIUM( 3476 void GLES2Implementation::GetImageParameterivCHROMIUM(
3865 GLuint image_id, GLenum pname, GLint* params) { 3477 GLuint image_id, GLenum pname, GLint* params) {
3866 GPU_CLIENT_SINGLE_THREAD_CHECK(); 3478 GPU_CLIENT_SINGLE_THREAD_CHECK();
3867 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); 3479 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params);
3868 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageParameterivCHROMIUM("
3869 << image_id << ", "
3870 << GLES2Util::GetStringBufferParameter(pname) << ", "
3871 << static_cast<const void*>(params) << ")");
3872 GetImageParameterivCHROMIUMHelper(image_id, pname, params); 3480 GetImageParameterivCHROMIUMHelper(image_id, pname, params);
3873 CheckGLError(); 3481 CheckGLError();
3874 } 3482 }
3875 3483
3876 // Include the auto-generated part of this file. We split this because it means 3484 // Include the auto-generated part of this file. We split this because it means
3877 // we can easily edit the non-auto generated parts right here in this file 3485 // we can easily edit the non-auto generated parts right here in this file
3878 // instead of having to edit some template or the code generator. 3486 // instead of having to edit some template or the code generator.
3879 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" 3487 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h"
3880 3488
3881 } // namespace gles2 3489 } // namespace gles2
3882 } // namespace gpu 3490 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_impl_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698