Revert of cc: Add mailbox support to ResourceProvider write locks. (patchset #5 id:70001 of https://codereview.chromium.org/2081883002/ )
Reason for revert:
Causing canvas crashes - bug 623101
Original issue's description:
> Reland of cc: Add mailbox support to ResourceProvider write locks. (patchset #24 id:460001 of https://codereview.chromium.org/1951193002/ )
>
> Original issue's description:
> > cc: Add mailbox support to ResourceProvider write locks.
> >
> > This adds support for mailboxes to ScopedWriteLockGL. Using the mailbox
> > requires using ScopedTextureProvider/ScopedSkSurfaceProvider which
> > ensures that the texture id for the mailbox is destroyed after use on
> > the worker context.
> >
> > This CL also includes the following cleanup:
> > 1. ResourceProvider locks don't keep resource pointers around.
> > 2. ScopedSamplerGL does not inherit from ScopedReadLockGL.
> > 3. GpuRasterizer is folded back into GpuRasterBufferProvider.
> > 4. TileTaskManager does not own RasterBufferProvider.
> >
> > BUG=525259
> > R=piman@chromium.org
> > CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
> >
> > Committed: https://crrev.com/5fa5dbdf25bbec21b84f752d3f0642cd184467e2
> > Committed: https://crrev.com/3b0f0b8d3db0a9f66864d5b7da87c82f49e74a29
> > Cr-Original-Commit-Position: refs/heads/master@{#398204}
> > Cr-Commit-Position: refs/heads/master@{#399983}
>
> R=piman@chromium.org
> BUG=525259, 621422, 621130
> CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
>
> Committed: https://crrev.com/b3071e4aabd0cb1f29cd624e77eb5f40722be965
> Cr-Commit-Position: refs/heads/master@{#401717}
TBR=piman@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=525259, 621422, 621130
Review-Url: https://codereview.chromium.org/2106503002
Cr-Commit-Position: refs/heads/master@{#402290}
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 2064895..171182b 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -358,6 +358,8 @@
"raster/bitmap_raster_buffer_provider.h",
"raster/gpu_raster_buffer_provider.cc",
"raster/gpu_raster_buffer_provider.h",
+ "raster/gpu_rasterizer.cc",
+ "raster/gpu_rasterizer.h",
"raster/one_copy_raster_buffer_provider.cc",
"raster/one_copy_raster_buffer_provider.h",
"raster/raster_buffer.cc",
diff --git a/cc/cc.gyp b/cc/cc.gyp
index fe365781..9d3a099 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -419,6 +419,8 @@
'raster/bitmap_raster_buffer_provider.h',
'raster/gpu_raster_buffer_provider.cc',
'raster/gpu_raster_buffer_provider.h',
+ 'raster/gpu_rasterizer.cc',
+ 'raster/gpu_rasterizer.h',
'raster/one_copy_raster_buffer_provider.cc',
'raster/one_copy_raster_buffer_provider.h',
'raster/raster_buffer.cc',
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc
index 1f52d92..38f6119 100644
--- a/cc/output/gl_renderer.cc
+++ b/cc/output/gl_renderer.cc
@@ -596,8 +596,8 @@
GrGLTextureInfo texture_info;
texture_info.fTarget = lock.target();
texture_info.fID = lock.texture_id();
- backend_texture_description.fWidth = lock.size().width();
- backend_texture_description.fHeight = lock.size().height();
+ backend_texture_description.fWidth = lock.texture_size().width();
+ backend_texture_description.fHeight = lock.texture_size().height();
backend_texture_description.fConfig = kSkia8888_GrPixelConfig;
backend_texture_description.fTextureHandle =
skia::GrGLTextureInfoToGrBackendObject(texture_info);
@@ -831,8 +831,8 @@
bounding_rect.size(), ResourceProvider::TEXTURE_HINT_DEFAULT,
resource_provider_->best_texture_format());
{
- ResourceProvider::ScopedWriteLockGL lock(
- resource_provider_, device_background_texture->id(), false);
+ ResourceProvider::ScopedWriteLockGL lock(resource_provider_,
+ device_background_texture->id());
GetFramebufferTexture(lock.texture_id(), bounding_rect);
}
return device_background_texture;
@@ -2505,7 +2505,7 @@
uv_transform = UVTransform(quad);
if (sampler == SAMPLER_TYPE_2D_RECT) {
// Un-normalize the texture coordiantes for rectangle targets.
- gfx::Size texture_size = lock.size();
+ gfx::Size texture_size = lock.texture_size();
uv_transform.data[0] *= texture_size.width();
uv_transform.data[2] *= texture_size.width();
uv_transform.data[1] *= texture_size.height();
@@ -3057,7 +3057,7 @@
gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_);
current_framebuffer_lock_ =
base::WrapUnique(new ResourceProvider::ScopedWriteLockGL(
- resource_provider_, texture->id(), false));
+ resource_provider_, texture->id()));
current_framebuffer_format_ = texture->format();
unsigned texture_id = current_framebuffer_lock_->texture_id();
gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index 12fb55a1..6e5b4c4 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -12,6 +12,7 @@
#include "base/memory/ptr_util.h"
#include "base/trace_event/trace_event.h"
#include "cc/playback/raster_source.h"
+#include "cc/raster/gpu_rasterizer.h"
#include "cc/raster/scoped_gpu_raster.h"
#include "cc/resources/resource.h"
#include "gpu/command_buffer/client/gles2_interface.h"
@@ -23,121 +24,89 @@
namespace cc {
namespace {
-static sk_sp<SkPicture> PlaybackToPicture(
- const RasterSource* raster_source,
- bool resource_has_previous_content,
- const gfx::Size& resource_size,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) {
- // GPU raster doesn't do low res tiles, so should always include images.
- DCHECK(!playback_settings.skip_images);
-
- gfx::Rect playback_rect = raster_full_rect;
- if (resource_has_previous_content) {
- playback_rect.Intersect(raster_dirty_rect);
+class RasterBufferImpl : public RasterBuffer {
+ public:
+ RasterBufferImpl(GpuRasterizer* rasterizer,
+ const Resource* resource,
+ uint64_t resource_content_id,
+ uint64_t previous_content_id)
+ : rasterizer_(rasterizer),
+ lock_(rasterizer->resource_provider(), resource->id()),
+ resource_has_previous_content_(
+ resource_content_id && resource_content_id == previous_content_id) {
}
- DCHECK(!playback_rect.IsEmpty())
- << "Why are we rastering a tile that's not dirty?";
- // Play back raster_source into temp SkPicture.
- SkPictureRecorder recorder;
- const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag;
- sk_sp<SkCanvas> canvas = sk_ref_sp(recorder.beginRecording(
- resource_size.width(), resource_size.height(), NULL, flags));
- canvas->save();
- raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect,
- scale, playback_settings);
- canvas->restore();
- return recorder.finishRecordingAsPicture();
-}
+ // Overridden from RasterBuffer:
+ void Playback(
+ const RasterSource* raster_source,
+ const gfx::Rect& raster_full_rect,
+ const gfx::Rect& raster_dirty_rect,
+ uint64_t new_content_id,
+ float scale,
+ const RasterSource::PlaybackSettings& playback_settings) override {
+ TRACE_EVENT0("cc", "GpuRasterBuffer::Playback");
+ // GPU raster doesn't do low res tiles, so should always include images.
+ DCHECK(!playback_settings.skip_images);
-static void RasterizePicture(SkPicture* picture,
- ContextProvider* context_provider,
- ResourceProvider::ScopedWriteLockGL* resource_lock,
- bool async_worker_context_enabled,
- bool use_distance_field_text,
- bool can_use_lcd_text,
- int msaa_sample_count) {
- ScopedGpuRaster gpu_raster(context_provider);
+ ContextProvider::ScopedContextLock scoped_context(
+ rasterizer_->worker_context_provider());
- ResourceProvider::ScopedSkSurfaceProvider scoped_surface(
- context_provider, resource_lock, async_worker_context_enabled,
- use_distance_field_text, can_use_lcd_text, msaa_sample_count);
- SkSurface* sk_surface = scoped_surface.sk_surface();
- // Allocating an SkSurface will fail after a lost context. Pretend we
- // rasterized, as the contents of the resource don't matter anymore.
- if (!sk_surface)
- return;
+ gfx::Rect playback_rect = raster_full_rect;
+ if (resource_has_previous_content_) {
+ playback_rect.Intersect(raster_dirty_rect);
+ }
+ DCHECK(!playback_rect.IsEmpty())
+ << "Why are we rastering a tile that's not dirty?";
- SkMultiPictureDraw multi_picture_draw;
- multi_picture_draw.add(sk_surface->getCanvas(), picture);
- multi_picture_draw.draw(false);
-}
+ // TODO(danakj): Implement partial raster with raster_dirty_rect.
+ // Rasterize source into resource.
+ rasterizer_->RasterizeSource(&lock_, raster_source, raster_full_rect,
+ playback_rect, scale, playback_settings);
+
+ gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
+ const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
+
+ // Barrier to sync worker context output to cc context.
+ gl->OrderingBarrierCHROMIUM();
+
+ // Generate sync token after the barrier for cross context synchronization.
+ gpu::SyncToken sync_token;
+ gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
+ lock_.UpdateResourceSyncToken(sync_token);
+ }
+
+ private:
+ GpuRasterizer* rasterizer_;
+ ResourceProvider::ScopedWriteLockGr lock_;
+ bool resource_has_previous_content_;
+
+ DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
+};
} // namespace
-GpuRasterBufferProvider::RasterBufferImpl::RasterBufferImpl(
- GpuRasterBufferProvider* client,
- ResourceProvider* resource_provider,
- ResourceId resource_id,
- bool async_worker_context_enabled,
- bool resource_has_previous_content)
- : client_(client),
- lock_(resource_provider, resource_id, async_worker_context_enabled),
- resource_has_previous_content_(resource_has_previous_content) {
- client_->pending_raster_buffers_.insert(this);
-}
-
-GpuRasterBufferProvider::RasterBufferImpl::~RasterBufferImpl() {
- client_->pending_raster_buffers_.erase(this);
-}
-
-void GpuRasterBufferProvider::RasterBufferImpl::Playback(
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) {
- TRACE_EVENT0("cc", "GpuRasterBuffer::Playback");
- client_->PlaybackOnWorkerThread(&lock_, sync_token_,
- resource_has_previous_content_, raster_source,
- raster_full_rect, raster_dirty_rect,
- new_content_id, scale, playback_settings);
-}
-
GpuRasterBufferProvider::GpuRasterBufferProvider(
ContextProvider* compositor_context_provider,
ContextProvider* worker_context_provider,
ResourceProvider* resource_provider,
bool use_distance_field_text,
- int gpu_rasterization_msaa_sample_count,
- bool async_worker_context_enabled)
+ int gpu_rasterization_msaa_sample_count)
: compositor_context_provider_(compositor_context_provider),
- worker_context_provider_(worker_context_provider),
- resource_provider_(resource_provider),
- use_distance_field_text_(use_distance_field_text),
- msaa_sample_count_(gpu_rasterization_msaa_sample_count),
- async_worker_context_enabled_(async_worker_context_enabled) {
- DCHECK(compositor_context_provider);
- DCHECK(worker_context_provider);
+ rasterizer_(new GpuRasterizer(worker_context_provider,
+ resource_provider,
+ use_distance_field_text,
+ gpu_rasterization_msaa_sample_count)) {
+ DCHECK(compositor_context_provider_);
}
-GpuRasterBufferProvider::~GpuRasterBufferProvider() {
- DCHECK(pending_raster_buffers_.empty());
-}
+GpuRasterBufferProvider::~GpuRasterBufferProvider() {}
std::unique_ptr<RasterBuffer> GpuRasterBufferProvider::AcquireBufferForRaster(
const Resource* resource,
uint64_t resource_content_id,
uint64_t previous_content_id) {
- bool resource_has_previous_content =
- resource_content_id && resource_content_id == previous_content_id;
- return base::WrapUnique(new RasterBufferImpl(
- this, resource_provider_, resource->id(), async_worker_context_enabled_,
- resource_has_previous_content));
+ return std::unique_ptr<RasterBuffer>(new RasterBufferImpl(
+ rasterizer_.get(), resource, resource_content_id, previous_content_id));
}
void GpuRasterBufferProvider::ReleaseBufferForRaster(
@@ -147,29 +116,12 @@
void GpuRasterBufferProvider::OrderingBarrier() {
TRACE_EVENT0("cc", "GpuRasterBufferProvider::OrderingBarrier");
-
- gpu::gles2::GLES2Interface* gl = compositor_context_provider_->ContextGL();
- if (async_worker_context_enabled_) {
- GLuint64 fence = gl->InsertFenceSyncCHROMIUM();
- gl->OrderingBarrierCHROMIUM();
-
- gpu::SyncToken sync_token;
- gl->GenUnverifiedSyncTokenCHROMIUM(fence, sync_token.GetData());
-
- DCHECK(sync_token.HasData() ||
- gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR);
-
- for (RasterBufferImpl* buffer : pending_raster_buffers_)
- buffer->set_sync_token(sync_token);
- } else {
- gl->OrderingBarrierCHROMIUM();
- }
- pending_raster_buffers_.clear();
+ compositor_context_provider_->ContextGL()->OrderingBarrierCHROMIUM();
}
ResourceFormat GpuRasterBufferProvider::GetResourceFormat(
bool must_support_alpha) const {
- return resource_provider_->best_render_buffer_format();
+ return rasterizer_->resource_provider()->best_render_buffer_format();
}
bool GpuRasterBufferProvider::GetResourceRequiresSwizzle(
@@ -178,56 +130,6 @@
return false;
}
-void GpuRasterBufferProvider::Shutdown() {
- pending_raster_buffers_.clear();
-}
-
-void GpuRasterBufferProvider::PlaybackOnWorkerThread(
- ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
- bool resource_has_previous_content,
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) {
- ContextProvider::ScopedContextLock scoped_context(worker_context_provider_);
- gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
-
- if (async_worker_context_enabled_) {
- // Early out if sync token is invalid. This happens if the compositor
- // context was lost before ScheduleTasks was called.
- if (!sync_token.HasData())
- return;
- // Synchronize with compositor.
- gl->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
- }
-
- sk_sp<SkPicture> picture = PlaybackToPicture(
- raster_source, resource_has_previous_content, resource_lock->size(),
- raster_full_rect, raster_dirty_rect, scale, playback_settings);
-
- // Turn on distance fields for layers that have ever animated.
- bool use_distance_field_text =
- use_distance_field_text_ ||
- raster_source->ShouldAttemptToUseDistanceFieldText();
-
- RasterizePicture(picture.get(), worker_context_provider_, resource_lock,
- async_worker_context_enabled_, use_distance_field_text,
- raster_source->CanUseLCDText(), msaa_sample_count_);
-
- const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
-
- // Barrier to sync worker context output to cc context.
- gl->OrderingBarrierCHROMIUM();
-
- // Generate sync token after the barrier for cross context synchronization.
- gpu::SyncToken resource_sync_token;
- gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, resource_sync_token.GetData());
- resource_lock->set_sync_token(resource_sync_token);
- resource_lock->set_synchronized(!async_worker_context_enabled_);
-}
+void GpuRasterBufferProvider::Shutdown() {}
} // namespace cc
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h
index ef69754..b6aea83 100644
--- a/cc/raster/gpu_raster_buffer_provider.h
+++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -9,11 +9,11 @@
#include "base/macros.h"
#include "cc/raster/raster_buffer_provider.h"
-#include "cc/resources/resource_provider.h"
-#include "gpu/command_buffer/common/sync_token.h"
namespace cc {
class ContextProvider;
+class GpuRasterizer;
+class ResourceProvider;
class CC_EXPORT GpuRasterBufferProvider : public RasterBufferProvider {
public:
@@ -21,8 +21,7 @@
ContextProvider* worker_context_provider,
ResourceProvider* resource_provider,
bool use_distance_field_text,
- int gpu_rasterization_msaa_sample_count,
- bool async_worker_context_enabled);
+ int gpu_rasterization_msaa_sample_count);
~GpuRasterBufferProvider() override;
// Overridden from RasterBufferProvider:
@@ -36,58 +35,9 @@
bool GetResourceRequiresSwizzle(bool must_support_alpha) const override;
void Shutdown() override;
- void PlaybackOnWorkerThread(
- ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
- bool resource_has_previous_content,
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings);
-
private:
- class RasterBufferImpl : public RasterBuffer {
- public:
- RasterBufferImpl(GpuRasterBufferProvider* client,
- ResourceProvider* resource_provider,
- ResourceId resource_id,
- bool async_worker_context_enabled,
- bool resource_has_previous_content);
- ~RasterBufferImpl() override;
-
- // Overridden from RasterBuffer:
- void Playback(
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) override;
-
- void set_sync_token(const gpu::SyncToken& sync_token) {
- sync_token_ = sync_token;
- }
-
- private:
- GpuRasterBufferProvider* const client_;
- ResourceProvider::ScopedWriteLockGL lock_;
- const bool resource_has_previous_content_;
-
- gpu::SyncToken sync_token_;
-
- DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
- };
-
ContextProvider* const compositor_context_provider_;
- ContextProvider* const worker_context_provider_;
- ResourceProvider* const resource_provider_;
- const bool use_distance_field_text_;
- const int msaa_sample_count_;
- const bool async_worker_context_enabled_;
-
- std::set<RasterBufferImpl*> pending_raster_buffers_;
+ std::unique_ptr<GpuRasterizer> rasterizer_;
DISALLOW_COPY_AND_ASSIGN(GpuRasterBufferProvider);
};
diff --git a/cc/raster/gpu_rasterizer.cc b/cc/raster/gpu_rasterizer.cc
new file mode 100644
index 0000000..0d08507e
--- /dev/null
+++ b/cc/raster/gpu_rasterizer.cc
@@ -0,0 +1,86 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/raster/gpu_rasterizer.h"
+
+#include <algorithm>
+
+#include "base/bind.h"
+#include "base/metrics/histogram.h"
+#include "base/trace_event/trace_event.h"
+#include "cc/debug/devtools_instrumentation.h"
+#include "cc/debug/frame_viewer_instrumentation.h"
+#include "cc/output/context_provider.h"
+#include "cc/playback/raster_source.h"
+#include "cc/raster/raster_buffer.h"
+#include "cc/raster/scoped_gpu_raster.h"
+#include "cc/resources/resource.h"
+#include "cc/tiles/tile_manager.h"
+#include "gpu/command_buffer/client/gles2_interface.h"
+#include "third_party/skia/include/core/SkMultiPictureDraw.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
+#include "third_party/skia/include/core/SkSurface.h"
+#include "third_party/skia/include/gpu/GrContext.h"
+
+namespace cc {
+
+GpuRasterizer::GpuRasterizer(ContextProvider* worker_context_provider,
+ ResourceProvider* resource_provider,
+ bool use_distance_field_text,
+ int msaa_sample_count)
+ : worker_context_provider_(worker_context_provider),
+ resource_provider_(resource_provider),
+ use_distance_field_text_(use_distance_field_text),
+ msaa_sample_count_(msaa_sample_count) {
+ DCHECK(worker_context_provider_);
+}
+
+GpuRasterizer::~GpuRasterizer() {}
+
+void GpuRasterizer::RasterizeSource(
+ ResourceProvider::ScopedWriteLockGr* write_lock,
+ const RasterSource* raster_source,
+ const gfx::Rect& raster_full_rect,
+ const gfx::Rect& playback_rect,
+ float scale,
+ const RasterSource::PlaybackSettings& playback_settings) {
+ // Play back raster_source into temp SkPicture.
+ SkPictureRecorder recorder;
+ const gfx::Size size = write_lock->GetResourceSize();
+ const int flags = SkPictureRecorder::kComputeSaveLayerInfo_RecordFlag;
+ sk_sp<SkCanvas> canvas = sk_ref_sp(
+ recorder.beginRecording(size.width(), size.height(), NULL, flags));
+ canvas->save();
+ raster_source->PlaybackToCanvas(canvas.get(), raster_full_rect, playback_rect,
+ scale, playback_settings);
+ canvas->restore();
+ sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
+
+ // Turn on distance fields for layers that have ever animated.
+ bool use_distance_field_text =
+ use_distance_field_text_ ||
+ raster_source->ShouldAttemptToUseDistanceFieldText();
+
+ // Playback picture into resource.
+ {
+ ScopedGpuRaster gpu_raster(worker_context_provider_);
+ write_lock->InitSkSurface(
+ worker_context_provider_->GrContext(), use_distance_field_text,
+ raster_source->CanUseLCDText(), msaa_sample_count_);
+
+ SkSurface* sk_surface = write_lock->sk_surface();
+
+ // Allocating an SkSurface will fail after a lost context. Pretend we
+ // rasterized, as the contents of the resource don't matter anymore.
+ if (!sk_surface)
+ return;
+
+ SkMultiPictureDraw multi_picture_draw;
+ multi_picture_draw.add(sk_surface->getCanvas(), picture.get());
+ multi_picture_draw.draw(false);
+ write_lock->ReleaseSkSurface();
+ }
+}
+
+} // namespace cc
diff --git a/cc/raster/gpu_rasterizer.h b/cc/raster/gpu_rasterizer.h
new file mode 100644
index 0000000..592dea7
--- /dev/null
+++ b/cc/raster/gpu_rasterizer.h
@@ -0,0 +1,57 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_RASTER_GPU_RASTERIZER_H_
+#define CC_RASTER_GPU_RASTERIZER_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "cc/base/cc_export.h"
+#include "cc/playback/raster_source.h"
+#include "cc/resources/resource_pool.h"
+#include "cc/tiles/tile.h"
+#include "third_party/skia/include/core/SkMultiPictureDraw.h"
+
+namespace cc {
+
+class ContextProvider;
+class RasterSource;
+class ResourceProvider;
+
+class CC_EXPORT GpuRasterizer {
+ public:
+ ~GpuRasterizer();
+
+ void RasterizeSource(ResourceProvider::ScopedWriteLockGr* write_lock,
+ const RasterSource* raster_source,
+ const gfx::Rect& raster_full_rect,
+ const gfx::Rect& playback_rect,
+ float scale,
+ const RasterSource::PlaybackSettings& playback_settings);
+
+ ResourceProvider* resource_provider() const { return resource_provider_; }
+ ContextProvider* worker_context_provider() const {
+ return worker_context_provider_;
+ }
+
+ private:
+ GpuRasterizer(ContextProvider* worker_context_provider,
+ ResourceProvider* resource_provider,
+ bool use_distance_filed_text,
+ int msaa_sample_count);
+
+ ContextProvider* worker_context_provider_;
+ ResourceProvider* resource_provider_;
+
+ bool use_distance_field_text_;
+ int msaa_sample_count_;
+
+ friend class GpuRasterBufferProvider;
+ DISALLOW_COPY_AND_ASSIGN(GpuRasterizer);
+};
+
+} // namespace cc
+
+#endif // CC_RASTER_GPU_RASTERIZER_H_
diff --git a/cc/raster/one_copy_raster_buffer_provider.cc b/cc/raster/one_copy_raster_buffer_provider.cc
index 3c7d066..f0f95ae 100644
--- a/cc/raster/one_copy_raster_buffer_provider.cc
+++ b/cc/raster/one_copy_raster_buffer_provider.cc
@@ -24,43 +24,49 @@
namespace cc {
namespace {
+class RasterBufferImpl : public RasterBuffer {
+ public:
+ RasterBufferImpl(OneCopyRasterBufferProvider* worker_pool,
+ ResourceProvider* resource_provider,
+ ResourceFormat resource_format,
+ const Resource* resource,
+ uint64_t previous_content_id)
+ : worker_pool_(worker_pool),
+ resource_(resource),
+ lock_(resource_provider, resource->id()),
+ previous_content_id_(previous_content_id) {}
+
+ ~RasterBufferImpl() override {}
+
+ // Overridden from RasterBuffer:
+ void Playback(
+ const RasterSource* raster_source,
+ const gfx::Rect& raster_full_rect,
+ const gfx::Rect& raster_dirty_rect,
+ uint64_t new_content_id,
+ float scale,
+ const RasterSource::PlaybackSettings& playback_settings) override {
+ TRACE_EVENT0("cc", "OneCopyRasterBuffer::Playback");
+ worker_pool_->PlaybackAndCopyOnWorkerThread(
+ resource_, &lock_, raster_source, raster_full_rect, raster_dirty_rect,
+ scale, playback_settings, previous_content_id_, new_content_id);
+ }
+
+ private:
+ OneCopyRasterBufferProvider* worker_pool_;
+ const Resource* resource_;
+ ResourceProvider::ScopedWriteLockGL lock_;
+ uint64_t previous_content_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
+};
+
// 4MiB is the size of 4 512x512 tiles, which has proven to be a good
// default batch size for copy operations.
const int kMaxBytesPerCopyOperation = 1024 * 1024 * 4;
} // namespace
-OneCopyRasterBufferProvider::RasterBufferImpl::RasterBufferImpl(
- OneCopyRasterBufferProvider* client,
- ResourceProvider* resource_provider,
- const Resource* resource,
- uint64_t previous_content_id,
- bool async_worker_context_enabled)
- : client_(client),
- resource_(resource),
- lock_(resource_provider, resource->id(), async_worker_context_enabled),
- previous_content_id_(previous_content_id) {
- client_->pending_raster_buffers_.insert(this);
-}
-
-OneCopyRasterBufferProvider::RasterBufferImpl::~RasterBufferImpl() {
- client_->pending_raster_buffers_.erase(this);
-}
-
-void OneCopyRasterBufferProvider::RasterBufferImpl::Playback(
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) {
- TRACE_EVENT0("cc", "OneCopyRasterBuffer::Playback");
- client_->PlaybackAndCopyOnWorkerThread(
- resource_, &lock_, sync_token_, raster_source, raster_full_rect,
- raster_dirty_rect, scale, playback_settings, previous_content_id_,
- new_content_id);
-}
-
OneCopyRasterBufferProvider::OneCopyRasterBufferProvider(
base::SequencedTaskRunner* task_runner,
ContextProvider* compositor_context_provider,
@@ -69,8 +75,7 @@
int max_copy_texture_chromium_size,
bool use_partial_raster,
int max_staging_buffer_usage_in_bytes,
- ResourceFormat preferred_tile_format,
- bool async_worker_context_enabled)
+ ResourceFormat preferred_tile_format)
: compositor_context_provider_(compositor_context_provider),
worker_context_provider_(worker_context_provider),
resource_provider_(resource_provider),
@@ -86,15 +91,12 @@
worker_context_provider,
resource_provider,
use_partial_raster,
- max_staging_buffer_usage_in_bytes),
- async_worker_context_enabled_(async_worker_context_enabled) {
- DCHECK(compositor_context_provider);
+ max_staging_buffer_usage_in_bytes) {
+ DCHECK(compositor_context_provider_);
DCHECK(worker_context_provider);
}
-OneCopyRasterBufferProvider::~OneCopyRasterBufferProvider() {
- DCHECK(pending_raster_buffers_.empty());
-}
+OneCopyRasterBufferProvider::~OneCopyRasterBufferProvider() {}
std::unique_ptr<RasterBuffer>
OneCopyRasterBufferProvider::AcquireBufferForRaster(
@@ -103,9 +105,9 @@
uint64_t previous_content_id) {
// TODO(danakj): If resource_content_id != 0, we only need to copy/upload
// the dirty rect.
- return base::WrapUnique(new RasterBufferImpl(this, resource_provider_,
- resource, previous_content_id,
- async_worker_context_enabled_));
+ return base::WrapUnique<RasterBuffer>(
+ new RasterBufferImpl(this, resource_provider_, resource->format(),
+ resource, previous_content_id));
}
void OneCopyRasterBufferProvider::ReleaseBufferForRaster(
@@ -115,24 +117,7 @@
void OneCopyRasterBufferProvider::OrderingBarrier() {
TRACE_EVENT0("cc", "OneCopyRasterBufferProvider::OrderingBarrier");
-
- gpu::gles2::GLES2Interface* gl = compositor_context_provider_->ContextGL();
- if (async_worker_context_enabled_) {
- GLuint64 fence = gl->InsertFenceSyncCHROMIUM();
- gl->OrderingBarrierCHROMIUM();
-
- gpu::SyncToken sync_token;
- gl->GenUnverifiedSyncTokenCHROMIUM(fence, sync_token.GetData());
-
- DCHECK(sync_token.HasData() ||
- gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR);
-
- for (RasterBufferImpl* buffer : pending_raster_buffers_)
- buffer->set_sync_token(sync_token);
- } else {
- gl->OrderingBarrierCHROMIUM();
- }
- pending_raster_buffers_.clear();
+ compositor_context_provider_->ContextGL()->OrderingBarrierCHROMIUM();
}
ResourceFormat OneCopyRasterBufferProvider::GetResourceFormat(
@@ -153,13 +138,11 @@
void OneCopyRasterBufferProvider::Shutdown() {
staging_pool_.Shutdown();
- pending_raster_buffers_.clear();
}
void OneCopyRasterBufferProvider::PlaybackAndCopyOnWorkerThread(
const Resource* resource,
ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
const RasterSource* raster_source,
const gfx::Rect& raster_full_rect,
const gfx::Rect& raster_dirty_rect,
@@ -167,18 +150,6 @@
const RasterSource::PlaybackSettings& playback_settings,
uint64_t previous_content_id,
uint64_t new_content_id) {
- if (async_worker_context_enabled_) {
- // Early out if sync token is invalid. This happens if the compositor
- // context was lost before ScheduleTasks was called.
- if (!sync_token.HasData())
- return;
- ContextProvider::ScopedContextLock scoped_context(worker_context_provider_);
- gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
- // Synchronize with compositor.
- gl->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
- }
-
std::unique_ptr<StagingBuffer> staging_buffer =
staging_pool_.AcquireStagingBuffer(resource, previous_content_id);
@@ -187,7 +158,7 @@
playback_settings, previous_content_id,
new_content_id);
- CopyOnWorkerThread(staging_buffer.get(), resource_lock, sync_token,
+ CopyOnWorkerThread(staging_buffer.get(), resource, resource_lock,
raster_source, previous_content_id, new_content_id);
staging_pool_.ReleaseStagingBuffer(std::move(staging_buffer));
@@ -246,118 +217,117 @@
void OneCopyRasterBufferProvider::CopyOnWorkerThread(
StagingBuffer* staging_buffer,
+ const Resource* resource,
ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
const RasterSource* raster_source,
uint64_t previous_content_id,
uint64_t new_content_id) {
- ContextProvider::ScopedContextLock scoped_context(worker_context_provider_);
- gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
- DCHECK(gl);
+ {
+ ContextProvider::ScopedContextLock scoped_context(worker_context_provider_);
- // Create texture after synchronizing with compositor.
- ResourceProvider::ScopedTextureProvider scoped_texture(
- gl, resource_lock, async_worker_context_enabled_);
+ gpu::gles2::GLES2Interface* gl = scoped_context.ContextGL();
+ DCHECK(gl);
- unsigned resource_texture_id = scoped_texture.texture_id();
- unsigned image_target =
- resource_provider_->GetImageTextureTarget(resource_lock->format());
+ unsigned image_target =
+ resource_provider_->GetImageTextureTarget(resource->format());
- // Create and bind staging texture.
- if (!staging_buffer->texture_id) {
- gl->GenTextures(1, &staging_buffer->texture_id);
- gl->BindTexture(image_target, staging_buffer->texture_id);
- gl->TexParameteri(image_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- gl->TexParameteri(image_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- gl->TexParameteri(image_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- gl->TexParameteri(image_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- } else {
- gl->BindTexture(image_target, staging_buffer->texture_id);
- }
+ // Create and bind staging texture.
+ if (!staging_buffer->texture_id) {
+ gl->GenTextures(1, &staging_buffer->texture_id);
+ gl->BindTexture(image_target, staging_buffer->texture_id);
+ gl->TexParameteri(image_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl->TexParameteri(image_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl->TexParameteri(image_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ gl->TexParameteri(image_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ } else {
+ gl->BindTexture(image_target, staging_buffer->texture_id);
+ }
- // Create and bind image.
- if (!staging_buffer->image_id) {
- if (staging_buffer->gpu_memory_buffer) {
- staging_buffer->image_id = gl->CreateImageCHROMIUM(
- staging_buffer->gpu_memory_buffer->AsClientBuffer(),
- staging_buffer->size.width(), staging_buffer->size.height(),
- GLInternalFormat(resource_lock->format()));
+ // Create and bind image.
+ if (!staging_buffer->image_id) {
+ if (staging_buffer->gpu_memory_buffer) {
+ staging_buffer->image_id = gl->CreateImageCHROMIUM(
+ staging_buffer->gpu_memory_buffer->AsClientBuffer(),
+ staging_buffer->size.width(), staging_buffer->size.height(),
+ GLInternalFormat(resource->format()));
+ gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
+ }
+ } else {
+ gl->ReleaseTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
}
- } else {
- gl->ReleaseTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
- gl->BindTexImage2DCHROMIUM(image_target, staging_buffer->image_id);
- }
- // Unbind staging texture.
- gl->BindTexture(image_target, 0);
+ // Unbind staging texture.
+ gl->BindTexture(image_target, 0);
- if (resource_provider_->use_sync_query()) {
- if (!staging_buffer->query_id)
- gl->GenQueriesEXT(1, &staging_buffer->query_id);
+ if (resource_provider_->use_sync_query()) {
+ if (!staging_buffer->query_id)
+ gl->GenQueriesEXT(1, &staging_buffer->query_id);
#if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
- // TODO(reveman): This avoids a performance problem on ARM ChromeOS
- // devices. crbug.com/580166
- gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, staging_buffer->query_id);
+ // TODO(reveman): This avoids a performance problem on ARM ChromeOS
+ // devices. crbug.com/580166
+ gl->BeginQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM, staging_buffer->query_id);
#else
- gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, staging_buffer->query_id);
+ gl->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM,
+ staging_buffer->query_id);
#endif
- }
+ }
- // Since compressed texture's cannot be pre-allocated we might have an
- // unallocated resource in which case we need to perform a full size copy.
- if (IsResourceFormatCompressed(resource_lock->format())) {
- gl->CompressedCopyTextureCHROMIUM(staging_buffer->texture_id,
- resource_texture_id);
- } else {
- int bytes_per_row = ResourceUtil::UncheckedWidthInBytes<int>(
- resource_lock->size().width(), resource_lock->format());
- int chunk_size_in_rows =
- std::max(1, max_bytes_per_copy_operation_ / bytes_per_row);
- // Align chunk size to 4. Required to support compressed texture formats.
- chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4);
- int y = 0;
- int height = resource_lock->size().height();
- while (y < height) {
- // Copy at most |chunk_size_in_rows|.
- int rows_to_copy = std::min(chunk_size_in_rows, height - y);
- DCHECK_GT(rows_to_copy, 0);
+ // Since compressed texture's cannot be pre-allocated we might have an
+ // unallocated resource in which case we need to perform a full size copy.
+ if (IsResourceFormatCompressed(resource->format())) {
+ gl->CompressedCopyTextureCHROMIUM(staging_buffer->texture_id,
+ resource_lock->texture_id());
+ } else {
+ int bytes_per_row = ResourceUtil::UncheckedWidthInBytes<int>(
+ resource->size().width(), resource->format());
+ int chunk_size_in_rows =
+ std::max(1, max_bytes_per_copy_operation_ / bytes_per_row);
+ // Align chunk size to 4. Required to support compressed texture formats.
+ chunk_size_in_rows = MathUtil::UncheckedRoundUp(chunk_size_in_rows, 4);
+ int y = 0;
+ int height = resource->size().height();
+ while (y < height) {
+ // Copy at most |chunk_size_in_rows|.
+ int rows_to_copy = std::min(chunk_size_in_rows, height - y);
+ DCHECK_GT(rows_to_copy, 0);
- gl->CopySubTextureCHROMIUM(
- staging_buffer->texture_id, resource_texture_id, 0, y, 0, y,
- resource_lock->size().width(), rows_to_copy, false, false, false);
- y += rows_to_copy;
+ gl->CopySubTextureCHROMIUM(
+ staging_buffer->texture_id, resource_lock->texture_id(), 0, y, 0, y,
+ resource->size().width(), rows_to_copy, false, false, false);
+ y += rows_to_copy;
- // Increment |bytes_scheduled_since_last_flush_| by the amount of memory
- // used for this copy operation.
- bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row;
+ // Increment |bytes_scheduled_since_last_flush_| by the amount of memory
+ // used for this copy operation.
+ bytes_scheduled_since_last_flush_ += rows_to_copy * bytes_per_row;
- if (bytes_scheduled_since_last_flush_ >= max_bytes_per_copy_operation_) {
- gl->ShallowFlushCHROMIUM();
- bytes_scheduled_since_last_flush_ = 0;
+ if (bytes_scheduled_since_last_flush_ >=
+ max_bytes_per_copy_operation_) {
+ gl->ShallowFlushCHROMIUM();
+ bytes_scheduled_since_last_flush_ = 0;
+ }
}
}
- }
- if (resource_provider_->use_sync_query()) {
+ if (resource_provider_->use_sync_query()) {
#if defined(OS_CHROMEOS) && defined(ARCH_CPU_ARM_FAMILY)
- gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
+ gl->EndQueryEXT(GL_COMMANDS_ISSUED_CHROMIUM);
#else
- gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
+ gl->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
#endif
+ }
+
+ const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
+
+ // Barrier to sync worker context output to cc context.
+ gl->OrderingBarrierCHROMIUM();
+
+ // Generate sync token after the barrier for cross context synchronization.
+ gpu::SyncToken sync_token;
+ gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
+ resource_lock->UpdateResourceSyncToken(sync_token);
}
-
- const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM();
-
- // Barrier to sync worker context output to cc context.
- gl->OrderingBarrierCHROMIUM();
-
- // Generate sync token after the barrier for cross context synchronization.
- gpu::SyncToken resource_sync_token;
- gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, resource_sync_token.GetData());
- resource_lock->set_sync_token(resource_sync_token);
- resource_lock->set_synchronized(!async_worker_context_enabled_);
}
} // namespace cc
diff --git a/cc/raster/one_copy_raster_buffer_provider.h b/cc/raster/one_copy_raster_buffer_provider.h
index 44ceb7a..d30c3b5 100644
--- a/cc/raster/one_copy_raster_buffer_provider.h
+++ b/cc/raster/one_copy_raster_buffer_provider.h
@@ -12,7 +12,6 @@
#include "cc/raster/raster_buffer_provider.h"
#include "cc/raster/staging_buffer_pool.h"
#include "cc/resources/resource_provider.h"
-#include "gpu/command_buffer/common/sync_token.h"
namespace cc {
struct StagingBuffer;
@@ -28,8 +27,7 @@
int max_copy_texture_chromium_size,
bool use_partial_raster,
int max_staging_buffer_usage_in_bytes,
- ResourceFormat preferred_tile_format,
- bool async_worker_context_enabled);
+ ResourceFormat preferred_tile_format);
~OneCopyRasterBufferProvider() override;
// Overridden from RasterBufferProvider:
@@ -47,7 +45,6 @@
void PlaybackAndCopyOnWorkerThread(
const Resource* resource,
ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
const RasterSource* raster_source,
const gfx::Rect& raster_full_rect,
const gfx::Rect& raster_dirty_rect,
@@ -57,39 +54,6 @@
uint64_t new_content_id);
private:
- class RasterBufferImpl : public RasterBuffer {
- public:
- RasterBufferImpl(OneCopyRasterBufferProvider* client,
- ResourceProvider* resource_provider,
- const Resource* resource,
- uint64_t previous_content_id,
- bool async_worker_context_enabled);
- ~RasterBufferImpl() override;
-
- // Overridden from RasterBuffer:
- void Playback(
- const RasterSource* raster_source,
- const gfx::Rect& raster_full_rect,
- const gfx::Rect& raster_dirty_rect,
- uint64_t new_content_id,
- float scale,
- const RasterSource::PlaybackSettings& playback_settings) override;
-
- void set_sync_token(const gpu::SyncToken& sync_token) {
- sync_token_ = sync_token;
- }
-
- private:
- OneCopyRasterBufferProvider* client_;
- const Resource* resource_;
- ResourceProvider::ScopedWriteLockGL lock_;
- uint64_t previous_content_id_;
-
- gpu::SyncToken sync_token_;
-
- DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
- };
-
void PlaybackToStagingBuffer(
StagingBuffer* staging_buffer,
const Resource* resource,
@@ -101,8 +65,8 @@
uint64_t previous_content_id,
uint64_t new_content_id);
void CopyOnWorkerThread(StagingBuffer* staging_buffer,
+ const Resource* resource,
ResourceProvider::ScopedWriteLockGL* resource_lock,
- const gpu::SyncToken& sync_token,
const RasterSource* raster_source,
uint64_t previous_content_id,
uint64_t new_content_id);
@@ -111,18 +75,14 @@
ContextProvider* const worker_context_provider_;
ResourceProvider* const resource_provider_;
const int max_bytes_per_copy_operation_;
- const bool use_partial_raster_;
+ bool use_partial_raster_;
// Context lock must be acquired when accessing this member.
int bytes_scheduled_since_last_flush_;
- const ResourceFormat preferred_tile_format_;
+ ResourceFormat preferred_tile_format_;
StagingBufferPool staging_pool_;
- const bool async_worker_context_enabled_;
-
- std::set<RasterBufferImpl*> pending_raster_buffers_;
-
DISALLOW_COPY_AND_ASSIGN(OneCopyRasterBufferProvider);
};
diff --git a/cc/raster/raster_buffer_provider.h b/cc/raster/raster_buffer_provider.h
index 1cdfba2..061740a 100644
--- a/cc/raster/raster_buffer_provider.h
+++ b/cc/raster/raster_buffer_provider.h
@@ -53,7 +53,7 @@
// Release raster buffer.
virtual void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) = 0;
- // Used for syncing resources to the worker context.
+ // Barrier to sync resources to the worker context.
virtual void OrderingBarrier() = 0;
// Returns the format to use for the tiles.
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index 5ebd47a..43e35da 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -13,11 +13,11 @@
#include "cc/output/context_provider.h"
#include "cc/raster/bitmap_raster_buffer_provider.h"
#include "cc/raster/gpu_raster_buffer_provider.h"
+#include "cc/raster/gpu_rasterizer.h"
#include "cc/raster/one_copy_raster_buffer_provider.h"
#include "cc/raster/raster_buffer_provider.h"
#include "cc/raster/synchronous_task_graph_runner.h"
#include "cc/raster/zero_copy_raster_buffer_provider.h"
-#include "cc/resources/platform_color.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/resource_provider.h"
#include "cc/resources/scoped_resource.h"
@@ -29,7 +29,6 @@
#include "cc/test/test_shared_bitmap_manager.h"
#include "cc/test/test_web_graphics_context_3d.h"
#include "cc/tiles/tile_task_manager.h"
-#include "gpu/command_buffer/common/sync_token.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/perf/perf_test.h"
#include "third_party/khronos/GLES2/gl2.h"
@@ -69,13 +68,6 @@
if (pname == GL_QUERY_RESULT_AVAILABLE_EXT)
*params = 1;
}
- void GenUnverifiedSyncTokenCHROMIUM(GLuint64 fence_sync,
- GLbyte* sync_token) override {
- // Copy the data over after setting the data to ensure alignment.
- gpu::SyncToken sync_token_data(gpu::CommandBufferNamespace::GPU_IO, 0,
- gpu::CommandBufferId(), fence_sync);
- memcpy(sync_token, &sync_token_data, sizeof(sync_token_data));
- }
};
class PerfContextProvider : public ContextProvider {
@@ -319,43 +311,43 @@
public:
// Overridden from testing::Test:
void SetUp() override {
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider;
switch (GetParam()) {
case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create(
+ raster_buffer_provider = ZeroCopyRasterBufferProvider::Create(
resource_provider_.get(), PlatformColor::BestTextureFormat());
break;
case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
+ raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>(
task_runner_.get(), compositor_context_provider_.get(),
worker_context_provider_.get(), resource_provider_.get(),
std::numeric_limits<int>::max(), false,
- std::numeric_limits<int>::max(), PlatformColor::BestTextureFormat(),
- false);
+ std::numeric_limits<int>::max(),
+ PlatformColor::BestTextureFormat());
break;
case RASTER_BUFFER_PROVIDER_TYPE_GPU:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
+ raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>(
compositor_context_provider_.get(), worker_context_provider_.get(),
- resource_provider_.get(), false, 0, false);
+ resource_provider_.get(), false, 0);
break;
case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
CreateSoftwareOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ =
+ raster_buffer_provider =
BitmapRasterBufferProvider::Create(resource_provider_.get());
break;
}
- DCHECK(raster_buffer_provider_);
+ DCHECK(raster_buffer_provider);
- tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner_.get());
+ tile_task_manager_ = TileTaskManagerImpl::Create(
+ std::move(raster_buffer_provider), task_graph_runner_.get());
}
void TearDown() override {
tile_task_manager_->Shutdown();
tile_task_manager_->CheckForCompletedTasks();
-
- raster_buffer_provider_->Shutdown();
}
// Overridden from PerfRasterBufferProviderHelper:
@@ -363,11 +355,13 @@
const Resource* resource,
uint64_t resource_content_id,
uint64_t previous_content_id) override {
- return raster_buffer_provider_->AcquireBufferForRaster(
- resource, resource_content_id, previous_content_id);
+ return tile_task_manager_->GetRasterBufferProvider()
+ ->AcquireBufferForRaster(resource, resource_content_id,
+ previous_content_id);
}
void ReleaseBufferForRaster(std::unique_ptr<RasterBuffer> buffer) override {
- raster_buffer_provider_->ReleaseBufferForRaster(std::move(buffer));
+ tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
+ std::move(buffer));
}
void RunMessageLoopUntilAllTasksHaveCompleted() {
@@ -392,14 +386,12 @@
graph.Reset();
ResetRasterTasks(raster_tasks);
BuildTileTaskGraph(&graph, raster_tasks);
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&graph);
tile_task_manager_->CheckForCompletedTasks();
timer_.NextLap();
} while (!timer_.HasTimeLimitExpired());
TaskGraph empty;
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&empty);
RunMessageLoopUntilAllTasksHaveCompleted();
tile_task_manager_->CheckForCompletedTasks();
@@ -430,7 +422,6 @@
// Reset the tasks as for scheduling new state tasks are needed.
ResetRasterTasks(raster_tasks[count % kNumVersions]);
BuildTileTaskGraph(&graph, raster_tasks[count % kNumVersions]);
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&graph);
tile_task_manager_->CheckForCompletedTasks();
++count;
@@ -438,7 +429,6 @@
} while (!timer_.HasTimeLimitExpired());
TaskGraph empty;
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&empty);
RunMessageLoopUntilAllTasksHaveCompleted();
tile_task_manager_->CheckForCompletedTasks();
@@ -463,14 +453,12 @@
do {
graph.Reset();
BuildTileTaskGraph(&graph, raster_tasks);
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&graph);
RunMessageLoopUntilAllTasksHaveCompleted();
timer_.NextLap();
} while (!timer_.HasTimeLimitExpired());
TaskGraph empty;
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&empty);
RunMessageLoopUntilAllTasksHaveCompleted();
@@ -511,7 +499,6 @@
}
std::unique_ptr<TileTaskManager> tile_task_manager_;
- std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
TestSharedBitmapManager shared_bitmap_manager_;
};
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index 3fb5713..1b4d3e5 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -20,10 +20,10 @@
#include "cc/base/unique_notifier.h"
#include "cc/raster/bitmap_raster_buffer_provider.h"
#include "cc/raster/gpu_raster_buffer_provider.h"
+#include "cc/raster/gpu_rasterizer.h"
#include "cc/raster/one_copy_raster_buffer_provider.h"
#include "cc/raster/synchronous_task_graph_runner.h"
#include "cc/raster/zero_copy_raster_buffer_provider.h"
-#include "cc/resources/platform_color.h"
#include "cc/resources/resource_pool.h"
#include "cc/resources/resource_provider.h"
#include "cc/resources/scoped_resource.h"
@@ -156,43 +156,43 @@
// Overridden from testing::Test:
void SetUp() override {
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider;
switch (GetParam()) {
case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = ZeroCopyRasterBufferProvider::Create(
+ raster_buffer_provider = ZeroCopyRasterBufferProvider::Create(
resource_provider_.get(), PlatformColor::BestTextureFormat());
break;
case RASTER_BUFFER_PROVIDER_TYPE_ONE_COPY:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = base::MakeUnique<OneCopyRasterBufferProvider>(
+ raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>(
base::ThreadTaskRunnerHandle::Get().get(), context_provider_.get(),
worker_context_provider_.get(), resource_provider_.get(),
kMaxBytesPerCopyOperation, false, kMaxStagingBuffers,
- PlatformColor::BestTextureFormat(), false);
+ PlatformColor::BestTextureFormat());
break;
case RASTER_BUFFER_PROVIDER_TYPE_GPU:
Create3dOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ = base::MakeUnique<GpuRasterBufferProvider>(
+ raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>(
context_provider_.get(), worker_context_provider_.get(),
- resource_provider_.get(), false, 0, false);
+ resource_provider_.get(), false, 0);
break;
case RASTER_BUFFER_PROVIDER_TYPE_BITMAP:
CreateSoftwareOutputSurfaceAndResourceProvider();
- raster_buffer_provider_ =
+ raster_buffer_provider =
BitmapRasterBufferProvider::Create(resource_provider_.get());
break;
}
- DCHECK(raster_buffer_provider_);
+ DCHECK(raster_buffer_provider);
- tile_task_manager_ = TileTaskManagerImpl::Create(&task_graph_runner_);
+ tile_task_manager_ = TileTaskManagerImpl::Create(
+ std::move(raster_buffer_provider), &task_graph_runner_);
}
void TearDown() override {
tile_task_manager_->Shutdown();
tile_task_manager_->CheckForCompletedTasks();
-
- raster_buffer_provider_->Shutdown();
}
void AllTileTasksFinished() {
@@ -216,7 +216,6 @@
0 /* dependencies */);
}
- raster_buffer_provider_->OrderingBarrier();
tile_task_manager_->ScheduleTasks(&graph_);
}
@@ -229,7 +228,8 @@
// The raster buffer has no tile ids associated with it for partial update,
// so doesn't need to provide a valid dirty rect.
std::unique_ptr<RasterBuffer> raster_buffer =
- raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
+ tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
+ resource.get(), 0, 0);
TileTask::Vector empty;
tasks_.push_back(new TestRasterTaskImpl(this, std::move(resource), id,
std::move(raster_buffer), &empty));
@@ -246,7 +246,8 @@
RGBA_8888);
std::unique_ptr<RasterBuffer> raster_buffer =
- raster_buffer_provider_->AcquireBufferForRaster(resource.get(), 0, 0);
+ tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
+ resource.get(), 0, 0);
TileTask::Vector empty;
tasks_.push_back(new BlockingTestRasterTaskImpl(
this, std::move(resource), id, std::move(raster_buffer), lock, &empty));
@@ -267,7 +268,8 @@
void OnRasterTaskCompleted(std::unique_ptr<RasterBuffer> raster_buffer,
unsigned id,
bool was_canceled) override {
- raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
+ tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
+ std::move(raster_buffer));
RasterTaskResult result;
result.id = id;
result.canceled = was_canceled;
@@ -305,7 +307,6 @@
std::unique_ptr<FakeOutputSurface> output_surface_;
std::unique_ptr<ResourceProvider> resource_provider_;
std::unique_ptr<TileTaskManager> tile_task_manager_;
- std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
TestGpuMemoryBufferManager gpu_memory_buffer_manager_;
TestSharedBitmapManager shared_bitmap_manager_;
SynchronousTaskGraphRunner task_graph_runner_;
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc
index a9e8e85..18e2f22 100644
--- a/cc/resources/resource_provider.cc
+++ b/cc/resources/resource_provider.cc
@@ -694,25 +694,11 @@
DeleteStyle style) {
TRACE_EVENT0("cc", "ResourceProvider::DeleteResourceInternal");
Resource* resource = &it->second;
+ bool lost_resource = resource->lost;
+
DCHECK(resource->exported_count == 0 || style != NORMAL);
-
- // Exported resources are lost on shutdown.
- bool exported_resource_lost =
- style == FOR_SHUTDOWN && resource->exported_count > 0;
- // GPU resources are lost when output surface is lost.
- bool gpu_resource_lost =
- IsGpuResourceType(resource->type) && lost_output_surface_;
- bool lost_resource =
- resource->lost || exported_resource_lost || gpu_resource_lost;
-
- if (!lost_resource &&
- resource->synchronization_state() == Resource::NEEDS_WAIT) {
- DCHECK(resource->allocated);
- DCHECK(IsGpuResourceType(resource->type));
- GLES2Interface* gl = ContextGL();
- DCHECK(gl);
- resource->WaitSyncToken(gl);
- }
+ if (style == FOR_SHUTDOWN && resource->exported_count > 0)
+ lost_resource = true;
if (resource->image_id) {
DCHECK(resource->origin == Resource::INTERNAL);
@@ -743,6 +729,7 @@
gpu::SyncToken sync_token = resource->mailbox().sync_token();
if (IsGpuResourceType(resource->type)) {
DCHECK(resource->mailbox().IsTexture());
+ lost_resource |= lost_output_surface_;
GLES2Interface* gl = ContextGL();
DCHECK(gl);
if (resource->gl_id) {
@@ -828,12 +815,11 @@
SkCanvas dest(lock.sk_bitmap());
dest.writePixels(source_info, image, image_stride, 0, 0);
} else {
- ScopedWriteLockGL lock(this, id, false);
- unsigned resource_texture_id = lock.texture_id();
- DCHECK(resource_texture_id);
+ ScopedWriteLockGL lock(this, id);
+ DCHECK(lock.texture_id());
GLES2Interface* gl = ContextGL();
DCHECK(gl);
- gl->BindTexture(resource->target, resource_texture_id);
+ gl->BindTexture(resource->target, lock.texture_id());
if (resource->format == ETC1) {
DCHECK_EQ(resource->target, static_cast<GLenum>(GL_TEXTURE_2D));
int image_bytes = ResourceUtil::CheckedSizeInBytes<int>(image_size, ETC1);
@@ -849,8 +835,7 @@
gl->OrderingBarrierCHROMIUM();
gpu::SyncToken sync_token;
gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
- lock.set_sync_token(sync_token);
- lock.set_synchronized(true);
+ lock.UpdateResourceSyncToken(sync_token);
}
}
@@ -868,7 +853,6 @@
gl->GenUnverifiedSyncTokenCHROMIUM(fence_sync, sync_token.GetData());
resource->UpdateSyncToken(sync_token);
- resource->SetSynchronized();
}
void ResourceProvider::GenerateSyncTokenForResources(
@@ -889,7 +873,6 @@
}
resource->UpdateSyncToken(sync_token);
- resource->SetSynchronized();
}
}
}
@@ -982,8 +965,7 @@
ResourceProvider::Resource* ResourceProvider::LockForWrite(ResourceId id) {
Resource* resource = GetResource(id);
DCHECK(CanLockForWrite(id));
- if (resource->allocated)
- WaitSyncTokenIfNeeded(id);
+ DCHECK_NE(Resource::NEEDS_WAIT, resource->synchronization_state());
resource->locked_for_write = true;
resource->SetLocallyUsed();
return resource;
@@ -1001,11 +983,12 @@
return resource->is_overlay_candidate;
}
-void ResourceProvider::UnlockForWrite(Resource* resource) {
+void ResourceProvider::UnlockForWrite(ResourceProvider::Resource* resource) {
DCHECK(resource->locked_for_write);
DCHECK_EQ(resource->exported_count, 0);
DCHECK(resource->origin == Resource::INTERNAL);
resource->locked_for_write = false;
+ resource->SetSynchronized();
}
void ResourceProvider::EnableReadLockFencesForTesting(ResourceId id) {
@@ -1017,11 +1000,10 @@
ResourceProvider::ScopedReadLockGL::ScopedReadLockGL(
ResourceProvider* resource_provider,
ResourceId resource_id)
- : resource_provider_(resource_provider), resource_id_(resource_id) {
- const Resource* resource = resource_provider->LockForRead(resource_id);
- texture_id_ = resource->gl_id;
- target_ = resource->target;
- size_ = resource->size;
+ : resource_provider_(resource_provider),
+ resource_id_(resource_id),
+ resource_(resource_provider->LockForRead(resource_id)) {
+ DCHECK(resource_);
}
ResourceProvider::ScopedReadLockGL::~ScopedReadLockGL() {
@@ -1032,7 +1014,7 @@
ResourceProvider* resource_provider,
ResourceId resource_id,
GLenum filter)
- : resource_lock_(resource_provider, resource_id),
+ : ScopedReadLockGL(resource_provider, resource_id),
unit_(GL_TEXTURE0),
target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {}
@@ -1041,7 +1023,7 @@
ResourceId resource_id,
GLenum unit,
GLenum filter)
- : resource_lock_(resource_provider, resource_id),
+ : ScopedReadLockGL(resource_provider, resource_id),
unit_(unit),
target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {}
@@ -1049,97 +1031,22 @@
ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL(
ResourceProvider* resource_provider,
- ResourceId resource_id,
- bool create_mailbox)
+ ResourceId resource_id)
: resource_provider_(resource_provider),
- resource_id_(resource_id),
- synchronized_(false) {
- DCHECK(thread_checker_.CalledOnValidThread());
- Resource* resource = resource_provider->LockForWrite(resource_id);
- resource_provider_->LazyAllocate(resource);
- if (resource->image_id && resource->dirty_image)
- resource_provider_->BindImageForSampling(resource);
- if (create_mailbox) {
- resource_provider_->CreateMailboxAndBindResource(
- resource_provider_->ContextGL(), resource);
- }
- texture_id_ = resource->gl_id;
- target_ = resource->target;
- format_ = resource->format;
- size_ = resource->size;
- mailbox_ = resource->mailbox();
+ resource_(resource_provider->LockForWrite(resource_id)),
+ texture_id_(0),
+ set_sync_token_(false) {
+ resource_provider_->LazyAllocate(resource_);
+ texture_id_ = resource_->gl_id;
+ DCHECK(texture_id_);
+ if (resource_->image_id && resource_->dirty_image)
+ resource_provider_->BindImageForSampling(resource_);
}
ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
- DCHECK(thread_checker_.CalledOnValidThread());
- Resource* resource = resource_provider_->GetResource(resource_id_);
- DCHECK(resource->locked_for_write);
- if (sync_token_.HasData())
- resource->UpdateSyncToken(sync_token_);
- if (synchronized_)
- resource->SetSynchronized();
- resource_provider_->UnlockForWrite(resource);
-}
-
-ResourceProvider::ScopedTextureProvider::ScopedTextureProvider(
- gpu::gles2::GLES2Interface* gl,
- ScopedWriteLockGL* resource_lock,
- bool use_mailbox)
- : gl_(gl), use_mailbox_(use_mailbox) {
- if (use_mailbox_) {
- texture_id_ = gl_->CreateAndConsumeTextureCHROMIUM(
- resource_lock->target(), resource_lock->mailbox().name());
- } else {
- texture_id_ = resource_lock->texture_id();
- }
- DCHECK(texture_id_);
-}
-
-ResourceProvider::ScopedTextureProvider::~ScopedTextureProvider() {
- if (use_mailbox_)
- gl_->DeleteTextures(1, &texture_id_);
-}
-
-ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider(
- ContextProvider* context_provider,
- ScopedWriteLockGL* resource_lock,
- bool use_mailbox,
- bool use_distance_field_text,
- bool can_use_lcd_text,
- int msaa_sample_count)
- : texture_provider_(context_provider->ContextGL(),
- resource_lock,
- use_mailbox) {
- GrGLTextureInfo texture_info;
- texture_info.fID = texture_provider_.texture_id();
- texture_info.fTarget = resource_lock->target();
- GrBackendTextureDesc desc;
- desc.fFlags = kRenderTarget_GrBackendTextureFlag;
- desc.fWidth = resource_lock->size().width();
- desc.fHeight = resource_lock->size().height();
- desc.fConfig = ToGrPixelConfig(resource_lock->format());
- desc.fOrigin = kTopLeft_GrSurfaceOrigin;
- desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info);
- desc.fSampleCnt = msaa_sample_count;
-
- uint32_t flags =
- use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0;
- // Use unknown pixel geometry to disable LCD text.
- SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry);
- if (can_use_lcd_text) {
- // LegacyFontHost will get LCD text and skia figures out what type to use.
- surface_props =
- SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
- }
- sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget(
- context_provider->GrContext(), desc, &surface_props);
-}
-
-ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() {
- if (sk_surface_.get()) {
- sk_surface_->prepareForExternalIO();
- sk_surface_.reset();
- }
+ if (set_sync_token_)
+ resource_->UpdateSyncToken(sync_token_);
+ resource_provider_->UnlockForWrite(resource_);
}
void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap,
@@ -1165,52 +1072,47 @@
ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(
ResourceProvider* resource_provider,
ResourceId resource_id)
- : resource_provider_(resource_provider), resource_id_(resource_id) {
- ResourceProvider::PopulateSkBitmapWithResource(
- &sk_bitmap_, resource_provider->LockForWrite(resource_id));
+ : resource_provider_(resource_provider),
+ resource_(resource_provider->LockForWrite(resource_id)) {
+ ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource_);
DCHECK(valid());
}
ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
DCHECK(thread_checker_.CalledOnValidThread());
- Resource* resource = resource_provider_->GetResource(resource_id_);
- DCHECK(resource);
- resource->SetSynchronized();
- resource_provider_->UnlockForWrite(resource);
+ resource_provider_->UnlockForWrite(resource_);
}
ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
ResourceId resource_id)
- : resource_provider_(resource_provider), resource_id_(resource_id) {
- Resource* resource = resource_provider->LockForWrite(resource_id);
- DCHECK(IsGpuResourceType(resource->type));
- format_ = resource->format;
- size_ = resource->size;
- gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer);
- resource->gpu_memory_buffer = nullptr;
+ : resource_provider_(resource_provider),
+ resource_(resource_provider->LockForWrite(resource_id)) {
+ DCHECK(IsGpuResourceType(resource_->type));
+ gpu_memory_buffer_ = std::move(resource_->gpu_memory_buffer);
+ resource_->gpu_memory_buffer = nullptr;
}
ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
~ScopedWriteLockGpuMemoryBuffer() {
DCHECK(thread_checker_.CalledOnValidThread());
- Resource* resource = resource_provider_->GetResource(resource_id_);
- DCHECK(resource);
- if (gpu_memory_buffer_) {
- DCHECK(!resource->gpu_memory_buffer);
- resource_provider_->LazyCreate(resource);
- resource->gpu_memory_buffer = std::move(gpu_memory_buffer_);
- resource->allocated = true;
- resource_provider_->LazyCreateImage(resource);
- resource->dirty_image = true;
- resource->is_overlay_candidate = true;
- // GpuMemoryBuffer 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
- // buffer that is currently in-use by the GPU.
- resource->read_lock_fences_enabled = true;
- }
- resource->SetSynchronized();
- resource_provider_->UnlockForWrite(resource);
+ resource_provider_->UnlockForWrite(resource_);
+ if (!gpu_memory_buffer_)
+ return;
+
+ DCHECK(!resource_->gpu_memory_buffer);
+ resource_provider_->LazyCreate(resource_);
+ resource_->gpu_memory_buffer = std::move(gpu_memory_buffer_);
+ resource_->allocated = true;
+ resource_provider_->LazyCreateImage(resource_);
+ resource_->dirty_image = true;
+ resource_->is_overlay_candidate = true;
+ resource_->SetSynchronized();
+
+ // GpuMemoryBuffer 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
+ // buffer that is currently in-use by the GPU.
+ resource_->read_lock_fences_enabled = true;
}
gfx::GpuMemoryBuffer*
@@ -1218,12 +1120,71 @@
if (!gpu_memory_buffer_) {
gpu_memory_buffer_ =
resource_provider_->gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer(
- size_, BufferFormat(format_),
+ resource_->size, BufferFormat(resource_->format),
gfx::BufferUsage::GPU_READ_CPU_READ_WRITE, gpu::kNullSurfaceHandle);
}
return gpu_memory_buffer_.get();
}
+ResourceProvider::ScopedWriteLockGr::ScopedWriteLockGr(
+ ResourceProvider* resource_provider,
+ ResourceId resource_id)
+ : resource_provider_(resource_provider),
+ resource_(resource_provider->LockForWrite(resource_id)),
+ set_sync_token_(false) {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ resource_provider_->LazyAllocate(resource_);
+ if (resource_->image_id && resource_->dirty_image)
+ resource_provider_->BindImageForSampling(resource_);
+}
+
+ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(resource_->locked_for_write);
+ if (set_sync_token_)
+ resource_->UpdateSyncToken(sync_token_);
+
+ resource_provider_->UnlockForWrite(resource_);
+}
+
+void ResourceProvider::ScopedWriteLockGr::InitSkSurface(
+ GrContext* gr_context,
+ bool use_distance_field_text,
+ bool can_use_lcd_text,
+ int msaa_sample_count) {
+ DCHECK(resource_->locked_for_write);
+
+ GrGLTextureInfo texture_info;
+ texture_info.fID = resource_->gl_id;
+ texture_info.fTarget = resource_->target;
+ GrBackendTextureDesc desc;
+ desc.fFlags = kRenderTarget_GrBackendTextureFlag;
+ desc.fWidth = resource_->size.width();
+ desc.fHeight = resource_->size.height();
+ desc.fConfig = ToGrPixelConfig(resource_->format);
+ desc.fOrigin = kTopLeft_GrSurfaceOrigin;
+ desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info);
+ desc.fSampleCnt = msaa_sample_count;
+
+ uint32_t flags =
+ use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0;
+ // Use unknown pixel geometry to disable LCD text.
+ SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry);
+ if (can_use_lcd_text) {
+ // LegacyFontHost will get LCD text and skia figures out what type to use.
+ surface_props =
+ SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
+ }
+ sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget(
+ gr_context, desc, &surface_props);
+}
+
+void ResourceProvider::ScopedWriteLockGr::ReleaseSkSurface() {
+ DCHECK(sk_surface_);
+ sk_surface_->prepareForExternalIO();
+ sk_surface_.reset();
+}
+
ResourceProvider::SynchronousFence::SynchronousFence(
gpu::gles2::GLES2Interface* gl)
: gl_(gl), has_synchronized_(true) {}
@@ -1772,10 +1733,6 @@
LazyCreateImage(resource);
resource->dirty_image = true;
resource->is_overlay_candidate = true;
- // GpuMemoryBuffer 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
- // buffer that is currently in-use by the GPU.
- resource->read_lock_fences_enabled = true;
} else if (use_texture_storage_ext_ &&
IsFormatSupportedForStorage(format, use_texture_format_bgra_) &&
(resource->hint & TEXTURE_HINT_IMMUTABLE)) {
diff --git a/cc/resources/resource_provider.h b/cc/resources/resource_provider.h
index e2b97c6..96f212f 100644
--- a/cc/resources/resource_provider.h
+++ b/cc/resources/resource_provider.h
@@ -216,23 +216,21 @@
public:
ScopedReadLockGL(ResourceProvider* resource_provider,
ResourceId resource_id);
- ~ScopedReadLockGL();
+ virtual ~ScopedReadLockGL();
- unsigned texture_id() const { return texture_id_; }
- GLenum target() const { return target_; }
- const gfx::Size& size() const { return size_; }
+ unsigned texture_id() const { return resource_->gl_id; }
+ GLenum target() const { return resource_->target; }
+ const gfx::Size& texture_size() const { return resource_->size; }
private:
ResourceProvider* resource_provider_;
ResourceId resource_id_;
- unsigned texture_id_;
- GLenum target_;
- gfx::Size size_;
+ const ResourceProvider::Resource* resource_;
DISALLOW_COPY_AND_ASSIGN(ScopedReadLockGL);
};
- class CC_EXPORT ScopedSamplerGL {
+ class CC_EXPORT ScopedSamplerGL : public ScopedReadLockGL {
public:
ScopedSamplerGL(ResourceProvider* resource_provider,
ResourceId resource_id,
@@ -241,13 +239,11 @@
ResourceId resource_id,
GLenum unit,
GLenum filter);
- ~ScopedSamplerGL();
+ ~ScopedSamplerGL() override;
- unsigned texture_id() const { return resource_lock_.texture_id(); }
GLenum target() const { return target_; }
private:
- ScopedReadLockGL resource_lock_;
GLenum unit_;
GLenum target_;
@@ -257,74 +253,26 @@
class CC_EXPORT ScopedWriteLockGL {
public:
ScopedWriteLockGL(ResourceProvider* resource_provider,
- ResourceId resource_id,
- bool create_mailbox);
+ ResourceId resource_id);
~ScopedWriteLockGL();
unsigned texture_id() const { return texture_id_; }
- GLenum target() const { return target_; }
- ResourceFormat format() const { return format_; }
- const gfx::Size& size() const { return size_; }
- const TextureMailbox& mailbox() const { return mailbox_; }
-
- void set_sync_token(const gpu::SyncToken& sync_token) {
+ void UpdateResourceSyncToken(const gpu::SyncToken& sync_token) {
+ set_sync_token_ = true;
sync_token_ = sync_token;
}
- void set_synchronized(bool synchronized) { synchronized_ = synchronized; }
-
private:
ResourceProvider* resource_provider_;
- ResourceId resource_id_;
+ ResourceProvider::Resource* resource_;
unsigned texture_id_;
- GLenum target_;
- ResourceFormat format_;
- gfx::Size size_;
- TextureMailbox mailbox_;
+ bool set_sync_token_;
gpu::SyncToken sync_token_;
- bool synchronized_;
- base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGL);
};
- class CC_EXPORT ScopedTextureProvider {
- public:
- ScopedTextureProvider(gpu::gles2::GLES2Interface* gl,
- ScopedWriteLockGL* resource_lock,
- bool use_mailbox);
- ~ScopedTextureProvider();
-
- unsigned texture_id() const { return texture_id_; }
-
- private:
- gpu::gles2::GLES2Interface* gl_;
- bool use_mailbox_;
- unsigned texture_id_;
-
- DISALLOW_COPY_AND_ASSIGN(ScopedTextureProvider);
- };
-
- class CC_EXPORT ScopedSkSurfaceProvider {
- public:
- ScopedSkSurfaceProvider(ContextProvider* context_provider,
- ScopedWriteLockGL* resource_lock,
- bool use_mailbox,
- bool use_distance_field_text,
- bool can_use_lcd_text,
- int msaa_sample_count);
- ~ScopedSkSurfaceProvider();
-
- SkSurface* sk_surface() { return sk_surface_.get(); }
-
- private:
- ScopedTextureProvider texture_provider_;
- sk_sp<SkSurface> sk_surface_;
-
- DISALLOW_COPY_AND_ASSIGN(ScopedSkSurfaceProvider);
- };
-
class CC_EXPORT ScopedReadLockSoftware {
public:
ScopedReadLockSoftware(ResourceProvider* resource_provider,
@@ -357,7 +305,7 @@
private:
ResourceProvider* resource_provider_;
- ResourceId resource_id_;
+ ResourceProvider::Resource* resource_;
SkBitmap sk_bitmap_;
base::ThreadChecker thread_checker_;
@@ -374,15 +322,45 @@
private:
ResourceProvider* resource_provider_;
- ResourceId resource_id_;
- ResourceFormat format_;
- gfx::Size size_;
+ ResourceProvider::Resource* resource_;
std::unique_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGpuMemoryBuffer);
};
+ class CC_EXPORT ScopedWriteLockGr {
+ public:
+ ScopedWriteLockGr(ResourceProvider* resource_provider,
+ ResourceId resource_id);
+ ~ScopedWriteLockGr();
+
+ void InitSkSurface(GrContext* gr_context,
+ bool use_distance_field_text,
+ bool can_use_lcd_text,
+ int msaa_sample_count);
+ void ReleaseSkSurface();
+
+ SkSurface* sk_surface() { return sk_surface_.get(); }
+
+ gfx::Size GetResourceSize() const { return resource_->size; }
+
+ void UpdateResourceSyncToken(const gpu::SyncToken& sync_token) {
+ set_sync_token_ = true;
+ sync_token_ = sync_token;
+ }
+
+ private:
+ ResourceProvider* resource_provider_;
+ ResourceProvider::Resource* resource_;
+ base::ThreadChecker thread_checker_;
+ sk_sp<SkSurface> sk_surface_;
+ bool set_sync_token_;
+ gpu::SyncToken sync_token_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedWriteLockGr);
+ };
+
class Fence : public base::RefCounted<Fence> {
public:
Fence() {}
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc
index ae02820..319e82e 100644
--- a/cc/resources/video_resource_updater.cc
+++ b/cc/resources/video_resource_updater.cc
@@ -191,8 +191,7 @@
gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
gl->GenMailboxCHROMIUM(mailbox.name);
- ResourceProvider::ScopedWriteLockGL lock(resource_provider_, resource_id,
- false);
+ ResourceProvider::ScopedWriteLockGL lock(resource_provider_, resource_id);
gl->ProduceTextureDirectCHROMIUM(
lock.texture_id(),
resource_provider_->GetResourceTextureTarget(resource_id),
@@ -585,7 +584,9 @@
resource->add_ref();
ResourceProvider::ScopedWriteLockGL lock(resource_provider_,
- resource->resource_id(), false);
+ resource->resource_id());
+ uint32_t texture_id = lock.texture_id();
+
DCHECK_EQ(
resource_provider_->GetResourceTextureTarget(resource->resource_id()),
(GLenum)GL_TEXTURE_2D);
@@ -593,7 +594,7 @@
gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData());
uint32_t src_texture_id = gl->CreateAndConsumeTextureCHROMIUM(
mailbox_holder.texture_target, mailbox_holder.mailbox.name);
- gl->CopySubTextureCHROMIUM(src_texture_id, lock.texture_id(), 0, 0, 0, 0,
+ gl->CopySubTextureCHROMIUM(src_texture_id, texture_id, 0, 0, 0, 0,
output_plane_resource_size.width(),
output_plane_resource_size.height(), false, false,
false);
diff --git a/cc/test/fake_tile_manager.cc b/cc/test/fake_tile_manager.cc
index ceb77d66..8cf9842 100644
--- a/cc/test/fake_tile_manager.cc
+++ b/cc/test/fake_tile_manager.cc
@@ -23,9 +23,6 @@
base::LazyInstance<FakeTileTaskManagerImpl> g_fake_tile_task_manager =
LAZY_INSTANCE_INITIALIZER;
-base::LazyInstance<FakeRasterBufferProviderImpl> g_fake_raster_buffer_provider =
- LAZY_INSTANCE_INITIALIZER;
-
} // namespace
FakeTileManager::FakeTileManager(TileManagerClient* client)
@@ -39,7 +36,6 @@
LayerTreeSettings().software_decoded_image_budget_bytes) {
SetResources(
nullptr, &image_decode_controller_, g_fake_tile_task_manager.Pointer(),
- g_fake_raster_buffer_provider.Pointer(),
std::numeric_limits<size_t>::max(), false /* use_gpu_rasterization */);
}
@@ -55,7 +51,6 @@
LayerTreeSettings().software_decoded_image_budget_bytes) {
SetResources(resource_pool, &image_decode_controller_,
g_fake_tile_task_manager.Pointer(),
- g_fake_raster_buffer_provider.Pointer(),
std::numeric_limits<size_t>::max(),
false /* use_gpu_rasterization */);
}
diff --git a/cc/test/fake_tile_task_manager.cc b/cc/test/fake_tile_task_manager.cc
index 044de23..cc70198 100644
--- a/cc/test/fake_tile_task_manager.cc
+++ b/cc/test/fake_tile_task_manager.cc
@@ -8,7 +8,13 @@
namespace cc {
-FakeTileTaskManagerImpl::FakeTileTaskManagerImpl() {}
+FakeTileTaskManagerImpl::FakeTileTaskManagerImpl()
+ : raster_buffer_provider_(base::WrapUnique<RasterBufferProvider>(
+ new FakeRasterBufferProviderImpl)) {}
+
+FakeTileTaskManagerImpl::FakeTileTaskManagerImpl(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider)
+ : raster_buffer_provider_(std::move(raster_buffer_provider)) {}
FakeTileTaskManagerImpl::~FakeTileTaskManagerImpl() {
DCHECK_EQ(0u, completed_tasks_.size());
@@ -36,4 +42,8 @@
void FakeTileTaskManagerImpl::Shutdown() {}
+RasterBufferProvider* FakeTileTaskManagerImpl::GetRasterBufferProvider() const {
+ return raster_buffer_provider_.get();
+}
+
} // namespace cc
diff --git a/cc/test/fake_tile_task_manager.h b/cc/test/fake_tile_task_manager.h
index 9c97ca06..b6ee2cf 100644
--- a/cc/test/fake_tile_task_manager.h
+++ b/cc/test/fake_tile_task_manager.h
@@ -15,14 +15,19 @@
class FakeTileTaskManagerImpl : public TileTaskManager {
public:
FakeTileTaskManagerImpl();
+ // Ctor for custom raster buffer provider.
+ FakeTileTaskManagerImpl(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider);
~FakeTileTaskManagerImpl() override;
// Overridden from TileTaskManager:
void ScheduleTasks(TaskGraph* graph) override;
void CheckForCompletedTasks() override;
void Shutdown() override;
+ RasterBufferProvider* GetRasterBufferProvider() const override;
protected:
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
Task::Vector completed_tasks_;
};
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index ca8cf5b..4345d05 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -7,6 +7,7 @@
#include "cc/layers/layer.h"
#include "cc/raster/bitmap_raster_buffer_provider.h"
#include "cc/raster/gpu_raster_buffer_provider.h"
+#include "cc/raster/gpu_rasterizer.h"
#include "cc/raster/one_copy_raster_buffer_provider.h"
#include "cc/raster/raster_buffer_provider.h"
#include "cc/raster/zero_copy_raster_buffer_provider.h"
@@ -141,7 +142,7 @@
*raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>(
compositor_context_provider, worker_context_provider,
- resource_provider, false, 0, false);
+ resource_provider, false, 0);
break;
case RASTER_BUFFER_PROVIDER_TYPE_ZERO_COPY:
EXPECT_TRUE(compositor_context_provider);
@@ -160,8 +161,8 @@
*raster_buffer_provider = base::MakeUnique<OneCopyRasterBufferProvider>(
task_runner, compositor_context_provider, worker_context_provider,
resource_provider, max_bytes_per_copy_operation, false,
- max_staging_buffer_usage_in_bytes, PlatformColor::BestTextureFormat(),
- false);
+ max_staging_buffer_usage_in_bytes,
+ PlatformColor::BestTextureFormat());
break;
}
}
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 3f83286..aab3047 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -347,9 +347,8 @@
// uninitialized resources.
tile_task_manager_->Shutdown();
- raster_buffer_provider_->Shutdown();
-
- // Now that all tasks have been finished, we can clear any |orphan_tasks_|.
+ // Now that all tasks have been finished, we can clear any
+ // |orphan_tasks_|.
orphan_tasks_.clear();
tile_task_manager_->CheckForCompletedTasks();
@@ -371,7 +370,6 @@
void TileManager::SetResources(ResourcePool* resource_pool,
ImageDecodeController* image_decode_controller,
TileTaskManager* tile_task_manager,
- RasterBufferProvider* raster_buffer_provider,
size_t scheduled_raster_task_limit,
bool use_gpu_rasterization) {
DCHECK(!tile_task_manager_);
@@ -382,7 +380,6 @@
resource_pool_ = resource_pool;
image_decode_controller_ = image_decode_controller;
tile_task_manager_ = tile_task_manager;
- raster_buffer_provider_ = raster_buffer_provider;
}
void TileManager::Release(Tile* tile) {
@@ -881,11 +878,6 @@
// below, so we do a swap instead of a move.
locked_images_.swap(new_locked_images);
- // We must reduce the amount of unused resources before calling
- // ScheduleTasks to prevent usage from rising above limits.
- resource_pool_->ReduceResourceUsage();
- image_decode_controller_->ReduceCacheUsage();
-
// Insert nodes for our task completion tasks. We enqueue these using
// NONCONCURRENT_FOREGROUND category this is the highest prioirty category and
// we'd like to run these tasks as soon as possible.
@@ -900,8 +892,10 @@
TASK_CATEGORY_NONCONCURRENT_FOREGROUND,
kAllDoneTaskPriority, all_count);
- // Synchronize worker with compositor.
- raster_buffer_provider_->OrderingBarrier();
+ // We must reduce the amount of unused resoruces before calling
+ // ScheduleTasks to prevent usage from rising above limits.
+ resource_pool_->ReduceResourceUsage();
+ image_decode_controller_->ReduceCacheUsage();
// Schedule running of |raster_queue_|. This replaces any previously
// scheduled tasks and effectively cancels all tasks not present
@@ -980,7 +974,7 @@
bool supports_concurrent_execution = !use_gpu_rasterization_;
std::unique_ptr<RasterBuffer> raster_buffer =
- raster_buffer_provider_->AcquireBufferForRaster(
+ tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
resource, resource_content_id, tile->invalidated_id());
return make_scoped_refptr(new RasterTaskImpl(
this, tile, resource, prioritized_tile.raster_source(), playback_settings,
@@ -995,7 +989,8 @@
bool was_canceled) {
DCHECK(tile);
DCHECK(tiles_.find(tile->id()) != tiles_.end());
- raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
+ tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
+ std::move(raster_buffer));
TileDrawInfo& draw_info = tile->draw_info();
DCHECK(tile->raster_task_.get());
@@ -1051,11 +1046,6 @@
tile_task_manager_ = tile_task_manager;
}
-void TileManager::SetRasterBufferProviderForTesting(
- RasterBufferProvider* raster_buffer_provider) {
- raster_buffer_provider_ = raster_buffer_provider;
-}
-
bool TileManager::AreRequiredTilesReadyToDraw(
RasterTilePriorityQueue::Type type) const {
std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
@@ -1225,12 +1215,13 @@
}
ResourceFormat TileManager::DetermineResourceFormat(const Tile* tile) const {
- return raster_buffer_provider_->GetResourceFormat(!tile->is_opaque());
+ return tile_task_manager_->GetRasterBufferProvider()->GetResourceFormat(
+ !tile->is_opaque());
}
bool TileManager::DetermineResourceRequiresSwizzle(const Tile* tile) const {
- return raster_buffer_provider_->GetResourceRequiresSwizzle(
- !tile->is_opaque());
+ return tile_task_manager_->GetRasterBufferProvider()
+ ->GetResourceRequiresSwizzle(!tile->is_opaque());
}
std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
diff --git a/cc/tiles/tile_manager.h b/cc/tiles/tile_manager.h
index 87a8e5c..588bed8 100644
--- a/cc/tiles/tile_manager.h
+++ b/cc/tiles/tile_manager.h
@@ -120,7 +120,6 @@
void SetResources(ResourcePool* resource_pool,
ImageDecodeController* image_decode_controller,
TileTaskManager* tile_task_manager,
- RasterBufferProvider* raster_buffer_provider,
size_t scheduled_raster_task_limit,
bool use_gpu_rasterization);
@@ -149,7 +148,8 @@
TileDrawInfo& draw_info = tiles[i]->draw_info();
draw_info.resource_ = resource_pool_->AcquireResource(
tiles[i]->desired_texture_size(),
- raster_buffer_provider_->GetResourceFormat(false));
+ tile_task_manager_->GetRasterBufferProvider()->GetResourceFormat(
+ false));
}
}
@@ -167,9 +167,6 @@
void SetTileTaskManagerForTesting(TileTaskManager* tile_task_manager);
- void SetRasterBufferProviderForTesting(
- RasterBufferProvider* raster_buffer_provider);
-
void FreeResourcesAndCleanUpReleasedTilesForTesting() {
FreeResourcesForReleasedTiles();
CleanUpReleasedTiles();
@@ -297,7 +294,6 @@
base::SequencedTaskRunner* task_runner_;
ResourcePool* resource_pool_;
TileTaskManager* tile_task_manager_;
- RasterBufferProvider* raster_buffer_provider_;
GlobalStateThatImpactsTilePriority global_state_;
size_t scheduled_raster_task_limit_;
const bool use_partial_raster_;
diff --git a/cc/tiles/tile_manager_unittest.cc b/cc/tiles/tile_manager_unittest.cc
index 0492417..f910c7a 100644
--- a/cc/tiles/tile_manager_unittest.cc
+++ b/cc/tiles/tile_manager_unittest.cc
@@ -1811,6 +1811,15 @@
uint64_t expected_resource_id_;
};
+class VerifyResourceContentIdTileTaskManager : public FakeTileTaskManagerImpl {
+ public:
+ explicit VerifyResourceContentIdTileTaskManager(uint64_t expected_resource_id)
+ : FakeTileTaskManagerImpl(base::WrapUnique<RasterBufferProvider>(
+ new VerifyResourceContentIdRasterBufferProvider(
+ expected_resource_id))) {}
+ ~VerifyResourceContentIdTileTaskManager() override {}
+};
+
// Runs a test to ensure that partial raster is either enabled or disabled,
// depending on |partial_raster_enabled|'s value. Takes ownership of host_impl
// so that cleanup order can be controlled.
@@ -1824,13 +1833,9 @@
// Create a VerifyResourceContentIdTileTaskManager to ensure that the
// raster task we see is created with |kExpectedId|.
- FakeTileTaskManagerImpl tile_task_manager;
- host_impl->tile_manager()->SetTileTaskManagerForTesting(&tile_task_manager);
-
- VerifyResourceContentIdRasterBufferProvider raster_buffer_provider(
- kExpectedId);
- host_impl->tile_manager()->SetRasterBufferProviderForTesting(
- &raster_buffer_provider);
+ VerifyResourceContentIdTileTaskManager verifying_task_manager(kExpectedId);
+ host_impl->tile_manager()->SetTileTaskManagerForTesting(
+ &verifying_task_manager);
// Ensure there's a resource with our |kInvalidatedId| in the resource pool.
host_impl->resource_pool()->ReleaseResource(
diff --git a/cc/tiles/tile_task_manager.cc b/cc/tiles/tile_task_manager.cc
index b57b0572..aa6466ff 100644
--- a/cc/tiles/tile_task_manager.cc
+++ b/cc/tiles/tile_task_manager.cc
@@ -15,19 +15,25 @@
// static
std::unique_ptr<TileTaskManagerImpl> TileTaskManagerImpl::Create(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider,
TaskGraphRunner* task_graph_runner) {
- return base::WrapUnique<TileTaskManagerImpl>(
- new TileTaskManagerImpl(task_graph_runner));
+ return base::WrapUnique<TileTaskManagerImpl>(new TileTaskManagerImpl(
+ std::move(raster_buffer_provider), task_graph_runner));
}
-TileTaskManagerImpl::TileTaskManagerImpl(TaskGraphRunner* task_graph_runner)
- : task_graph_runner_(task_graph_runner),
+TileTaskManagerImpl::TileTaskManagerImpl(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider,
+ TaskGraphRunner* task_graph_runner)
+ : raster_buffer_provider_(std::move(raster_buffer_provider)),
+ task_graph_runner_(task_graph_runner),
namespace_token_(task_graph_runner->GetNamespaceToken()) {}
TileTaskManagerImpl::~TileTaskManagerImpl() {}
void TileTaskManagerImpl::ScheduleTasks(TaskGraph* graph) {
TRACE_EVENT0("cc", "TileTaskManagerImpl::ScheduleTasks");
+
+ raster_buffer_provider_->OrderingBarrier();
task_graph_runner_->ScheduleTasks(namespace_token_, graph);
}
@@ -51,6 +57,12 @@
TaskGraph empty;
task_graph_runner_->ScheduleTasks(namespace_token_, &empty);
task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
+
+ raster_buffer_provider_->Shutdown();
+}
+
+RasterBufferProvider* TileTaskManagerImpl::GetRasterBufferProvider() const {
+ return raster_buffer_provider_.get();
}
} // namespace cc
diff --git a/cc/tiles/tile_task_manager.h b/cc/tiles/tile_task_manager.h
index 7f543c1..60294d67 100644
--- a/cc/tiles/tile_task_manager.h
+++ b/cc/tiles/tile_task_manager.h
@@ -32,6 +32,9 @@
// Shutdown after canceling all previously scheduled tasks.
virtual void Shutdown() = 0;
+
+ // Get RasterBufferProvider.
+ virtual RasterBufferProvider* GetRasterBufferProvider() const = 0;
};
class CC_EXPORT TileTaskManagerImpl : public TileTaskManager {
@@ -39,16 +42,21 @@
~TileTaskManagerImpl() override;
static std::unique_ptr<TileTaskManagerImpl> Create(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider,
TaskGraphRunner* task_graph_runner);
// Overridden from TileTaskManager:
void ScheduleTasks(TaskGraph* graph) override;
void CheckForCompletedTasks() override;
void Shutdown() override;
+ RasterBufferProvider* GetRasterBufferProvider() const override;
protected:
- explicit TileTaskManagerImpl(TaskGraphRunner* task_graph_runner);
+ TileTaskManagerImpl(
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider,
+ TaskGraphRunner* task_graph_runner);
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
TaskGraphRunner* task_graph_runner_;
const NamespaceToken namespace_token_;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 053ae802..6d8aaa6 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -62,6 +62,7 @@
#include "cc/quads/texture_draw_quad.h"
#include "cc/raster/bitmap_raster_buffer_provider.h"
#include "cc/raster/gpu_raster_buffer_provider.h"
+#include "cc/raster/gpu_rasterizer.h"
#include "cc/raster/one_copy_raster_buffer_provider.h"
#include "cc/raster/raster_buffer_provider.h"
#include "cc/raster/synchronous_task_graph_runner.h"
@@ -2167,7 +2168,8 @@
}
void LayerTreeHostImpl::CreateTileManagerResources() {
- CreateResourceAndRasterBufferProvider(&raster_buffer_provider_,
+ std::unique_ptr<RasterBufferProvider> raster_buffer_provider;
+ CreateResourceAndRasterBufferProvider(&raster_buffer_provider,
&resource_pool_);
if (use_gpu_rasterization_) {
@@ -2192,12 +2194,13 @@
task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
}
- tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner);
+ tile_task_manager_ = TileTaskManagerImpl::Create(
+ std::move(raster_buffer_provider), task_graph_runner);
// TODO(vmpstr): Initialize tile task limit at ctor time.
tile_manager_.SetResources(
resource_pool_.get(), image_decode_controller_.get(),
- tile_task_manager_.get(), raster_buffer_provider_.get(),
+ tile_task_manager_.get(),
is_synchronous_single_threaded_ ? std::numeric_limits<size_t>::max()
: settings_.scheduled_raster_task_limit,
use_gpu_rasterization_);
@@ -2236,7 +2239,7 @@
*raster_buffer_provider = base::MakeUnique<GpuRasterBufferProvider>(
compositor_context_provider, worker_context_provider,
resource_provider_.get(), settings_.use_distance_field_text,
- msaa_sample_count, settings_.async_worker_context_enabled);
+ msaa_sample_count);
return;
}
@@ -2272,8 +2275,7 @@
GetTaskRunner(), compositor_context_provider, worker_context_provider,
resource_provider_.get(), max_copy_texture_chromium_size,
settings_.use_partial_raster, settings_.max_staging_buffer_usage_in_bytes,
- settings_.renderer_settings.preferred_tile_format,
- settings_.async_worker_context_enabled);
+ settings_.renderer_settings.preferred_tile_format);
}
void LayerTreeHostImpl::SetLayerTreeMutator(
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index fc802c8f..fad9db7b 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -738,7 +738,6 @@
bool use_msaa_;
GpuRasterizationStatus gpu_rasterization_status_;
bool tree_resources_for_gpu_rasterization_dirty_;
- std::unique_ptr<RasterBufferProvider> raster_buffer_provider_;
std::unique_ptr<TileTaskManager> tile_task_manager_;
std::unique_ptr<ResourcePool> resource_pool_;
std::unique_ptr<Renderer> renderer_;
diff --git a/cc/trees/layer_tree_host_unittest_context.cc b/cc/trees/layer_tree_host_unittest_context.cc
index fd9e73f..2f4c242 100644
--- a/cc/trees/layer_tree_host_unittest_context.cc
+++ b/cc/trees/layer_tree_host_unittest_context.cc
@@ -942,7 +942,7 @@
ResourceId resource = child_resource_provider_->CreateResource(
gfx::Size(4, 4), ResourceProvider::TEXTURE_HINT_IMMUTABLE, RGBA_8888);
ResourceProvider::ScopedWriteLockGL lock(child_resource_provider_.get(),
- resource, false);
+ resource);
gpu::Mailbox mailbox;
gl->GenMailboxCHROMIUM(mailbox.name);