| 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 <GLES2/gl2.h> | 9 #include <GLES2/gl2.h> |
| 10 #include <GLES2/gl2ext.h> | 10 #include <GLES2/gl2ext.h> |
| (...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 return true; | 711 return true; |
| 712 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: | 712 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: |
| 713 *params = bound_pixel_unpack_transfer_buffer_id_; | 713 *params = bound_pixel_unpack_transfer_buffer_id_; |
| 714 return true; | 714 return true; |
| 715 case GL_READ_FRAMEBUFFER_BINDING: | 715 case GL_READ_FRAMEBUFFER_BINDING: |
| 716 if (IsChromiumFramebufferMultisampleAvailable()) { | 716 if (IsChromiumFramebufferMultisampleAvailable()) { |
| 717 *params = bound_read_framebuffer_; | 717 *params = bound_read_framebuffer_; |
| 718 return true; | 718 return true; |
| 719 } | 719 } |
| 720 break; | 720 break; |
| 721 // TODO(dyen): Also support GL_GPU_DISJOINT_EXT. | |
| 722 case GL_TIMESTAMP_EXT: | 721 case GL_TIMESTAMP_EXT: |
| 723 // We convert all GPU timestamps to CPU time. | 722 // We convert all GPU timestamps to CPU time. |
| 724 *params = base::saturated_cast<GLint>( | 723 *params = base::saturated_cast<GLint>( |
| 725 (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() | 724 (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() |
| 726 * base::Time::kNanosecondsPerMicrosecond); | 725 * base::Time::kNanosecondsPerMicrosecond); |
| 727 return true; | 726 return true; |
| 728 | 727 |
| 729 // Non-cached parameters. | 728 // Non-cached parameters. |
| 730 case GL_ALIASED_LINE_WIDTH_RANGE: | 729 case GL_ALIASED_LINE_WIDTH_RANGE: |
| 731 case GL_ALIASED_POINT_SIZE_RANGE: | 730 case GL_ALIASED_POINT_SIZE_RANGE: |
| (...skipping 4124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4856 // queries across contexts? | 4855 // queries across contexts? |
| 4857 return query_tracker_->GetQuery(id) != NULL; | 4856 return query_tracker_->GetQuery(id) != NULL; |
| 4858 } | 4857 } |
| 4859 | 4858 |
| 4860 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { | 4859 void GLES2Implementation::BeginQueryEXT(GLenum target, GLuint id) { |
| 4861 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4860 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4862 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT(" | 4861 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] BeginQueryEXT(" |
| 4863 << GLES2Util::GetStringQueryTarget(target) | 4862 << GLES2Util::GetStringQueryTarget(target) |
| 4864 << ", " << id << ")"); | 4863 << ", " << id << ")"); |
| 4865 | 4864 |
| 4866 // Check capabilities | |
| 4867 switch (target) { | 4865 switch (target) { |
| 4868 case GL_COMMANDS_ISSUED_CHROMIUM: | 4866 case GL_COMMANDS_ISSUED_CHROMIUM: |
| 4869 case GL_LATENCY_QUERY_CHROMIUM: | 4867 case GL_LATENCY_QUERY_CHROMIUM: |
| 4870 case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM: | 4868 case GL_ASYNC_PIXEL_UNPACK_COMPLETED_CHROMIUM: |
| 4871 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: | 4869 case GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM: |
| 4872 case GL_GET_ERROR_QUERY_CHROMIUM: | 4870 case GL_GET_ERROR_QUERY_CHROMIUM: |
| 4873 break; | 4871 break; |
| 4874 case GL_COMMANDS_COMPLETED_CHROMIUM: | 4872 case GL_COMMANDS_COMPLETED_CHROMIUM: |
| 4875 if (!capabilities_.sync_query) { | 4873 if (!capabilities_.sync_query) { |
| 4876 SetGLError( | 4874 SetGLError( |
| 4877 GL_INVALID_OPERATION, "glBeginQueryEXT", | 4875 GL_INVALID_OPERATION, "glBeginQueryEXT", |
| 4878 "not enabled for commands completed queries"); | 4876 "not enabled for commands completed queries"); |
| 4879 return; | 4877 return; |
| 4880 } | 4878 } |
| 4881 break; | 4879 break; |
| 4882 case GL_ANY_SAMPLES_PASSED: | 4880 case GL_ANY_SAMPLES_PASSED: |
| 4883 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: | 4881 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE: |
| 4884 if (!capabilities_.occlusion_query_boolean) { | 4882 if (!capabilities_.occlusion_query_boolean) { |
| 4885 SetGLError( | 4883 SetGLError( |
| 4886 GL_INVALID_OPERATION, "glBeginQueryEXT", | 4884 GL_INVALID_OPERATION, "glBeginQueryEXT", |
| 4887 "not enabled for occlusion queries"); | 4885 "not enabled for occlusion queries"); |
| 4888 return; | 4886 return; |
| 4889 } | 4887 } |
| 4890 break; | 4888 break; |
| 4891 // TODO(dyen): Also support GL_TIMESTAMP. | |
| 4892 case GL_TIME_ELAPSED_EXT: | 4889 case GL_TIME_ELAPSED_EXT: |
| 4893 if (!capabilities_.timer_queries) { | 4890 if (!capabilities_.timer_queries) { |
| 4894 SetGLError( | 4891 SetGLError( |
| 4895 GL_INVALID_OPERATION, "glBeginQueryEXT", | 4892 GL_INVALID_OPERATION, "glBeginQueryEXT", |
| 4896 "not enabled for timing queries"); | 4893 "not enabled for timing queries"); |
| 4897 return; | 4894 return; |
| 4898 } | 4895 } |
| 4899 break; | 4896 break; |
| 4900 default: | 4897 default: |
| 4901 SetGLError( | 4898 SetGLError( |
| 4902 GL_INVALID_OPERATION, "glBeginQueryEXT", "unknown query target"); | 4899 GL_INVALID_ENUM, "glBeginQueryEXT", "unknown query target"); |
| 4903 return; | 4900 return; |
| 4904 } | 4901 } |
| 4905 | 4902 |
| 4906 // if any outstanding queries INV_OP | 4903 // if any outstanding queries INV_OP |
| 4907 if (query_tracker_->GetCurrentQuery(target)) { | 4904 if (query_tracker_->GetCurrentQuery(target)) { |
| 4908 SetGLError( | 4905 SetGLError( |
| 4909 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); | 4906 GL_INVALID_OPERATION, "glBeginQueryEXT", "query already in progress"); |
| 4910 return; | 4907 return; |
| 4911 } | 4908 } |
| 4912 | 4909 |
| 4913 // id = 0 INV_OP | |
| 4914 if (id == 0) { | 4910 if (id == 0) { |
| 4915 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); | 4911 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "id is 0"); |
| 4916 return; | 4912 return; |
| 4917 } | 4913 } |
| 4918 | 4914 |
| 4919 // if not GENned INV_OPERATION | |
| 4920 if (!query_id_allocator_->InUse(id)) { | 4915 if (!query_id_allocator_->InUse(id)) { |
| 4921 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "invalid id"); | 4916 SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT", "invalid id"); |
| 4922 return; | 4917 return; |
| 4923 } | 4918 } |
| 4924 | 4919 |
| 4925 if (query_tracker_->BeginQuery(id, target, this)) | 4920 if (query_tracker_->BeginQuery(id, target, this)) |
| 4926 CheckGLError(); | 4921 CheckGLError(); |
| 4927 } | 4922 } |
| 4928 | 4923 |
| 4929 void GLES2Implementation::EndQueryEXT(GLenum target) { | 4924 void GLES2Implementation::EndQueryEXT(GLenum target) { |
| 4930 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4925 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4931 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT(" | 4926 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] EndQueryEXT(" |
| 4932 << GLES2Util::GetStringQueryTarget(target) << ")"); | 4927 << GLES2Util::GetStringQueryTarget(target) << ")"); |
| 4933 // Don't do anything if the context is lost. | 4928 // Don't do anything if the context is lost. |
| 4934 if (helper_->IsContextLost()) { | 4929 if (helper_->IsContextLost()) { |
| 4935 return; | 4930 return; |
| 4936 } | 4931 } |
| 4937 | 4932 |
| 4938 if (query_tracker_->EndQuery(target, this)) | 4933 if (query_tracker_->EndQuery(target, this)) |
| 4939 CheckGLError(); | 4934 CheckGLError(); |
| 4940 } | 4935 } |
| 4941 | 4936 |
| 4937 void GLES2Implementation::QueryCounterEXT(GLuint id, GLenum target) { |
| 4938 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4939 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] QueryCounterEXT(" |
| 4940 << id |
| 4941 << ", " << GLES2Util::GetStringQueryTarget(target) << ")"); |
| 4942 |
| 4943 switch (target) { |
| 4944 case GL_TIMESTAMP_EXT: |
| 4945 if (!capabilities_.timer_queries) { |
| 4946 SetGLError( |
| 4947 GL_INVALID_OPERATION, "glQueryCounterEXT", |
| 4948 "not enabled for timing queries"); |
| 4949 return; |
| 4950 } |
| 4951 break; |
| 4952 default: |
| 4953 SetGLError( |
| 4954 GL_INVALID_ENUM, "glQueryCounterEXT", "unknown query target"); |
| 4955 return; |
| 4956 } |
| 4957 |
| 4958 if (id == 0) { |
| 4959 SetGLError(GL_INVALID_OPERATION, "glQueryCounterEXT", "id is 0"); |
| 4960 return; |
| 4961 } |
| 4962 |
| 4963 if (!query_id_allocator_->InUse(id)) { |
| 4964 SetGLError(GL_INVALID_OPERATION, "glQueryCounterEXT", "invalid id"); |
| 4965 return; |
| 4966 } |
| 4967 |
| 4968 if (query_tracker_->QueryCounter(id, target, this)) |
| 4969 CheckGLError(); |
| 4970 } |
| 4971 |
| 4942 void GLES2Implementation::GetQueryivEXT( | 4972 void GLES2Implementation::GetQueryivEXT( |
| 4943 GLenum target, GLenum pname, GLint* params) { | 4973 GLenum target, GLenum pname, GLint* params) { |
| 4944 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4974 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
| 4945 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" | 4975 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" |
| 4946 << GLES2Util::GetStringQueryTarget(target) << ", " | 4976 << GLES2Util::GetStringQueryTarget(target) << ", " |
| 4947 << GLES2Util::GetStringQueryParameter(pname) << ", " | 4977 << GLES2Util::GetStringQueryParameter(pname) << ", " |
| 4948 << static_cast<const void*>(params) << ")"); | 4978 << static_cast<const void*>(params) << ")"); |
| 4949 if (pname == GL_QUERY_COUNTER_BITS_EXT) { | 4979 if (pname == GL_QUERY_COUNTER_BITS_EXT) { |
| 4950 // We convert all queries to CPU time so we support 64 bits. | 4980 // We convert all queries to CPU time so we support 64 bits. |
| 4951 *params = 64; | 4981 *params = 64; |
| (...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5994 CheckGLError(); | 6024 CheckGLError(); |
| 5995 } | 6025 } |
| 5996 | 6026 |
| 5997 // Include the auto-generated part of this file. We split this because it means | 6027 // Include the auto-generated part of this file. We split this because it means |
| 5998 // we can easily edit the non-auto generated parts right here in this file | 6028 // we can easily edit the non-auto generated parts right here in this file |
| 5999 // instead of having to edit some template or the code generator. | 6029 // instead of having to edit some template or the code generator. |
| 6000 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 6030 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
| 6001 | 6031 |
| 6002 } // namespace gles2 | 6032 } // namespace gles2 |
| 6003 } // namespace gpu | 6033 } // namespace gpu |
| OLD | NEW |