summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy
diff options
context:
space:
mode:
authorabarth@chromium.org <abarth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-08 07:50:40 +0000
committerabarth@chromium.org <abarth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-12-08 07:50:40 +0000
commit3acbbae42b47be2b5a347744ea8c84a99123b2a0 (patch)
tree5f3593d74369ad0f061fdebefa7b80ef8c3380e9 /ppapi/proxy
parent416ad1e494da96ded9cc8828dac5606277f1437d (diff)
downloadchromium_src-3acbbae42b47be2b5a347744ea8c84a99123b2a0.zip
chromium_src-3acbbae42b47be2b5a347744ea8c84a99123b2a0.tar.gz
chromium_src-3acbbae42b47be2b5a347744ea8c84a99123b2a0.tar.bz2
Teach PPAPI proxy to share image memory on Mac OS X
Instead of just using base::SharedMemory, we use SysV shared memory on Linux so that we can share memory with X. Normally we abstract this detail away with TransportDIB, but the TransportDIB lives in chrome/app, which is outside the dependency cone of ppapi/proxy. This patch creates a new abstraction at this layer of the dependency graph called ImageData::ImageHandle that represents shared memory for the purpose of image data. This patch also fills in the implementation of this abstraction on Mac OS X. Consequently, out-of-process PPAPI plugins on Mac can now draw to the screen. Review URL: http://codereview.chromium.org/5658003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68569 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy')
-rw-r--r--ppapi/proxy/image_data.cc91
-rw-r--r--ppapi/proxy/image_data.h44
-rw-r--r--ppapi/proxy/ppapi_messages_internal.h2
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.cc79
-rw-r--r--ppapi/proxy/ppb_image_data_proxy.h4
-rw-r--r--ppapi/proxy/serialized_structs.h13
6 files changed, 157 insertions, 76 deletions
diff --git a/ppapi/proxy/image_data.cc b/ppapi/proxy/image_data.cc
new file mode 100644
index 0000000..c01896d
--- /dev/null
+++ b/ppapi/proxy/image_data.cc
@@ -0,0 +1,91 @@
+// Copyright (c) 2010 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 "ppapi/proxy/image_data.h"
+
+#if defined(OS_LINUX)
+#include <sys/shm.h>
+#endif
+
+#if defined(OS_MACOSX)
+#include <sys/stat.h>
+#include <sys/mman.h>
+#endif
+
+namespace pp {
+namespace proxy {
+
+ImageData::ImageData(const PP_ImageDataDesc& desc, ImageHandle handle)
+ : desc_(desc),
+ handle_(handle),
+ mapped_data_(NULL) {
+}
+
+ImageData::~ImageData() {
+ Unmap();
+}
+
+void* ImageData::Map() {
+#if defined(OS_WIN)
+ NOTIMPLEMENTED();
+ return NULL;
+#elif defined(OS_MACOSX)
+ struct stat st;
+ if (fstat(handle_.fd, &st) != 0)
+ return NULL;
+ void* memory = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE,
+ MAP_SHARED, handle_.fd, 0);
+ if (memory == MAP_FAILED)
+ return NULL;
+ mapped_data_ = memory;
+ return mapped_data_;
+#else
+ return NULL;
+ int shmkey = handle_;
+ void* address = shmat(shmkey, NULL, 0);
+ // Mark for deletion in case we crash so the kernel will clean it up.
+ shmctl(shmkey, IPC_RMID, 0);
+ if (address == (void*)-1)
+ return NULL;
+ mapped_data_ = address;
+ return address;
+#endif
+}
+
+void ImageData::Unmap() {
+#if defined(OS_WIN)
+ NOTIMPLEMENTED();
+#elif defined(OS_MACOSX)
+ if (mapped_data_) {
+ struct stat st;
+ if (fstat(handle_.fd, &st) == 0)
+ munmap(mapped_data_, st.st_size);
+ }
+#else
+ if (mapped_data_)
+ shmdt(mapped_data_);
+#endif
+ mapped_data_ = NULL;
+}
+
+#if defined(OS_WIN)
+const ImageHandle ImageData::NullHandle = NULL;
+#elif defined(OS_MACOSX)
+const ImageHandle ImageData::NullHandle = ImageHandle();
+#else
+const ImageHandle ImageData::NullHandle = 0;
+#endif
+
+ImageHandle ImageData::HandleFromInt(int32_t i) {
+#if defined(OS_WIN)
+ return reinterpret_cast<ImageHandle>(i);
+#elif defined(OS_MACOSX)
+ return ImageHandle(i, false);
+#else
+ return static_cast<ImageHandle>(i);
+#endif
+}
+
+} // namespace proxy
+} // namespace pp
diff --git a/ppapi/proxy/image_data.h b/ppapi/proxy/image_data.h
new file mode 100644
index 0000000..fb4a839
--- /dev/null
+++ b/ppapi/proxy/image_data.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2010 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 PPAPI_PROXY_IMAGE_DATA_H_
+#define PPAPI_PROXY_IMAGE_DATA_H_
+
+#include "base/shared_memory.h"
+#include "ppapi/c/ppb_image_data.h"
+#include "ppapi/proxy/plugin_resource.h"
+#include "ppapi/proxy/serialized_structs.h"
+
+namespace pp {
+namespace proxy {
+
+class ImageData : public PluginResource {
+ public:
+ ImageData(const PP_ImageDataDesc& desc, ImageHandle handle);
+ virtual ~ImageData();
+
+ // Resource overrides.
+ virtual ImageData* AsImageData() { return this; }
+
+ void* Map();
+ void Unmap();
+
+ const PP_ImageDataDesc& desc() const { return desc_; }
+
+ static const ImageHandle NullHandle;
+ static ImageHandle HandleFromInt(int32_t i);
+
+ private:
+ PP_ImageDataDesc desc_;
+ ImageHandle handle_;
+
+ void* mapped_data_;
+
+ DISALLOW_COPY_AND_ASSIGN(ImageData);
+};
+
+} // namespace proxy
+} // namespace pp
+
+#endif // PPAPI_PROXY_IMAGE_DATA_H_
diff --git a/ppapi/proxy/ppapi_messages_internal.h b/ppapi/proxy/ppapi_messages_internal.h
index 5259725..5e9ad61 100644
--- a/ppapi/proxy/ppapi_messages_internal.h
+++ b/ppapi/proxy/ppapi_messages_internal.h
@@ -359,7 +359,7 @@ IPC_BEGIN_MESSAGES(PpapiHost)
PP_Bool /* init_to_zero */,
PP_Resource /* result_resource */,
std::string /* image_data_desc */,
- int32_t /* result_shm_handle */)
+ pp::proxy::ImageHandle /* result */)
// PPB_Instance.
IPC_SYNC_MESSAGE_ROUTED1_1(PpapiHostMsg_PPBInstance_GetWindowObject,
diff --git a/ppapi/proxy/ppb_image_data_proxy.cc b/ppapi/proxy/ppb_image_data_proxy.cc
index a3ffe71..4fa4205 100644
--- a/ppapi/proxy/ppb_image_data_proxy.cc
+++ b/ppapi/proxy/ppb_image_data_proxy.cc
@@ -13,79 +13,14 @@
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
-#include "ppapi/c/ppb_image_data.h"
#include "ppapi/c/trusted/ppb_image_data_trusted.h"
+#include "ppapi/proxy/image_data.h"
#include "ppapi/proxy/plugin_dispatcher.h"
-#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
-#if defined(OS_LINUX)
-#include <sys/shm.h>
-#endif
-
namespace pp {
namespace proxy {
-class ImageData : public PluginResource {
- public:
- ImageData(const PP_ImageDataDesc& desc, int memory_handle);
- virtual ~ImageData();
-
- // Resource overrides.
- virtual ImageData* AsImageData() { return this; }
-
- void* Map();
- void Unmap();
-
- const PP_ImageDataDesc& desc() const { return desc_; }
-
- private:
- PP_ImageDataDesc desc_;
- int memory_handle_;
-
- void* mapped_data_;
-
- DISALLOW_COPY_AND_ASSIGN(ImageData);
-};
-
-ImageData::ImageData(const PP_ImageDataDesc& desc,
- int memory_handle)
- : desc_(desc),
- memory_handle_(memory_handle),
- mapped_data_(NULL) {
-}
-
-ImageData::~ImageData() {
- Unmap();
-}
-
-void* ImageData::Map() {
-#if defined(OS_LINUX)
- // On linux, the memory handle is a SysV shared memory segment.
- int shmkey = memory_handle_;
- void* address = shmat(shmkey, NULL, 0);
- // Mark for deletion in case we crash so the kernel will clean it up.
- shmctl(shmkey, IPC_RMID, 0);
- if (address == (void*)-1)
- return NULL;
- mapped_data_ = address;
- return address;
-#else
- NOTIMPLEMENTED();
- return NULL;
-#endif
-}
-
-void ImageData::Unmap() {
-#if defined(OS_LINUX)
- if (mapped_data_)
- shmdt(mapped_data_);
-#else
- NOTIMPLEMENTED();
-#endif
- mapped_data_ = NULL;
-}
-
namespace {
PP_ImageDataFormat GetNativeImageDataFormat() {
@@ -111,11 +46,11 @@ PP_Resource Create(PP_Module module_id,
PP_Bool init_to_zero) {
PP_Resource result = 0;
std::string image_data_desc;
- int shm_handle = -1;
+ ImageHandle image_handle = ImageData::NullHandle;
PluginDispatcher::Get()->Send(
new PpapiHostMsg_PPBImageData_Create(
INTERFACE_ID_PPB_IMAGE_DATA, module_id, format, *size, init_to_zero,
- &result, &image_data_desc, &shm_handle));
+ &result, &image_data_desc, &image_handle));
if (result && image_data_desc.size() == sizeof(PP_ImageDataDesc)) {
// We serialize the PP_ImageDataDesc just by copying to a string.
@@ -123,7 +58,7 @@ PP_Resource Create(PP_Module module_id,
memcpy(&desc, image_data_desc.data(), sizeof(PP_ImageDataDesc));
linked_ptr<ImageData> object(
- new ImageData(desc, shm_handle));
+ new ImageData(desc, image_handle));
PluginDispatcher::Get()->plugin_resource_tracker()->AddResource(
result, object);
}
@@ -211,10 +146,10 @@ void PPB_ImageData_Proxy::OnMsgCreate(PP_Module module,
PP_Bool init_to_zero,
PP_Resource* result,
std::string* image_data_desc,
- int* result_shm_handle) {
+ ImageHandle* result_image_handle) {
*result = ppb_image_data_target()->Create(
module, static_cast<PP_ImageDataFormat>(format), &size, init_to_zero);
- *result_shm_handle = 0;
+ *result_image_handle = ImageData::NullHandle;
if (*result) {
// The ImageDesc is just serialized as a string.
PP_ImageDataDesc desc;
@@ -231,7 +166,7 @@ void PPB_ImageData_Proxy::OnMsgCreate(PP_Module module,
if (trusted) {
int32_t handle;
if (trusted->GetSharedMemory(*result, &handle, &byte_count) == PP_OK)
- *result_shm_handle = static_cast<int>(handle);
+ *result_image_handle = ImageData::HandleFromInt(handle);
}
}
}
diff --git a/ppapi/proxy/ppb_image_data_proxy.h b/ppapi/proxy/ppb_image_data_proxy.h
index a61a3a7..5ff617c 100644
--- a/ppapi/proxy/ppb_image_data_proxy.h
+++ b/ppapi/proxy/ppb_image_data_proxy.h
@@ -12,6 +12,8 @@
#include "ppapi/c/pp_size.h"
#include "ppapi/c/pp_var.h"
#include "ppapi/proxy/interface_proxy.h"
+#include "ppapi/proxy/image_data.h"
+
struct PPB_ImageData;
@@ -42,7 +44,7 @@ class PPB_ImageData_Proxy : public InterfaceProxy {
PP_Bool init_to_zero,
PP_Resource* result,
std::string* image_data_desc,
- int* result_shm_handle);
+ ImageHandle* result_image_handle);
};
} // namespace proxy
diff --git a/ppapi/proxy/serialized_structs.h b/ppapi/proxy/serialized_structs.h
index d90926b..2c78dd4 100644
--- a/ppapi/proxy/serialized_structs.h
+++ b/ppapi/proxy/serialized_structs.h
@@ -8,6 +8,8 @@
#include <string>
#include <vector>
+#include "base/shared_memory.h"
+#include "build/build_config.h"
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_point.h"
#include "ppapi/c/pp_rect.h"
@@ -96,9 +98,16 @@ struct PPBFlash_DrawGlyphs_Params {
std::vector<PP_Point> glyph_advances;
};
+#if defined(OS_WIN)
+typedef HANDLE ImageHandle;
+#elif defined(OS_MACOSX)
+typedef base::SharedMemoryHandle ImageHandle;
+#else
+// On X Windows this is a SysV shared memory key.
+typedef int ImageHandle;
+#endif
+
} // namespace proxy
} // namespace pp
-
-
#endif // PPAPI_PROXY_SERIALIZED_STRUCTS_H_