summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-28 23:36:54 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-28 23:36:54 +0000
commit36dbfe198cb0eab50ff4a7300fc86b8314d30cde (patch)
treec7b2271be2e885ca87ac58d53e338cca322276a4 /gpu
parent406e6e22b82ef80e8bc44f45d85efa68799bc552 (diff)
downloadchromium_src-36dbfe198cb0eab50ff4a7300fc86b8314d30cde.zip
chromium_src-36dbfe198cb0eab50ff4a7300fc86b8314d30cde.tar.gz
chromium_src-36dbfe198cb0eab50ff4a7300fc86b8314d30cde.tar.bz2
Moved creation of GPU command buffer shared memory into the browser process.
This is to allow the GPU process to be sandboxed on all platforms. TEST=try, run WebGL app on win and mac. BUG=none Review URL: http://codereview.chromium.org/6588029 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@76307 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/client/gles2_implementation_unittest.cc5
-rw-r--r--gpu/command_buffer/common/command_buffer.h7
-rw-r--r--gpu/command_buffer/common/command_buffer_mock.h1
-rw-r--r--gpu/command_buffer/service/command_buffer_service.cc57
-rw-r--r--gpu/command_buffer/service/command_buffer_service.h3
-rw-r--r--gpu/pgl/command_buffer_pepper.cc5
-rw-r--r--gpu/pgl/command_buffer_pepper.h5
7 files changed, 63 insertions, 20 deletions
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index dc088fd..c18c34a 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -33,6 +33,11 @@ class GLES2MockCommandBufferHelper : public CommandBuffer {
return true;
}
+ virtual bool Initialize(base::SharedMemory* buffer, int32 size) {
+ GPU_NOTREACHED();
+ return false;
+ }
+
virtual Buffer GetRingBuffer() {
return ring_buffer_buffer_;
}
diff --git a/gpu/command_buffer/common/command_buffer.h b/gpu/command_buffer/common/command_buffer.h
index b758333..bcc39ea 100644
--- a/gpu/command_buffer/common/command_buffer.h
+++ b/gpu/command_buffer/common/command_buffer.h
@@ -8,6 +8,10 @@
#include "../common/buffer.h"
#include "../common/constants.h"
+namespace base {
+class SharedMemory;
+}
+
namespace gpu {
// Common interface for CommandBuffer implementations.
@@ -55,6 +59,9 @@ class CommandBuffer {
// Initialize the command buffer with the given size.
virtual bool Initialize(int32 size) = 0;
+ // Initialize the command buffer using the given preallocated buffer.
+ virtual bool Initialize(base::SharedMemory* buffer, int32 size) = 0;
+
// Gets the ring buffer for the command buffer.
virtual Buffer GetRingBuffer() = 0;
diff --git a/gpu/command_buffer/common/command_buffer_mock.h b/gpu/command_buffer/common/command_buffer_mock.h
index 99a72d3..2966801 100644
--- a/gpu/command_buffer/common/command_buffer_mock.h
+++ b/gpu/command_buffer/common/command_buffer_mock.h
@@ -22,6 +22,7 @@ class MockCommandBuffer : public CommandBuffer {
virtual ~MockCommandBuffer();
MOCK_METHOD1(Initialize, bool(int32 size));
+ MOCK_METHOD2(Initialize, bool(base::SharedMemory* buffer, int32 size));
MOCK_METHOD0(GetRingBuffer, Buffer());
MOCK_METHOD0(GetState, State());
MOCK_METHOD1(Flush, void(int32 put_offset));
diff --git a/gpu/command_buffer/service/command_buffer_service.cc b/gpu/command_buffer/service/command_buffer_service.cc
index d806de1..adc5623 100644
--- a/gpu/command_buffer/service/command_buffer_service.cc
+++ b/gpu/command_buffer/service/command_buffer_service.cc
@@ -25,6 +25,8 @@ CommandBufferService::CommandBufferService()
}
CommandBufferService::~CommandBufferService() {
+ delete ring_buffer_.shared_memory;
+
for (size_t i = 0; i < registered_objects_.size(); ++i) {
if (registered_objects_[i].shared_memory)
delete registered_objects_[i].shared_memory;
@@ -33,42 +35,59 @@ CommandBufferService::~CommandBufferService() {
bool CommandBufferService::Initialize(int32 size) {
// Fail if already initialized.
- if (ring_buffer_.get()) {
- LOG(ERROR) << "CommandBufferService::Initialize "
- << "failed because already initialized.";
+ if (ring_buffer_.shared_memory) {
+ LOG(ERROR) << "Failed because already initialized.";
return false;
}
if (size <= 0 || size > kMaxCommandBufferSize) {
- LOG(ERROR) << "CommandBufferService::Initialize "
- << "because command buffer size was invalid.";
+ LOG(ERROR) << "Failed because command buffer size was invalid.";
return false;
}
num_entries_ = size / sizeof(CommandBufferEntry);
- ring_buffer_.reset(new SharedMemory);
- if (ring_buffer_->CreateAndMapAnonymous(size)) {
+ SharedMemory shared_memory;
+ if (!shared_memory.CreateAnonymous(size)) {
+ LOG(ERROR) << "Failed to create shared memory for command buffer.";
return true;
}
- num_entries_ = 0;
- ring_buffer_.reset();
+ return Initialize(&shared_memory, size);
+}
- LOG(ERROR) << "CommandBufferService::Initialize failed because ring buffer "
- << "could not be created or mapped ";
+bool CommandBufferService::Initialize(base::SharedMemory* buffer, int32 size) {
+ // Fail if already initialized.
+ if (ring_buffer_.shared_memory) {
+ LOG(ERROR) << "Failed because already initialized.";
+ return false;
+ }
+
+ base::SharedMemoryHandle shared_memory_handle;
+ if (!buffer->ShareToProcess(base::GetCurrentProcessHandle(),
+ &shared_memory_handle)) {
+ LOG(ERROR) << "Failed to duplicate command buffer shared memory handle.";
+ return false;
+ }
- return false;
+ ring_buffer_.shared_memory = new base::SharedMemory(shared_memory_handle,
+ false);
+ if (!ring_buffer_.shared_memory->Map(size)) {
+ LOG(ERROR) << "Failed because ring buffer could not be created or mapped ";
+ delete ring_buffer_.shared_memory;
+ ring_buffer_.shared_memory = NULL;
+ return false;
+ }
+
+ ring_buffer_.ptr = ring_buffer_.shared_memory->memory();
+ ring_buffer_.size = size;
+ num_entries_ = size / sizeof(CommandBufferEntry);
+
+ return true;
}
Buffer CommandBufferService::GetRingBuffer() {
- Buffer buffer;
- if (ring_buffer_.get()) {
- buffer.ptr = ring_buffer_->memory();
- buffer.size = ring_buffer_->created_size();
- buffer.shared_memory = ring_buffer_.get();
- }
- return buffer;
+ return ring_buffer_;
}
CommandBufferService::State CommandBufferService::GetState() {
diff --git a/gpu/command_buffer/service/command_buffer_service.h b/gpu/command_buffer/service/command_buffer_service.h
index 9706008..15b5046 100644
--- a/gpu/command_buffer/service/command_buffer_service.h
+++ b/gpu/command_buffer/service/command_buffer_service.h
@@ -26,6 +26,7 @@ class CommandBufferService : public CommandBuffer {
// CommandBuffer implementation:
virtual bool Initialize(int32 size);
+ virtual bool Initialize(base::SharedMemory* buffer, int32 size);
virtual Buffer GetRingBuffer();
virtual State GetState();
virtual void Flush(int32 put_offset);
@@ -52,7 +53,7 @@ class CommandBufferService : public CommandBuffer {
virtual void SetPutOffsetChangeCallback(Callback0::Type* callback);
private:
- scoped_ptr< base::SharedMemory> ring_buffer_;
+ Buffer ring_buffer_;
int32 num_entries_;
int32 get_offset_;
int32 put_offset_;
diff --git a/gpu/pgl/command_buffer_pepper.cc b/gpu/pgl/command_buffer_pepper.cc
index e4b6ce8..c508b53 100644
--- a/gpu/pgl/command_buffer_pepper.cc
+++ b/gpu/pgl/command_buffer_pepper.cc
@@ -27,6 +27,11 @@ bool CommandBufferPepper::Initialize(int32 size) {
return false;
}
+bool CommandBufferPepper::Initialize(base::SharedMemory* buffer, int32 size) {
+ GPU_NOTREACHED();
+ return false;
+}
+
Buffer CommandBufferPepper::GetRingBuffer() {
Buffer buffer;
#if defined(ENABLE_NEW_NPDEVICE_API)
diff --git a/gpu/pgl/command_buffer_pepper.h b/gpu/pgl/command_buffer_pepper.h
index 902db36..8f990da 100644
--- a/gpu/pgl/command_buffer_pepper.h
+++ b/gpu/pgl/command_buffer_pepper.h
@@ -15,6 +15,10 @@
#include "third_party/npapi/bindings/nphostapi.h"
#endif // __native_client__
+namespace {
+class SharedMemory;
+}
+
// A CommandBuffer proxy implementation that uses the Pepper API to access
// the command buffer.
@@ -27,6 +31,7 @@ class CommandBufferPepper : public gpu::CommandBuffer {
// CommandBuffer implementation.
virtual bool Initialize(int32 size);
+ virtual bool Initialize(base::SharedMemory* buffer, int32 size);
virtual gpu::Buffer GetRingBuffer();
virtual State GetState();
virtual void Flush(int32 put_offset);