Index: cc/resources/gpu_tile_task_worker_pool.cc |
diff --git a/cc/resources/gpu_tile_task_worker_pool.cc b/cc/resources/gpu_tile_task_worker_pool.cc |
index 824945740b97b0bbd049f8790c85e599733a58c3..c57d25a27de533214ba2656c00bbfad32d2f5553 100644 |
--- a/cc/resources/gpu_tile_task_worker_pool.cc |
+++ b/cc/resources/gpu_tile_task_worker_pool.cc |
@@ -7,6 +7,7 @@ |
#include <algorithm> |
#include "base/trace_event/trace_event.h" |
+#include "cc/resources/gpu_rasterizer.h" |
#include "cc/resources/raster_buffer.h" |
#include "cc/resources/raster_source.h" |
#include "cc/resources/resource.h" |
@@ -22,39 +23,64 @@ namespace { |
class RasterBufferImpl : public RasterBuffer { |
public: |
- RasterBufferImpl() {} |
+ RasterBufferImpl(GpuRasterizer* rasterizer, const Resource* resource) |
+ : rasterizer_(rasterizer), |
+ lock_(rasterizer->resource_provider(), resource->id()), |
+ resource_(resource) {} |
// Overridden from RasterBuffer: |
void Playback(const RasterSource* raster_source, |
const gfx::Rect& rect, |
float scale) override { |
- // Don't do anything. |
+ TRACE_EVENT0("cc", "RasterBufferImpl::Playback"); |
+ ContextProvider* context_provider = rasterizer_->resource_provider() |
+ ->output_surface() |
+ ->worker_context_provider(); |
+ |
+ // The context lock must be held while accessing the context on a |
+ // worker thread. |
+ base::AutoLock context_lock(*context_provider->GetLock()); |
+ |
+ // Allow this worker thread to bind to context_provider. |
+ context_provider->DetachFromThread(); |
+ |
+ // Rasterize source into resource. |
+ rasterizer_->RasterizeSource(true, &lock_, raster_source, rect, scale); |
+ |
+ // Barrier to sync worker context output to cc context. |
+ context_provider->ContextGL()->OrderingBarrierCHROMIUM(); |
+ |
+ // Allow compositor thread to bind to context_provider. |
+ context_provider->DetachFromThread(); |
} |
private: |
+ GpuRasterizer* rasterizer_; |
+ ResourceProvider::ScopedWriteLockGr lock_; |
+ const Resource* resource_; |
+ |
DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl); |
}; |
} // namespace |
+ |
// static |
scoped_ptr<TileTaskWorkerPool> GpuTileTaskWorkerPool::Create( |
base::SequencedTaskRunner* task_runner, |
TaskGraphRunner* task_graph_runner, |
- ResourceProvider* resource_provider) { |
+ GpuRasterizer* rasterizer) { |
return make_scoped_ptr<TileTaskWorkerPool>( |
- new GpuTileTaskWorkerPool( |
- task_runner, task_graph_runner, resource_provider)); |
+ new GpuTileTaskWorkerPool(task_runner, task_graph_runner, rasterizer)); |
} |
-// TODO(hendrikw): This class should be removed. See crbug.com/444938. |
GpuTileTaskWorkerPool::GpuTileTaskWorkerPool( |
base::SequencedTaskRunner* task_runner, |
TaskGraphRunner* task_graph_runner, |
- ResourceProvider* resource_provider) |
+ GpuRasterizer* rasterizer) |
: task_runner_(task_runner), |
task_graph_runner_(task_graph_runner), |
namespace_token_(task_graph_runner_->GetNamespaceToken()), |
- resource_provider_(resource_provider), |
+ rasterizer_(rasterizer), |
task_set_finished_weak_ptr_factory_(this), |
weak_ptr_factory_(this) { |
} |
@@ -129,6 +155,14 @@ void GpuTileTaskWorkerPool::ScheduleTasks(TileTaskQueue* queue) { |
} |
ScheduleTasksOnOriginThread(this, &graph_); |
+ |
+ // Barrier to sync any new resources to the worker context. |
+ rasterizer_->resource_provider() |
+ ->output_surface() |
+ ->context_provider() |
+ ->ContextGL() |
+ ->OrderingBarrierCHROMIUM(); |
+ |
task_graph_runner_->ScheduleTasks(namespace_token_, &graph_); |
std::copy(new_task_set_finished_tasks, |
@@ -146,7 +180,7 @@ void GpuTileTaskWorkerPool::CheckForCompletedTasks() { |
} |
ResourceFormat GpuTileTaskWorkerPool::GetResourceFormat() { |
- return resource_provider_->best_texture_format(); |
+ return rasterizer_->resource_provider()->best_texture_format(); |
} |
void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) { |
@@ -164,7 +198,8 @@ void GpuTileTaskWorkerPool::CompleteTasks(const Task::Vector& tasks) { |
scoped_ptr<RasterBuffer> GpuTileTaskWorkerPool::AcquireBufferForRaster( |
const Resource* resource) { |
- return make_scoped_ptr<RasterBuffer>(new RasterBufferImpl()); |
+ return make_scoped_ptr<RasterBuffer>( |
+ new RasterBufferImpl(rasterizer_, resource)); |
} |
void GpuTileTaskWorkerPool::ReleaseBufferForRaster( |