OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // 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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |