| 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 |