Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 49dae1d6ae988284713422c430f0f1e8a2f814e8..a1492710e27f8adb99466c9ceb1942d924e7b313 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -31,6 +31,7 @@ |
#include "gpu/command_buffer/client/context_support.h" |
#include "gpu/command_buffer/client/gles2_interface.h" |
#include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" |
+#include "media/base/media_switches.h" |
#include "skia/ext/texture_handle.h" |
#include "third_party/khronos/GLES2/gl2.h" |
#include "third_party/khronos/GLES2/gl2ext.h" |
@@ -92,6 +93,7 @@ GLenum TextureToStorageFormat(ResourceFormat format) { |
case RGB_565: |
case ETC1: |
case RED_8: |
+ case RG_88: |
case LUMINANCE_F16: |
NOTREACHED(); |
break; |
@@ -112,6 +114,7 @@ bool IsFormatSupportedForStorage(ResourceFormat format, bool use_bgra) { |
case RGB_565: |
case ETC1: |
case RED_8: |
+ case RG_88: |
case LUMINANCE_F16: |
return false; |
} |
@@ -456,6 +459,11 @@ ResourceProvider::ResourceProvider( |
yuv_resource_format_ = caps.texture_rg ? RED_8 : LUMINANCE_8; |
yuv_highbit_resource_format_ = |
caps.texture_half_float_linear ? LUMINANCE_F16 : yuv_resource_format_; |
+ if (base::FeatureList::IsEnabled(media::kUseRGTexture) || |
+ !caps.texture_half_float_linear) { |
+ yuv_highbit_resource_format_ = |
+ caps.texture_rg ? RG_88 : yuv_highbit_resource_format_; |
+ } |
} |
use_sync_query_ = caps.sync_query; |
@@ -523,6 +531,7 @@ bool ResourceProvider::IsResourceFormatSupported(ResourceFormat format) const { |
case ETC1: |
return caps.texture_format_etc1; |
case RED_8: |
+ case RG_88: |
return caps.texture_rg; |
case LUMINANCE_F16: |
return caps.texture_half_float_linear; |
@@ -656,6 +665,7 @@ ResourceId ResourceProvider::CreateBitmap(const gfx::Size& size, |
ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
const TextureMailbox& mailbox, |
+ ResourceFormat format, |
std::unique_ptr<SingleReleaseCallbackImpl> release_callback_impl, |
bool read_lock_fences_enabled) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
@@ -665,11 +675,10 @@ ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
Resource* resource = nullptr; |
if (mailbox.IsTexture()) { |
resource = InsertResource( |
- id, |
- Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL, |
- mailbox.target(), |
- mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR, |
- TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, RGBA_8888)); |
+ id, Resource(0, mailbox.size_in_pixels(), Resource::EXTERNAL, |
+ mailbox.target(), |
+ mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR, |
+ TEXTURE_HINT_IMMUTABLE, RESOURCE_TYPE_GL_TEXTURE, format)); |
} else { |
DCHECK(mailbox.IsSharedMemory()); |
SharedBitmap* shared_bitmap = mailbox.shared_bitmap(); |
@@ -678,6 +687,7 @@ ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
resource = InsertResource( |
id, Resource(pixels, shared_bitmap, mailbox.size_in_pixels(), |
Resource::EXTERNAL, GL_LINEAR)); |
+ resource->format = format; |
} |
resource->allocated = true; |
resource->set_mailbox(mailbox); |
@@ -692,6 +702,15 @@ ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
return id; |
} |
+// TODO(dswang): remove this method. crbug.com/624436 |
+ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
+ const TextureMailbox& mailbox, |
+ std::unique_ptr<SingleReleaseCallbackImpl> release_callback_impl, |
+ bool read_lock_fences_enabled) { |
+ return CreateResourceFromTextureMailbox( |
+ mailbox, RGBA_8888, std::move(release_callback_impl), false); |
+} |
+ |
ResourceId ResourceProvider::CreateResourceFromTextureMailbox( |
const TextureMailbox& mailbox, |
std::unique_ptr<SingleReleaseCallbackImpl> release_callback_impl) { |
@@ -825,6 +844,10 @@ GLenum ResourceProvider::GetResourceTextureTarget(ResourceId id) { |
return GetResource(id)->target; |
} |
+ResourceFormat ResourceProvider::GetResourceFormat(ResourceId id) { |
+ return GetResource(id)->format; |
+} |
+ |
bool ResourceProvider::IsImmutable(ResourceId id) { |
if (IsGpuResourceType(default_resource_type_)) { |
return GetTextureHint(id) == TEXTURE_HINT_IMMUTABLE; |