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..5cd09d5464ad7228190a9d6b95dd88063ed742a3 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,45 +23,72 @@ 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"); |
+ |
+ // Rasterize source into resource. |
+ rasterizer_->RasterizeSource(true, &lock_, raster_source, rect, scale); |
+ |
+ // Barrier to sync worker context output to cc context. |
+ rasterizer_->resource_provider() |
+ ->output_surface() |
+ ->worker_context_provider() |
+ ->ContextGL() |
+ ->OrderingBarrierCHROMIUM(); |
} |
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. |
vmpstr
2015/02/11 19:00:52
Is this still true?
vmiura
2015/02/11 20:13:18
Removed comment.
|
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) { |
+ // Allow |worker_context_provider| to bind to the worker thread. |
+ rasterizer_->resource_provider() |
+ ->output_surface() |
+ ->worker_context_provider() |
+ ->DetachFromThread(); |
} |
GpuTileTaskWorkerPool::~GpuTileTaskWorkerPool() { |
DCHECK_EQ(0u, completed_tasks_.size()); |
+ // Allow |worker_context_provider| to bind to the cc thread. |
+ rasterizer_->resource_provider() |
+ ->output_surface() |
+ ->worker_context_provider() |
+ ->DetachFromThread(); |
} |
TileTaskRunner* GpuTileTaskWorkerPool::AsTileTaskRunner() { |
@@ -129,6 +157,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 +182,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 +200,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( |