summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-29 22:02:36 +0000
committerapatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-29 22:02:36 +0000
commitc77ea36637f9494c048f6c8035f3cf8a389da93d (patch)
treef1feccf837765ba30c4f46e11b8f7b0b996a5cbd /chrome/renderer
parent23fc99cca22572abe60eced18b90b5693c2f64f7 (diff)
downloadchromium_src-c77ea36637f9494c048f6c8035f3cf8a389da93d.zip
chromium_src-c77ea36637f9494c048f6c8035f3cf8a389da93d.tar.gz
chromium_src-c77ea36637f9494c048f6c8035f3cf8a389da93d.tar.bz2
Redesigned CommandBuffer and NPDevice3D interfaces.
All status is now in the Device3D context. It can be retreived with fewer IPC messages. It can be now be accessed off the main plugin thread, which is necessary to run OpenGL in another thread. TEST=none BUG=none Review URL: http://codereview.chromium.org/555020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37545 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/command_buffer_proxy.cc69
-rw-r--r--chrome/renderer/command_buffer_proxy.h12
-rw-r--r--chrome/renderer/webplugin_delegate_pepper.cc61
-rw-r--r--chrome/renderer/webplugin_delegate_pepper.h10
4 files changed, 54 insertions, 98 deletions
diff --git a/chrome/renderer/command_buffer_proxy.cc b/chrome/renderer/command_buffer_proxy.cc
index 5b97e3c..e63ca5a 100644
--- a/chrome/renderer/command_buffer_proxy.cc
+++ b/chrome/renderer/command_buffer_proxy.cc
@@ -71,27 +71,18 @@ Buffer CommandBufferProxy::GetRingBuffer() {
return buffer;
}
-int32 CommandBufferProxy::GetSize() {
- // Return locally cached size.
- return size_;
+gpu::CommandBuffer::State CommandBufferProxy::GetState() {
+ gpu::CommandBuffer::State state;
+ Send(new CommandBufferMsg_GetState(route_id_, &state));
+ return state;
}
-int32 CommandBufferProxy::SyncOffsets(int32 put_offset) {
- int32 get_offset;
- if (Send(new CommandBufferMsg_SyncOffsets(route_id_,
- put_offset,
- &get_offset)))
- return get_offset;
-
- return -1;
-}
-
-int32 CommandBufferProxy::GetGetOffset() {
- int32 get_offset;
- if (Send(new CommandBufferMsg_GetGetOffset(route_id_, &get_offset)))
- return get_offset;
-
- return -1;
+gpu::CommandBuffer::State CommandBufferProxy::Flush(int32 put_offset) {
+ gpu::CommandBuffer::State state;
+ Send(new CommandBufferMsg_Flush(route_id_,
+ put_offset,
+ &state));
+ return state;
}
void CommandBufferProxy::SetGetOffset(int32 get_offset) {
@@ -99,14 +90,6 @@ void CommandBufferProxy::SetGetOffset(int32 get_offset) {
NOTREACHED();
}
-int32 CommandBufferProxy::GetPutOffset() {
- int put_offset;
- if (Send(new CommandBufferMsg_GetPutOffset(route_id_, &put_offset)))
- return put_offset;
-
- return -1;
-}
-
int32 CommandBufferProxy::CreateTransferBuffer(size_t size) {
int32 id;
if (Send(new CommandBufferMsg_CreateTransferBuffer(route_id_, size, &id)))
@@ -176,41 +159,13 @@ Buffer CommandBufferProxy::GetTransferBuffer(int32 id) {
return buffer;
}
-int32 CommandBufferProxy::GetToken() {
- int32 token;
- if (Send(new CommandBufferMsg_GetToken(route_id_, &token)))
- return token;
-
- return -1;
-}
-
void CommandBufferProxy::SetToken(int32 token) {
// Not implemented in proxy.
NOTREACHED();
}
-int32 CommandBufferProxy::ResetParseError() {
- int32 parse_error;
- if (Send(new CommandBufferMsg_ResetParseError(route_id_, &parse_error)))
- return parse_error;
-
- return -1;
-}
-
-void CommandBufferProxy::SetParseError(int32 parse_error) {
- // Not implemented in proxy.
- NOTREACHED();
-}
-
-bool CommandBufferProxy::GetErrorStatus() {
- bool status;
- if (Send(new CommandBufferMsg_GetErrorStatus(route_id_, &status)))
- return status;
-
- return true;
-}
-
-void CommandBufferProxy::RaiseErrorStatus() {
+void CommandBufferProxy::SetParseError(
+ gpu::parse_error::ParseError parse_error) {
// Not implemented in proxy.
NOTREACHED();
}
diff --git a/chrome/renderer/command_buffer_proxy.h b/chrome/renderer/command_buffer_proxy.h
index 0be704a..849f540 100644
--- a/chrome/renderer/command_buffer_proxy.h
+++ b/chrome/renderer/command_buffer_proxy.h
@@ -35,20 +35,14 @@ class CommandBufferProxy : public gpu::CommandBuffer,
// CommandBuffer implementation:
virtual bool Initialize(int32 size);
virtual gpu::Buffer GetRingBuffer();
- virtual int32 GetSize();
- virtual int32 SyncOffsets(int32 put_offset);
- virtual int32 GetGetOffset();
+ virtual State GetState();
+ virtual State Flush(int32 put_offset);
virtual void SetGetOffset(int32 get_offset);
- virtual int32 GetPutOffset();
virtual int32 CreateTransferBuffer(size_t size);
virtual void DestroyTransferBuffer(int32 id);
virtual gpu::Buffer GetTransferBuffer(int32 handle);
- virtual int32 GetToken();
virtual void SetToken(int32 token);
- virtual int32 ResetParseError();
- virtual void SetParseError(int32 parse_error);
- virtual bool GetErrorStatus();
- virtual void RaiseErrorStatus();
+ virtual void SetParseError(gpu::parse_error::ParseError parse_error);
private:
// As with the service, the client takes ownership of the ring buffer.
diff --git a/chrome/renderer/webplugin_delegate_pepper.cc b/chrome/renderer/webplugin_delegate_pepper.cc
index 68e611d..d25364f 100644
--- a/chrome/renderer/webplugin_delegate_pepper.cc
+++ b/chrome/renderer/webplugin_delegate_pepper.cc
@@ -352,13 +352,15 @@ NPError WebPluginDelegatePepper::Device3DInitializeContext(
if (command_buffer_.get()) {
// Initialize the proxy command buffer.
if (command_buffer_->Initialize(config->commandBufferEntries)) {
+ // Get the initial command buffer state.
+ gpu::CommandBuffer::State state = command_buffer_->GetState();
+
// Initialize the 3D context.
context->reserved = NULL;
Buffer ring_buffer = command_buffer_->GetRingBuffer();
context->commandBuffer = ring_buffer.ptr;
- context->commandBufferEntries = command_buffer_->GetSize();
- context->getOffset = command_buffer_->GetGetOffset();
- context->putOffset = command_buffer_->GetPutOffset();
+ context->commandBufferEntries = state.size;
+ Synchronize3DContext(context, state);
// Ensure the service knows the window size before rendering anything.
nested_delegate_->UpdateGeometry(window_rect_, clip_rect_);
@@ -392,32 +394,7 @@ NPError WebPluginDelegatePepper::Device3DGetStateContext(
NPDeviceContext3D* context,
int32 state,
int32* value) {
-#if defined(ENABLE_GPU)
- if (!command_buffer_.get())
- return NPERR_GENERIC_ERROR;
-
- switch (state) {
- case NPDeviceContext3DState_GetOffset:
- context->getOffset = *value = command_buffer_->GetGetOffset();
- break;
- case NPDeviceContext3DState_PutOffset:
- *value = command_buffer_->GetPutOffset();
- break;
- case NPDeviceContext3DState_Token:
- *value = command_buffer_->GetToken();
- break;
- case NPDeviceContext3DState_ParseError:
- *value = command_buffer_->ResetParseError();
- break;
- case NPDeviceContext3DState_ErrorStatus:
- *value = command_buffer_->GetErrorStatus() ? 1 : 0;
- break;
- default:
- return NPERR_GENERIC_ERROR;
- };
-#endif // ENABLE_GPU
-
- return NPERR_NO_ERROR;
+ return NPERR_GENERIC_ERROR;
}
NPError WebPluginDelegatePepper::Device3DFlushContext(
@@ -426,8 +403,16 @@ NPError WebPluginDelegatePepper::Device3DFlushContext(
NPDeviceFlushContextCallbackPtr callback,
void* user_data) {
#if defined(ENABLE_GPU)
- DCHECK(callback == NULL);
- context->getOffset = command_buffer_->SyncOffsets(context->putOffset);
+ gpu::CommandBuffer::State state;
+ // Only flush if new commands have been put in the command buffer. Otherwise
+ // update the state to the current service state.
+ if (context->putOffset == last_command_buffer_put_offset_) {
+ state = command_buffer_->GetState();
+ } else {
+ last_command_buffer_put_offset_ = context->putOffset;
+ state = command_buffer_->Flush(context->putOffset);
+ }
+ Synchronize3DContext(context, state);
#endif // ENABLE_GPU
return NPERR_NO_ERROR;
}
@@ -556,7 +541,8 @@ WebPluginDelegatePepper::WebPluginDelegatePepper(
: render_view_(render_view),
plugin_(NULL),
instance_(instance),
- nested_delegate_(NULL) {
+ nested_delegate_(NULL),
+ last_command_buffer_put_offset_(-1) {
// For now we keep a window struct, although it isn't used.
memset(&window_, 0, sizeof(window_));
// All Pepper plugins are windowless and transparent.
@@ -720,3 +706,14 @@ bool WebPluginDelegatePepper::HandleInputEvent(const WebInputEvent& event,
}
return instance()->NPP_HandleEvent(&npevent) != 0;
}
+
+#if defined(ENABLE_GPU)
+void WebPluginDelegatePepper::Synchronize3DContext(
+ NPDeviceContext3D* context,
+ gpu::CommandBuffer::State state) {
+ context->getOffset = state.get_offset;
+ context->putOffset = state.put_offset;
+ context->token = state.token;
+ context->error = static_cast<int32>(state.error);
+}
+#endif // ENABLE_GPU
diff --git a/chrome/renderer/webplugin_delegate_pepper.h b/chrome/renderer/webplugin_delegate_pepper.h
index 91e35b6..b2ac3c6 100644
--- a/chrome/renderer/webplugin_delegate_pepper.h
+++ b/chrome/renderer/webplugin_delegate_pepper.h
@@ -164,6 +164,12 @@ class WebPluginDelegatePepper : public webkit_glue::WebPluginDelegate {
// Closes down and destroys our plugin instance.
void DestroyInstance();
+#if defined(ENABLE_GPU)
+ // Synchronize a 3D context state with the service.
+ void Synchronize3DContext(NPDeviceContext3D* context,
+ gpu::CommandBuffer::State state);
+#endif
+
base::WeakPtr<RenderView> render_view_;
webkit_glue::WebPlugin* plugin_;
@@ -190,6 +196,10 @@ class WebPluginDelegatePepper : public webkit_glue::WebPluginDelegate {
scoped_ptr<CommandBufferProxy> command_buffer_;
#endif
+ // Used to track whether additional commands have been put in the command
+ // buffer since the last flush.
+ int32 last_command_buffer_put_offset_;
+
DISALLOW_COPY_AND_ASSIGN(WebPluginDelegatePepper);
};