Index: chrome/renderer/webplugin_delegate_pepper.cc |
=================================================================== |
--- chrome/renderer/webplugin_delegate_pepper.cc (revision 44555) |
+++ chrome/renderer/webplugin_delegate_pepper.cc (working copy) |
@@ -74,8 +74,11 @@ |
struct Device3DImpl { |
gpu::CommandBuffer* command_buffer; |
+ bool dynamically_created; |
}; |
+const int32 kDefaultCommandBufferSize = 1024 * 1024; |
+ |
#if defined(OS_WIN) |
struct ScrollbarThemeMapping { |
NPThemeItem item; |
@@ -730,6 +733,7 @@ |
// Save the implementation information (the CommandBuffer). |
Device3DImpl* impl = new Device3DImpl; |
impl->command_buffer = command_buffer_; |
+ impl->dynamically_created = false; |
context->reserved = impl; |
return NPERR_NO_ERROR; |
@@ -814,8 +818,16 @@ |
// has been destroyed. |
method_factory3d_.RevokeAll(); |
- delete static_cast<Device3DImpl*>(context->reserved); |
+ // TODO(apatrick): this will be much simpler when we switch to the new device |
+ // API. There should be no need for the Device3DImpl and the context will |
+ // always be destroyed dynamically. |
+ Device3DImpl* impl = static_cast<Device3DImpl*>(context->reserved); |
+ bool dynamically_created = impl->dynamically_created; |
+ delete impl; |
context->reserved = NULL; |
+ if (dynamically_created) { |
+ delete context; |
+ } |
if (nested_delegate_) { |
if (command_buffer_) { |
@@ -867,7 +879,13 @@ |
return NPERR_GENERIC_ERROR; |
#if defined(ENABLE_GPU) |
- Buffer gpu_buffer = command_buffer_->GetTransferBuffer(id); |
+ Buffer gpu_buffer; |
+ if (id == NP3DCommandBufferId) { |
+ gpu_buffer = command_buffer_->GetRingBuffer(); |
+ } else { |
+ gpu_buffer = command_buffer_->GetTransferBuffer(id); |
+ } |
+ |
np_buffer->ptr = gpu_buffer.ptr; |
np_buffer->size = gpu_buffer.size; |
if (!np_buffer->ptr) |
@@ -877,6 +895,171 @@ |
return NPERR_NO_ERROR; |
} |
+NPError WebPluginDelegatePepper::Device3DGetNumConfigs(int32* num_configs) { |
+ if (!num_configs) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ *num_configs = 1; |
+ return NPERR_NO_ERROR; |
+} |
+ |
+NPError WebPluginDelegatePepper::Device3DGetConfigAttribs( |
+ int32 config, |
+ int32* attrib_list) { |
+ // Only one config available currently. |
+ if (config != 0) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ if (attrib_list) { |
+ for (int32* attrib_pair = attrib_list; *attrib_pair; attrib_pair += 2) { |
+ switch (attrib_pair[0]) { |
+ case NP3DAttrib_BufferSize: |
+ attrib_pair[1] = 32; |
+ break; |
+ case NP3DAttrib_AlphaSize: |
+ case NP3DAttrib_BlueSize: |
+ case NP3DAttrib_GreenSize: |
+ case NP3DAttrib_RedSize: |
+ attrib_pair[1] = 8; |
+ break; |
+ case NP3DAttrib_DepthSize: |
+ attrib_pair[1] = 24; |
+ break; |
+ case NP3DAttrib_StencilSize: |
+ attrib_pair[1] = 8; |
+ break; |
+ case NP3DAttrib_SurfaceType: |
+ attrib_pair[1] = 0; |
+ break; |
+ default: |
+ return NPERR_GENERIC_ERROR; |
+ } |
+ } |
+ } |
+ |
+ return NPERR_NO_ERROR; |
+} |
+ |
+NPError WebPluginDelegatePepper::Device3DCreateContext( |
+ int32 config, |
+ int32* attrib_list, |
+ NPDeviceContext3D** context) { |
+ if (!context) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ // Only one config available currently. |
+ if (config != 0) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ // For now, just use the old API to initialize the context. |
+ NPDeviceContext3DConfig old_config; |
+ old_config.commandBufferSize = kDefaultCommandBufferSize; |
+ if (attrib_list) { |
+ for (int32* attrib_pair = attrib_list; *attrib_pair; attrib_pair += 2) { |
+ switch (attrib_pair[0]) { |
+ case NP3DAttrib_CommandBufferSize: |
+ old_config.commandBufferSize = attrib_pair[1]; |
+ break; |
+ default: |
+ return NPERR_GENERIC_ERROR; |
+ } |
+ } |
+ } |
+ |
+ *context = new NPDeviceContext3D; |
+ Device3DInitializeContext(&old_config, *context); |
+ |
+ // Flag the context as dynamically created by the browser. TODO(apatrick): |
+ // take this out when all contexts are dynamically created. |
+ Device3DImpl* impl = static_cast<Device3DImpl*>((*context)->reserved); |
+ impl->dynamically_created = true; |
+ |
+ return NPERR_NO_ERROR; |
+} |
+ |
+NPError WebPluginDelegatePepper::Device3DRegisterCallback( |
+ NPP id, |
+ NPDeviceContext3D* context, |
+ int32 callback_type, |
+ NPDeviceGenericCallbackPtr callback, |
+ void* callback_data) { |
+ if (!context) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ switch (callback_type) { |
+ case NP3DCallback_Repaint: |
+ context->repaintCallback = reinterpret_cast<NPDeviceContext3DRepaintPtr>( |
+ callback); |
+ break; |
+ default: |
+ return NPERR_GENERIC_ERROR; |
+ } |
+ |
+ return NPERR_NO_ERROR; |
+} |
+ |
+NPError WebPluginDelegatePepper::Device3DSynchronizeContext( |
+ NPP id, |
+ NPDeviceContext3D* context, |
+ NPDeviceSynchronizationMode mode, |
+ const int32* input_attrib_list, |
+ int32* output_attrib_list, |
+ NPDeviceSynchronizeContextCallbackPtr callback, |
+ void* callback_data) { |
+ if (!context) |
+ return NPERR_GENERIC_ERROR; |
+ |
+ // Copy input attributes into context. |
+ if (input_attrib_list) { |
+ for (const int32* attrib_pair = input_attrib_list; |
+ *attrib_pair; |
+ attrib_pair += 2) { |
+ switch (attrib_pair[0]) { |
+ case NP3DAttrib_PutOffset: |
+ context->putOffset = attrib_pair[1]; |
+ break; |
+ default: |
+ return NPERR_GENERIC_ERROR; |
+ } |
+ } |
+ } |
+ |
+ // Use existing flush mechanism for now. |
+ if (mode != NPDeviceSynchronizationMode_Cached) { |
+ context->waitForProgress = mode == NPDeviceSynchronizationMode_Flush; |
+ Device3DFlushContext(id, context, callback, callback_data); |
+ } |
+ |
+ // Copy most recent output attributes from context. |
+ // To read output attributes after the completion of an asynchronous flush, |
+ // invoke SynchronizeContext again with mode |
+ // NPDeviceSynchronizationMode_Cached from the callback function. |
+ if (output_attrib_list) { |
+ for (int32* attrib_pair = output_attrib_list; |
+ *attrib_pair; |
+ attrib_pair += 2) { |
+ switch (attrib_pair[0]) { |
+ case NP3DAttrib_CommandBufferSize: |
+ attrib_pair[1] = context->commandBufferSize; |
+ break; |
+ case NP3DAttrib_GetOffset: |
+ attrib_pair[1] = context->getOffset; |
+ break; |
+ case NP3DAttrib_PutOffset: |
+ attrib_pair[1] = context->putOffset; |
+ break; |
+ case NP3DAttrib_Token: |
+ attrib_pair[1] = context->token; |
+ break; |
+ default: |
+ return NPERR_GENERIC_ERROR; |
+ } |
+ } |
+ } |
+ |
+ return NPERR_NO_ERROR; |
+} |
+ |
NPError WebPluginDelegatePepper::DeviceAudioQueryCapability(int32 capability, |
int32* value) { |
// TODO(neb,cpu) implement QueryCapability |