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

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

Issue 707833003: gpu: Make sure sync queries complete on service side when calling glFinish. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: wait_if_supported -> did_finish and add some checks to help diagnose these errors Created 6 years, 1 month 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/query_manager.h ('k') | gpu/command_buffer/service/query_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/service/query_manager.cc
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index 5f518eca4c24c2c6d95244c1f02adaefbb1d687f..c7f34312f103c58dfae246d26414c834fe9e6a89 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -64,7 +64,7 @@ class AsyncPixelTransfersCompletedQuery
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -105,7 +105,7 @@ bool AsyncPixelTransfersCompletedQuery::End(
return AddToPendingTransferQueue(submit_count);
}
-bool AsyncPixelTransfersCompletedQuery::Process() {
+bool AsyncPixelTransfersCompletedQuery::Process(bool did_finish) {
QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
shm_id(), shm_offset(), sizeof(*sync));
if (!sync)
@@ -141,7 +141,7 @@ class AllSamplesPassedQuery : public QueryManager::Query {
GLuint service_id);
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -169,7 +169,7 @@ bool AllSamplesPassedQuery::End(base::subtle::Atomic32 submit_count) {
return AddToPendingQueue(submit_count);
}
-bool AllSamplesPassedQuery::Process() {
+bool AllSamplesPassedQuery::Process(bool did_finish) {
GLuint available = 0;
glGetQueryObjectuivARB(
service_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
@@ -200,7 +200,7 @@ class CommandsIssuedQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -226,7 +226,7 @@ bool CommandsIssuedQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(elapsed.InMicroseconds());
}
-bool CommandsIssuedQuery::Process() {
+bool CommandsIssuedQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -247,7 +247,7 @@ class CommandLatencyQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -269,7 +269,7 @@ bool CommandLatencyQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(now.InMicroseconds());
}
-bool CommandLatencyQuery::Process() {
+bool CommandLatencyQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -293,7 +293,7 @@ class AsyncReadPixelsCompletedQuery
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -324,7 +324,7 @@ bool AsyncReadPixelsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
base::Bind(&AsyncReadPixelsCompletedQuery::Complete,
AsWeakPtr()));
- return Process();
+ return Process(false);
}
void AsyncReadPixelsCompletedQuery::Complete() {
@@ -332,7 +332,7 @@ void AsyncReadPixelsCompletedQuery::Complete() {
complete_result_ = MarkAsCompleted(1);
}
-bool AsyncReadPixelsCompletedQuery::Process() {
+bool AsyncReadPixelsCompletedQuery::Process(bool did_finish) {
return !completed_ || complete_result_;
}
@@ -353,7 +353,7 @@ class GetErrorQuery : public QueryManager::Query {
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -376,7 +376,7 @@ bool GetErrorQuery::End(base::subtle::Atomic32 submit_count) {
return MarkAsCompleted(manager()->decoder()->GetErrorState()->GetGLError());
}
-bool GetErrorQuery::Process() {
+bool GetErrorQuery::Process(bool did_finish) {
NOTREACHED();
return true;
}
@@ -400,7 +400,7 @@ class CommandsCompletedQuery : public QueryManager::Query {
// Overridden from QueryManager::Query:
bool Begin() override;
bool End(base::subtle::Atomic32 submit_count) override;
- bool Process() override;
+ bool Process(bool did_finish) override;
void Destroy(bool have_context) override;
protected:
@@ -424,9 +424,29 @@ bool CommandsCompletedQuery::End(base::subtle::Atomic32 submit_count) {
return AddToPendingQueue(submit_count);
}
-bool CommandsCompletedQuery::Process() {
- if (fence_ && !fence_->HasCompleted())
- return true;
+bool CommandsCompletedQuery::Process(bool did_finish) {
+ if (fence_) {
+ // Note: We expect fences to have passed after glFinish() has been called.
+ // The CHECKs below assist in diagnosing cases where this assumption is
+ // incorrect and help determine how harmful this error is.
+ if (did_finish) {
+ bool has_compleded_after_finish = fence_->HasCompleted();
+ base::TimeDelta client_wait_duration;
+ if (!has_compleded_after_finish) {
+ base::TimeTicks client_wait_start_time = base::TimeTicks::Now();
+ fence_->ClientWait();
+ client_wait_duration = base::TimeTicks::Now() - client_wait_start_time;
+ bool has_compleded_after_finish_and_client_wait =
+ fence_->HasCompleted();
+ CHECK(has_compleded_after_finish_and_client_wait) <<
+ "Client wait duration: " << client_wait_duration.InSeconds();
+ }
+ CHECK(has_compleded_after_finish) << "Client wait duration: " <<
+ client_wait_duration.InSeconds();
reveman 2014/11/06 23:51:15 Maybe as a follow up based on the result of this c
+ } else if (!fence_->HasCompleted()) {
+ return true;
+ }
+ }
return MarkAsCompleted(0);
}
@@ -635,10 +655,10 @@ bool QueryManager::Query::MarkAsCompleted(uint64 result) {
return true;
}
-bool QueryManager::ProcessPendingQueries() {
+bool QueryManager::ProcessPendingQueries(bool did_finish) {
while (!pending_queries_.empty()) {
Query* query = pending_queries_.front().get();
- if (!query->Process()) {
+ if (!query->Process(did_finish)) {
return false;
}
if (query->pending()) {
@@ -658,7 +678,7 @@ bool QueryManager::HavePendingQueries() {
bool QueryManager::ProcessPendingTransferQueries() {
while (!pending_transfer_queries_.empty()) {
Query* query = pending_transfer_queries_.front().get();
- if (!query->Process()) {
+ if (!query->Process(false)) {
return false;
}
if (query->pending()) {
« no previous file with comments | « gpu/command_buffer/service/query_manager.h ('k') | gpu/command_buffer/service/query_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698