diff options
author | reveman <reveman@chromium.org> | 2014-10-28 15:49:20 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-28 22:49:44 +0000 |
commit | eeba91b525f74890247a93fe022054f12aee18cc (patch) | |
tree | 3796e6ae653db0610ea6ee0dd7cdcbd8e3313826 | |
parent | b950c3c26267f2e3aa2a95df567da1760577a7fd (diff) | |
download | chromium_src-eeba91b525f74890247a93fe022054f12aee18cc.zip chromium_src-eeba91b525f74890247a93fe022054f12aee18cc.tar.gz chromium_src-eeba91b525f74890247a93fe022054f12aee18cc.tar.bz2 |
gpu: Move image creation part of GpuMemoryBufferFactory interface to gpu namespace.
This moves the image creation part of the GpuMemoryBufferFactory
interface to a new ImageFactory interface in the gpu namespace. This
is necessary for in-process command buffer to be able to create
images.
This also moves some utility functions from CommandBufferProxy to
this new ImageFactory interface so they can be reused by the
in-process command buffer code.
BUG=423533
Review URL: https://codereview.chromium.org/659883003
Cr-Commit-Position: refs/heads/master@{#301732}
-rw-r--r-- | content/common/gpu/client/command_buffer_proxy_impl.cc | 67 | ||||
-rw-r--r-- | content/common/gpu/gpu_command_buffer_stub.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory.h | 15 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory_android.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory_mac.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory_ozone.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory_win.cc | 7 | ||||
-rw-r--r-- | content/common/gpu/gpu_memory_buffer_factory_x11.cc | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/BUILD.gn | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/image_factory.cc | 76 | ||||
-rw-r--r-- | gpu/command_buffer/service/image_factory.h | 54 | ||||
-rw-r--r-- | gpu/command_buffer_service.gypi | 2 |
12 files changed, 180 insertions, 78 deletions
diff --git a/content/common/gpu/client/command_buffer_proxy_impl.cc b/content/common/gpu/client/command_buffer_proxy_impl.cc index 13bade3..9acf05a 100644 --- a/content/common/gpu/client/command_buffer_proxy_impl.cc +++ b/content/common/gpu/client/command_buffer_proxy_impl.cc @@ -19,68 +19,11 @@ #include "gpu/command_buffer/common/cmd_buffer_common.h" #include "gpu/command_buffer/common/command_buffer_shared.h" #include "gpu/command_buffer/common/gpu_memory_allocation.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gfx/size.h" #include "ui/gl/gl_bindings.h" namespace content { -namespace { - -gfx::GpuMemoryBuffer::Format ImageFormatToGpuMemoryBufferFormat( - unsigned internalformat) { - switch (internalformat) { - case GL_RGB: - return gfx::GpuMemoryBuffer::RGBX_8888; - case GL_RGBA: - return gfx::GpuMemoryBuffer::RGBA_8888; - default: - NOTREACHED(); - return gfx::GpuMemoryBuffer::RGBA_8888; - } -} - -gfx::GpuMemoryBuffer::Usage ImageUsageToGpuMemoryBufferUsage(unsigned usage) { - switch (usage) { - case GL_MAP_CHROMIUM: - return gfx::GpuMemoryBuffer::MAP; - case GL_SCANOUT_CHROMIUM: - return gfx::GpuMemoryBuffer::SCANOUT; - default: - NOTREACHED(); - return gfx::GpuMemoryBuffer::MAP; - } -} - -bool IsImageFormatCompatibleWithGpuMemoryBufferFormat( - gfx::GpuMemoryBuffer::Format format, - unsigned internalformat) { - switch (internalformat) { - case GL_RGB: - switch (format) { - case gfx::GpuMemoryBuffer::RGBX_8888: - return true; - case gfx::GpuMemoryBuffer::RGBA_8888: - case gfx::GpuMemoryBuffer::BGRA_8888: - return false; - } - NOTREACHED(); - return false; - case GL_RGBA: - switch (format) { - case gfx::GpuMemoryBuffer::RGBX_8888: - return false; - case gfx::GpuMemoryBuffer::RGBA_8888: - case gfx::GpuMemoryBuffer::BGRA_8888: - return true; - } - NOTREACHED(); - return false; - default: - NOTREACHED(); - return false; - } -} - -} // namespace CommandBufferProxyImpl::CommandBufferProxyImpl( GpuChannelHost* channel, @@ -377,8 +320,8 @@ int32_t CommandBufferProxyImpl::CreateImage(ClientBuffer buffer, channel_->ShareGpuMemoryBufferToGpuProcess( gpu_memory_buffer->GetHandle()); - DCHECK(IsImageFormatCompatibleWithGpuMemoryBufferFormat( - gpu_memory_buffer->GetFormat(), internalformat)); + DCHECK(gpu::ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat( + internalformat, gpu_memory_buffer->GetFormat())); if (!Send(new GpuCommandBufferMsg_CreateImage(route_id_, new_id, handle, @@ -406,8 +349,8 @@ int32_t CommandBufferProxyImpl::CreateGpuMemoryBufferImage( scoped_ptr<gfx::GpuMemoryBuffer> buffer( channel_->gpu_memory_buffer_manager()->AllocateGpuMemoryBuffer( gfx::Size(width, height), - ImageFormatToGpuMemoryBufferFormat(internalformat), - ImageUsageToGpuMemoryBufferUsage(usage))); + gpu::ImageFactory::ImageFormatToGpuMemoryBufferFormat(internalformat), + gpu::ImageFactory::ImageUsageToGpuMemoryBufferUsage(usage))); if (!buffer) return -1; diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc index 1a8cc17..80d0ee2 100644 --- a/content/common/gpu/gpu_command_buffer_stub.cc +++ b/content/common/gpu/gpu_command_buffer_stub.cc @@ -30,6 +30,7 @@ #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/service/gl_context_virtual.h" #include "gpu/command_buffer/service/gl_state_restorer_impl.h" +#include "gpu/command_buffer/service/image_factory.h" #include "gpu/command_buffer/service/image_manager.h" #include "gpu/command_buffer/service/logger.h" #include "gpu/command_buffer/service/mailbox_manager.h" @@ -957,8 +958,10 @@ void GpuCommandBufferStub::OnCreateImage(int32 id, GpuChannelManager* manager = channel_->gpu_channel_manager(); scoped_refptr<gfx::GLImage> image = - manager->gpu_memory_buffer_factory()->CreateImageForGpuMemoryBuffer( - handle, size, format, internalformat, channel()->client_id()); + manager->gpu_memory_buffer_factory() + ->AsImageFactory() + ->CreateImageForGpuMemoryBuffer( + handle, size, format, internalformat, channel()->client_id()); if (!image.get()) return; diff --git a/content/common/gpu/gpu_memory_buffer_factory.h b/content/common/gpu/gpu_memory_buffer_factory.h index 473f30b..0c06537 100644 --- a/content/common/gpu/gpu_memory_buffer_factory.h +++ b/content/common/gpu/gpu_memory_buffer_factory.h @@ -14,6 +14,10 @@ namespace gfx { class GLImage; } +namespace gpu { +class ImageFactory; +} + namespace content { class GpuMemoryBufferFactory { @@ -37,15 +41,8 @@ class GpuMemoryBufferFactory { virtual void DestroyGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle) = 0; - // Creates a GLImage instance for GPU memory buffer identified by |handle|. - // |client_id| should be set to the client requesting the creation of instance - // and can be used by factory implementation to verify access rights. - virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( - const gfx::GpuMemoryBufferHandle& handle, - const gfx::Size& size, - gfx::GpuMemoryBuffer::Format format, - unsigned internalformat, - int client_id) = 0; + // Type-checking downcast routine. + virtual gpu::ImageFactory* AsImageFactory() = 0; private: DISALLOW_COPY_AND_ASSIGN(GpuMemoryBufferFactory); diff --git a/content/common/gpu/gpu_memory_buffer_factory_android.cc b/content/common/gpu/gpu_memory_buffer_factory_android.cc index 9730ffb..4c92263 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_android.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_android.cc @@ -6,13 +6,15 @@ #include "base/logging.h" #include "content/common/gpu/gpu_memory_buffer_factory_surface_texture.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" namespace content { namespace { -class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { +class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory, + public gpu::ImageFactory { public: // Overridden from GpuMemoryBufferFactory: virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( @@ -40,6 +42,9 @@ class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { break; } } + virtual gpu::ImageFactory* AsImageFactory() override { return this; } + + // Overridden from gpu::ImageFactory: virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, diff --git a/content/common/gpu/gpu_memory_buffer_factory_mac.cc b/content/common/gpu/gpu_memory_buffer_factory_mac.cc index 3494cd7..2ad5bc9 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_mac.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_mac.cc @@ -6,13 +6,15 @@ #include "base/logging.h" #include "content/common/gpu/gpu_memory_buffer_factory_io_surface.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" namespace content { namespace { -class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { +class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory, + public gpu::ImageFactory { public: // Overridden from GpuMemoryBufferFactory: gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( @@ -40,6 +42,9 @@ class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { break; } } + gpu::ImageFactory* AsImageFactory() override { return this; } + + // Overridden from gpu::ImageFactory: scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, diff --git a/content/common/gpu/gpu_memory_buffer_factory_ozone.cc b/content/common/gpu/gpu_memory_buffer_factory_ozone.cc index be0492a..4259a46 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_ozone.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_ozone.cc @@ -5,6 +5,7 @@ #include "content/common/gpu/gpu_memory_buffer_factory.h" #include "base/logging.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" #include "ui/ozone/gpu/gpu_memory_buffer_factory_ozone_native_buffer.h" @@ -12,7 +13,8 @@ namespace content { namespace { -class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { +class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory, + public gpu::ImageFactory { public: // Overridden from GpuMemoryBufferFactory: virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( @@ -42,6 +44,9 @@ class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { break; } } + virtual gpu::ImageFactory* AsImageFactory() override { return this; } + + // Overridden from gpu::ImageFactory: virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, diff --git a/content/common/gpu/gpu_memory_buffer_factory_win.cc b/content/common/gpu/gpu_memory_buffer_factory_win.cc index fde3e2a..75d91d2 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_win.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_win.cc @@ -5,13 +5,15 @@ #include "content/common/gpu/gpu_memory_buffer_factory.h" #include "base/logging.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" namespace content { namespace { -class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { +class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory, + public gpu::ImageFactory { public: // Overridden from GpuMemoryBufferFactory: virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( @@ -26,6 +28,9 @@ class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { const gfx::GpuMemoryBufferHandle& handle) override { NOTREACHED(); } + virtual gpu::ImageFactory* AsImageFactory() override { return this; } + + // Overridden from gpu::ImageFactory: virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, diff --git a/content/common/gpu/gpu_memory_buffer_factory_x11.cc b/content/common/gpu/gpu_memory_buffer_factory_x11.cc index 2131eb1..0f71392 100644 --- a/content/common/gpu/gpu_memory_buffer_factory_x11.cc +++ b/content/common/gpu/gpu_memory_buffer_factory_x11.cc @@ -6,13 +6,15 @@ #include "base/logging.h" #include "content/common/gpu/gpu_memory_buffer_factory_x11_pixmap.h" +#include "gpu/command_buffer/service/image_factory.h" #include "ui/gl/gl_image.h" #include "ui/gl/gl_image_shared_memory.h" namespace content { namespace { -class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { +class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory, + public gpu::ImageFactory { public: // Overridden from GpuMemoryBufferFactory: virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBuffer( @@ -41,6 +43,9 @@ class GpuMemoryBufferFactoryImpl : public GpuMemoryBufferFactory { break; } } + virtual gpu::ImageFactory* AsImageFactory() override { return this; } + + // Overridden from gpu::GpuMemoryBufferFactory: virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( const gfx::GpuMemoryBufferHandle& handle, const gfx::Size& size, diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 3b2b782..8293fbc 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn @@ -69,6 +69,8 @@ source_set("service") { "gpu_tracer.h", "id_manager.h", "id_manager.cc", + "image_factory.cc", + "image_factory.h", "image_manager.cc", "image_manager.h", "in_process_command_buffer.cc", diff --git a/gpu/command_buffer/service/image_factory.cc b/gpu/command_buffer/service/image_factory.cc new file mode 100644 index 0000000..0b740d8 --- /dev/null +++ b/gpu/command_buffer/service/image_factory.cc @@ -0,0 +1,76 @@ +// Copyright 2014 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 "gpu/command_buffer/service/image_factory.h" + +#include "ui/gl/gl_bindings.h" + +namespace gpu { + +ImageFactory::ImageFactory() { +} + +ImageFactory::~ImageFactory() { +} + +// static +gfx::GpuMemoryBuffer::Format ImageFactory::ImageFormatToGpuMemoryBufferFormat( + unsigned internalformat) { + switch (internalformat) { + case GL_RGB: + return gfx::GpuMemoryBuffer::RGBX_8888; + case GL_RGBA: + return gfx::GpuMemoryBuffer::RGBA_8888; + default: + NOTREACHED(); + return gfx::GpuMemoryBuffer::RGBA_8888; + } +} + +// static +gfx::GpuMemoryBuffer::Usage ImageFactory::ImageUsageToGpuMemoryBufferUsage( + unsigned usage) { + switch (usage) { + case GL_MAP_CHROMIUM: + return gfx::GpuMemoryBuffer::MAP; + case GL_SCANOUT_CHROMIUM: + return gfx::GpuMemoryBuffer::SCANOUT; + default: + NOTREACHED(); + return gfx::GpuMemoryBuffer::MAP; + } +} + +// static +bool ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat( + unsigned internalformat, + gfx::GpuMemoryBuffer::Format format) { + switch (internalformat) { + case GL_RGB: + switch (format) { + case gfx::GpuMemoryBuffer::RGBX_8888: + return true; + case gfx::GpuMemoryBuffer::RGBA_8888: + case gfx::GpuMemoryBuffer::BGRA_8888: + return false; + } + NOTREACHED(); + return false; + case GL_RGBA: + switch (format) { + case gfx::GpuMemoryBuffer::RGBX_8888: + return false; + case gfx::GpuMemoryBuffer::RGBA_8888: + case gfx::GpuMemoryBuffer::BGRA_8888: + return true; + } + NOTREACHED(); + return false; + default: + NOTREACHED(); + return false; + } +} + +} // namespace gpu diff --git a/gpu/command_buffer/service/image_factory.h b/gpu/command_buffer/service/image_factory.h new file mode 100644 index 0000000..40dd15a0e --- /dev/null +++ b/gpu/command_buffer/service/image_factory.h @@ -0,0 +1,54 @@ +// Copyright 2014 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 GPU_COMMAND_BUFFER_SERVICE_IMAGE_FACTORY_H_ +#define GPU_COMMAND_BUFFER_SERVICE_IMAGE_FACTORY_H_ + +#include "base/memory/ref_counted.h" +#include "gpu/gpu_export.h" +#include "ui/gfx/geometry/size.h" +#include "ui/gfx/gpu_memory_buffer.h" + +namespace gfx { +class GLImage; +} + +namespace gpu { + +class GPU_EXPORT ImageFactory { + public: + ImageFactory(); + + // Returns a valid GpuMemoryBuffer format given a valid internalformat as + // defined by CHROMIUM_gpu_memory_buffer_image. + static gfx::GpuMemoryBuffer::Format ImageFormatToGpuMemoryBufferFormat( + unsigned internalformat); + + // Returns a valid GpuMemoryBuffer usage given a valid usage as defined by + // CHROMIUM_gpu_memory_buffer_image. + static gfx::GpuMemoryBuffer::Usage ImageUsageToGpuMemoryBufferUsage( + unsigned usage); + + // Returns true if |internalformat| is compatible with |format|. + static bool IsImageFormatCompatibleWithGpuMemoryBufferFormat( + unsigned internalformat, + gfx::GpuMemoryBuffer::Format format); + + // Creates a GLImage instance for GPU memory buffer identified by |handle|. + // |client_id| should be set to the client requesting the creation of instance + // and can be used by factory implementation to verify access rights. + virtual scoped_refptr<gfx::GLImage> CreateImageForGpuMemoryBuffer( + const gfx::GpuMemoryBufferHandle& handle, + const gfx::Size& size, + gfx::GpuMemoryBuffer::Format format, + unsigned internalformat, + int client_id) = 0; + + protected: + virtual ~ImageFactory(); +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_IMAGE_FACTORY_H_ diff --git a/gpu/command_buffer_service.gypi b/gpu/command_buffer_service.gypi index 4814cb2..f1ed489 100644 --- a/gpu/command_buffer_service.gypi +++ b/gpu/command_buffer_service.gypi @@ -87,6 +87,8 @@ 'command_buffer/service/gpu_tracer.h', 'command_buffer/service/id_manager.h', 'command_buffer/service/id_manager.cc', + 'command_buffer/service/image_factory.cc', + 'command_buffer/service/image_factory.h', 'command_buffer/service/image_manager.cc', 'command_buffer/service/image_manager.h', 'command_buffer/service/in_process_command_buffer.cc', |