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

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: Removed ppapi support 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 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698