Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Unified Diff: ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_graphics_3d_rpc_server.cc

Issue 7740013: Cloning a bunch of stuff from the native_client repository at r6528 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_graphics_3d_rpc_server.cc
===================================================================
--- ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_graphics_3d_rpc_server.cc (revision 0)
+++ ppapi/native_client/src/shared/ppapi_proxy/browser_ppb_graphics_3d_rpc_server.cc (revision 0)
@@ -0,0 +1,353 @@
+// Copyright (c) 2011 The Native Client Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// SRPC-abstraction wrappers around PPB_Graphics3D functions.
+
+#include <limits>
+
+#include "native_client/src/include/nacl_scoped_ptr.h"
+#include "native_client/src/include/portability.h"
+#include "native_client/src/shared/ppapi_proxy/browser_callback.h"
+#include "native_client/src/shared/ppapi_proxy/browser_globals.h"
+#include "native_client/src/shared/ppapi_proxy/object_serialize.h"
+#include "native_client/src/shared/ppapi_proxy/plugin_resource.h"
+#include "native_client/src/shared/ppapi_proxy/utility.h"
+#include "native_client/src/trusted/desc/nacl_desc_wrapper.h"
+#include "ppapi/c/dev/pp_graphics_3d_dev.h"
+#include "ppapi/c/dev/ppb_graphics_3d_dev.h"
+#include "ppapi/c/dev/ppb_graphics_3d_trusted_dev.h"
+#include "ppapi/c/pp_errors.h"
+#include "srpcgen/ppb_rpc.h"
+
+using ppapi_proxy::DebugPrintf;
+using ppapi_proxy::SerializeTo;
+
+namespace {
+
+const int32_t kMaxAllowedBufferSize = 16777216;
+
+/// Check that the attribute list is well formed.
+bool ValidateAttribList(nacl_abi_size_t attrib_list_count,
+ int32_t* attrib_list) {
+ DebugPrintf("ValidateAttribList: count = %d, ptr_null = %d\n",
+ static_cast<int>(attrib_list_count), (attrib_list == NULL) ? 1 : 0);
+ // Zero count lists are ok.
+ if (attrib_list_count == 0)
+ return true;
+ // NULL lists w/ a non-zero count are not allowed.
+ if (attrib_list == NULL)
+ return false;
+ // Must be an odd count, and the last item must be the terminator.
+ return (attrib_list_count & 1) &&
+ (attrib_list[attrib_list_count - 1] == PP_GRAPHICS3DATTRIB_NONE);
+}
+
+/// Check that the attribute list is well formed, then copy to output.
+bool ValidateAndCopyAttribList(nacl_abi_size_t in_attrib_list_count,
+ int32_t* in_attrib_list,
+ nacl_abi_size_t* out_attrib_list_count,
+ int32_t* out_attrib_list) {
+
+ DebugPrintf("ValidateAndCopyAttribList: in_count = %d, in_ptr_null = %d\n",
+ static_cast<int>(in_attrib_list_count),
+ (in_attrib_list == NULL) ? 1 : 0);
+ DebugPrintf(" out_count = %d, out_ptr_null = %d\n",
+ static_cast<int>(*out_attrib_list_count),
+ (out_attrib_list == NULL) ? 1 : 0);
+
+ // Attrib lists can both be NULL w/ 0 count.
+ if ((in_attrib_list == NULL) && (out_attrib_list == NULL))
+ return (in_attrib_list_count == 0) && (*out_attrib_list_count == 0);
+ // Don't allow only one list to be NULL.
+ if ((in_attrib_list == NULL) || (out_attrib_list == NULL))
+ return false;
+ // Input and output lists must be the same size.
+ if (in_attrib_list_count != *out_attrib_list_count)
+ return false;
+ // Make sure input list is well formed.
+ if (!ValidateAttribList(in_attrib_list_count, in_attrib_list))
+ return false;
+ // Copy input list to output list.
+ // Note: attrib lists can be zero sized.
+ for (nacl_abi_size_t i = 0; i < in_attrib_list_count; ++i)
+ out_attrib_list[i] = in_attrib_list[i];
+ return true;
+}
+
+} // namespace
+
+//@{
+/// The following methods are SRPC dispatchers for ppapi/c/ppb_graphics_3d.h.
+
+void PpbGraphics3DRpcServer::PPB_Graphics3D_Create(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Instance instance,
+ PP_Resource share_context,
+ nacl_abi_size_t num_attrib_list, int32_t* attrib_list,
+ PP_Resource* graphics3d_id) {
+ DebugPrintf("PpbGraphics3DRpcServer::PPB_Graphics3D_Create(...)\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (num_attrib_list == 0)
+ attrib_list = NULL;
+ if (!ValidateAttribList(num_attrib_list, attrib_list))
+ return;
+ *graphics3d_id = ppapi_proxy::PPBGraphics3DInterface()->Create(
+ instance, share_context, attrib_list);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3D_GetAttribs(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource graphics3d_id,
+ nacl_abi_size_t in_attrib_list_count, int32_t* in_attrib_list,
+ nacl_abi_size_t* out_attrib_list_count, int32_t* out_attrib_list,
+ int32_t* pp_error) {
+ DebugPrintf("PpbGraphics3DRpcServer::PPB_Graphics3D_GetAttrib(...)\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (in_attrib_list_count == 0)
+ in_attrib_list = NULL;
+ if (*out_attrib_list_count == 0)
+ out_attrib_list = NULL;
+ if (!ValidateAndCopyAttribList(in_attrib_list_count, in_attrib_list,
+ out_attrib_list_count, out_attrib_list))
+ return;
+ *pp_error = ppapi_proxy::PPBGraphics3DInterface()->GetAttribs(
+ graphics3d_id, out_attrib_list);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3D_SetAttribs(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource graphics3d_id,
+ nacl_abi_size_t attrib_list_count, int32_t* attrib_list,
+ int32_t* pp_error) {
+ DebugPrintf("PpbGraphics3DRpcServer::PPB_Graphics3D_SetAttrib(...)\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (attrib_list_count == 0)
+ attrib_list = NULL;
+ if (!ValidateAttribList(attrib_list_count, attrib_list))
+ return;
+ *pp_error = ppapi_proxy::PPBGraphics3DInterface()->SetAttribs(
+ graphics3d_id, attrib_list);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3D_ResizeBuffers(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource graphics3d_id,
+ int32_t width,
+ int32_t height,
+ int32_t* pp_error) {
+ DebugPrintf("PpbGraphics3DRpcServer::PPB_Graphics3D_ResizeBuffers(...)\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ *pp_error = ppapi_proxy::PPBGraphics3DInterface()->ResizeBuffers(
+ graphics3d_id, width, height);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3D_SwapBuffers(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource graphics3d_id,
+ int32_t callback_id,
+ int32_t* pp_error) {
+ DebugPrintf("PpbGraphics3DRpcServer::PPB_Graphics3D_SwapBuffers(...)\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ PP_CompletionCallback remote_callback =
+ ppapi_proxy::MakeRemoteCompletionCallback(rpc->channel, callback_id);
+ if (remote_callback.func == NULL) {
+ DebugPrintf(" PPB_Graphics3D_SwapBuffers() FAILED!\n");
+ return; // Treat this as a generic SRPC error.
+ }
+ *pp_error = ppapi_proxy::PPBGraphics3DInterface()->SwapBuffers(
+ graphics3d_id, remote_callback);
+ if (*pp_error != PP_OK_COMPLETIONPENDING)
+ ppapi_proxy::DeleteRemoteCallbackInfo(remote_callback);
+ DebugPrintf(" PPB_Graphics3D_SwapBuffers: pp_error=%"NACL_PRId32"\n",
+ *pp_error);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+//@}
+
+//@{
+/// The following methods are the SRPC dispatchers for
+/// ppapi/c/ppb_graphics_3d_trusted.h.
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_CreateRaw(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Instance instance,
+ PP_Resource share_context,
+ nacl_abi_size_t attrib_list_size, int32_t* attrib_list,
+ PP_Resource* resource_id) {
+ DebugPrintf("PPB_Graphics3DTrusted_CreateRaw: instance: %"NACL_PRIu32"\n",
+ instance);
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (attrib_list_size == 0)
+ attrib_list = NULL;
+ if (!ValidateAttribList(attrib_list_size, attrib_list))
+ return;
+ *resource_id = ppapi_proxy::PPBGraphics3DTrustedInterface()->CreateRaw(
+ instance, share_context, attrib_list);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_InitCommandBuffer(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t size,
+ int32_t* success) {
+ DebugPrintf("PPB_Graphics3DTrusted_InitCommandBuffer(...) resource_id: %d\n",
+ resource_id);
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if ((size > kMaxAllowedBufferSize) || (size < 0))
+ return;
+ *success = ppapi_proxy::PPBGraphics3DTrustedInterface()->InitCommandBuffer(
+ resource_id, size);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_GetRingBuffer(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ NaClSrpcImcDescType* shm_desc,
+ int32_t* shm_size) {
+ DebugPrintf("PPB_Graphics3DTrusted_GetRingBuffer\n");
+ nacl::DescWrapperFactory factory;
+ nacl::scoped_ptr<nacl::DescWrapper> desc_wrapper;
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+
+ int native_handle = 0;
+ uint32_t native_size = 0;
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->GetRingBuffer(
+ resource_id, &native_handle, &native_size);
+ desc_wrapper.reset(factory.ImportShmHandle(
+ (NaClHandle)native_handle, native_size));
+ *shm_desc = desc_wrapper->desc();
+ *shm_size = native_size;
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_GetState(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ nacl_abi_size_t* state_size, char* state) {
+ DebugPrintf("PPB_Graphics3DTrusted_GetState\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (*state_size != sizeof(PP_Graphics3DTrustedState))
+ return;
+ PP_Graphics3DTrustedState trusted_state =
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->GetState(resource_id);
+ *reinterpret_cast<PP_Graphics3DTrustedState*>(state) = trusted_state;
+ *state_size = sizeof(trusted_state);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_Flush(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t put_offset) {
+ DebugPrintf("PPB_Graphics3DTrusted_Flush(id: %d, put_offset: %d\n",
+ resource_id, put_offset);
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->Flush(resource_id, put_offset);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_FlushSync(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t put_offset,
+ nacl_abi_size_t* state_size, char* state) {
+ DebugPrintf("PPB_Graphics3DTrusted_FlushSync\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ if (*state_size != sizeof(PP_Graphics3DTrustedState))
+ return;
+ PP_Graphics3DTrustedState trusted_state =
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->FlushSync(resource_id,
+ put_offset);
+ *reinterpret_cast<PP_Graphics3DTrustedState*>(state) = trusted_state;
+ *state_size = sizeof(trusted_state);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_CreateTransferBuffer(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t size,
+ int32_t id_request,
+ int32_t* id) {
+ UNREFERENCED_PARAMETER(id_request);
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ DebugPrintf("PPB_Graphics3DTrusted_CreateTransferBuffer\n");
+ if ((size > kMaxAllowedBufferSize) || (size < 0))
+ return;
+ *id = ppapi_proxy::PPBGraphics3DTrustedInterface()->CreateTransferBuffer(
+ resource_id, size);
+ rpc->result = NACL_SRPC_RESULT_OK;
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_DestroyTransferBuffer(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t id) {
+ DebugPrintf("PPB_Graphics3DTrusted_DestroyTransferBuffer\n");
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->DestroyTransferBuffer(
+ resource_id, id);
+ rpc->result = NACL_SRPC_RESULT_OK;
+
+}
+
+void PpbGraphics3DRpcServer::PPB_Graphics3DTrusted_GetTransferBuffer(
+ NaClSrpcRpc* rpc,
+ NaClSrpcClosure* done,
+ PP_Resource resource_id,
+ int32_t id,
+ NaClSrpcImcDescType* shm_desc,
+ int32_t* shm_size) {
+ DebugPrintf("PPB_Graphics3DTrusted_GetTransferBuffer\n");
+ nacl::DescWrapperFactory factory;
+ nacl::scoped_ptr<nacl::DescWrapper> desc_wrapper;
+ NaClSrpcClosureRunner runner(done);
+ rpc->result = NACL_SRPC_RESULT_APP_ERROR;
+
+ int native_handle = 0;
+ uint32_t native_size = 0;
+ ppapi_proxy::PPBGraphics3DTrustedInterface()->
+ GetTransferBuffer(resource_id, id, &native_handle, &native_size);
+ desc_wrapper.reset(factory.ImportShmHandle(
+ (NaClHandle)native_handle, native_size));
+ *shm_desc = desc_wrapper->desc();
+ *shm_size = native_size;
+ rpc->result = NACL_SRPC_RESULT_OK;
+
+}
+
+//@}

Powered by Google App Engine
This is Rietveld 408576698