summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer')
-rw-r--r--gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc5
-rw-r--r--gpu/command_buffer/service/query_manager.cc104
-rw-r--r--gpu/command_buffer/service/query_manager.h32
4 files changed, 27 insertions, 119 deletions
diff --git a/gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h b/gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h
index b716e70..4f44f7a 100644
--- a/gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h
+++ b/gpu/command_buffer/service/async_pixel_transfer_delegate_mock.h
@@ -32,9 +32,8 @@ class MockAsyncPixelTransferDelegate : public gfx::AsyncPixelTransferDelegate {
// Implement AsyncPixelTransferDelegate.
MOCK_METHOD1(CreateRawPixelTransferState,
gfx::AsyncPixelTransferState*(GLuint service_id));
- MOCK_METHOD2(AsyncNotifyCompletion,
- void(const AsyncMemoryParams& mem_params,
- const CompletionCallback& callback));
+ MOCK_METHOD1(AsyncNotifyCompletion,
+ void(const base::Closure& task));
MOCK_METHOD3(AsyncTexImage2D,
void(gfx::AsyncPixelTransferState*,
const AsyncTexImage2DParams& tex_params,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index d756a2c..feb688c 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -2725,9 +2725,6 @@ bool GLES2DecoderImpl::MakeCurrent() {
return false;
}
- if (query_manager_.get())
- query_manager_->ProcessPendingTransferQueries();
-
// TODO(epenner): Is there a better place to do this? Transfers
// can complete any time we yield the main thread. So we *must*
// process transfers after any such yield, before resuming.
@@ -9125,8 +9122,6 @@ error::Error GLES2DecoderImpl::HandleEndQueryEXT(
return error::kOutOfBounds;
}
- query_manager_->ProcessPendingTransferQueries();
-
state_.current_query = NULL;
return error::kNoError;
}
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc
index cc4de7a..51055e2 100644
--- a/gpu/command_buffer/service/query_manager.cc
+++ b/gpu/command_buffer/service/query_manager.cc
@@ -3,15 +3,13 @@
// found in the LICENSE file.
#include "gpu/command_buffer/service/query_manager.h"
-
#include "base/atomicops.h"
#include "base/bind.h"
#include "base/logging.h"
-#include "base/shared_memory.h"
#include "base/time.h"
#include "gpu/command_buffer/common/gles2_cmd_format.h"
-#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+#include "gpu/command_buffer/service/feature_info.h"
#include "ui/gl/async_pixel_transfer_delegate.h"
namespace gpu {
@@ -178,20 +176,10 @@ class AsyncPixelTransfersCompletedQuery
virtual bool Process() OVERRIDE;
virtual void Destroy(bool have_context) OVERRIDE;
+ void MarkAsCompletedCallback() { MarkAsCompleted(1); }
+
protected:
virtual ~AsyncPixelTransfersCompletedQuery();
-
- static void MarkAsCompletedThreadSafe(
- uint32 submit_count, const gfx::AsyncMemoryParams& mem_params) {
- DCHECK(mem_params.shared_memory);
- DCHECK(mem_params.shared_memory->memory());
- void *data = static_cast<int8*>(mem_params.shared_memory->memory()) +
- mem_params.shm_data_offset;
- QuerySync* sync = static_cast<QuerySync*>(data);
-
- // No need for a MemoryBarrier here as sync->result is not written.
- sync->process_count = submit_count;
- }
};
AsyncPixelTransfersCompletedQuery::AsyncPixelTransfersCompletedQuery(
@@ -204,41 +192,28 @@ bool AsyncPixelTransfersCompletedQuery::Begin() {
}
bool AsyncPixelTransfersCompletedQuery::End(uint32 submit_count) {
- gfx::AsyncMemoryParams mem_params;
- // Get the real shared memory since it might need to be duped to prevent
- // use-after-free of the memory.
- Buffer buffer = manager()->decoder()->GetSharedMemoryBuffer(shm_id());
- if (!buffer.shared_memory)
- return false;
- mem_params.shared_memory = buffer.shared_memory;
- mem_params.shm_size = buffer.size;
- mem_params.shm_data_offset = shm_offset();
- mem_params.shm_data_size = sizeof(QuerySync);
-
- // Ask AsyncPixelTransferDelegate to run completion callback after all
- // previous async transfers are done. No guarantee that callback is run
- // on the current thread.
+ MarkAsPending(submit_count);
+
+ // This will call MarkAsCompleted(1) as a reply to a task on
+ // the async upload thread, such that it occurs after all previous
+ // async transfers have completed.
manager()->decoder()->GetAsyncPixelTransferDelegate()->AsyncNotifyCompletion(
- mem_params,
- base::Bind(AsyncPixelTransfersCompletedQuery::MarkAsCompletedThreadSafe,
- submit_count));
+ base::Bind(
+ &AsyncPixelTransfersCompletedQuery::MarkAsCompletedCallback,
+ AsWeakPtr()));
+
+ // TODO(epenner): The async task occurs outside the normal
+ // flow, via a callback on this thread. Is there anything
+ // missing or wrong with that?
- return AddToPendingTransferQueue(submit_count);
+ // TODO(epenner): Could we possibly trigger the completion on
+ // the upload thread by writing to the query shared memory
+ // directly?
+ return true;
}
bool AsyncPixelTransfersCompletedQuery::Process() {
- QuerySync* sync = manager()->decoder()->GetSharedMemoryAs<QuerySync*>(
- shm_id(), shm_offset(), sizeof(*sync));
- if (!sync)
- return false;
-
- // Check if completion callback has been run. sync->process_count atomicity
- // is guaranteed as this is already used to notify client of a completed
- // query.
- if (sync->process_count != submit_count())
- return true;
-
- UnmarkAsPending();
+ NOTREACHED();
return true;
}
@@ -460,7 +435,7 @@ bool QueryManager::ProcessPendingQueries() {
return false;
}
if (query->pending()) {
- break;
+ return true;
}
pending_queries_.pop_front();
}
@@ -472,25 +447,6 @@ bool QueryManager::HavePendingQueries() {
return !pending_queries_.empty();
}
-bool QueryManager::ProcessPendingTransferQueries() {
- while (!pending_transfer_queries_.empty()) {
- Query* query = pending_transfer_queries_.front().get();
- if (!query->Process()) {
- return false;
- }
- if (query->pending()) {
- break;
- }
- pending_transfer_queries_.pop_front();
- }
-
- return true;
-}
-
-bool QueryManager::HavePendingTransferQueries() {
- return !pending_transfer_queries_.empty();
-}
-
bool QueryManager::AddPendingQuery(Query* query, uint32 submit_count) {
DCHECK(query);
DCHECK(!query->IsDeleted());
@@ -502,17 +458,6 @@ bool QueryManager::AddPendingQuery(Query* query, uint32 submit_count) {
return true;
}
-bool QueryManager::AddPendingTransferQuery(Query* query, uint32 submit_count) {
- DCHECK(query);
- DCHECK(!query->IsDeleted());
- if (!RemovePendingQuery(query)) {
- return false;
- }
- query->MarkAsPending(submit_count);
- pending_transfer_queries_.push_back(query);
- return true;
-}
-
bool QueryManager::RemovePendingQuery(Query* query) {
DCHECK(query);
if (query->pending()) {
@@ -526,13 +471,6 @@ bool QueryManager::RemovePendingQuery(Query* query) {
break;
}
}
- for (QueryQueue::iterator it = pending_transfer_queries_.begin();
- it != pending_transfer_queries_.end(); ++it) {
- if (it->get() == query) {
- pending_transfer_queries_.erase(it);
- break;
- }
- }
if (!query->MarkAsCompleted(0)) {
return false;
}
diff --git a/gpu/command_buffer/service/query_manager.h b/gpu/command_buffer/service/query_manager.h
index bf083aa..322c03d 100644
--- a/gpu/command_buffer/service/query_manager.h
+++ b/gpu/command_buffer/service/query_manager.h
@@ -89,21 +89,11 @@ class GPU_EXPORT QueryManager {
submit_count_ = submit_count;
}
- void UnmarkAsPending() {
- DCHECK(pending_);
- pending_ = false;
- }
-
// Returns false if shared memory for sync is invalid.
bool AddToPendingQueue(uint32 submit_count) {
return manager_->AddPendingQuery(this, submit_count);
}
- // Returns false if shared memory for sync is invalid.
- bool AddToPendingTransferQueue(uint32 submit_count) {
- return manager_->AddPendingTransferQuery(this, submit_count);
- }
-
void BeginQueryHelper(GLenum target, GLuint id) {
manager_->BeginQueryHelper(target, id);
}
@@ -112,15 +102,15 @@ class GPU_EXPORT QueryManager {
manager_->EndQueryHelper(target);
}
- uint32 submit_count() const {
- return submit_count_;
- }
-
private:
friend class QueryManager;
friend class QueryManagerTest;
friend class base::RefCounted<Query>;
+ uint32 submit_count() const {
+ return submit_count_;
+ }
+
// The manager that owns this Query.
QueryManager* manager_;
@@ -172,13 +162,6 @@ class GPU_EXPORT QueryManager {
// True if there are pending queries.
bool HavePendingQueries();
- // Processes pending transfer queries. Returns false if any queries are
- // pointing to invalid shared memory.
- bool ProcessPendingTransferQueries();
-
- // True if there are pending transfer queries.
- bool HavePendingTransferQueries();
-
GLES2Decoder* decoder() const {
return decoder_;
}
@@ -196,10 +179,6 @@ class GPU_EXPORT QueryManager {
// Returns false if any query is pointing to invalid shared memory.
bool AddPendingQuery(Query* query, uint32 submit_count);
- // Adds to queue of transfer queries waiting for completion.
- // Returns false if any query is pointing to invalid shared memory.
- bool AddPendingTransferQuery(Query* query, uint32 submit_count);
-
// Removes a query from the queue of pending queries.
// Returns false if any query is pointing to invalid shared memory.
bool RemovePendingQuery(Query* query);
@@ -226,9 +205,6 @@ class GPU_EXPORT QueryManager {
typedef std::deque<Query::Ref> QueryQueue;
QueryQueue pending_queries_;
- // Async pixel transfer queries waiting for completion.
- QueryQueue pending_transfer_queries_;
-
DISALLOW_COPY_AND_ASSIGN(QueryManager);
};