Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index d0733c9f095d3214c544baf558ea19bab71168b5..7bf636b1d271bc2212ba0450856dc04ceb12aca8 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -398,43 +398,73 @@ ResourceProvider::Child::Child(const Child& other) = default; |
ResourceProvider::Child::~Child() {} |
+ResourceProvider::Settings::Settings( |
+ ContextProvider* compositor_context_provider, |
+ bool delegated_sync_points_required, |
+ bool use_gpu_memory_buffer_resources, |
+ bool enable_color_correct_rendering) |
+ : default_resource_type(use_gpu_memory_buffer_resources |
+ ? RESOURCE_TYPE_GPU_MEMORY_BUFFER |
+ : RESOURCE_TYPE_GL_TEXTURE), |
+ enable_color_correct_rendering(enable_color_correct_rendering), |
+ delegated_sync_points_required(delegated_sync_points_required) { |
+ if (!compositor_context_provider) { |
+ default_resource_type = RESOURCE_TYPE_BITMAP; |
+ // Pick an arbitrary limit here similar to what hardware might. |
+ max_texture_size = 16 * 1024; |
+ best_texture_format = RGBA_8888; |
+ return; |
+ } |
+ |
+ DCHECK(IsGpuResourceType(default_resource_type)); |
+ |
+ const auto& caps = compositor_context_provider->ContextCapabilities(); |
+ use_texture_storage_ext = caps.texture_storage; |
+ use_texture_format_bgra = caps.texture_format_bgra8888; |
+ use_texture_usage_hint = caps.texture_usage; |
+ use_sync_query = caps.sync_query; |
+ |
+ if (caps.disable_one_component_textures) { |
+ yuv_resource_format = yuv_highbit_resource_format = RGBA_8888; |
+ } else { |
+ yuv_resource_format = caps.texture_rg ? RED_8 : LUMINANCE_8; |
+ yuv_highbit_resource_format = |
+ caps.texture_half_float_linear ? LUMINANCE_F16 : yuv_resource_format; |
+ } |
+ |
+ GLES2Interface* gl = compositor_context_provider->ContextGL(); |
+ gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); |
+ |
+ best_texture_format = |
+ PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra); |
+ best_render_buffer_format = PlatformColor::BestSupportedTextureFormat( |
+ caps.render_buffer_format_bgra8888); |
+} |
+ |
ResourceProvider::ResourceProvider( |
ContextProvider* compositor_context_provider, |
SharedBitmapManager* shared_bitmap_manager, |
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
BlockingTaskRunner* blocking_main_thread_task_runner, |
- int highp_threshold_min, |
size_t id_allocation_chunk_size, |
bool delegated_sync_points_required, |
bool use_gpu_memory_buffer_resources, |
bool enable_color_correct_rendering, |
const BufferToTextureTargetMap& buffer_to_texture_target_map) |
- : compositor_context_provider_(compositor_context_provider), |
+ : settings_(compositor_context_provider, |
+ delegated_sync_points_required, |
+ use_gpu_memory_buffer_resources, |
+ enable_color_correct_rendering), |
+ compositor_context_provider_(compositor_context_provider), |
shared_bitmap_manager_(shared_bitmap_manager), |
gpu_memory_buffer_manager_(gpu_memory_buffer_manager), |
blocking_main_thread_task_runner_(blocking_main_thread_task_runner), |
lost_context_provider_(false), |
- highp_threshold_min_(highp_threshold_min), |
next_id_(1), |
next_child_(1), |
- delegated_sync_points_required_(delegated_sync_points_required), |
- default_resource_type_(use_gpu_memory_buffer_resources |
- ? RESOURCE_TYPE_GPU_MEMORY_BUFFER |
- : RESOURCE_TYPE_GL_TEXTURE), |
- use_texture_storage_ext_(false), |
- use_texture_format_bgra_(false), |
- use_texture_usage_hint_(false), |
- use_compressed_texture_etc1_(false), |
- yuv_resource_format_(LUMINANCE_8), |
- max_texture_size_(0), |
- best_texture_format_(RGBA_8888), |
- best_render_buffer_format_(RGBA_8888), |
- enable_color_correct_rendering_(enable_color_correct_rendering), |
- id_allocation_chunk_size_(id_allocation_chunk_size), |
- use_sync_query_(false), |
buffer_to_texture_target_map_(buffer_to_texture_target_map), |
tracing_id_(g_next_resource_provider_tracing_id.GetNext()) { |
- DCHECK(id_allocation_chunk_size_); |
+ DCHECK(id_allocation_chunk_size); |
DCHECK(thread_checker_.CalledOnValidThread()); |
// In certain cases, ThreadTaskRunnerHandle isn't set (Android Webview). |
@@ -445,49 +475,16 @@ ResourceProvider::ResourceProvider( |
this, "cc::ResourceProvider", base::ThreadTaskRunnerHandle::Get()); |
} |
- if (!compositor_context_provider_) { |
- default_resource_type_ = RESOURCE_TYPE_BITMAP; |
- // Pick an arbitrary limit here similar to what hardware might. |
- max_texture_size_ = 16 * 1024; |
- best_texture_format_ = RGBA_8888; |
+ if (!compositor_context_provider) |
return; |
- } |
DCHECK(!texture_id_allocator_); |
DCHECK(!buffer_id_allocator_); |
- |
- const auto& caps = compositor_context_provider_->ContextCapabilities(); |
- |
- DCHECK(IsGpuResourceType(default_resource_type_)); |
- use_texture_storage_ext_ = caps.texture_storage; |
- use_texture_format_bgra_ = caps.texture_format_bgra8888; |
- use_texture_usage_hint_ = caps.texture_usage; |
- use_compressed_texture_etc1_ = caps.texture_format_etc1; |
- |
- if (caps.disable_one_component_textures) { |
- yuv_resource_format_ = yuv_highbit_resource_format_ = RGBA_8888; |
- } else { |
- yuv_resource_format_ = caps.texture_rg ? RED_8 : LUMINANCE_8; |
- yuv_highbit_resource_format_ = |
- caps.texture_half_float_linear ? LUMINANCE_F16 : yuv_resource_format_; |
- } |
- |
- use_sync_query_ = caps.sync_query; |
- |
GLES2Interface* gl = ContextGL(); |
- |
- max_texture_size_ = 0; // Context expects cleared value. |
- gl->GetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size_); |
- best_texture_format_ = |
- PlatformColor::BestSupportedTextureFormat(use_texture_format_bgra_); |
- |
- best_render_buffer_format_ = PlatformColor::BestSupportedTextureFormat( |
- caps.render_buffer_format_bgra8888); |
- |
texture_id_allocator_.reset( |
- new TextureIdAllocator(gl, id_allocation_chunk_size_)); |
+ new TextureIdAllocator(gl, id_allocation_chunk_size)); |
buffer_id_allocator_.reset( |
- new BufferIdAllocator(gl, id_allocation_chunk_size_)); |
+ new BufferIdAllocator(gl, id_allocation_chunk_size)); |
} |
ResourceProvider::~ResourceProvider() { |
@@ -500,7 +497,7 @@ ResourceProvider::~ResourceProvider() { |
DeleteResourceInternal(resources_.begin(), FOR_SHUTDOWN); |
GLES2Interface* gl = ContextGL(); |
- if (!IsGpuResourceType(default_resource_type_)) { |
+ if (!IsGpuResourceType(settings_.default_resource_type)) { |
// We are not in GL mode, but double check before returning. |
DCHECK(!gl); |
return; |
@@ -565,9 +562,9 @@ void ResourceProvider::LoseResourceForTesting(ResourceId id) { |
ResourceFormat ResourceProvider::YuvResourceFormat(int bits) const { |
if (bits > 8) { |
- return yuv_highbit_resource_format_; |
+ return settings_.yuv_highbit_resource_format; |
} else { |
- return yuv_resource_format_; |
+ return settings_.yuv_resource_format; |
} |
} |
@@ -577,7 +574,7 @@ ResourceId ResourceProvider::CreateResource( |
ResourceFormat format, |
const gfx::ColorSpace& color_space) { |
DCHECK(!size.IsEmpty()); |
- switch (default_resource_type_) { |
+ switch (settings_.default_resource_type) { |
case RESOURCE_TYPE_GPU_MEMORY_BUFFER: |
// GPU memory buffers don't support LUMINANCE_F16. |
if (format != LUMINANCE_F16) { |
@@ -607,7 +604,7 @@ ResourceId ResourceProvider::CreateGpuMemoryBufferResource( |
gfx::BufferUsage usage, |
const gfx::ColorSpace& color_space) { |
DCHECK(!size.IsEmpty()); |
- switch (default_resource_type_) { |
+ switch (settings_.default_resource_type) { |
case RESOURCE_TYPE_GPU_MEMORY_BUFFER: |
case RESOURCE_TYPE_GL_TEXTURE: { |
return CreateGLTexture(size, hint, RESOURCE_TYPE_GPU_MEMORY_BUFFER, |
@@ -629,8 +626,8 @@ ResourceId ResourceProvider::CreateGLTexture( |
ResourceFormat format, |
gfx::BufferUsage usage, |
const gfx::ColorSpace& color_space) { |
- DCHECK_LE(size.width(), max_texture_size_); |
- DCHECK_LE(size.height(), max_texture_size_); |
+ DCHECK_LE(size.width(), settings_.max_texture_size); |
+ DCHECK_LE(size.height(), settings_.max_texture_size); |
DCHECK(thread_checker_.CalledOnValidThread()); |
// TODO(crbug.com/590317): We should not assume that all resources created by |
@@ -859,7 +856,7 @@ GLenum ResourceProvider::GetResourceTextureTarget(ResourceId id) { |
} |
bool ResourceProvider::IsImmutable(ResourceId id) { |
- if (IsGpuResourceType(default_resource_type_)) { |
+ if (IsGpuResourceType(settings_.default_resource_type)) { |
return GetTextureHint(id) == TEXTURE_HINT_IMMUTABLE; |
} else { |
// Software resources are immutable; they cannot change format or be |
@@ -874,7 +871,7 @@ ResourceProvider::TextureHint ResourceProvider::GetTextureHint(ResourceId id) { |
sk_sp<SkColorSpace> ResourceProvider::GetResourceSkColorSpace( |
const Resource* resource) const { |
- if (!enable_color_correct_rendering_) |
+ if (!settings_.enable_color_correct_rendering) |
return nullptr; |
return resource->color_space.ToSkColorSpace(); |
} |
@@ -1354,7 +1351,7 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
Resource* resource = resource_provider_->GetResource(resource_id_); |
DCHECK(resource); |
if (gpu_memory_buffer_) { |
- if (resource_provider_->enable_color_correct_rendering_) |
+ if (resource_provider_->settings_.enable_color_correct_rendering) |
gpu_memory_buffer_->SetColorSpaceForScanout(resource->color_space); |
DCHECK(!resource->gpu_memory_buffer); |
resource_provider_->LazyCreate(resource); |
@@ -1476,12 +1473,12 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, |
// are required. The only case where we allow a sync token to not be set is |
// the case where the image is dirty. In that case we will bind the image |
// lazily and generate a sync token at that point. |
- DCHECK(!delegated_sync_points_required_ || resource->dirty_image || |
+ DCHECK(!settings_.delegated_sync_points_required || resource->dirty_image || |
!resource->needs_sync_token()); |
// If we are validating the resource to be sent, the resource cannot be |
// in a LOCALLY_USED state. It must have been properly synchronized. |
- DCHECK(!delegated_sync_points_required_ || |
+ DCHECK(!settings_.delegated_sync_points_required || |
Resource::LOCALLY_USED != resource->synchronization_state()); |
resources.push_back(resource); |
@@ -1496,7 +1493,7 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, |
CreateMailboxAndBindResource(gl, resource); |
- if (delegated_sync_points_required_) { |
+ if (settings_.delegated_sync_points_required) { |
if (resource->needs_sync_token()) { |
need_synchronization_resources.push_back(resource); |
} else if (resource->mailbox().HasSyncToken() && |
@@ -1509,7 +1506,7 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, |
// Insert sync point to synchronize the mailbox creation or bound textures. |
gpu::SyncToken new_sync_token; |
if (!need_synchronization_resources.empty()) { |
- DCHECK(delegated_sync_points_required_); |
+ DCHECK(settings_.delegated_sync_points_required); |
DCHECK(gl); |
const uint64_t fence_sync = gl->InsertFenceSyncCHROMIUM(); |
gl->OrderingBarrierCHROMIUM(); |
@@ -1518,7 +1515,7 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, |
} |
if (!unverified_sync_tokens.empty()) { |
- DCHECK(delegated_sync_points_required_); |
+ DCHECK(settings_.delegated_sync_points_required); |
DCHECK(gl); |
gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(), |
unverified_sync_tokens.size()); |
@@ -1537,8 +1534,9 @@ void ResourceProvider::PrepareSendToParent(const ResourceIdArray& resource_ids, |
Resource* source = resources[i]; |
const ResourceId id = resource_ids[i]; |
- DCHECK(!delegated_sync_points_required_ || !source->needs_sync_token()); |
- DCHECK(!delegated_sync_points_required_ || |
+ DCHECK(!settings_.delegated_sync_points_required || |
+ !source->needs_sync_token()); |
+ DCHECK(!settings_.delegated_sync_points_required || |
Resource::LOCALLY_USED != source->synchronization_state()); |
TransferableResource resource; |
@@ -1952,7 +1950,8 @@ void ResourceProvider::LazyCreate(Resource* resource) { |
resource->original_filter); |
gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); |
gl->TexParameteri(resource->target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); |
- if (use_texture_usage_hint_ && (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { |
+ if (settings_.use_texture_usage_hint && |
+ (resource->hint & TEXTURE_HINT_FRAMEBUFFER)) { |
gl->TexParameteri(resource->target, GL_TEXTURE_USAGE_ANGLE, |
GL_FRAMEBUFFER_ATTACHMENT_ANGLE); |
} |
@@ -1979,7 +1978,8 @@ void ResourceProvider::LazyAllocate(Resource* resource) { |
gpu_memory_buffer_manager_->CreateGpuMemoryBuffer( |
size, BufferFormat(format), resource->usage, |
gpu::kNullSurfaceHandle); |
- if (resource->gpu_memory_buffer && enable_color_correct_rendering_) { |
+ if (resource->gpu_memory_buffer && |
+ settings_.enable_color_correct_rendering) { |
resource->gpu_memory_buffer->SetColorSpaceForScanout( |
resource->color_space); |
} |
@@ -1991,8 +1991,9 @@ void ResourceProvider::LazyAllocate(Resource* resource) { |
// 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_) && |
+ } else if (settings_.use_texture_storage_ext && |
+ IsFormatSupportedForStorage(format, |
+ settings_.use_texture_format_bgra) && |
(resource->hint & TEXTURE_HINT_IMMUTABLE)) { |
GLenum storage_format = TextureToStorageFormat(format); |
gl->TexStorage2DEXT(resource->target, 1, storage_format, size.width(), |