Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 1188013004: Added support for Time Elapsed queries through the command buffer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bad upload before Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698