summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorreveman <reveman@chromium.org>2014-10-28 15:49:20 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-28 22:49:44 +0000
commiteeba91b525f74890247a93fe022054f12aee18cc (patch)
tree3796e6ae653db0610ea6ee0dd7cdcbd8e3313826
parentb950c3c26267f2e3aa2a95df567da1760577a7fd (diff)
downloadchromium_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.cc67
-rw-r--r--content/common/gpu/gpu_command_buffer_stub.cc7
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory.h15
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory_android.cc7
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory_mac.cc7
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory_ozone.cc7
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory_win.cc7
-rw-r--r--content/common/gpu/gpu_memory_buffer_factory_x11.cc7
-rw-r--r--gpu/command_buffer/service/BUILD.gn2
-rw-r--r--gpu/command_buffer/service/image_factory.cc76
-rw-r--r--gpu/command_buffer/service/image_factory.h54
-rw-r--r--gpu/command_buffer_service.gypi2
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',