summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreveman <reveman@chromium.org>2014-11-13 20:15:42 -0500
committerdhacker29 <dhackerdvm@gmail.com>2014-11-13 20:15:42 -0500
commitfaebc79552c8867295203c88d804c1f56c39114c (patch)
tree9dc0a7219ed4a784635c19a2694cf596c47e6434
parent95b575e111379b61fc35909663ef504301089ad0 (diff)
cc: Avoid issuing COMMANDS_COMPLETED queries unless necessary.
Minor change to the Fence API that allows GLRenderer to not issue sync queries unless some resource that depend on them was used to produce a frame. Also includes some minor renaming cleanup related to usage of Fences in ResourceProvider code. Change-Id: I45165a8f6a91b3ad56c5db02489ea83a782d6b05 Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=284318
-rw-r--r--cc/output/gl_renderer.cc50
-rw-r--r--cc/resources/image_raster_worker_pool.cc2
-rw-r--r--cc/resources/pixel_buffer_raster_worker_pool.cc2
-rw-r--r--cc/resources/resource_provider.cc27
-rw-r--r--cc/resources/resource_provider.h6
5 files changed, 65 insertions, 22 deletions
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index b58a4d19e0..9a51d808b0 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -63,9 +63,10 @@ namespace {
class FallbackFence : public ResourceProvider::Fence {
public:
explicit FallbackFence(gpu::gles2::GLES2Interface* gl)
- : gl_(gl), has_passed_(false) {}
+ : gl_(gl), has_passed_(true) {}
// Overridden from ResourceProvider::Fence:
+ virtual void Set() OVERRIDE { has_passed_ = false; }
virtual bool HasPassed() OVERRIDE {
if (!has_passed_) {
has_passed_ = true;
@@ -229,32 +230,60 @@ struct GLRenderer::PendingAsyncReadPixels {
class GLRenderer::SyncQuery {
public:
explicit SyncQuery(gpu::gles2::GLES2Interface* gl)
- : gl_(gl), query_id_(0u), weak_ptr_factory_(this) {
+ : gl_(gl), query_id_(0u), is_pending_(false), weak_ptr_factory_(this) {
gl_->GenQueriesEXT(1, &query_id_);
}
virtual ~SyncQuery() { gl_->DeleteQueriesEXT(1, &query_id_); }
scoped_refptr<ResourceProvider::Fence> Begin() {
- DCHECK(!weak_ptr_factory_.HasWeakPtrs() || !IsPending());
+ DCHECK(!IsPending());
// Invalidate weak pointer held by old fence.
weak_ptr_factory_.InvalidateWeakPtrs();
- gl_->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_);
+ // Note: In case the set of drawing commands issued before End() do not
+ // depend on the query, defer BeginQueryEXT call until Set() is called and
+ // query is required.
return make_scoped_refptr<ResourceProvider::Fence>(
new Fence(weak_ptr_factory_.GetWeakPtr()));
}
- void End() { gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM); }
+ void Set() {
+ if (is_pending_)
+ return;
+
+ // Note: BeginQueryEXT on GL_COMMANDS_COMPLETED_CHROMIUM is effectively a
+ // noop relative to GL, so it doesn't matter where it happens but we still
+ // make sure to issue this command when Set() is called (prior to issuing
+ // any drawing commands that depend on query), in case some future extension
+ // can take advantage of this.
+ gl_->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_);
+ is_pending_ = true;
+ }
+
+ void End() {
+ if (!is_pending_)
+ return;
+
+ gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
+ }
bool IsPending() {
- unsigned available = 1;
+ if (!is_pending_)
+ return false;
+
+ unsigned result_available = 1;
gl_->GetQueryObjectuivEXT(
- query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &available);
- return !available;
+ query_id_, GL_QUERY_RESULT_AVAILABLE_EXT, &result_available);
+ is_pending_ = !result_available;
+ return is_pending_;
}
void Wait() {
+ if (!is_pending_)
+ return;
+
unsigned result = 0;
gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result);
+ is_pending_ = false;
}
private:
@@ -264,6 +293,10 @@ class GLRenderer::SyncQuery {
: query_(query) {}
// Overridden from ResourceProvider::Fence:
+ virtual void Set() OVERRIDE {
+ DCHECK(query_);
+ query_->Set();
+ }
virtual bool HasPassed() OVERRIDE {
return !query_ || !query_->IsPending();
}
@@ -278,6 +311,7 @@ class GLRenderer::SyncQuery {
gpu::gles2::GLES2Interface* gl_;
unsigned query_id_;
+ bool is_pending_;
base::WeakPtrFactory<SyncQuery> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(SyncQuery);
diff --git a/cc/resources/image_raster_worker_pool.cc b/cc/resources/image_raster_worker_pool.cc
index 007c1ed83f..79cfe37e94 100644
--- a/cc/resources/image_raster_worker_pool.cc
+++ b/cc/resources/image_raster_worker_pool.cc
@@ -155,7 +155,7 @@ void ImageRasterWorkerPool::ReleaseCanvasForRaster(RasterTask* task) {
// Map/UnmapImageRasterBuffer provides direct access to the memory used by the
// GPU. Read lock fences are required to ensure that we're not trying to map a
// resource that is currently in-use by the GPU.
- resource_provider_->EnableReadLockFences(task->resource()->id(), true);
+ resource_provider_->EnableReadLockFences(task->resource()->id());
}
void ImageRasterWorkerPool::OnRasterFinished() {
diff --git a/cc/resources/pixel_buffer_raster_worker_pool.cc b/cc/resources/pixel_buffer_raster_worker_pool.cc
index cf18f7510b..860b1fcd08 100644
--- a/cc/resources/pixel_buffer_raster_worker_pool.cc
+++ b/cc/resources/pixel_buffer_raster_worker_pool.cc
@@ -406,7 +406,7 @@ void PixelBufferRasterWorkerPool::CheckForCompletedUploads() {
// Async set pixels commands are not necessarily processed in-sequence with
// drawing commands. Read lock fences are required to ensure that async
// commands don't access the resource while used for drawing.
- resource_provider_->EnableReadLockFences(task->resource()->id(), true);
+ resource_provider_->EnableReadLockFences(task->resource()->id());
DCHECK(std::find(completed_raster_tasks_.begin(),
completed_raster_tasks_.end(),
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index a3cded504a..ff1e65ae8f 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -197,6 +197,7 @@ class QueryFence : public ResourceProvider::Fence {
: gl_(gl), query_id_(query_id) {}
// Overridden from ResourceProvider::Fence:
+ virtual void Set() OVERRIDE {}
virtual bool HasPassed() OVERRIDE {
unsigned available = 1;
gl_->GetQueryObjectuivEXT(
@@ -232,7 +233,7 @@ ResourceProvider::Resource::Resource()
pending_set_pixels(false),
set_pixels_completion_forced(false),
allocated(false),
- enable_read_lock_fences(false),
+ read_lock_fences_enabled(false),
has_shared_bitmap_id(false),
allow_overlay(false),
read_lock_fence(NULL),
@@ -248,7 +249,8 @@ ResourceProvider::Resource::Resource()
hint(TextureUsageAny),
type(InvalidType),
format(RGBA_8888),
- shared_bitmap(NULL) {}
+ shared_bitmap(NULL) {
+}
ResourceProvider::Resource::~Resource() {}
@@ -277,7 +279,7 @@ ResourceProvider::Resource::Resource(GLuint texture_id,
pending_set_pixels(false),
set_pixels_completion_forced(false),
allocated(false),
- enable_read_lock_fences(false),
+ read_lock_fences_enabled(false),
has_shared_bitmap_id(false),
allow_overlay(false),
read_lock_fence(NULL),
@@ -320,7 +322,7 @@ ResourceProvider::Resource::Resource(uint8_t* pixels,
pending_set_pixels(false),
set_pixels_completion_forced(false),
allocated(false),
- enable_read_lock_fences(false),
+ read_lock_fences_enabled(false),
has_shared_bitmap_id(!!bitmap),
allow_overlay(false),
read_lock_fence(NULL),
@@ -364,7 +366,7 @@ ResourceProvider::Resource::Resource(const SharedBitmapId& bitmap_id,
pending_set_pixels(false),
set_pixels_completion_forced(false),
allocated(false),
- enable_read_lock_fences(false),
+ read_lock_fences_enabled(false),
has_shared_bitmap_id(true),
allow_overlay(false),
read_lock_fence(NULL),
@@ -1089,8 +1091,11 @@ const ResourceProvider::Resource* ResourceProvider::LockForRead(ResourceId id) {
}
resource->lock_for_read_count++;
- if (resource->enable_read_lock_fences)
+ if (resource->read_lock_fences_enabled) {
+ if (current_read_lock_fence_)
+ current_read_lock_fence_->Set();
resource->read_lock_fence = current_read_lock_fence_;
+ }
return resource;
}
@@ -1549,8 +1554,11 @@ void ResourceProvider::ReceiveReturnsFromParent(
// Need to wait for the current read lock fence to pass before we can
// recycle this resource.
- if (resource->enable_read_lock_fences)
+ if (resource->read_lock_fences_enabled) {
+ if (current_read_lock_fence_)
+ current_read_lock_fence_->Set();
resource->read_lock_fence = current_read_lock_fence_;
+ }
if (returned.sync_point) {
DCHECK(!resource->has_shared_bitmap_id);
@@ -2129,10 +2137,9 @@ void ResourceProvider::BindImageForSampling(Resource* resource) {
resource->dirty_image = false;
}
-void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id,
- bool enable) {
+void ResourceProvider::EnableReadLockFences(ResourceProvider::ResourceId id) {
Resource* resource = GetResource(id);
- resource->enable_read_lock_fences = enable;
+ resource->read_lock_fences_enabled = true;
}
void ResourceProvider::AcquireImage(Resource* resource) {
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index 1d991e2b14..cd634483f4 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -309,6 +309,8 @@ class CC_EXPORT ResourceProvider {
class Fence : public base::RefCounted<Fence> {
public:
Fence() {}
+
+ virtual void Set() = 0;
virtual bool HasPassed() = 0;
protected:
@@ -364,7 +366,7 @@ class CC_EXPORT ResourceProvider {
void SetReadLockFence(Fence* fence) { current_read_lock_fence_ = fence; }
// Enable read lock fences for a specific resource.
- void EnableReadLockFences(ResourceProvider::ResourceId id, bool enable);
+ void EnableReadLockFences(ResourceProvider::ResourceId id);
// Indicates if we can currently lock this resource for write.
bool CanLockForWrite(ResourceId id);
@@ -426,7 +428,7 @@ class CC_EXPORT ResourceProvider {
bool pending_set_pixels : 1;
bool set_pixels_completion_forced : 1;
bool allocated : 1;
- bool enable_read_lock_fences : 1;
+ bool read_lock_fences_enabled : 1;
bool has_shared_bitmap_id : 1;
bool allow_overlay : 1;
scoped_refptr<Fence> read_lock_fence;