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/gl2ext.h> | 9 #include <GLES2/gl2ext.h> |
10 #include <GLES2/gl2extchromium.h> | 10 #include <GLES2/gl2extchromium.h> |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
694 return true; | 694 return true; |
695 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: | 695 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: |
696 *params = bound_pixel_unpack_transfer_buffer_id_; | 696 *params = bound_pixel_unpack_transfer_buffer_id_; |
697 return true; | 697 return true; |
698 case GL_READ_FRAMEBUFFER_BINDING: | 698 case GL_READ_FRAMEBUFFER_BINDING: |
699 if (IsChromiumFramebufferMultisampleAvailable()) { | 699 if (IsChromiumFramebufferMultisampleAvailable()) { |
700 *params = bound_read_framebuffer_; | 700 *params = bound_read_framebuffer_; |
701 return true; | 701 return true; |
702 } | 702 } |
703 break; | 703 break; |
704 case GL_TIMESTAMP_EXT: | |
705 // We convert all GPU timestamps to CPU time. | |
706 *params = static_cast<GLint>( | |
no sievers
2015/06/23 21:45:27
I think this should be a saturated cast because of
David Yen
2015/06/23 23:35:32
Done.
| |
707 (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() | |
708 * base::Time::kNanosecondsPerMicrosecond); | |
709 return true; | |
710 | |
704 | 711 |
705 // Non-cached parameters. | 712 // Non-cached parameters. |
706 case GL_ALIASED_LINE_WIDTH_RANGE: | 713 case GL_ALIASED_LINE_WIDTH_RANGE: |
707 case GL_ALIASED_POINT_SIZE_RANGE: | 714 case GL_ALIASED_POINT_SIZE_RANGE: |
708 case GL_ALPHA_BITS: | 715 case GL_ALPHA_BITS: |
709 case GL_BLEND: | 716 case GL_BLEND: |
710 case GL_BLEND_COLOR: | 717 case GL_BLEND_COLOR: |
711 case GL_BLEND_DST_ALPHA: | 718 case GL_BLEND_DST_ALPHA: |
712 case GL_BLEND_DST_RGB: | 719 case GL_BLEND_DST_RGB: |
713 case GL_BLEND_EQUATION_ALPHA: | 720 case GL_BLEND_EQUATION_ALPHA: |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
984 return true; | 991 return true; |
985 case GL_MAX_ELEMENT_INDEX: | 992 case GL_MAX_ELEMENT_INDEX: |
986 *params = capabilities_.max_element_index; | 993 *params = capabilities_.max_element_index; |
987 return true; | 994 return true; |
988 case GL_MAX_SERVER_WAIT_TIMEOUT: | 995 case GL_MAX_SERVER_WAIT_TIMEOUT: |
989 *params = capabilities_.max_server_wait_timeout; | 996 *params = capabilities_.max_server_wait_timeout; |
990 return true; | 997 return true; |
991 case GL_MAX_UNIFORM_BLOCK_SIZE: | 998 case GL_MAX_UNIFORM_BLOCK_SIZE: |
992 *params = capabilities_.max_uniform_block_size; | 999 *params = capabilities_.max_uniform_block_size; |
993 return true; | 1000 return true; |
1001 case GL_TIMESTAMP_EXT: | |
1002 // We convert all GPU timestamps to CPU time. | |
1003 *params = (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() | |
1004 * base::Time::kNanosecondsPerMicrosecond; | |
1005 return true; | |
994 default: | 1006 default: |
995 break; | 1007 break; |
996 } | 1008 } |
997 GLint value; | 1009 GLint value; |
998 if (!GetHelper(pname, &value)) { | 1010 if (!GetHelper(pname, &value)) { |
999 return false; | 1011 return false; |
1000 } | 1012 } |
1001 *params = static_cast<GLint64>(value); | 1013 *params = static_cast<GLint64>(value); |
1002 return true; | 1014 return true; |
1003 } | 1015 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1045 if (bufsize > 0) { | 1057 if (bufsize > 0) { |
1046 DCHECK(values); | 1058 DCHECK(values); |
1047 *values = value; | 1059 *values = value; |
1048 } | 1060 } |
1049 if (length) { | 1061 if (length) { |
1050 *length = 1; | 1062 *length = 1; |
1051 } | 1063 } |
1052 return true; | 1064 return true; |
1053 } | 1065 } |
1054 | 1066 |
1067 bool GLES2Implementation::GetQueryObjectValueHelper( | |
1068 const char* function_name, GLuint id, GLenum pname, GLuint64* params) { | |
1069 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
1070 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryObjectValueHelper(" | |
1071 << id << ", " | |
1072 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " | |
1073 << static_cast<const void*>(params) << ")"); | |
1074 | |
1075 QueryTracker::Query* query = query_tracker_->GetQuery(id); | |
1076 if (!query) { | |
1077 SetGLError(GL_INVALID_OPERATION, | |
1078 function_name, "unknown query id"); | |
1079 return false; | |
1080 } | |
1081 | |
1082 QueryMap::iterator it = current_queries_.find(query->target()); | |
1083 if (it != current_queries_.end()) { | |
1084 SetGLError( | |
1085 GL_INVALID_OPERATION, | |
1086 function_name, | |
1087 "query active. Did you to call glEndQueryEXT?"); | |
1088 return false; | |
1089 } | |
1090 | |
1091 if (query->NeverUsed()) { | |
1092 SetGLError( | |
1093 GL_INVALID_OPERATION, | |
1094 function_name, "Never used. Did you call glBeginQueryEXT?"); | |
1095 return false; | |
1096 } | |
1097 | |
1098 bool valid_value = false; | |
1099 switch (pname) { | |
1100 case GL_QUERY_RESULT_EXT: | |
1101 if (!query->CheckResultsAvailable(helper_)) { | |
1102 helper_->WaitForToken(query->token()); | |
1103 if (!query->CheckResultsAvailable(helper_)) { | |
1104 FinishHelper(); | |
1105 CHECK(query->CheckResultsAvailable(helper_)); | |
1106 } | |
1107 } | |
1108 *params = query->GetResult(); | |
1109 valid_value = true; | |
1110 break; | |
1111 case GL_QUERY_RESULT_AVAILABLE_EXT: | |
1112 *params = query->CheckResultsAvailable(helper_); | |
1113 valid_value = true; | |
1114 break; | |
1115 default: | |
1116 SetGLErrorInvalidEnum(function_name, pname, "pname"); | |
1117 break; | |
1118 } | |
1119 GPU_CLIENT_LOG(" " << *params); | |
1120 CheckGLError(); | |
1121 return valid_value; | |
1122 } | |
1123 | |
1055 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper( | 1124 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper( |
1056 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { | 1125 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { |
1057 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result; | 1126 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result; |
1058 Result* result = GetResultAs<Result*>(); | 1127 Result* result = GetResultAs<Result*>(); |
1059 if (!result) { | 1128 if (!result) { |
1060 return 0; | 1129 return 0; |
1061 } | 1130 } |
1062 *result = 0; | 1131 *result = 0; |
1063 helper_->GetMaxValueInBufferCHROMIUM( | 1132 helper_->GetMaxValueInBufferCHROMIUM( |
1064 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset()); | 1133 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset()); |
(...skipping 3792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4857 CheckGLError(); | 4926 CheckGLError(); |
4858 } | 4927 } |
4859 | 4928 |
4860 void GLES2Implementation::GetQueryivEXT( | 4929 void GLES2Implementation::GetQueryivEXT( |
4861 GLenum target, GLenum pname, GLint* params) { | 4930 GLenum target, GLenum pname, GLint* params) { |
4862 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4931 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
4863 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" | 4932 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" |
4864 << GLES2Util::GetStringQueryTarget(target) << ", " | 4933 << GLES2Util::GetStringQueryTarget(target) << ", " |
4865 << GLES2Util::GetStringQueryParameter(pname) << ", " | 4934 << GLES2Util::GetStringQueryParameter(pname) << ", " |
4866 << static_cast<const void*>(params) << ")"); | 4935 << static_cast<const void*>(params) << ")"); |
4867 | 4936 if (pname == GL_QUERY_COUNTER_BITS_EXT) { |
4868 if (pname != GL_CURRENT_QUERY_EXT) { | 4937 *params = 64; |
4938 return; | |
4939 } else if (pname != GL_CURRENT_QUERY_EXT) { | |
4869 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); | 4940 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); |
4870 return; | 4941 return; |
4871 } | 4942 } |
4872 QueryMap::iterator it = current_queries_.find(target); | 4943 QueryMap::iterator it = current_queries_.find(target); |
4873 if (it != current_queries_.end()) { | 4944 if (it != current_queries_.end()) { |
4874 QueryTracker::Query* query = it->second; | 4945 QueryTracker::Query* query = it->second; |
4875 *params = query->id(); | 4946 *params = query->id(); |
4876 } else { | 4947 } else { |
4877 *params = 0; | 4948 *params = 0; |
4878 } | 4949 } |
4879 GPU_CLIENT_LOG(" " << *params); | 4950 GPU_CLIENT_LOG(" " << *params); |
4880 CheckGLError(); | 4951 CheckGLError(); |
4881 } | 4952 } |
4882 | 4953 |
4883 void GLES2Implementation::GetQueryObjectuivEXT( | 4954 void GLES2Implementation::GetQueryObjectuivEXT( |
4884 GLuint id, GLenum pname, GLuint* params) { | 4955 GLuint id, GLenum pname, GLuint* params) { |
4885 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4956 GLuint64 result = 0; |
4886 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " | 4957 if (GetQueryObjectValueHelper("glQueryObjectuivEXT", id, pname, &result)) |
4887 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " | 4958 *params = base::saturated_cast<GLuint>(result); |
4888 << static_cast<const void*>(params) << ")"); | 4959 } |
4889 | 4960 |
4890 QueryTracker::Query* query = query_tracker_->GetQuery(id); | 4961 void GLES2Implementation::GetQueryObjectui64vEXT( |
4891 if (!query) { | 4962 GLuint id, GLenum pname, GLuint64* params) { |
4892 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); | 4963 GLuint64 result = 0; |
4893 return; | 4964 if (GetQueryObjectValueHelper("glQueryObjectui64vEXT", id, pname, &result)) |
4894 } | 4965 *params = result; |
4895 | |
4896 QueryMap::iterator it = current_queries_.find(query->target()); | |
4897 if (it != current_queries_.end()) { | |
4898 SetGLError( | |
4899 GL_INVALID_OPERATION, | |
4900 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); | |
4901 return; | |
4902 } | |
4903 | |
4904 if (query->NeverUsed()) { | |
4905 SetGLError( | |
4906 GL_INVALID_OPERATION, | |
4907 "glQueryObjectuivEXT", "Never used. Did you call glBeginQueryEXT?"); | |
4908 return; | |
4909 } | |
4910 | |
4911 switch (pname) { | |
4912 case GL_QUERY_RESULT_EXT: | |
4913 if (!query->CheckResultsAvailable(helper_)) { | |
4914 helper_->WaitForToken(query->token()); | |
4915 if (!query->CheckResultsAvailable(helper_)) { | |
4916 FinishHelper(); | |
4917 CHECK(query->CheckResultsAvailable(helper_)); | |
4918 } | |
4919 } | |
4920 *params = query->GetResult(); | |
4921 break; | |
4922 case GL_QUERY_RESULT_AVAILABLE_EXT: | |
4923 *params = query->CheckResultsAvailable(helper_); | |
4924 break; | |
4925 default: | |
4926 SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname"); | |
4927 break; | |
4928 } | |
4929 GPU_CLIENT_LOG(" " << *params); | |
4930 CheckGLError(); | |
4931 } | 4966 } |
4932 | 4967 |
4933 void GLES2Implementation::DrawArraysInstancedANGLE( | 4968 void GLES2Implementation::DrawArraysInstancedANGLE( |
4934 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { | 4969 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { |
4935 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4970 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
4936 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" | 4971 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" |
4937 << GLES2Util::GetStringDrawMode(mode) << ", " | 4972 << GLES2Util::GetStringDrawMode(mode) << ", " |
4938 << first << ", " << count << ", " << primcount << ")"); | 4973 << first << ", " << count << ", " << primcount << ")"); |
4939 if (count < 0) { | 4974 if (count < 0) { |
4940 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0"); | 4975 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0"); |
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5792 CheckGLError(); | 5827 CheckGLError(); |
5793 } | 5828 } |
5794 | 5829 |
5795 // Include the auto-generated part of this file. We split this because it means | 5830 // Include the auto-generated part of this file. We split this because it means |
5796 // we can easily edit the non-auto generated parts right here in this file | 5831 // we can easily edit the non-auto generated parts right here in this file |
5797 // instead of having to edit some template or the code generator. | 5832 // instead of having to edit some template or the code generator. |
5798 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 5833 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
5799 | 5834 |
5800 } // namespace gles2 | 5835 } // namespace gles2 |
5801 } // namespace gpu | 5836 } // namespace gpu |
OLD | NEW |