Commit 4c8002ab authored by Miguel Casas's avatar Miguel Casas Committed by Commit Bot

CanvasResourceProvider: extract ResourceType list logic to a function

This CL makes enum CanvasResourceType an enum class, and
extracts the ResourceType fallback list selection logic
out of CanvasResourceProvider::Create() -- so I can add a
DCHECK() to enforce similarity between vectors.

Bug: 920626
Change-Id: Icac251b0c1e7676b4eb0b1c6876a953858920eff
Reviewed-on: https://chromium-review.googlesource.com/c/1423348
Commit-Queue: Miguel Casas <mcasas@chromium.org>
Reviewed-by: default avatarAndres Calderon Jaramillo <andrescj@chromium.org>
Cr-Commit-Position: refs/heads/master@{#625229}
parent 05cdb4d1
...@@ -436,53 +436,82 @@ class CanvasResourceProviderDirectGpuMemoryBuffer final ...@@ -436,53 +436,82 @@ class CanvasResourceProviderDirectGpuMemoryBuffer final
scoped_refptr<CanvasResource> resource_; scoped_refptr<CanvasResource> resource_;
}; };
enum CanvasResourceType { namespace {
kDirectGpuMemoryBufferResourceType,
kTextureGpuMemoryBufferResourceType, enum class ResourceType {
kBitmapGpuMemoryBufferResourceType, kDirectGpuMemoryBuffer,
kSharedBitmapResourceType, kTextureGpuMemoryBuffer,
kTextureResourceType, kBitmapGpuMemoryBuffer,
kBitmapResourceType, kSharedBitmap,
kTexture,
kBitmap,
}; };
constexpr CanvasResourceType kSoftwareCompositedFallbackList[] = { const std::vector<ResourceType>& GetResourceTypeFallbackList(
kBitmapGpuMemoryBufferResourceType, CanvasResourceProvider::ResourceUsage usage) {
kSharedBitmapResourceType, static const std::vector<ResourceType> kSoftwareFallbackList({
// Fallback to no direct compositing support ResourceType::kBitmap,
kBitmapResourceType, });
};
static const std::vector<ResourceType> kAcceleratedFallbackList({
constexpr CanvasResourceType kSoftwareFallbackList[] = { ResourceType::kTexture,
kBitmapResourceType, // Fallback to software
}; ResourceType::kBitmap,
});
constexpr CanvasResourceType kAcceleratedFallbackList[] = {
kTextureResourceType, static const std::vector<ResourceType> kSoftwareCompositedFallbackList({
// Fallback to software ResourceType::kBitmapGpuMemoryBuffer,
kBitmapResourceType, ResourceType::kSharedBitmap,
}; // Fallback to no direct compositing support
ResourceType::kBitmap,
});
static const std::vector<ResourceType> kAcceleratedCompositedFallbackList({
ResourceType::kTextureGpuMemoryBuffer,
ResourceType::kTexture,
// Fallback to software composited (|kSoftwareCompositedFallbackList|).
ResourceType::kBitmapGpuMemoryBuffer,
ResourceType::kSharedBitmap,
// Fallback to no direct compositing support
ResourceType::kBitmap,
});
DCHECK(std::equal(kAcceleratedCompositedFallbackList.begin() + 2,
kAcceleratedCompositedFallbackList.end(),
kSoftwareCompositedFallbackList.begin(),
kSoftwareCompositedFallbackList.end()));
static const std::vector<ResourceType> kAcceleratedDirectFallbackList({
ResourceType::kDirectGpuMemoryBuffer,
// The rest is equal to |kAcceleratedCompositedFallbackList|.
ResourceType::kTextureGpuMemoryBuffer,
ResourceType::kTexture,
// Fallback to software composited
ResourceType::kBitmapGpuMemoryBuffer,
ResourceType::kSharedBitmap,
// Fallback to no direct compositing support
ResourceType::kBitmap,
});
DCHECK(std::equal(kAcceleratedDirectFallbackList.begin() + 1,
kAcceleratedDirectFallbackList.end(),
kAcceleratedCompositedFallbackList.begin(),
kAcceleratedCompositedFallbackList.end()));
constexpr CanvasResourceType kAcceleratedCompositedFallbackList[] = { switch (usage) {
kTextureGpuMemoryBufferResourceType, case CanvasResourceProvider::kSoftwareResourceUsage:
kTextureResourceType, return kSoftwareFallbackList;
// Fallback to software composited case CanvasResourceProvider::kSoftwareCompositedResourceUsage:
kBitmapGpuMemoryBufferResourceType, return kSoftwareCompositedFallbackList;
kSharedBitmapResourceType, case CanvasResourceProvider::kAcceleratedResourceUsage:
// Fallback to no direct compositing support return kAcceleratedFallbackList;
kBitmapResourceType, case CanvasResourceProvider::kAcceleratedCompositedResourceUsage:
}; return kAcceleratedCompositedFallbackList;
case CanvasResourceProvider::kAcceleratedDirectResourceUsage:
return kAcceleratedDirectFallbackList;
}
NOTREACHED();
}
constexpr CanvasResourceType kAcceleratedDirectFallbackList[] = { } // unnamed namespace
kDirectGpuMemoryBufferResourceType,
// The rest is equal to |kAcceleratedCompositedFallbackList|.
kTextureGpuMemoryBufferResourceType,
kTextureResourceType,
// Fallback to software composited
kBitmapGpuMemoryBufferResourceType,
kSharedBitmapResourceType,
// Fallback to no direct compositing support
kBitmapResourceType,
};
std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create( std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create(
const IntSize& size, const IntSize& size,
...@@ -493,41 +522,17 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create( ...@@ -493,41 +522,17 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create(
PresentationMode presentation_mode, PresentationMode presentation_mode,
base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher, base::WeakPtr<CanvasResourceDispatcher> resource_dispatcher,
bool is_origin_top_left) { bool is_origin_top_left) {
const CanvasResourceType* resource_type_fallback_list = nullptr;
size_t list_length = 0;
switch (usage) {
case kSoftwareResourceUsage:
resource_type_fallback_list = kSoftwareFallbackList;
list_length = base::size(kSoftwareFallbackList);
break;
case kSoftwareCompositedResourceUsage:
resource_type_fallback_list = kSoftwareCompositedFallbackList;
list_length = base::size(kSoftwareCompositedFallbackList);
break;
case kAcceleratedResourceUsage:
resource_type_fallback_list = kAcceleratedFallbackList;
list_length = base::size(kAcceleratedFallbackList);
break;
case kAcceleratedCompositedResourceUsage:
resource_type_fallback_list = kAcceleratedCompositedFallbackList;
list_length = base::size(kAcceleratedCompositedFallbackList);
break;
case kAcceleratedDirectResourceUsage:
resource_type_fallback_list = kAcceleratedDirectFallbackList;
list_length = base::size(kAcceleratedDirectFallbackList);
break;
}
std::unique_ptr<CanvasResourceProvider> provider; std::unique_ptr<CanvasResourceProvider> provider;
for (size_t i = 0; i < list_length; ++i) { const std::vector<ResourceType>& fallback_list =
GetResourceTypeFallbackList(usage);
for (ResourceType resource_type : fallback_list) {
// Note: We are deliberately not using std::move() on // Note: We are deliberately not using std::move() on
// |context_provider_wrapper| and |resource_dispatcher| to ensure that the // |context_provider_wrapper| and |resource_dispatcher| to ensure that the
// pointers remain valid for the next iteration of this loop if necessary. // pointers remain valid for the next iteration of this loop if necessary.
switch (resource_type_fallback_list[i]) { switch (resource_type) {
case kTextureGpuMemoryBufferResourceType: case ResourceType::kTextureGpuMemoryBuffer:
FALLTHROUGH; FALLTHROUGH;
case kDirectGpuMemoryBufferResourceType: case ResourceType::kDirectGpuMemoryBuffer:
if (!SharedGpuContext::IsGpuCompositingEnabled()) if (!SharedGpuContext::IsGpuCompositingEnabled())
continue; continue;
if (presentation_mode != kAllowImageChromiumPresentationMode) if (presentation_mode != kAllowImageChromiumPresentationMode)
...@@ -547,8 +552,7 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create( ...@@ -547,8 +552,7 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create(
DCHECK_EQ(color_params.GLUnsizedInternalFormat(), DCHECK_EQ(color_params.GLUnsizedInternalFormat(),
gpu::InternalFormatForGpuMemoryBufferFormat( gpu::InternalFormatForGpuMemoryBufferFormat(
color_params.GetBufferFormat())); color_params.GetBufferFormat()));
if (resource_type_fallback_list[i] == if (resource_type == ResourceType::kDirectGpuMemoryBuffer) {
kDirectGpuMemoryBufferResourceType) {
provider = provider =
std::make_unique<CanvasResourceProviderDirectGpuMemoryBuffer>( std::make_unique<CanvasResourceProviderDirectGpuMemoryBuffer>(
size, msaa_sample_count, color_params, size, msaa_sample_count, color_params,
...@@ -562,7 +566,7 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create( ...@@ -562,7 +566,7 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create(
is_origin_top_left); is_origin_top_left);
} }
break; break;
case kBitmapGpuMemoryBufferResourceType: case ResourceType::kBitmapGpuMemoryBuffer:
if (!SharedGpuContext::IsGpuCompositingEnabled()) if (!SharedGpuContext::IsGpuCompositingEnabled())
continue; continue;
if (presentation_mode != kAllowImageChromiumPresentationMode) if (presentation_mode != kAllowImageChromiumPresentationMode)
...@@ -580,20 +584,20 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create( ...@@ -580,20 +584,20 @@ std::unique_ptr<CanvasResourceProvider> CanvasResourceProvider::Create(
size, color_params, context_provider_wrapper, size, color_params, context_provider_wrapper,
resource_dispatcher); resource_dispatcher);
break; break;
case kSharedBitmapResourceType: case ResourceType::kSharedBitmap:
if (!resource_dispatcher) if (!resource_dispatcher)
continue; continue;
provider = std::make_unique<CanvasResourceProviderSharedBitmap>( provider = std::make_unique<CanvasResourceProviderSharedBitmap>(
size, color_params, resource_dispatcher); size, color_params, resource_dispatcher);
break; break;
case kTextureResourceType: case ResourceType::kTexture:
if (!context_provider_wrapper) if (!context_provider_wrapper)
continue; continue;
provider = std::make_unique<CanvasResourceProviderTexture>( provider = std::make_unique<CanvasResourceProviderTexture>(
size, msaa_sample_count, color_params, context_provider_wrapper, size, msaa_sample_count, color_params, context_provider_wrapper,
resource_dispatcher, is_origin_top_left); resource_dispatcher, is_origin_top_left);
break; break;
case kBitmapResourceType: case ResourceType::kBitmap:
provider = std::make_unique<CanvasResourceProviderBitmap>( provider = std::make_unique<CanvasResourceProviderBitmap>(
size, color_params, context_provider_wrapper, resource_dispatcher); size, color_params, context_provider_wrapper, resource_dispatcher);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment