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

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 extra line 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 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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