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