Commit a494fc16 authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

Fix CHROMIUM_texture_storage_image detection

Whether or not CHROMIUM_texture_storage_image is supported depends
entirely on the underlying ImageFactory.

Add a function to query if the ImageFactory has the capability to create
anonymous images, and use this to enable relevant parts of FeatureInfo.
Remove the ifdef that was being used to determine whether or not to
enable CHROMIUM_texture_storage_image, because that was just attempting
to match the capabilities of the ImageFactory (and sometimes failing).

I screwed this up in the previous patch because I was checking for
gpu_memory_manager, thinking that it was gpu_memory_buffer_manager.
As it happens CHROMIUM_gpu_memory_manager is unused, so just remove
it.

Bug: 845213, 849478
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;luci.chromium.try:linux_optional_gpu_tests_rel;luci.chromium.try:mac_optional_gpu_tests_rel;luci.chromium.try:win_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: I9d97749863c61954151e9f06dc23949613c2181f
Reviewed-on: https://chromium-review.googlesource.com/1088313Reviewed-by: default avatarccameron <ccameron@chromium.org>
Reviewed-by: default avatarSunny Sachanandani <sunnyps@chromium.org>
Commit-Queue: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565140}
parent e0285d9a
...@@ -33,14 +33,4 @@ scoped_refptr<gl::GLImage> TestImageFactory::CreateImageForGpuMemoryBuffer( ...@@ -33,14 +33,4 @@ scoped_refptr<gl::GLImage> TestImageFactory::CreateImageForGpuMemoryBuffer(
return image; return image;
} }
scoped_refptr<gl::GLImage> TestImageFactory::CreateAnonymousImage(
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) {
NOTREACHED();
return nullptr;
}
} // namespace cc } // namespace cc
...@@ -23,11 +23,6 @@ class TestImageFactory : public gpu::ImageFactory { ...@@ -23,11 +23,6 @@ class TestImageFactory : public gpu::ImageFactory {
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
gpu::SurfaceHandle surface_handle) override; gpu::SurfaceHandle surface_handle) override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) override;
private: private:
DISALLOW_COPY_AND_ASSIGN(TestImageFactory); DISALLOW_COPY_AND_ASSIGN(TestImageFactory);
......
...@@ -320,6 +320,13 @@ bool IsGL_REDSupportedOnFBOs() { ...@@ -320,6 +320,13 @@ bool IsGL_REDSupportedOnFBOs() {
return result; return result;
} }
void FeatureInfo::EnableCHROMIUMTextureStorageImage() {
if (!feature_flags_.chromium_texture_storage_image) {
feature_flags_.chromium_texture_storage_image = true;
AddExtensionString("GL_CHROMIUM_texture_storage_image");
}
}
void FeatureInfo::EnableEXTColorBufferFloat() { void FeatureInfo::EnableEXTColorBufferFloat() {
if (!ext_color_buffer_float_available_) if (!ext_color_buffer_float_available_)
return; return;
...@@ -457,16 +464,6 @@ void FeatureInfo::InitializeFeatures() { ...@@ -457,16 +464,6 @@ void FeatureInfo::InitializeFeatures() {
// so the extension string is always exposed. // so the extension string is always exposed.
AddExtensionString("GL_OES_vertex_array_object"); AddExtensionString("GL_OES_vertex_array_object");
if (!disallowed_features_.gpu_memory_manager) {
// Texture storage image is only usable with native gpu memory buffer support.
#if defined(OS_MACOSX) || (defined(OS_LINUX) && defined(USE_OZONE))
feature_flags_.chromium_texture_storage_image = true;
AddExtensionString("GL_CHROMIUM_texture_storage_image");
#endif
AddExtensionString("GL_CHROMIUM_gpu_memory_manager");
}
if (gl::HasExtension(extensions, "GL_ANGLE_translated_shader_source")) { if (gl::HasExtension(extensions, "GL_ANGLE_translated_shader_source")) {
feature_flags_.angle_translated_shader_source = true; feature_flags_.angle_translated_shader_source = true;
} }
......
...@@ -181,6 +181,7 @@ class GPU_GLES2_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> { ...@@ -181,6 +181,7 @@ class GPU_GLES2_EXPORT FeatureInfo : public base::RefCounted<FeatureInfo> {
bool IsWebGL1OrES2Context() const; bool IsWebGL1OrES2Context() const;
bool IsWebGL2OrES3Context() const; bool IsWebGL2OrES3Context() const;
void EnableCHROMIUMTextureStorageImage();
void EnableCHROMIUMColorBufferFloatRGBA(); void EnableCHROMIUMColorBufferFloatRGBA();
void EnableCHROMIUMColorBufferFloatRGB(); void EnableCHROMIUMColorBufferFloatRGB();
void EnableEXTColorBufferFloat(); void EnableEXTColorBufferFloat();
......
...@@ -2985,6 +2985,11 @@ GLenum BackTexture::Target() { ...@@ -2985,6 +2985,11 @@ GLenum BackTexture::Target() {
bool BackTexture::AllocateNativeGpuMemoryBuffer(const gfx::Size& size, bool BackTexture::AllocateNativeGpuMemoryBuffer(const gfx::Size& size,
GLenum format, GLenum format,
bool zero) { bool zero) {
if (!decoder_->GetContextGroup()
->image_factory()
->SupportsCreateAnonymousImage())
return false;
DCHECK(format == GL_RGB || format == GL_RGBA); DCHECK(format == GL_RGB || format == GL_RGBA);
bool is_cleared = false; bool is_cleared = false;
scoped_refptr<gl::GLImage> image = scoped_refptr<gl::GLImage> image =
...@@ -3407,6 +3412,12 @@ gpu::ContextResult GLES2DecoderImpl::Initialize( ...@@ -3407,6 +3412,12 @@ gpu::ContextResult GLES2DecoderImpl::Initialize(
} }
} }
// Support for CHROMIUM_texture_storage_image depends on the underlying
// ImageFactory's ability to create anonymous images.
gpu::ImageFactory* image_factory = group_->image_factory();
if (image_factory && image_factory->SupportsCreateAnonymousImage())
feature_info_->EnableCHROMIUMTextureStorageImage();
// In theory |needs_emulation| needs to be true on Desktop GL 4.1 or lower. // In theory |needs_emulation| needs to be true on Desktop GL 4.1 or lower.
// However, we set it to true everywhere, not to trust drivers to handle // However, we set it to true everywhere, not to trust drivers to handle
// out-of-bounds buffer accesses. // out-of-bounds buffer accesses.
......
...@@ -64,7 +64,6 @@ struct DisallowedFeatures { ...@@ -64,7 +64,6 @@ struct DisallowedFeatures {
oes_texture_half_float_linear = false; oes_texture_half_float_linear = false;
} }
bool gpu_memory_manager = false;
bool npot_support = false; bool npot_support = false;
bool chromium_color_buffer_float_rgba = false; bool chromium_color_buffer_float_rgba = false;
bool chromium_color_buffer_float_rgb = false; bool chromium_color_buffer_float_rgb = false;
......
...@@ -12,6 +12,10 @@ ImageFactory::ImageFactory() = default; ...@@ -12,6 +12,10 @@ ImageFactory::ImageFactory() = default;
ImageFactory::~ImageFactory() = default; ImageFactory::~ImageFactory() = default;
bool ImageFactory::SupportsCreateAnonymousImage() const {
return false;
}
scoped_refptr<gl::GLImage> ImageFactory::CreateAnonymousImage( scoped_refptr<gl::GLImage> ImageFactory::CreateAnonymousImage(
const gfx::Size& size, const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
......
...@@ -34,6 +34,7 @@ class GPU_EXPORT ImageFactory { ...@@ -34,6 +34,7 @@ class GPU_EXPORT ImageFactory {
// Create an anonymous GLImage backed by a GpuMemoryBuffer that doesn't have a // Create an anonymous GLImage backed by a GpuMemoryBuffer that doesn't have a
// client_id. It can't be passed to other processes. // client_id. It can't be passed to other processes.
virtual bool SupportsCreateAnonymousImage() const;
virtual scoped_refptr<gl::GLImage> CreateAnonymousImage( virtual scoped_refptr<gl::GLImage> CreateAnonymousImage(
const gfx::Size& size, const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
......
...@@ -61,6 +61,10 @@ scoped_refptr<gl::GLImage> TextureImageFactory::CreateImageForGpuMemoryBuffer( ...@@ -61,6 +61,10 @@ scoped_refptr<gl::GLImage> TextureImageFactory::CreateImageForGpuMemoryBuffer(
return nullptr; return nullptr;
} }
bool TextureImageFactory::SupportsCreateAnonymousImage() const {
return true;
}
scoped_refptr<gl::GLImage> TextureImageFactory::CreateAnonymousImage( scoped_refptr<gl::GLImage> TextureImageFactory::CreateAnonymousImage(
const gfx::Size& size, const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
......
...@@ -20,6 +20,7 @@ class TextureImageFactory : public gpu::ImageFactory { ...@@ -20,6 +20,7 @@ class TextureImageFactory : public gpu::ImageFactory {
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
SurfaceHandle surface_handle) override; SurfaceHandle surface_handle) override;
bool SupportsCreateAnonymousImage() const override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size, scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
......
...@@ -510,7 +510,6 @@ gpu::ContextResult InProcessCommandBuffer::InitializeOnGpuThread( ...@@ -510,7 +510,6 @@ gpu::ContextResult InProcessCommandBuffer::InitializeOnGpuThread(
} }
gles2::DisallowedFeatures disallowed_features; gles2::DisallowedFeatures disallowed_features;
disallowed_features.gpu_memory_manager = true;
auto result = decoder_->Initialize(surface_, context_, params.is_offscreen, auto result = decoder_->Initialize(surface_, context_, params.is_offscreen,
disallowed_features, params.attribs); disallowed_features, params.attribs);
if (result != gpu::ContextResult::kSuccess) { if (result != gpu::ContextResult::kSuccess) {
......
...@@ -72,17 +72,6 @@ GpuMemoryBufferFactoryAndroidHardwareBuffer::CreateImageForGpuMemoryBuffer( ...@@ -72,17 +72,6 @@ GpuMemoryBufferFactoryAndroidHardwareBuffer::CreateImageForGpuMemoryBuffer(
return image; return image;
} }
scoped_refptr<gl::GLImage>
GpuMemoryBufferFactoryAndroidHardwareBuffer::CreateAnonymousImage(
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) {
NOTIMPLEMENTED();
return nullptr;
}
unsigned GpuMemoryBufferFactoryAndroidHardwareBuffer::RequiredTextureType() { unsigned GpuMemoryBufferFactoryAndroidHardwareBuffer::RequiredTextureType() {
return GL_TEXTURE_EXTERNAL_OES; return GL_TEXTURE_EXTERNAL_OES;
} }
......
...@@ -42,11 +42,6 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryAndroidHardwareBuffer ...@@ -42,11 +42,6 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryAndroidHardwareBuffer
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
SurfaceHandle surface_handle) override; SurfaceHandle surface_handle) override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) override;
unsigned RequiredTextureType() override; unsigned RequiredTextureType() override;
private: private:
......
...@@ -116,16 +116,6 @@ GpuMemoryBufferFactoryDXGI::CreateImageForGpuMemoryBuffer( ...@@ -116,16 +116,6 @@ GpuMemoryBufferFactoryDXGI::CreateImageForGpuMemoryBuffer(
return image; return image;
} }
scoped_refptr<gl::GLImage> GpuMemoryBufferFactoryDXGI::CreateAnonymousImage(
const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) {
NOTIMPLEMENTED();
return nullptr;
}
unsigned GpuMemoryBufferFactoryDXGI::RequiredTextureType() { unsigned GpuMemoryBufferFactoryDXGI::RequiredTextureType() {
return GL_TEXTURE_2D; return GL_TEXTURE_2D;
} }
......
...@@ -53,11 +53,6 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryDXGI ...@@ -53,11 +53,6 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryDXGI
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
SurfaceHandle surface_handle) override; SurfaceHandle surface_handle) override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format,
gfx::BufferUsage usage,
unsigned internalformat,
bool* is_cleared) override;
unsigned RequiredTextureType() override; unsigned RequiredTextureType() override;
bool SupportsFormatRGB() override; bool SupportsFormatRGB() override;
......
...@@ -99,6 +99,10 @@ ImageFactory* GpuMemoryBufferFactoryIOSurface::AsImageFactory() { ...@@ -99,6 +99,10 @@ ImageFactory* GpuMemoryBufferFactoryIOSurface::AsImageFactory() {
return this; return this;
} }
bool GpuMemoryBufferFactoryIOSurface::SupportsCreateAnonymousImage() const {
return true;
}
scoped_refptr<gl::GLImage> scoped_refptr<gl::GLImage>
GpuMemoryBufferFactoryIOSurface::CreateImageForGpuMemoryBuffer( GpuMemoryBufferFactoryIOSurface::CreateImageForGpuMemoryBuffer(
const gfx::GpuMemoryBufferHandle& handle, const gfx::GpuMemoryBufferHandle& handle,
......
...@@ -54,6 +54,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryIOSurface ...@@ -54,6 +54,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryIOSurface
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
SurfaceHandle surface_handle) override; SurfaceHandle surface_handle) override;
bool SupportsCreateAnonymousImage() const override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size, scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
......
...@@ -134,6 +134,14 @@ GpuMemoryBufferFactoryNativePixmap::CreateImageForGpuMemoryBuffer( ...@@ -134,6 +134,14 @@ GpuMemoryBufferFactoryNativePixmap::CreateImageForGpuMemoryBuffer(
return image; return image;
} }
bool GpuMemoryBufferFactoryNativePixmap::SupportsCreateAnonymousImage() const {
#if defined(USE_OZONE)
return true;
#else
return false;
#endif
}
scoped_refptr<gl::GLImage> scoped_refptr<gl::GLImage>
GpuMemoryBufferFactoryNativePixmap::CreateAnonymousImage( GpuMemoryBufferFactoryNativePixmap::CreateAnonymousImage(
const gfx::Size& size, const gfx::Size& size,
......
...@@ -49,6 +49,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryNativePixmap ...@@ -49,6 +49,7 @@ class GPU_IPC_SERVICE_EXPORT GpuMemoryBufferFactoryNativePixmap
unsigned internalformat, unsigned internalformat,
int client_id, int client_id,
SurfaceHandle surface_handle) override; SurfaceHandle surface_handle) override;
bool SupportsCreateAnonymousImage() const override;
scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size, scoped_refptr<gl::GLImage> CreateAnonymousImage(const gfx::Size& size,
gfx::BufferFormat format, gfx::BufferFormat format,
gfx::BufferUsage usage, gfx::BufferUsage usage,
......
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