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

Unified Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 9694025: Add support for GL_COMMANDS_ISSUED_CHROMIUM fence like query. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add cast for std::min Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/service/gl_utils.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 2f4c1e6557a23788d1de333bd063e49f470be3ef..3811ac8d9674c527329011fcb7d38a9cbe118248 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2023,7 +2023,8 @@ bool GLES2DecoderImpl::Initialize(
vertex_attrib_manager_.reset(new VertexAttribManager());
vertex_attrib_manager_->Initialize(group_->max_vertex_attribs());
- query_manager_.reset(new QueryManager());
+ query_manager_.reset(new QueryManager(this, feature_info_->feature_flags(
+ ).use_arb_occlusion_query2_for_occlusion_query_boolean));
util_.set_num_compressed_texture_formats(
validators_->compressed_texture_format.GetValues().size());
@@ -7931,11 +7932,7 @@ bool GLES2DecoderImpl::GenQueriesEXTHelper(
return false;
}
}
- scoped_array<GLuint> service_ids(new GLuint[n]);
- glGenQueriesARB(n, service_ids.get());
- for (GLsizei ii = 0; ii < n; ++ii) {
- query_manager_->CreateQuery(client_ids[ii], service_ids[ii]);
- }
+ // NOTE: We don't generate Query objects here. Only in BeginQueryEXT
return true;
}
@@ -7947,8 +7944,7 @@ void GLES2DecoderImpl::DeleteQueriesEXTHelper(
if (query == current_query_) {
current_query_ = NULL;
}
- GLuint service_id = query->service_id();
- glDeleteQueriesARB(1, &service_id);
+ query->Destroy(true);
query_manager_->RemoveQuery(client_ids[ii]);
}
}
@@ -7958,7 +7954,7 @@ bool GLES2DecoderImpl::ProcessPendingQueries() {
if (query_manager_.get() == NULL) {
return false;
}
- if (!query_manager_->ProcessPendingQueries(this)) {
+ if (!query_manager_->ProcessPendingQueries()) {
current_decoder_error_ = error::kOutOfBounds;
}
return query_manager_->HavePendingQueries();
@@ -7971,9 +7967,15 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
int32 sync_shm_id = static_cast<int32>(c.sync_data_shm_id);
uint32 sync_shm_offset = static_cast<uint32>(c.sync_data_shm_offset);
- if (!feature_info_->feature_flags().occlusion_query_boolean) {
- SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: not enabled");
- return error::kNoError;
+ switch (target) {
+ case GL_COMMANDS_ISSUED_CHROMIUM:
+ break;
+ default:
+ if (!feature_info_->feature_flags().occlusion_query_boolean) {
+ SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: not enabled");
+ return error::kNoError;
+ }
+ break;
}
if (current_query_) {
@@ -7989,31 +7991,28 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
QueryManager::Query* query = query_manager_->GetQuery(client_id);
if (!query) {
+ // TODO(gman): Decide if we need this check.
+ //
// Checks id was made by glGenQueries
- IdAllocatorInterface* id_allocator =
- group_->GetIdAllocator(id_namespaces::kQueries);
- if (!id_allocator->InUse(client_id)) {
- SetGLError(GL_INVALID_OPERATION,
- "glBeginQueryEXT: id not made by glGenQueriesEXT");
- return error::kNoError;
- }
- // Makes object and assoicates with memory.
- GLuint service_id = 0;
- glGenQueriesARB(1, &service_id);
- DCHECK_NE(0u, service_id);
- query = query_manager_->CreateQuery(client_id, service_id);
- }
-
- QuerySync* sync = GetSharedMemoryAs<QuerySync*>(
- sync_shm_id, sync_shm_offset, sizeof(*sync));
- if (!sync) {
- DLOG(ERROR) << "Invalid shared memory referenced by query";
- return error::kOutOfBounds;
- }
-
- if (!query->IsInitialized()) {
- query->Initialize(target, sync_shm_id, sync_shm_offset);
- } else if (query->target() != target) {
+ //
+ // From the POV of OpenGL ES 2.0 you need to call glGenQueriesEXT
+ // for all Query ids but from the POV of the command buffer service maybe
+ // you don't.
+ //
+ // The client can enforce this. I don't think the service cares.
+ //
+ // IdAllocatorInterface* id_allocator =
+ // group_->GetIdAllocator(id_namespaces::kQueries);
+ // if (!id_allocator->InUse(client_id)) {
+ // SetGLError(GL_INVALID_OPERATION,
+ // "glBeginQueryEXT: id not made by glGenQueriesEXT");
+ // return error::kNoError;
+ // }
+ query = query_manager_->CreateQuery(
+ target, client_id, sync_shm_id, sync_shm_offset);
+ }
+
+ if (query->target() != target) {
SetGLError(GL_INVALID_OPERATION, "glBeginQueryEXT: target does not match");
return error::kNoError;
} else if (query->shm_id() != sync_shm_id ||
@@ -8022,11 +8021,11 @@ error::Error GLES2DecoderImpl::HandleBeginQueryEXT(
return error::kInvalidArguments;
}
- query_manager_->RemovePendingQuery(query);
+ if (!query_manager_->BeginQuery(query)) {
+ return error::kOutOfBounds;
+ }
- glBeginQueryARB(target, query->service_id());
current_query_ = query;
-
return error::kNoError;
}
@@ -8044,10 +8043,12 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT(
"glEndQueryEXT: target does not match active query");
return error::kNoError;
}
- glEndQueryARB(target);
- query_manager_->AddPendingQuery(current_query_, submit_count);
- current_query_ = NULL;
+ if (!query_manager_->EndQuery(current_query_, submit_count)) {
+ return error::kOutOfBounds;
+ }
+
+ current_query_ = NULL;
return error::kNoError;
}
« no previous file with comments | « gpu/command_buffer/service/gl_utils.h ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698