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 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
700 return true; | 700 return true; |
701 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: | 701 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_BINDING_CHROMIUM: |
702 *params = bound_pixel_unpack_transfer_buffer_id_; | 702 *params = bound_pixel_unpack_transfer_buffer_id_; |
703 return true; | 703 return true; |
704 case GL_READ_FRAMEBUFFER_BINDING: | 704 case GL_READ_FRAMEBUFFER_BINDING: |
705 if (IsChromiumFramebufferMultisampleAvailable()) { | 705 if (IsChromiumFramebufferMultisampleAvailable()) { |
706 *params = bound_read_framebuffer_; | 706 *params = bound_read_framebuffer_; |
707 return true; | 707 return true; |
708 } | 708 } |
709 break; | 709 break; |
710 case GL_TIMESTAMP_EXT: | |
711 // We convert all GPU timestamps to CPU time. | |
712 *params = base::saturated_cast<GLint>( | |
713 (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() | |
714 * base::Time::kNanosecondsPerMicrosecond); | |
715 return true; | |
710 | 716 |
711 // Non-cached parameters. | 717 // Non-cached parameters. |
712 case GL_ALIASED_LINE_WIDTH_RANGE: | 718 case GL_ALIASED_LINE_WIDTH_RANGE: |
713 case GL_ALIASED_POINT_SIZE_RANGE: | 719 case GL_ALIASED_POINT_SIZE_RANGE: |
714 case GL_ALPHA_BITS: | 720 case GL_ALPHA_BITS: |
715 case GL_BLEND: | 721 case GL_BLEND: |
716 case GL_BLEND_COLOR: | 722 case GL_BLEND_COLOR: |
717 case GL_BLEND_DST_ALPHA: | 723 case GL_BLEND_DST_ALPHA: |
718 case GL_BLEND_DST_RGB: | 724 case GL_BLEND_DST_RGB: |
719 case GL_BLEND_EQUATION_ALPHA: | 725 case GL_BLEND_EQUATION_ALPHA: |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
990 return true; | 996 return true; |
991 case GL_MAX_ELEMENT_INDEX: | 997 case GL_MAX_ELEMENT_INDEX: |
992 *params = capabilities_.max_element_index; | 998 *params = capabilities_.max_element_index; |
993 return true; | 999 return true; |
994 case GL_MAX_SERVER_WAIT_TIMEOUT: | 1000 case GL_MAX_SERVER_WAIT_TIMEOUT: |
995 *params = capabilities_.max_server_wait_timeout; | 1001 *params = capabilities_.max_server_wait_timeout; |
996 return true; | 1002 return true; |
997 case GL_MAX_UNIFORM_BLOCK_SIZE: | 1003 case GL_MAX_UNIFORM_BLOCK_SIZE: |
998 *params = capabilities_.max_uniform_block_size; | 1004 *params = capabilities_.max_uniform_block_size; |
999 return true; | 1005 return true; |
1006 case GL_TIMESTAMP_EXT: | |
1007 // We convert all GPU timestamps to CPU time. | |
1008 *params = (base::TraceTicks::Now() - base::TraceTicks()).InMicroseconds() | |
1009 * base::Time::kNanosecondsPerMicrosecond; | |
michaeln
2015/07/01 20:00:43
Hello, we're seeing crashes on this line in the ca
| |
1010 return true; | |
1000 default: | 1011 default: |
1001 break; | 1012 break; |
1002 } | 1013 } |
1003 GLint value; | 1014 GLint value; |
1004 if (!GetHelper(pname, &value)) { | 1015 if (!GetHelper(pname, &value)) { |
1005 return false; | 1016 return false; |
1006 } | 1017 } |
1007 *params = static_cast<GLint64>(value); | 1018 *params = static_cast<GLint64>(value); |
1008 return true; | 1019 return true; |
1009 } | 1020 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1051 if (bufsize > 0) { | 1062 if (bufsize > 0) { |
1052 DCHECK(values); | 1063 DCHECK(values); |
1053 *values = value; | 1064 *values = value; |
1054 } | 1065 } |
1055 if (length) { | 1066 if (length) { |
1056 *length = 1; | 1067 *length = 1; |
1057 } | 1068 } |
1058 return true; | 1069 return true; |
1059 } | 1070 } |
1060 | 1071 |
1072 bool GLES2Implementation::GetQueryObjectValueHelper( | |
1073 const char* function_name, GLuint id, GLenum pname, GLuint64* params) { | |
1074 GPU_CLIENT_SINGLE_THREAD_CHECK(); | |
1075 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryObjectValueHelper(" | |
1076 << id << ", " | |
1077 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " | |
1078 << static_cast<const void*>(params) << ")"); | |
1079 | |
1080 QueryTracker::Query* query = query_tracker_->GetQuery(id); | |
1081 if (!query) { | |
1082 SetGLError(GL_INVALID_OPERATION, | |
1083 function_name, "unknown query id"); | |
1084 return false; | |
1085 } | |
1086 | |
1087 if (query->Active()) { | |
1088 SetGLError( | |
1089 GL_INVALID_OPERATION, | |
1090 function_name, | |
1091 "query active. Did you to call glEndQueryEXT?"); | |
1092 return false; | |
1093 } | |
1094 | |
1095 if (query->NeverUsed()) { | |
1096 SetGLError( | |
1097 GL_INVALID_OPERATION, | |
1098 function_name, "Never used. Did you call glBeginQueryEXT?"); | |
1099 return false; | |
1100 } | |
1101 | |
1102 bool valid_value = false; | |
1103 switch (pname) { | |
1104 case GL_QUERY_RESULT_EXT: | |
1105 if (!query->CheckResultsAvailable(helper_)) { | |
1106 helper_->WaitForToken(query->token()); | |
1107 if (!query->CheckResultsAvailable(helper_)) { | |
1108 FinishHelper(); | |
1109 CHECK(query->CheckResultsAvailable(helper_)); | |
1110 } | |
1111 } | |
1112 *params = query->GetResult(); | |
1113 valid_value = true; | |
1114 break; | |
1115 case GL_QUERY_RESULT_AVAILABLE_EXT: | |
1116 *params = query->CheckResultsAvailable(helper_); | |
1117 valid_value = true; | |
1118 break; | |
1119 default: | |
1120 SetGLErrorInvalidEnum(function_name, pname, "pname"); | |
1121 break; | |
1122 } | |
1123 GPU_CLIENT_LOG(" " << *params); | |
1124 CheckGLError(); | |
1125 return valid_value; | |
1126 } | |
1127 | |
1061 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper( | 1128 GLuint GLES2Implementation::GetMaxValueInBufferCHROMIUMHelper( |
1062 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { | 1129 GLuint buffer_id, GLsizei count, GLenum type, GLuint offset) { |
1063 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result; | 1130 typedef cmds::GetMaxValueInBufferCHROMIUM::Result Result; |
1064 Result* result = GetResultAs<Result*>(); | 1131 Result* result = GetResultAs<Result*>(); |
1065 if (!result) { | 1132 if (!result) { |
1066 return 0; | 1133 return 0; |
1067 } | 1134 } |
1068 *result = 0; | 1135 *result = 0; |
1069 helper_->GetMaxValueInBufferCHROMIUM( | 1136 helper_->GetMaxValueInBufferCHROMIUM( |
1070 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset()); | 1137 buffer_id, count, type, offset, GetResultShmId(), GetResultShmOffset()); |
(...skipping 3749 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4820 CheckGLError(); | 4887 CheckGLError(); |
4821 } | 4888 } |
4822 | 4889 |
4823 void GLES2Implementation::GetQueryivEXT( | 4890 void GLES2Implementation::GetQueryivEXT( |
4824 GLenum target, GLenum pname, GLint* params) { | 4891 GLenum target, GLenum pname, GLint* params) { |
4825 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4892 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
4826 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" | 4893 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" |
4827 << GLES2Util::GetStringQueryTarget(target) << ", " | 4894 << GLES2Util::GetStringQueryTarget(target) << ", " |
4828 << GLES2Util::GetStringQueryParameter(pname) << ", " | 4895 << GLES2Util::GetStringQueryParameter(pname) << ", " |
4829 << static_cast<const void*>(params) << ")"); | 4896 << static_cast<const void*>(params) << ")"); |
4830 | 4897 if (pname == GL_QUERY_COUNTER_BITS_EXT) { |
4831 if (pname != GL_CURRENT_QUERY_EXT) { | 4898 // We convert all queries to CPU time so we support 64 bits. |
4899 *params = 64; | |
4900 return; | |
4901 } else if (pname != GL_CURRENT_QUERY_EXT) { | |
4832 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); | 4902 SetGLErrorInvalidEnum("glGetQueryivEXT", pname, "pname"); |
4833 return; | 4903 return; |
4834 } | 4904 } |
4835 QueryTracker::Query* query = query_tracker_->GetCurrentQuery(target); | 4905 QueryTracker::Query* query = query_tracker_->GetCurrentQuery(target); |
4836 *params = query ? query->id() : 0; | 4906 *params = query ? query->id() : 0; |
4837 GPU_CLIENT_LOG(" " << *params); | 4907 GPU_CLIENT_LOG(" " << *params); |
4838 CheckGLError(); | 4908 CheckGLError(); |
4839 } | 4909 } |
4840 | 4910 |
4841 void GLES2Implementation::GetQueryObjectuivEXT( | 4911 void GLES2Implementation::GetQueryObjectuivEXT( |
4842 GLuint id, GLenum pname, GLuint* params) { | 4912 GLuint id, GLenum pname, GLuint* params) { |
4843 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4913 GLuint64 result = 0; |
4844 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] GetQueryivEXT(" << id << ", " | 4914 if (GetQueryObjectValueHelper("glQueryObjectuivEXT", id, pname, &result)) |
4845 << GLES2Util::GetStringQueryObjectParameter(pname) << ", " | 4915 *params = base::saturated_cast<GLuint>(result); |
4846 << static_cast<const void*>(params) << ")"); | 4916 } |
4847 | 4917 |
4848 QueryTracker::Query* query = query_tracker_->GetQuery(id); | 4918 void GLES2Implementation::GetQueryObjectui64vEXT( |
4849 if (!query) { | 4919 GLuint id, GLenum pname, GLuint64* params) { |
4850 SetGLError(GL_INVALID_OPERATION, "glQueryObjectuivEXT", "unknown query id"); | 4920 GLuint64 result = 0; |
4851 return; | 4921 if (GetQueryObjectValueHelper("glQueryObjectui64vEXT", id, pname, &result)) |
4852 } | 4922 *params = result; |
4853 | |
4854 if (query->Active()) { | |
4855 SetGLError( | |
4856 GL_INVALID_OPERATION, | |
4857 "glQueryObjectuivEXT", "query active. Did you to call glEndQueryEXT?"); | |
4858 return; | |
4859 } | |
4860 | |
4861 if (query->NeverUsed()) { | |
4862 SetGLError( | |
4863 GL_INVALID_OPERATION, | |
4864 "glQueryObjectuivEXT", "Never used. Did you call glBeginQueryEXT?"); | |
4865 return; | |
4866 } | |
4867 | |
4868 switch (pname) { | |
4869 case GL_QUERY_RESULT_EXT: | |
4870 if (!query->CheckResultsAvailable(helper_)) { | |
4871 helper_->WaitForToken(query->token()); | |
4872 if (!query->CheckResultsAvailable(helper_)) { | |
4873 FinishHelper(); | |
4874 CHECK(query->CheckResultsAvailable(helper_)); | |
4875 } | |
4876 } | |
4877 *params = query->GetResult(); | |
4878 break; | |
4879 case GL_QUERY_RESULT_AVAILABLE_EXT: | |
4880 *params = query->CheckResultsAvailable(helper_); | |
4881 break; | |
4882 default: | |
4883 SetGLErrorInvalidEnum("glQueryObjectuivEXT", pname, "pname"); | |
4884 break; | |
4885 } | |
4886 GPU_CLIENT_LOG(" " << *params); | |
4887 CheckGLError(); | |
4888 } | 4923 } |
4889 | 4924 |
4890 void GLES2Implementation::DrawArraysInstancedANGLE( | 4925 void GLES2Implementation::DrawArraysInstancedANGLE( |
4891 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { | 4926 GLenum mode, GLint first, GLsizei count, GLsizei primcount) { |
4892 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 4927 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
4893 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" | 4928 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDrawArraysInstancedANGLE(" |
4894 << GLES2Util::GetStringDrawMode(mode) << ", " | 4929 << GLES2Util::GetStringDrawMode(mode) << ", " |
4895 << first << ", " << count << ", " << primcount << ")"); | 4930 << first << ", " << count << ", " << primcount << ")"); |
4896 if (count < 0) { | 4931 if (count < 0) { |
4897 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0"); | 4932 SetGLError(GL_INVALID_VALUE, "glDrawArraysInstancedANGLE", "count < 0"); |
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5749 CheckGLError(); | 5784 CheckGLError(); |
5750 } | 5785 } |
5751 | 5786 |
5752 // Include the auto-generated part of this file. We split this because it means | 5787 // Include the auto-generated part of this file. We split this because it means |
5753 // we can easily edit the non-auto generated parts right here in this file | 5788 // we can easily edit the non-auto generated parts right here in this file |
5754 // instead of having to edit some template or the code generator. | 5789 // instead of having to edit some template or the code generator. |
5755 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 5790 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
5756 | 5791 |
5757 } // namespace gles2 | 5792 } // namespace gles2 |
5758 } // namespace gpu | 5793 } // namespace gpu |
OLD | NEW |