summaryrefslogtreecommitdiffstats
path: root/o3d
diff options
context:
space:
mode:
authorapatrick@google.com <apatrick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-19 18:43:09 +0000
committerapatrick@google.com <apatrick@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-10-19 18:43:09 +0000
commit52f88d8d6be4ddfad56c25d3c9a13cd22a768628 (patch)
treeccf9de7149854ab9c04fe451fb8b58a9de41e9d4 /o3d
parent52d08b12e8e7ff7c9b865837a2aeb17fb9dc2d42 (diff)
downloadchromium_src-52f88d8d6be4ddfad56c25d3c9a13cd22a768628.zip
chromium_src-52f88d8d6be4ddfad56c25d3c9a13cd22a768628.tar.gz
chromium_src-52f88d8d6be4ddfad56c25d3c9a13cd22a768628.tar.bz2
Changed O3D to use CommandBuffer in-process. Still not connecting to the GPU plugin.
I removed all the NaCl dependencies. Synchronous messages are now sent by NPAPI. Removed BufferSyncInterface and replaced it with CommandBuffer. CommandBufferHelper now uses NPAPI. Changed some unsigned ints to int32s because NPAPI doesn't support unsigned int. There are now two subclasses of RendererCB. RendererCBLocal is for use with an in-process CommandBuffer. RendererCBRemote is for use with an out-of-process CommandBuffer. I'm going to rearrange the locations of the source files under gpu_plugin next. CommandBuffer and GPUProcessor probably belong in the command_buffer_service library now. np_utils and system_services should be standalone libraries. TEST=none BUG=none Review URL: http://codereview.chromium.org/266068 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29429 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'o3d')
-rw-r--r--o3d/build/common.gypi6
-rw-r--r--o3d/command_buffer/client/build.scons70
-rw-r--r--o3d/command_buffer/client/cross/big_test_client.cc300
-rw-r--r--o3d/command_buffer/client/cross/buffer_sync_proxy.cc128
-rw-r--r--o3d/command_buffer/client/cross/buffer_sync_proxy.h102
-rw-r--r--o3d/command_buffer/client/cross/buffer_sync_proxy_test.cc260
-rw-r--r--o3d/command_buffer/client/cross/cmd_buffer_helper.cc168
-rw-r--r--o3d/command_buffer/client/cross/cmd_buffer_helper.h83
-rw-r--r--o3d/command_buffer/client/cross/cmd_buffer_helper_test.cc169
-rw-r--r--o3d/command_buffer/client/cross/effect_helper.cc18
-rw-r--r--o3d/command_buffer/client/cross/fenced_allocator_test.cc388
-rw-r--r--o3d/command_buffer/command_buffer.gyp66
-rw-r--r--o3d/command_buffer/common/build.scons41
-rw-r--r--o3d/command_buffer/common/cross/buffer_sync_api.h169
-rw-r--r--o3d/command_buffer/common/cross/constants.h (renamed from o3d/command_buffer/service/cross/big_test_helpers.h)55
-rw-r--r--o3d/command_buffer/common/cross/gapi_interface.h164
-rw-r--r--o3d/command_buffer/common/cross/mocks.h148
-rw-r--r--o3d/command_buffer/common/cross/rpc.h160
-rw-r--r--o3d/command_buffer/common/cross/rpc_fake.cc226
-rw-r--r--o3d/command_buffer/common/cross/rpc_fake.h206
-rw-r--r--o3d/command_buffer/common/cross/rpc_imc.cc231
-rw-r--r--o3d/command_buffer/common/cross/rpc_imc.h109
-rw-r--r--o3d/command_buffer/samples/build.scons55
-rw-r--r--o3d/command_buffer/service/build.scons146
-rw-r--r--o3d/command_buffer/service/cross/big_test.cc106
-rw-r--r--o3d/command_buffer/service/cross/buffer_rpc.cc136
-rw-r--r--o3d/command_buffer/service/cross/buffer_rpc.h101
-rw-r--r--o3d/command_buffer/service/cross/buffer_rpc_test.cc173
-rw-r--r--o3d/command_buffer/service/cross/cmd_buffer_engine.cc293
-rw-r--r--o3d/command_buffer/service/cross/cmd_buffer_engine.h184
-rw-r--r--o3d/command_buffer/service/cross/cmd_buffer_engine_test.cc625
-rw-r--r--o3d/command_buffer/service/cross/cmd_parser.cc27
-rw-r--r--o3d/command_buffer/service/cross/cmd_parser.h13
-rw-r--r--o3d/command_buffer/service/cross/cmd_parser_test.cc48
-rw-r--r--o3d/command_buffer/service/cross/gapi_decoder.cc250
-rw-r--r--o3d/command_buffer/service/cross/gapi_decoder.h8
-rw-r--r--o3d/command_buffer/service/cross/gl/effect_gl.cc76
-rw-r--r--o3d/command_buffer/service/cross/gl/geometry_gl.cc104
-rw-r--r--o3d/command_buffer/service/cross/gl/render_surface_gl.cc42
-rw-r--r--o3d/command_buffer/service/cross/gl/sampler_gl.cc28
-rw-r--r--o3d/command_buffer/service/cross/gl/texture_gl.cc40
-rw-r--r--o3d/command_buffer/service/cross/mocks.h55
-rw-r--r--o3d/command_buffer/service/cross/plugin.cc439
-rw-r--r--o3d/command_buffer/service/win/big_test_main.cc179
-rw-r--r--o3d/command_buffer/service/win/d3d9/effect_d3d9.cc76
-rw-r--r--o3d/command_buffer/service/win/d3d9/gapi_d3d9.cc30
-rw-r--r--o3d/command_buffer/service/win/d3d9/geometry_d3d9.cc68
-rw-r--r--o3d/command_buffer/service/win/d3d9/render_surface_d3d9.cc40
-rw-r--r--o3d/command_buffer/service/win/d3d9/sampler_d3d9.cc28
-rw-r--r--o3d/command_buffer/service/win/d3d9/texture_d3d9.cc40
-rw-r--r--o3d/command_buffer/service/win/plugin.def6
-rw-r--r--o3d/command_buffer/service/win/plugin.rc100
-rw-r--r--o3d/core/build.scons20
-rw-r--r--o3d/core/core.gyp20
-rw-r--r--o3d/core/cross/command_buffer/display_window_cb.h (renamed from o3d/command_buffer/common/cross/buffer_sync_api.cc)61
-rw-r--r--o3d/core/cross/command_buffer/effect_cb.cc7
-rw-r--r--o3d/core/cross/command_buffer/renderer_cb.cc289
-rw-r--r--o3d/core/cross/command_buffer/renderer_cb.h98
-rw-r--r--o3d/core/cross/renderer_test.cc5
-rw-r--r--o3d/core/win/command_buffer/win32_cb_server.cc120
-rw-r--r--o3d/core/win/command_buffer/win32_cb_server.h81
-rw-r--r--o3d/gpu_plugin/command_buffer.cc6
-rw-r--r--o3d/gpu_plugin/command_buffer.h4
-rw-r--r--o3d/gpu_plugin/gpu_plugin.gyp179
-rw-r--r--o3d/gpu_plugin/gpu_processor.cc25
-rw-r--r--o3d/gpu_plugin/gpu_processor.h51
-rw-r--r--o3d/gpu_plugin/gpu_processor_win.cc6
-rw-r--r--o3d/gpu_plugin/np_utils/np_browser.cc11
-rw-r--r--o3d/gpu_plugin/np_utils/np_browser_stub.cc4
-rw-r--r--o3d/gpu_plugin/np_utils/np_headers.h13
-rw-r--r--o3d/gpu_plugin/system_services/shared_memory.h6
-rw-r--r--o3d/main.scons230
-rw-r--r--o3d/plugin/cross/o3d_glue.cc12
-rw-r--r--o3d/plugin/plugin.gyp1
-rw-r--r--o3d/plugin/win/main_win.cc46
-rw-r--r--o3d/tests/build.scons15
-rw-r--r--o3d/tests/common/cross/main.cc2
-rw-r--r--o3d/tests/common/win/testing_common.cc52
-rw-r--r--o3d/tests/tests.gyp19
79 files changed, 1607 insertions, 6559 deletions
diff --git a/o3d/build/common.gypi b/o3d/build/common.gypi
index 9f058c4..ca2b697 100644
--- a/o3d/build/common.gypi
+++ b/o3d/build/common.gypi
@@ -21,12 +21,12 @@
'skiadir': 'third_party/skia/include',
'zlibdir': 'third_party/zlib',
# If the DEPS file exists two levels up, then we're in a Chrome tree.
- 'o3d_in_chrome%': '<!(python <(DEPTH)/o3d/build/file_exists.py ../../DEPS)',
+ 'o3d_in_chrome%': '<!(python <(DEPTH)/o3d/build/file_exists.py <(DEPTH)/DEPS)',
# We default to building everything only if the assets exist.
# (and the teapot is the least likely asset to change).
# This is so that chrome developers get a much reduced dependency set.
'o3d_developer%': '<!(python <(DEPTH)/o3d/build/file_exists.py '
- '../o3d_assets/samples/convert_assets/teapot.zip)',
+ '<(DEPTH)/o3d/o3d_assets/samples/convert_assets/teapot.zip)',
'selenium_screenshots%': 0,
'conditions' : [
# These have to come first because GYP doesn't like it when
@@ -72,7 +72,7 @@
}],
],
'conditions': [
- ['o3d_in_chrome != 0',
+ ['o3d_in_chrome == "True"',
{
'defines': [
'O3D_IN_CHROME',
diff --git a/o3d/command_buffer/client/build.scons b/o3d/command_buffer/client/build.scons
deleted file mode 100644
index eeefca6..0000000
--- a/o3d/command_buffer/client/build.scons
+++ /dev/null
@@ -1,70 +0,0 @@
-# Copyright 2009, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-Import('env')
-
-INPUTS = [
- 'cross/buffer_sync_proxy.cc',
- 'cross/cmd_buffer_helper.cc',
- 'cross/effect_helper.cc',
- 'cross/fenced_allocator.cc',
- 'cross/id_allocator.cc',
-]
-
-# Create a target library from the sources called 'o3dCmdBuf'
-o3dcmdbuf_lib = env.ComponentLibrary('o3dCmdBuf_client', INPUTS)
-
-# Add some flags and libraries to the build environment for the unit tests
-env.Append(
- LIBS = [
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- ] + env['NACL_HTP_LIBS'],
- LIBPATH = ['$NACL_LIB_DIR'],
-)
-
-if env['TARGET_PLATFORM'] == 'WINDOWS':
- env.Append(CCFLAGS = ['/Wp64'],
- LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
-
-if env['TARGET_PLATFORM'] != 'NACL':
- env.Append(LIBS = ['o3d_base'] + env['ICU_LIBS'])
-
-# Build the big tests
-BIG_TEST_CLIENT = [
- 'cross/big_test_client.cc',
-]
-
-# Create a target executable program called 'o3dCmdBuf_bigtest_client' from the
-# list of big test client files.
-big_test_client = env.Program('o3dCmdBuf_bigtest_client', BIG_TEST_CLIENT)
-
-# Copy the resulting executable to the Artifacts directory.
-env.Replicate('$ARTIFACTS_DIR', big_test_client)
diff --git a/o3d/command_buffer/client/cross/big_test_client.cc b/o3d/command_buffer/client/cross/big_test_client.cc
deleted file mode 100644
index 676b21b..0000000
--- a/o3d/command_buffer/client/cross/big_test_client.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <math.h>
-#ifdef __native_client__
-#include <sys/nacl_syscalls.h>
-#else
-#include "third_party/native_client/googleclient/native_client/src/trusted/desc/nrd_all_modules.h"
-#endif
-#include "command_buffer/common/cross/gapi_interface.h"
-#include "command_buffer/common/cross/rpc_imc.h"
-#include "command_buffer/client/cross/cmd_buffer_helper.h"
-#include "command_buffer/client/cross/buffer_sync_proxy.h"
-#include "third_party/vectormath/files/vectormathlibrary/include/vectormath/scalar/cpp/vectormath_aos.h" // NOLINT
-
-namespace o3d {
-namespace command_buffer {
-
-namespace math = Vectormath::Aos;
-
-// Adds a SetViewport command into the buffer.
-// Parameters:
-// cmd_buffer: the command buffer helper.
-// x, y, width, height: the dimensions of the Viewport.
-// z_near, z_far: the near and far clip plane distances.
-void SetViewportCmd(CommandBufferHelper *cmd_buffer,
- unsigned int x,
- unsigned int y,
- unsigned int width,
- unsigned int height,
- float z_near,
- float z_far) {
- cmd_buffer->SetViewport(x, y, width, height, z_near, z_far);
-}
-
-// Copy a data buffer to args, for IMMEDIATE commands. Returns the number of
-// args used.
-unsigned int CopyToArgs(CommandBufferEntry *args,
- const void *data,
- size_t size) {
- memcpy(args, data, size);
- const unsigned int arg_size = sizeof(args[0]);
- return static_cast<unsigned int>((size + arg_size - 1) / arg_size);
-}
-
-// Our effect: pass through position and UV, look up texture.
-// This follows the command buffer effect format :
-// vertex_program_entry \0 fragment_program_entry \0 effect_code.
-const char effect_data[] =
- "vs\0" // Vertex program entry point
- "ps\0" // Fragment program entry point
- "struct a2v {float4 pos: POSITION; float2 uv: TEXCOORD0;};\n"
- "struct v2f {float4 pos: POSITION; float2 uv: TEXCOORD0;};\n"
- "float4x4 worldViewProj : WorldViewProjection;\n"
- "v2f vs(a2v i) {\n"
- " v2f o;\n"
- " o.pos = mul(i.pos, worldViewProj);\n"
- " o.uv = i.uv;\n"
- " return o;\n"
- "}\n"
- "sampler s0;\n"
- "float4 ps(v2f i) : COLOR { return tex2D(s0, i.uv); }\n";
-
-// Custom vertex, with position and color.
-struct CustomVertex {
- float x, y, z, w;
- float u, v;
-};
-
-void BigTestClient(nacl::HtpHandle handle) {
- IMCSender sender(handle);
- BufferSyncProxy proxy(&sender);
-
- proxy.InitConnection();
- const int kShmSize = 2048;
- RPCShmHandle shm = CreateShm(kShmSize);
- void *shm_address = MapShm(shm, kShmSize);
- unsigned int shm_id = proxy.RegisterSharedMemory(shm, kShmSize);
-
- {
- CommandBufferHelper cmd_buffer(&proxy);
- cmd_buffer.Init(500);
-
- // Clear the buffers.
- RGBA color = {0.2f, 0.2f, 0.2f, 1.f};
- cmd_buffer.Clear(command_buffer::kColor | command_buffer::kDepth,
- color.red, color.green, color.blue, color.alpha,
- 1.f, 0);
-
- const ResourceId vertex_buffer_id = 1;
- const ResourceId vertex_struct_id = 1;
-
- static const CustomVertex vertices[4] = {
- {-.5f, -.5f, 0.f, 1.f, 0, 0},
- {.5f, -.5f, 0.f, 1.f, 1, 0},
- {-.5f, .5f, 0.f, 1.f, 0, 1},
- {.5f, .5f, 0.f, 1.f, 1, 1},
- };
- cmd_buffer.CreateVertexBuffer(vertex_buffer_id, sizeof(vertices),
- vertex_buffer::kNone);
-
- memcpy(shm_address, vertices, sizeof(vertices));
- cmd_buffer.SetVertexBufferData(
- vertex_buffer_id, 0, sizeof(vertices), shm_id, 0);
- unsigned int token = cmd_buffer.InsertToken();
-
- cmd_buffer.CreateVertexStruct(vertex_struct_id, 2);
-
- // Set POSITION input stream
- cmd_buffer.SetVertexInput(vertex_struct_id, 0, vertex_buffer_id, 0,
- vertex_struct::kPosition, 0,
- vertex_struct::kFloat4, sizeof(CustomVertex));
-
- // Set TEXCOORD0 input stream
- cmd_buffer.SetVertexInput(vertex_struct_id, 1, vertex_buffer_id, 16,
- vertex_struct::kTexCoord, 0,
- vertex_struct::kFloat2, sizeof(CustomVertex));
-
- // wait for previous transfer to be executed, so that we can re-use the
- // transfer shared memory buffer.
- cmd_buffer.WaitForToken(token);
- memcpy(shm_address, effect_data, sizeof(effect_data));
- const ResourceId effect_id = 1;
- cmd_buffer.CreateEffect(effect_id, sizeof(effect_data), shm_id, 0);
- token = cmd_buffer.InsertToken();
-
- // Create a 4x4 2D texture.
- const ResourceId texture_id = 1;
- cmd_buffer.CreateTexture2d(texture_id, 4, 4, 1, texture::kARGB8, 0);
-
- static const unsigned int texels[4] = {
- 0xff0000ff,
- 0xffff00ff,
- 0xff00ffff,
- 0xffffffff,
- };
- // wait for previous transfer to be executed, so that we can re-use the
- // transfer shared memory buffer.
- cmd_buffer.WaitForToken(token);
- memcpy(shm_address, texels, sizeof(texels));
- // Creates a 4x4 texture by uploading 2x2 data in each quadrant.
- for (unsigned int x = 0; x < 2; ++x)
- for (unsigned int y = 0; y < 2; ++y) {
- cmd_buffer.SetTextureData(texture_id, x * 2, y * 2, 0, 2, 2, 1, 0,
- texture::kFaceNone,
- sizeof(texels[0]) * 2, // row_pitch
- 0, // slice_pitch
- sizeof(texels), // size
- shm_id,
- 0);
- }
- token = cmd_buffer.InsertToken();
-
- const ResourceId sampler_id = 1;
- cmd_buffer.CreateSampler(sampler_id);
- cmd_buffer.SetSamplerTexture(sampler_id, texture_id);
- cmd_buffer.SetSamplerStates(sampler_id,
- sampler::kClampToEdge,
- sampler::kClampToEdge,
- sampler::kClampToEdge,
- sampler::kPoint,
- sampler::kPoint,
- sampler::kNone,
- 1);
-
- // Create a parameter for the sampler.
- const ResourceId sampler_param_id = 1;
- {
- static const char param_name[] = "s0";
- cmd_buffer.CreateParamByNameImmediate(sampler_param_id, effect_id,
- sizeof(param_name), param_name);
- }
-
- const ResourceId matrix_param_id = 2;
- {
- static const char param_name[] = "worldViewProj";
- cmd_buffer.CreateParamByNameImmediate(matrix_param_id, effect_id,
- sizeof(param_name), param_name);
- }
-
- float t = 0.f;
- while (true) {
- t = fmodf(t + .01f, 1.f);
- math::Matrix4 m =
- math::Matrix4::translation(math::Vector3(0.f, 0.f, .5f));
- m *= math::Matrix4::rotationY(t * 2 * 3.1415926f);
- cmd_buffer.BeginFrame();
- // Clear the background with an animated color (black to red).
- cmd_buffer.Clear(command_buffer::kColor | command_buffer::kDepth,
- color.red, color.green, color.blue, color.alpha,
- 1.f, 0);
-
- cmd_buffer.SetVertexStruct(vertex_struct_id);
- cmd_buffer.SetEffect(effect_id);
- cmd_buffer.SetParamDataImmediate(
- sampler_param_id, sizeof(uint32), &sampler_id); // NOLINT
- cmd_buffer.SetParamDataImmediate(
- matrix_param_id, sizeof(m), &m);
- cmd_buffer.Draw(command_buffer::kTriangleStrips, 0, 2);
-
- cmd_buffer.EndFrame();
- cmd_buffer.Flush();
- }
-
- cmd_buffer.Finish();
- }
-
- proxy.CloseConnection();
- proxy.UnregisterSharedMemory(shm_id);
- DestroyShm(shm);
-
- sender.SendCall(POISONED_MESSAGE_ID, NULL, 0, NULL, 0);
-}
-
-} // namespace command_buffer
-} // namespace o3d
-
-nacl::HtpHandle InitConnection(int argc, char **argv) {
- nacl::Handle handle = nacl::kInvalidHandle;
-#ifndef __native_client__
- NaClNrdAllModulesInit();
-
- static nacl::SocketAddress g_address = { "command-buffer" };
- static nacl::SocketAddress g_local_address = { "cb-client" };
-
- nacl::Handle sockets[2];
- nacl::SocketPair(sockets);
-
- nacl::MessageHeader msg;
- msg.iov = NULL;
- msg.iov_length = 0;
- msg.handles = &sockets[1];
- msg.handle_count = 1;
- nacl::Handle local_socket = nacl::BoundSocket(&g_local_address);
- nacl::SendDatagramTo(local_socket, &msg, 0, &g_address);
- nacl::Close(local_socket);
- nacl::Close(sockets[1]);
- handle = sockets[0];
-#else
- if (argc < 3 || strcmp(argv[1], "-fd") != 0) {
- fprintf(stderr, "Usage: %s -fd file_descriptor\n", argv[0]);
- return nacl::kInvalidHtpHandle;
- }
- int fd = atoi(argv[2]);
- handle = imc_connect(fd);
- if (handle < 0) {
- fprintf(stderr, "Could not connect to file descriptor %d.\n"
- "Did you use the -a and -X options to sel_ldr ?\n", fd);
- return nacl::kInvalidHtpHandle;
- }
-#endif
- return nacl::CreateImcDesc(handle);
-}
-
-void CloseConnection(nacl::HtpHandle handle) {
- nacl::Close(handle);
-#ifndef __native_client__
- NaClNrdAllModulesFini();
-#endif
-}
-
-int main(int argc, char **argv) {
- nacl::HtpHandle htp_handle = InitConnection(argc, argv);
- if (htp_handle == nacl::kInvalidHtpHandle) {
- return 1;
- }
-
- o3d::command_buffer::BigTestClient(htp_handle);
- CloseConnection(htp_handle);
- return 0;
-}
diff --git a/o3d/command_buffer/client/cross/buffer_sync_proxy.cc b/o3d/command_buffer/client/cross/buffer_sync_proxy.cc
deleted file mode 100644
index 8439085..0000000
--- a/o3d/command_buffer/client/cross/buffer_sync_proxy.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file has the implementation of the Command Buffer Synchronous API RPC
-// glue, client-side (proxy).
-
-#include "command_buffer/client/cross/buffer_sync_proxy.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Implements the proxy InitConnection, forwarding the call with its argument to
-// the RPC server.
-void BufferSyncProxy::InitConnection() {
- server_->SendCall(BufferRPCImpl::INIT_CONNECTION, NULL, 0, NULL, 0);
-}
-
-// Implements the proxy CloseConnection, forwarding the call to the RPC server.
-void BufferSyncProxy::CloseConnection() {
- server_->SendCall(BufferRPCImpl::CLOSE_CONNECTION, NULL, 0, NULL, 0);
-}
-
-unsigned int BufferSyncProxy::RegisterSharedMemory(RPCShmHandle buffer,
- size_t size) {
- RPCHandle handles[1] = {buffer};
- return server_->SendCall(BufferRPCImpl::REGISTER_SHARED_MEMORY, &size,
- sizeof(size), handles, 1);
-}
-
-void BufferSyncProxy::UnregisterSharedMemory(unsigned int shm_id) {
- server_->SendCall(BufferRPCImpl::UNREGISTER_SHARED_MEMORY, &shm_id,
- sizeof(shm_id), NULL, 0);
-}
-
-// Implements the proxy SetCommandBuffer, forwarding the call with its
-// arguments to the RPC server.
-void BufferSyncProxy::SetCommandBuffer(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get) {
- BufferRPCImpl::SetCommandBufferStruct params;
- params.shm_id = shm_id;
- params.offset = offset;
- params.size = size;
- params.start_get = start_get;
- server_->SendCall(BufferRPCImpl::SET_COMMAND_BUFFER, &params, sizeof(params),
- NULL, 0);
-}
-
-// Implements the proxy Put, forwarding the call with its argument to the RPC
-// server.
-void BufferSyncProxy::Put(CommandBufferOffset offset) {
- server_->SendCall(BufferRPCImpl::PUT, &offset, sizeof(offset), NULL, 0);
-}
-
-// Implements the proxy Get, forwarding the call to the RPC server.
-CommandBufferOffset BufferSyncProxy::Get() {
- return server_->SendCall(BufferRPCImpl::GET, NULL, 0, NULL, 0);
-}
-
-// Implements the proxy GetToken, forwarding the call to the RPC server.
-unsigned int BufferSyncProxy::GetToken() {
- return server_->SendCall(BufferRPCImpl::GET_TOKEN, NULL, 0, NULL, 0);
-}
-
-// Implements the proxy WaitGetChanges, forwarding the call with its argument
-// to the RPC server.
-CommandBufferOffset BufferSyncProxy::WaitGetChanges(
- CommandBufferOffset current_value) {
- return server_->SendCall(BufferRPCImpl::WAIT_GET_CHANGES, &current_value,
- sizeof(current_value), NULL, 0);
-}
-
-// Implements the proxy SignalGetChanges, forwarding the call with its
-// arguments to the RPC server.
-void BufferSyncProxy::SignalGetChanges(CommandBufferOffset current_value,
- int rpc_message_id) {
- BufferRPCImpl::SignalGetChangesStruct params;
- params.current_value = current_value;
- params.rpc_message_id = rpc_message_id;
- server_->SendCall(BufferRPCImpl::SIGNAL_GET_CHANGES, &params, sizeof(params),
- NULL, 0);
-}
-
-// Implements the proxy GetStatus, forwarding the call to the RPC server.
-BufferSyncInterface::ParserStatus BufferSyncProxy::GetStatus() {
- return static_cast<BufferSyncInterface::ParserStatus>(
- server_->SendCall(BufferRPCImpl::GET_STATUS, NULL, 0, NULL, 0));
-}
-
-// Implements the proxy GetParseError, forwarding the call to the RPC server.
-BufferSyncInterface::ParseError BufferSyncProxy::GetParseError() {
- return static_cast<ParseError>(
- server_->SendCall(BufferRPCImpl::GET_PARSE_ERROR, NULL, 0, NULL, 0));
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/client/cross/buffer_sync_proxy.h b/o3d/command_buffer/client/cross/buffer_sync_proxy.h
deleted file mode 100644
index 341b935..0000000
--- a/o3d/command_buffer/client/cross/buffer_sync_proxy.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file defines the RPC glue for the Command Buffer Synchronous API,
-// client side: a proxy implementation of BufferSyncInterface, forwarding calls
-// to a RPC send interface.
-
-#ifndef O3D_COMMAND_BUFFER_CLIENT_CROSS_BUFFER_SYNC_PROXY_H_
-#define O3D_COMMAND_BUFFER_CLIENT_CROSS_BUFFER_SYNC_PROXY_H_
-
-#include "command_buffer/common/cross/rpc.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Class implementing the Command Buffer Synchronous API, forwarding all the
-// calls to a RPC server, according to the (trivial) protocol defined in
-// BufferRPCImpl.
-class BufferSyncProxy : public BufferSyncInterface {
- public:
- explicit BufferSyncProxy(RPCSendInterface *server) : server_(server) {}
- virtual ~BufferSyncProxy() {}
-
- // Implements the InitConnection call, forwarding it to the RPC server.
- virtual void InitConnection();
-
- // Implements the CloseConnection call, forwarding it to the RPC server.
- virtual void CloseConnection();
-
- // Implements the RegisterSharedMemory call, forwarding it to the RPC server.
- virtual unsigned int RegisterSharedMemory(RPCShmHandle buffer, size_t size);
-
- // Implements the UnregisterSharedMemory call, forwarding it to the RPC
- // server.
- virtual void UnregisterSharedMemory(unsigned int shm_id);
-
- // Implements the SetCommandBuffer call, forwarding it to the RPC server.
- virtual void SetCommandBuffer(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get);
-
- // Implements the Put call, forwarding it to the RPC server.
- virtual void Put(CommandBufferOffset offset);
-
- // Implements the Get call, forwarding it to the RPC server.
- virtual CommandBufferOffset Get();
-
- // Implements the GetToken call, forwarding it to the RPC server.
- virtual unsigned int GetToken();
-
- // Implements the WaitGetChanges call, forwarding it to the RPC server.
- virtual CommandBufferOffset WaitGetChanges(
- CommandBufferOffset current_value);
-
- // Implements the SignalGetChanges call, forwarding it to the RPC server.
- virtual void SignalGetChanges(CommandBufferOffset current_value,
- int rpc_message_id);
-
- // Implements the GetStatus call, forwarding it to the RPC server.
- virtual ParserStatus GetStatus();
-
- // Implements the GetParseError call, forwarding it to the RPC server.
- virtual ParseError GetParseError();
- private:
- RPCSendInterface *server_;
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_CLIENT_CROSS_BUFFER_SYNC_PROXY_H_
diff --git a/o3d/command_buffer/client/cross/buffer_sync_proxy_test.cc b/o3d/command_buffer/client/cross/buffer_sync_proxy_test.cc
deleted file mode 100644
index c5d473f..0000000
--- a/o3d/command_buffer/client/cross/buffer_sync_proxy_test.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// Tests for the Command Buffer RPC glue, client side (proxy).
-
-#include "base/scoped_ptr.h"
-#include "tests/common/win/testing_common.h"
-#include "command_buffer/client/cross/buffer_sync_proxy.h"
-#include "command_buffer/common/cross/mocks.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-using testing::Return;
-
-// Test fixture for BufferSyncProxy test - Creates a BufferSyncProxy, using a
-// mock RPCSendInterface.
-class BufferSyncProxyTest : public testing::Test {
- protected:
- virtual void SetUp() {
- server_mock_.reset(new RPCSendInterfaceMock);
- proxy_.reset(new BufferSyncProxy(server_mock_.get()));
- }
- virtual void TearDown() {}
-
- RPCSendInterfaceMock *server_mock() { return server_mock_.get(); }
- BufferSyncProxy *proxy() { return proxy_.get(); }
- private:
- scoped_ptr<RPCSendInterfaceMock> server_mock_;
- scoped_ptr<BufferSyncProxy> proxy_;
-};
-
-// Tests the implementation of InitConnection, checking that it sends the
-// correct message.
-TEST_F(BufferSyncProxyTest, TestInitConnection) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::INIT_CONNECTION;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->InitConnection();
-}
-
-// Tests the implementation of CloseConnection, checking that it sends the
-// correct message.
-TEST_F(BufferSyncProxyTest, TestCloseConnection) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::CLOSE_CONNECTION;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->CloseConnection();
-}
-
-// Tests the implementation of RegisterSharedMemory, checking that it sends the
-// correct message and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestRegisterSharedMemory) {
- RPCShmHandle shm = reinterpret_cast<RPCShmHandle>(456);
- RPCHandle handles[1] = {shm};
- size_t size = 789;
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 123;
- expect.message_id = BufferRPCImpl::REGISTER_SHARED_MEMORY;
- expect.data = &size;
- expect.size = sizeof(size);
- expect.handles = handles;
- expect.handle_count = 1;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(123u, proxy()->RegisterSharedMemory(shm, size));
-}
-
-// Tests the implementation of UnregisterSharedMemory, checking that it sends
-// the correct message.
-TEST_F(BufferSyncProxyTest, TestUnregisterSharedMemory) {
- unsigned int shm_id = 456;
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::UNREGISTER_SHARED_MEMORY;
- expect.data = &shm_id;
- expect.size = sizeof(shm_id);
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->UnregisterSharedMemory(456);
-}
-
-// Tests the implementation of SetCommandBuffer, checking that it sends the
-// correct message.
-TEST_F(BufferSyncProxyTest, TestSetCommandBuffer) {
- BufferRPCImpl::SetCommandBufferStruct params;
- params.shm_id = 53;
- params.offset = 1234;
- params.size = 5678;
- params.start_get = 42;
-
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::SET_COMMAND_BUFFER;
- expect.data = &params;
- expect.size = sizeof(params);
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->SetCommandBuffer(53, 1234, 5678, 42);
-}
-
-// Tests the implementation of Put, checking that it sends the correct message.
-TEST_F(BufferSyncProxyTest, TestPut) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::PUT;
- CommandBufferOffset value = 67;
- expect.data = &value;
- expect.size = sizeof(value);
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->Put(67);
-}
-
-// Tests the implementation of Get, checking that it sends the correct message
-// and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestGet) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 72;
- expect.message_id = BufferRPCImpl::GET;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(72u, proxy()->Get());
-}
-
-// Tests the implementation of GetToken, checking that it sends the correct
-// message and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestGetToken) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 38;
- expect.message_id = BufferRPCImpl::GET_TOKEN;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(38u, proxy()->GetToken());
-}
-
-// Tests the implementation of WaitGetChanges, checking that it sends the
-// correct message and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestWaitGetChanges) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 53;
- expect.message_id = BufferRPCImpl::WAIT_GET_CHANGES;
- CommandBufferOffset value = 101;
- expect.data = &value;
- expect.size = sizeof(value);
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(53u, proxy()->WaitGetChanges(101));
-}
-
-// Tests the implementation of SignalGetChanges, checking that it sends the
-// correct message.
-TEST_F(BufferSyncProxyTest, TestSignalGetChanges) {
- BufferRPCImpl::SignalGetChangesStruct params;
- params.current_value = 3141;
- params.rpc_message_id = 5926;
-
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = 0;
- expect.message_id = BufferRPCImpl::SIGNAL_GET_CHANGES;
- expect.data = &params;
- expect.size = sizeof(params);
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- proxy()->SignalGetChanges(3141, 5926);
-}
-
-// Tests the implementation of GetStatus, checking that it sends the correct
-// message and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestGetStatus) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = BufferSyncInterface::kParsing;
- expect.message_id = BufferRPCImpl::GET_STATUS;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(BufferSyncInterface::kParsing, proxy()->GetStatus());
-}
-
-// Tests the implementation of GetParseError, checking that it sends the correct
-// message and returns the correct value.
-TEST_F(BufferSyncProxyTest, TestGetParseError) {
- RPCSendInterfaceMock::SendCallExpect expect;
- expect._return = BufferSyncInterface::kParseUnknownCommand;
- expect.message_id = BufferRPCImpl::GET_PARSE_ERROR;
- expect.data = NULL;
- expect.size = 0;
- expect.handles = NULL;
- expect.handle_count = 0;
- server_mock()->AddSendCallExpect(expect);
-
- EXPECT_EQ(BufferSyncInterface::kParseUnknownCommand,
- proxy()->GetParseError());
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/client/cross/cmd_buffer_helper.cc b/o3d/command_buffer/client/cross/cmd_buffer_helper.cc
index 10faddc..108f78e 100644
--- a/o3d/command_buffer/client/cross/cmd_buffer_helper.cc
+++ b/o3d/command_buffer/client/cross/cmd_buffer_helper.cc
@@ -33,72 +33,100 @@
// This file contains the implementation of the command buffer helper class.
#include "command_buffer/client/cross/cmd_buffer_helper.h"
+#include "o3d/gpu_plugin/np_utils/np_utils.h"
namespace o3d {
namespace command_buffer {
-CommandBufferHelper::CommandBufferHelper(BufferSyncInterface *interface)
- : interface_(interface),
+using gpu_plugin::NPBrowser;
+using gpu_plugin::NPInvoke;
+using gpu_plugin::NPObjectPointer;
+
+CommandBufferHelper::CommandBufferHelper(
+ NPP npp,
+ const NPObjectPointer<NPObject>& command_buffer)
+ : npp_(npp),
+ command_buffer_(command_buffer),
entries_(NULL),
entry_count_(0),
- token_(0) {
- // The interface should be connected already.
- DCHECK_NE(BufferSyncInterface::kNotConnected, interface_->GetStatus());
+ token_(0),
+ last_token_read_(-1),
+ get_(0),
+ put_(0) {
}
-bool CommandBufferHelper::Init(unsigned int entry_count) {
- if (entry_count == 0)
+bool CommandBufferHelper::Initialize() {
+ // Get the ring buffer from the GPU process.
+ if (!NPInvoke(npp_, command_buffer_, "getRingBuffer", &ring_buffer_) ||
+ !ring_buffer_.Get()) {
+ return false;
+ }
+
+ // Map the ring buffer into this process.
+ size_t size_bytes;
+ entries_ = static_cast<CommandBufferEntry*>(
+ NPBrowser::get()->MapMemory(npp_, ring_buffer_.Get(), &size_bytes));
+
+ // Get the command buffer size.
+ if (!NPInvoke(npp_, command_buffer_, "getSize", &entry_count_)) {
+ return false;
+ }
+
+ // Get the initial get offset.
+ if (!NPInvoke(npp_, command_buffer_, "getGetOffset", &get_)) {
return false;
- size_t size = entry_count * sizeof(CommandBufferEntry); // NOLINT
- shm_handle_ = CreateShm(size);
- if (shm_handle_ == kRPCInvalidHandle)
+ }
+
+ // Get the initial put offset.
+ if (!NPInvoke(npp_, command_buffer_, "getPutOffset", &put_)) {
return false;
- void *address = MapShm(shm_handle_, size);
- if (!address) {
- DestroyShm(shm_handle_);
- shm_handle_ = kRPCInvalidHandle;
+ }
+
+ // Get the last token.
+ if (!NPInvoke(npp_, command_buffer_, "getToken", &last_token_read_)) {
return false;
}
- entries_ = static_cast<CommandBufferEntry *>(address);
- entry_count_ = entry_count;
- shm_id_ = interface_->RegisterSharedMemory(shm_handle_, size);
- interface_->SetCommandBuffer(shm_id_, 0, size, 0);
- get_ = interface_->Get();
- put_ = get_;
- last_token_read_ = interface_->GetToken();
+
return true;
}
CommandBufferHelper::~CommandBufferHelper() {
- if (entries_) {
- interface_->UnregisterSharedMemory(shm_id_);
- UnmapShm(entries_, entry_count_ * sizeof(CommandBufferEntry)); // NOLINT
- DestroyShm(shm_handle_);
- }
+}
+
+bool CommandBufferHelper::Flush() {
+ // If this fails it means the command buffer reader has been shutdown.
+ return NPInvoke(npp_, command_buffer_, "syncOffsets", put_, &get_);
}
// Calls Flush() and then waits until the buffer is empty. Break early if the
// error is set.
-void CommandBufferHelper::Finish() {
- Flush();
- while (put_ != get_) {
- WaitForGetChange();
- }
+bool CommandBufferHelper::Finish() {
+ do {
+ // Do not loop forever if the flush fails, meaning the command buffer reader
+ // has shutdown).
+ if (!Flush())
+ return false;
+ } while (put_ != get_);
+
+ return true;
}
// Inserts a new token into the command stream. It uses an increasing value
// scheme so that we don't lose tokens (a token has passed if the current token
// value is higher than that token). Calls Finish() if the token value wraps,
// which will be rare.
-unsigned int CommandBufferHelper::InsertToken() {
- ++token_;
+int32 CommandBufferHelper::InsertToken() {
+ // Increment token as 31-bit integer. Negative values are used to signal an
+ // error.
+ token_ = (token_ + 1) & 0x7FFFFFFF;
CommandBufferEntry args;
args.value_uint32 = token_;
AddCommand(command_buffer::kSetToken, 1, &args);
if (token_ == 0) {
// we wrapped
Finish();
- last_token_read_ = interface_->GetToken();
+ if (!NPInvoke(npp_, command_buffer_, "getToken", &last_token_read_))
+ return -1;
DCHECK_EQ(token_, last_token_read_);
}
return token_;
@@ -106,48 +134,27 @@ unsigned int CommandBufferHelper::InsertToken() {
// Waits until the current token value is greater or equal to the value passed
// in argument.
-void CommandBufferHelper::WaitForToken(unsigned int token) {
+void CommandBufferHelper::WaitForToken(int32 token) {
+ // Return immediately if corresponding InsertToken failed.
+ if (token < 0)
+ return;
if (last_token_read_ >= token) return; // fast path.
if (token > token_) return; // we wrapped
Flush();
- last_token_read_ = interface_->GetToken();
+ if (!NPInvoke(npp_, command_buffer_, "getToken", &last_token_read_))
+ return;
while (last_token_read_ < token) {
if (get_ == put_) {
LOG(FATAL) << "Empty command buffer while waiting on a token.";
return;
}
- WaitForGetChange();
- last_token_read_ = interface_->GetToken();
- }
-}
-
-// Waits for get to change. In case get doesn't change or becomes invalid,
-// check for an error.
-void CommandBufferHelper::WaitForGetChange() {
- CommandBufferOffset new_get = interface_->WaitGetChanges(get_);
- if (new_get == get_ || new_get == kInvalidCommandBufferOffset) {
- // If get_ didn't change or is invalid, it means an error may have
- // occured. Check that.
- BufferSyncInterface::ParserStatus status = interface_->GetStatus();
- if (status != BufferSyncInterface::kParsing) {
- switch (status) {
- case BufferSyncInterface::kNotConnected:
- LOG(FATAL) << "Service disconnected.";
- return;
- case BufferSyncInterface::kNoBuffer:
- LOG(FATAL) << "Service doesn't have a buffer set.";
- return;
- case BufferSyncInterface::kParseError: {
- BufferSyncInterface::ParseError error = interface_->GetParseError();
- LOG(WARNING) << "Parse error: " << error;
- return;
- }
- case BufferSyncInterface::kParsing:
- break;
- }
- }
+ // Do not loop forever if the flush fails, meaning the command buffer reader
+ // has shutdown.
+ if (!Flush())
+ return;
+ if (!NPInvoke(npp_, command_buffer_, "getToken", &last_token_read_))
+ return;
}
- get_ = new_get;
}
// Waits for available entries, basically waiting until get >= put + count + 1.
@@ -155,17 +162,25 @@ void CommandBufferHelper::WaitForGetChange() {
// around, adding noops. Thus this function may change the value of put_.
// The function will return early if an error occurs, in which case the
// available space may not be available.
-void CommandBufferHelper::WaitForAvailableEntries(unsigned int count) {
+void CommandBufferHelper::WaitForAvailableEntries(int32 count) {
CHECK(count < entry_count_);
if (put_ + count > entry_count_) {
// There's not enough room between the current put and the end of the
// buffer, so we need to wrap. We will add noops all the way to the end,
// but we need to make sure get wraps first, actually that get is 1 or
// more (since put will wrap to 0 after we add the noops).
- DCHECK_LE(1U, put_);
+ DCHECK_LE(1, put_);
Flush();
- while (get_ > put_ || get_ == 0) WaitForGetChange();
+ while (get_ > put_ || get_ == 0) {
+ // Do not loop forever if the flush fails, meaning the command buffer
+ // reader has shutdown.
+ if (!Flush())
+ return;
+ }
// Add the noops. By convention, a noop is a command 0 with no args.
+ // TODO(apatrick): A noop can have a size. It would be better to add a
+ // single noop with a variable size. Watch out for size limit on
+ // individual commands.
CommandHeader header;
header.size = 1;
header.command = 0;
@@ -178,7 +193,12 @@ void CommandBufferHelper::WaitForAvailableEntries(unsigned int count) {
if (count <= AvailableEntries()) return;
// Otherwise flush, and wait until we do have enough room.
Flush();
- while (AvailableEntries() < count) WaitForGetChange();
+ while (AvailableEntries() < count) {
+ // Do not loop forever if the flush fails, meaning the command buffer reader
+ // has shutdown.
+ if (!Flush())
+ return;
+ }
}
CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) {
@@ -188,5 +208,11 @@ CommandBufferEntry* CommandBufferHelper::GetSpace(uint32 entries) {
return space;
}
+parse_error::ParseError CommandBufferHelper::GetParseError() {
+ int32 parse_error;
+ DCHECK(NPInvoke(npp_, command_buffer_, "resetParseError", &parse_error));
+ return static_cast<parse_error::ParseError>(parse_error);
+}
+
} // namespace command_buffer
} // namespace o3d
diff --git a/o3d/command_buffer/client/cross/cmd_buffer_helper.h b/o3d/command_buffer/client/cross/cmd_buffer_helper.h
index b00c8fc6..b42c5e0 100644
--- a/o3d/command_buffer/client/cross/cmd_buffer_helper.h
+++ b/o3d/command_buffer/client/cross/cmd_buffer_helper.h
@@ -36,8 +36,9 @@
#define O3D_COMMAND_BUFFER_CLIENT_CROSS_CMD_BUFFER_HELPER_H_
#include "command_buffer/common/cross/logging.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
+#include "command_buffer/common/cross/constants.h"
#include "command_buffer/common/cross/cmd_buffer_format.h"
+#include "o3d/gpu_plugin/np_utils/np_object_pointer.h"
namespace o3d {
namespace command_buffer {
@@ -50,7 +51,7 @@ namespace command_buffer {
//
// helper.AddCommand(...);
// helper.AddCommand(...);
-// unsigned int token = helper.InsertToken();
+// int32 token = helper.InsertToken();
// helper.AddCommand(...);
// helper.AddCommand(...);
// [...]
@@ -59,43 +60,38 @@ namespace command_buffer {
// // commands have been executed.
class CommandBufferHelper {
public:
- // Constructs a CommandBufferHelper object. The helper needs to be
- // initialized by calling Init() before use.
- // Parameters:
- // interface: the buffer interface the helper sends commands to.
- explicit CommandBufferHelper(BufferSyncInterface *interface);
+ explicit CommandBufferHelper(
+ NPP npp,
+ const gpu_plugin::NPObjectPointer<NPObject>& command_buffer);
~CommandBufferHelper();
- // Initializes the command buffer by allocating shared memory.
- // Parameters:
- // entry_count: the number of entries in the buffer. Note that commands
- // sent through the buffer must use at most entry_count-2 arguments
- // (entry_count-1 size).
- // Returns:
- // true if successful.
- bool Init(unsigned int entry_count);
+ bool Initialize();
// Flushes the commands, setting the put pointer to let the buffer interface
- // know that new commands have been added.
- void Flush() {
- interface_->Put(put_);
- }
-
- // Waits until all the commands have been executed.
- void Finish();
+ // know that new commands have been added. After a flush returns, the command
+ // buffer service is aware of all pending commands and it is guaranteed to
+ // have made some progress in processing them. Returns whether the flush was
+ // successful. The flush will fail if the command buffer service has
+ // disconnected.
+ bool Flush();
+
+ // Waits until all the commands have been executed. Returns whether it
+ // was successful. The function will fail if the command buffer service has
+ // disconnected.
+ bool Finish();
// Waits until a given number of available entries are available.
// Parameters:
// count: number of entries needed. This value must be at most
// the size of the buffer minus one.
- void WaitForAvailableEntries(unsigned int count);
+ void WaitForAvailableEntries(int32 count);
// Adds a command data to the command buffer. This may wait until sufficient
// space is available.
// Parameters:
// entries: The command entries to add.
// count: The number of entries.
- void AddCommandData(const CommandBufferEntry* entries, unsigned int count) {
+ void AddCommandData(const CommandBufferEntry* entries, int32 count) {
WaitForAvailableEntries(count);
for (; count > 0; --count) {
entries_[put_++] = *entries++;
@@ -118,15 +114,15 @@ class CommandBufferHelper {
// arg_count: the number of arguments for the command.
// args: the arguments for the command (these are copied before the
// function returns).
- void AddCommand(unsigned int command,
- unsigned int arg_count,
+ void AddCommand(int32 command,
+ int32 arg_count,
const CommandBufferEntry *args) {
CommandHeader header;
header.size = arg_count + 1;
header.command = command;
WaitForAvailableEntries(header.size);
entries_[put_++].value_header = header;
- for (unsigned int i = 0; i < arg_count; ++i) {
+ for (int i = 0; i < arg_count; ++i) {
entries_[put_++] = args[i];
}
DCHECK_LE(put_, entry_count_);
@@ -138,18 +134,16 @@ class CommandBufferHelper {
// inserted tokens with that value have already passed through the command
// stream.
// Returns:
- // the value of the new token.
- unsigned int InsertToken();
+ // the value of the new token or -1 if the command buffer reader has
+ // shutdown.
+ int32 InsertToken();
// Waits until the token of a particular value has passed through the command
// stream (i.e. commands inserted before that token have been executed).
// NOTE: This will call Flush if it needs to block.
// Parameters:
// the value of the token to wait for.
- void WaitForToken(unsigned int token);
-
- // Returns the buffer interface used to send synchronous commands.
- BufferSyncInterface *interface() { return interface_; }
+ void WaitForToken(int32 token);
// Waits for a certain amount of space to be available. Returns address
// of space.
@@ -174,6 +168,8 @@ class CommandBufferHelper {
return *reinterpret_cast<T*>(data);
}
+ parse_error::ParseError GetParseError();
+
// ------------------ Individual commands ----------------------
void Noop(uint32 skip_count) {
@@ -765,20 +761,19 @@ class CommandBufferHelper {
void WaitForGetChange();
// Returns the number of available entries (they may not be contiguous).
- unsigned int AvailableEntries() {
- return static_cast<unsigned int>(
- (get_ - put_ - 1 + entry_count_) % entry_count_);
+ int32 AvailableEntries() {
+ return (get_ - put_ - 1 + entry_count_) % entry_count_;
}
- BufferSyncInterface *interface_;
+ NPP npp_;
+ gpu_plugin::NPObjectPointer<NPObject> command_buffer_;
+ gpu_plugin::NPObjectPointer<NPObject> ring_buffer_;
CommandBufferEntry *entries_;
- unsigned int entry_count_;
- unsigned int token_;
- unsigned int last_token_read_;
- RPCShmHandle shm_handle_;
- unsigned int shm_id_;
- CommandBufferOffset get_;
- CommandBufferOffset put_;
+ int32 entry_count_;
+ int32 token_;
+ int32 last_token_read_;
+ int32 get_;
+ int32 put_;
friend class CommandBufferHelperTest;
};
diff --git a/o3d/command_buffer/client/cross/cmd_buffer_helper_test.cc b/o3d/command_buffer/client/cross/cmd_buffer_helper_test.cc
index d72d920..95d31d5 100644
--- a/o3d/command_buffer/client/cross/cmd_buffer_helper_test.cc
+++ b/o3d/command_buffer/client/cross/cmd_buffer_helper_test.cc
@@ -33,13 +33,22 @@
// Tests for the Command Buffer Helper.
#include "tests/common/win/testing_common.h"
+#include "base/message_loop.h"
#include "command_buffer/client/cross/cmd_buffer_helper.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
#include "command_buffer/service/cross/mocks.h"
+#include "gpu_plugin/command_buffer.h"
+#include "gpu_plugin/gpu_processor.h"
+#include "gpu_plugin/np_utils/np_object_pointer.h"
+#include "gpu_plugin/system_services/shared_memory.h"
namespace o3d {
namespace command_buffer {
+using gpu_plugin::CommandBuffer;
+using gpu_plugin::GPUProcessor;
+using gpu_plugin::NPCreateObject;
+using gpu_plugin::NPObjectPointer;
+using gpu_plugin::SharedMemory;
using testing::Return;
using testing::Mock;
using testing::Truly;
@@ -48,6 +57,9 @@ using testing::DoAll;
using testing::Invoke;
using testing::_;
+const int32 kNumCommandEntries = 10;
+const int32 kCommandBufferSizeBytes = kNumCommandEntries * sizeof(int32);
+
// Test fixture for CommandBufferHelper test - Creates a CommandBufferHelper,
// using a CommandBufferEngine with a mock AsyncAPIInterface for its interface
// (calling it directly, not through the RPC mechanism).
@@ -58,28 +70,50 @@ class CommandBufferHelperTest : public testing::Test {
// ignore noops in the mock - we don't want to inspect the internals of the
// helper.
EXPECT_CALL(*api_mock_, DoCommand(0, 0, _))
- .WillRepeatedly(Return(BufferSyncInterface::kParseNoError));
- engine_.reset(new CommandBufferEngine(api_mock_.get()));
- api_mock_->set_engine(engine_.get());
+ .WillRepeatedly(Return(parse_error::kParseNoError));
+
+ NPObjectPointer<SharedMemory> ring_buffer =
+ NPCreateObject<SharedMemory>(NULL);
+ ring_buffer->Initialize(kCommandBufferSizeBytes);
+
+ size_t size_bytes;
+ void* buffer = NPN_MapMemory(NULL, ring_buffer.Get(), &size_bytes);
+
+ command_buffer_ = NPCreateObject<CommandBuffer>(NULL);
+ command_buffer_->Initialize(ring_buffer);
+
+ parser_ = new command_buffer::CommandParser(buffer,
+ kCommandBufferSizeBytes,
+ 0,
+ kCommandBufferSizeBytes,
+ 0,
+ api_mock_.get());
- engine_->InitConnection();
- helper_.reset(new CommandBufferHelper(engine_.get()));
- helper_->Init(10);
+ scoped_refptr<GPUProcessor> gpu_processor(new GPUProcessor(
+ NULL, command_buffer_.Get(), NULL, NULL, parser_, 1));
+ command_buffer_->SetPutOffsetChangeCallback(NewCallback(
+ gpu_processor.get(), &GPUProcessor::ProcessCommands));
+
+ api_mock_->set_engine(gpu_processor.get());
+
+ helper_.reset(new CommandBufferHelper(NULL, command_buffer_));
+ helper_->Initialize();
}
virtual void TearDown() {
+ // If the GPUProcessor posts any tasks, this forces them to run.
+ MessageLoop::current()->RunAllPending();
helper_.release();
- engine_->CloseConnection();
}
// Adds a command to the buffer through the helper, while adding it as an
// expected call on the API mock.
- void AddCommandWithExpect(BufferSyncInterface::ParseError _return,
+ void AddCommandWithExpect(parse_error::ParseError _return,
unsigned int command,
unsigned int arg_count,
CommandBufferEntry *args) {
helper_->AddCommand(command, arg_count, args);
- EXPECT_CALL(*api_mock(), DoCommand(command, arg_count,
+ EXPECT_CALL(*api_mock_, DoCommand(command, arg_count,
Truly(AsyncAPIMock::IsArgs(arg_count, args))))
.InSequence(sequence_)
.WillOnce(Return(_return));
@@ -87,8 +121,8 @@ class CommandBufferHelperTest : public testing::Test {
// Checks that the buffer from put to put+size is free in the parser.
void CheckFreeSpace(CommandBufferOffset put, unsigned int size) {
- CommandBufferOffset parser_put = engine()->parser()->put();
- CommandBufferOffset parser_get = engine()->parser()->get();
+ CommandBufferOffset parser_put = parser_->put();
+ CommandBufferOffset parser_get = parser_->get();
CommandBufferOffset limit = put + size;
if (parser_get > parser_put) {
// "busy" buffer wraps, so "free" buffer is between put (inclusive) and
@@ -100,7 +134,7 @@ class CommandBufferHelperTest : public testing::Test {
// put to the limit) and the bottom side (from 0 to get).
if (put >= parser_put) {
// we're on the top side, check we are below the limit.
- EXPECT_GE(10U, limit);
+ EXPECT_GE(kNumCommandEntries, limit);
} else {
// we're on the bottom side, check we are below get.
EXPECT_GT(parser_get, limit);
@@ -108,13 +142,11 @@ class CommandBufferHelperTest : public testing::Test {
}
}
- CommandBufferHelper *helper() { return helper_.get(); }
- CommandBufferEngine *engine() { return engine_.get(); }
- AsyncAPIMock *api_mock() { return api_mock_.get(); }
CommandBufferOffset get_helper_put() { return helper_->put_; }
- private:
+
scoped_ptr<AsyncAPIMock> api_mock_;
- scoped_ptr<CommandBufferEngine> engine_;
+ NPObjectPointer<CommandBuffer> command_buffer_;
+ command_buffer::CommandParser* parser_;
scoped_ptr<CommandBufferHelper> helper_;
Sequence sequence_;
};
@@ -124,40 +156,39 @@ class CommandBufferHelperTest : public testing::Test {
TEST_F(CommandBufferHelperTest, TestCommandProcessing) {
// Check initial state of the engine - it should have been configured by the
// helper.
- EXPECT_TRUE(engine()->rpc_impl() != NULL);
- EXPECT_TRUE(engine()->parser() != NULL);
- EXPECT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(0u, engine()->Get());
+ EXPECT_TRUE(parser_ != NULL);
+ EXPECT_FALSE(command_buffer_->GetErrorStatus());
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
+ EXPECT_EQ(0u, command_buffer_->GetGetOffset());
// Add 3 commands through the helper
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 1, 0, NULL);
+ AddCommandWithExpect(parse_error::kParseNoError, 1, 0, NULL);
CommandBufferEntry args1[2];
args1[0].value_uint32 = 3;
args1[1].value_float = 4.f;
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 2, 2, args1);
+ AddCommandWithExpect(parse_error::kParseNoError, 2, 2, args1);
CommandBufferEntry args2[2];
args2[0].value_uint32 = 5;
args2[1].value_float = 6.f;
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 3, 2, args2);
+ AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args2);
- helper()->Flush();
+ helper_->Flush();
// Check that the engine has work to do now.
- EXPECT_FALSE(engine()->parser()->IsEmpty());
+ EXPECT_FALSE(parser_->IsEmpty());
// Wait until it's done.
- helper()->Finish();
+ helper_->Finish();
// Check that the engine has no more work to do.
- EXPECT_TRUE(engine()->parser()->IsEmpty());
+ EXPECT_TRUE(parser_->IsEmpty());
// Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
+ Mock::VerifyAndClearExpectations(api_mock_.get());
// Check the error status.
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
+ EXPECT_FALSE(command_buffer_->GetErrorStatus());
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
}
// Checks that commands in the buffer are properly executed when wrapping the
@@ -169,16 +200,16 @@ TEST_F(CommandBufferHelperTest, TestCommandWrapping) {
args1[1].value_float = 4.f;
for (unsigned int i = 0; i < 5; ++i) {
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, i+1, 2, args1);
+ AddCommandWithExpect(parse_error::kParseNoError, i + 1, 2, args1);
}
- helper()->Finish();
+ helper_->Finish();
// Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
+ Mock::VerifyAndClearExpectations(api_mock_.get());
// Check the error status.
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
+ EXPECT_FALSE(command_buffer_->GetErrorStatus());
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
}
@@ -191,22 +222,20 @@ TEST_F(CommandBufferHelperTest, TestRecoverableError) {
args[1].value_float = 4.f;
// Create a command buffer with 3 commands, 2 of them generating errors
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 1, 2, args);
- AddCommandWithExpect(BufferSyncInterface::kParseUnknownCommand, 2, 2, args);
- AddCommandWithExpect(BufferSyncInterface::kParseInvalidArguments, 3, 2,
+ AddCommandWithExpect(parse_error::kParseNoError, 1, 2, args);
+ AddCommandWithExpect(parse_error::kParseUnknownCommand, 2, 2, args);
+ AddCommandWithExpect(parse_error::kParseInvalidArguments, 3, 2,
args);
- helper()->Finish();
+ helper_->Finish();
// Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
+ Mock::VerifyAndClearExpectations(api_mock_.get());
// Check that the error status was set to the first error.
- EXPECT_EQ(BufferSyncInterface::kParseUnknownCommand,
- engine()->GetParseError());
+ EXPECT_EQ(parse_error::kParseUnknownCommand,
+ command_buffer_->ResetParseError());
// Check that the error status was reset after the query.
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
-
- engine()->CloseConnection();
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
}
// Checks that asking for available entries work, and that the parser
@@ -217,29 +246,29 @@ TEST_F(CommandBufferHelperTest, TestAvailableEntries) {
args[1].value_float = 4.f;
// Add 2 commands through the helper - 8 entries
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 1, 0, NULL);
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 2, 0, NULL);
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 3, 2, args);
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 4, 2, args);
+ AddCommandWithExpect(parse_error::kParseNoError, 1, 0, NULL);
+ AddCommandWithExpect(parse_error::kParseNoError, 2, 0, NULL);
+ AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args);
+ AddCommandWithExpect(parse_error::kParseNoError, 4, 2, args);
// Ask for 5 entries.
- helper()->WaitForAvailableEntries(5);
+ helper_->WaitForAvailableEntries(5);
CommandBufferOffset put = get_helper_put();
CheckFreeSpace(put, 5);
// Add more commands.
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 5, 2, args);
+ AddCommandWithExpect(parse_error::kParseNoError, 5, 2, args);
// Wait until everything is done done.
- helper()->Finish();
+ helper_->Finish();
// Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
+ Mock::VerifyAndClearExpectations(api_mock_.get());
// Check the error status.
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
+ EXPECT_FALSE(command_buffer_->GetErrorStatus());
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
}
// Checks that the InsertToken/WaitForToken work.
@@ -249,27 +278,27 @@ TEST_F(CommandBufferHelperTest, TestToken) {
args[1].value_float = 4.f;
// Add a first command.
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 3, 2, args);
+ AddCommandWithExpect(parse_error::kParseNoError, 3, 2, args);
// keep track of the buffer position.
CommandBufferOffset command1_put = get_helper_put();
- unsigned int token = helper()->InsertToken();
+ int32 token = helper_->InsertToken();
- EXPECT_CALL(*api_mock(), DoCommand(kSetToken, 1, _))
- .WillOnce(DoAll(Invoke(api_mock(), &AsyncAPIMock::SetToken),
- Return(BufferSyncInterface::kParseNoError)));
+ EXPECT_CALL(*api_mock_.get(), DoCommand(kSetToken, 1, _))
+ .WillOnce(DoAll(Invoke(api_mock_.get(), &AsyncAPIMock::SetToken),
+ Return(parse_error::kParseNoError)));
// Add another command.
- AddCommandWithExpect(BufferSyncInterface::kParseNoError, 4, 2, args);
- helper()->WaitForToken(token);
+ AddCommandWithExpect(parse_error::kParseNoError, 4, 2, args);
+ helper_->WaitForToken(token);
// check that the get pointer is beyond the first command.
- EXPECT_LE(command1_put, engine()->Get());
- helper()->Finish();
+ EXPECT_LE(command1_put, command_buffer_->GetGetOffset());
+ helper_->Finish();
// Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
+ Mock::VerifyAndClearExpectations(api_mock_.get());
// Check the error status.
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
+ EXPECT_FALSE(command_buffer_->GetErrorStatus());
+ EXPECT_EQ(parse_error::kParseNoError, command_buffer_->ResetParseError());
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/client/cross/effect_helper.cc b/o3d/command_buffer/client/cross/effect_helper.cc
index 3f2430b..2523892 100644
--- a/o3d/command_buffer/client/cross/effect_helper.cc
+++ b/o3d/command_buffer/client/cross/effect_helper.cc
@@ -58,8 +58,7 @@ bool EffectHelper::CreateEffectParameters(ResourceId effect_id,
helper_->Finish();
// We could have failed if the effect_id is invalid.
- if (helper_->interface()->GetParseError() !=
- BufferSyncInterface::kParseNoError) {
+ if (helper_->GetParseError() != parse_error::kParseNoError) {
shm_allocator_->Free(retval);
return false;
}
@@ -96,8 +95,7 @@ bool EffectHelper::CreateEffectParameters(ResourceId effect_id,
}
// Finish to get the results.
helper_->Finish();
- DCHECK_EQ(helper_->interface()->GetParseError(),
- BufferSyncInterface::kParseNoError);
+ DCHECK_EQ(helper_->GetParseError(), parse_error::kParseNoError);
for (unsigned int j = 0 ; j < count; ++j) {
EffectParamDesc *desc = &((*descs)[i + j]);
Desc *raw_desc = raw_descs + j;
@@ -132,8 +130,7 @@ bool EffectHelper::GetParamStrings(EffectParamDesc *desc) {
helper_->Finish();
// We could have failed if the param ID is invalid.
- if (helper_->interface()->GetParseError() !=
- BufferSyncInterface::kParseNoError) {
+ if (helper_->GetParseError() != parse_error::kParseNoError) {
shm_allocator_->Free(raw_desc);
return false;
}
@@ -156,8 +153,7 @@ bool EffectHelper::GetParamStrings(EffectParamDesc *desc) {
shm_allocator_->GetOffset(raw_desc));
// Finish to get the results.
helper_->Finish();
- DCHECK_EQ(helper_->interface()->GetParseError(),
- BufferSyncInterface::kParseNoError);
+ DCHECK_EQ(helper_->GetParseError(), parse_error::kParseNoError);
DCHECK_EQ(raw_desc->size, size);
}
@@ -211,8 +207,7 @@ bool EffectHelper::GetEffectStreams(ResourceId effect_id,
helper_->Finish();
// We could have failed if the effect_id is invalid.
- if (helper_->interface()->GetParseError() !=
- BufferSyncInterface::kParseNoError) {
+ if (helper_->GetParseError() != parse_error::kParseNoError) {
shm_allocator_->Free(retval);
return false;
}
@@ -242,8 +237,7 @@ bool EffectHelper::GetEffectStreams(ResourceId effect_id,
}
// Finish to get the results.
helper_->Finish();
- DCHECK_EQ(helper_->interface()->GetParseError(),
- BufferSyncInterface::kParseNoError);
+ DCHECK_EQ(helper_->GetParseError(), parse_error::kParseNoError);
for (unsigned int j = 0 ; j < count; ++j) {
EffectStreamDesc *desc = &((*descs)[i + j]);
Desc *raw_desc = raw_descs + j;
diff --git a/o3d/command_buffer/client/cross/fenced_allocator_test.cc b/o3d/command_buffer/client/cross/fenced_allocator_test.cc
index 362254a..8c6ef1e 100644
--- a/o3d/command_buffer/client/cross/fenced_allocator_test.cc
+++ b/o3d/command_buffer/client/cross/fenced_allocator_test.cc
@@ -33,13 +33,24 @@
// This file contains the tests for the FencedAllocator class.
#include "tests/common/win/testing_common.h"
+#include "base/message_loop.h"
#include "command_buffer/client/cross/cmd_buffer_helper.h"
#include "command_buffer/client/cross/fenced_allocator.h"
#include "command_buffer/service/cross/cmd_buffer_engine.h"
#include "command_buffer/service/cross/mocks.h"
+#include "gpu_plugin/command_buffer.h"
+#include "gpu_plugin/gpu_processor.h"
+#include "gpu_plugin/np_utils/np_object_pointer.h"
+#include "gpu_plugin/system_services/shared_memory.h"
namespace o3d {
namespace command_buffer {
+
+using gpu_plugin::CommandBuffer;
+using gpu_plugin::GPUProcessor;
+using gpu_plugin::NPCreateObject;
+using gpu_plugin::NPObjectPointer;
+using gpu_plugin::SharedMemory;
using testing::Return;
using testing::Mock;
using testing::Truly;
@@ -48,78 +59,104 @@ using testing::DoAll;
using testing::Invoke;
using testing::_;
-// Test fixture for FencedAllocator test - Creates a FencedAllocator, using a
-// CommandBufferHelper with a mock AsyncAPIInterface for its interface (calling
-// it directly, not through the RPC mechanism), making sure Noops are ignored
-// and SetToken are properly forwarded to the engine.
-class FencedAllocatorTest : public testing::Test {
- public:
+class BaseFencedAllocatorTest : public testing::Test {
+ protected:
static const unsigned int kBufferSize = 1024;
- protected:
virtual void SetUp() {
api_mock_.reset(new AsyncAPIMock);
// ignore noops in the mock - we don't want to inspect the internals of the
// helper.
EXPECT_CALL(*api_mock_, DoCommand(kNoop, 0, _))
- .WillRepeatedly(Return(BufferSyncInterface::kParseNoError));
+ .WillRepeatedly(Return(parse_error::kParseNoError));
// Forward the SetToken calls to the engine
- EXPECT_CALL(*api_mock(), DoCommand(kSetToken, 1, _))
- .WillRepeatedly(DoAll(Invoke(api_mock(), &AsyncAPIMock::SetToken),
- Return(BufferSyncInterface::kParseNoError)));
- engine_.reset(new CommandBufferEngine(api_mock_.get()));
- api_mock_->set_engine(engine_.get());
-
- nacl::SocketAddress client_address = { "test-socket" };
- client_socket_ = nacl::BoundSocket(&client_address);
- engine_->InitConnection();
- helper_.reset(new CommandBufferHelper(engine_.get()));
- helper_->Init(100);
+ EXPECT_CALL(*api_mock_.get(), DoCommand(kSetToken, 1, _))
+ .WillRepeatedly(DoAll(Invoke(api_mock_.get(), &AsyncAPIMock::SetToken),
+ Return(parse_error::kParseNoError)));
- allocator_.reset(new FencedAllocator(kBufferSize, helper_.get()));
+ NPObjectPointer<SharedMemory> ring_buffer =
+ NPCreateObject<SharedMemory>(NULL);
+ ring_buffer->Initialize(1024);
+
+ size_t size_bytes;
+ void* buffer = NPN_MapMemory(NULL, ring_buffer.Get(), &size_bytes);
+
+ command_buffer_ = NPCreateObject<CommandBuffer>(NULL);
+ command_buffer_->Initialize(ring_buffer);
+
+ parser_ = new command_buffer::CommandParser(buffer,
+ kBufferSize,
+ 0,
+ kBufferSize,
+ 0,
+ api_mock_.get());
+
+ scoped_refptr<GPUProcessor> gpu_processor(new GPUProcessor(
+ NULL, command_buffer_.Get(), NULL, NULL, parser_, INT_MAX));
+ command_buffer_->SetPutOffsetChangeCallback(NewCallback(
+ gpu_processor.get(), &GPUProcessor::ProcessCommands));
+
+ api_mock_->set_engine(gpu_processor.get());
+
+ helper_.reset(new CommandBufferHelper(NULL, command_buffer_));
+ helper_->Initialize();
}
virtual void TearDown() {
- EXPECT_TRUE(allocator_->CheckConsistency());
- allocator_.release();
helper_.release();
- engine_->CloseConnection();
- nacl::Close(client_socket_);
}
- CommandBufferHelper *helper() { return helper_.get(); }
- CommandBufferEngine *engine() { return engine_.get(); }
- AsyncAPIMock *api_mock() { return api_mock_.get(); }
- FencedAllocator *allocator() { return allocator_.get(); }
- private:
scoped_ptr<AsyncAPIMock> api_mock_;
- scoped_ptr<CommandBufferEngine> engine_;
+ NPObjectPointer<CommandBuffer> command_buffer_;
+ command_buffer::CommandParser* parser_;
scoped_ptr<CommandBufferHelper> helper_;
- scoped_ptr<FencedAllocator> allocator_;
- nacl::Handle client_socket_;
};
#ifndef COMPILER_MSVC
-const unsigned int FencedAllocatorTest::kBufferSize;
+const unsigned int BaseFencedAllocatorTest::kBufferSize;
#endif
+// Test fixture for FencedAllocator test - Creates a FencedAllocator, using a
+// CommandBufferHelper with a mock AsyncAPIInterface for its interface (calling
+// it directly, not through the RPC mechanism), making sure Noops are ignored
+// and SetToken are properly forwarded to the engine.
+class FencedAllocatorTest : public BaseFencedAllocatorTest {
+ protected:
+ virtual void SetUp() {
+ BaseFencedAllocatorTest::SetUp();
+ allocator_.reset(new FencedAllocator(kBufferSize, helper_.get()));
+ }
+
+ virtual void TearDown() {
+ // If the GPUProcessor posts any tasks, this forces them to run.
+ MessageLoop::current()->RunAllPending();
+
+ EXPECT_TRUE(allocator_->CheckConsistency());
+ allocator_.release();
+
+ BaseFencedAllocatorTest::TearDown();
+ }
+
+ scoped_ptr<FencedAllocator> allocator_;
+};
+
// Checks basic alloc and free.
TEST_F(FencedAllocatorTest, TestBasic) {
- allocator()->CheckConsistency();
+ allocator_->CheckConsistency();
const unsigned int kSize = 16;
- FencedAllocator::Offset offset = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset = allocator_->Alloc(kSize);
EXPECT_NE(FencedAllocator::kInvalidOffset, offset);
EXPECT_GE(kBufferSize, offset+kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
- allocator()->Free(offset);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(offset);
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
// Checks out-of-memory condition.
TEST_F(FencedAllocatorTest, TestOutOfMemory) {
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
const unsigned int kSize = 16;
const unsigned int kAllocCount = kBufferSize / kSize;
@@ -128,40 +165,40 @@ TEST_F(FencedAllocatorTest, TestOutOfMemory) {
// Allocate several buffers to fill in the memory.
FencedAllocator::Offset offsets[kAllocCount];
for (unsigned int i = 0; i < kAllocCount; ++i) {
- offsets[i] = allocator()->Alloc(kSize);
+ offsets[i] = allocator_->Alloc(kSize);
EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
EXPECT_GE(kBufferSize, offsets[i]+kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
// This allocation should fail.
- FencedAllocator::Offset offset_failed = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset_failed = allocator_->Alloc(kSize);
EXPECT_EQ(FencedAllocator::kInvalidOffset, offset_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free one successful allocation, reallocate with half the size
- allocator()->Free(offsets[0]);
- EXPECT_TRUE(allocator()->CheckConsistency());
- offsets[0] = allocator()->Alloc(kSize/2);
+ allocator_->Free(offsets[0]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
+ offsets[0] = allocator_->Alloc(kSize/2);
EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[0]);
EXPECT_GE(kBufferSize, offsets[0]+kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// This allocation should fail as well.
- offset_failed = allocator()->Alloc(kSize);
+ offset_failed = allocator_->Alloc(kSize);
EXPECT_EQ(FencedAllocator::kInvalidOffset, offset_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free up everything.
for (unsigned int i = 0; i < kAllocCount; ++i) {
- allocator()->Free(offsets[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(offsets[i]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
}
// Checks the free-pending-token mechanism.
TEST_F(FencedAllocatorTest, TestFreePendingToken) {
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
const unsigned int kSize = 16;
const unsigned int kAllocCount = kBufferSize / kSize;
@@ -170,143 +207,143 @@ TEST_F(FencedAllocatorTest, TestFreePendingToken) {
// Allocate several buffers to fill in the memory.
FencedAllocator::Offset offsets[kAllocCount];
for (unsigned int i = 0; i < kAllocCount; ++i) {
- offsets[i] = allocator()->Alloc(kSize);
+ offsets[i] = allocator_->Alloc(kSize);
EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[i]);
EXPECT_GE(kBufferSize, offsets[i]+kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
// This allocation should fail.
- FencedAllocator::Offset offset_failed = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset_failed = allocator_->Alloc(kSize);
EXPECT_EQ(FencedAllocator::kInvalidOffset, offset_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free one successful allocation, pending fence.
- unsigned int token = helper()->InsertToken();
- allocator()->FreePendingToken(offsets[0], token);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ int32 token = helper_.get()->InsertToken();
+ allocator_->FreePendingToken(offsets[0], token);
+ EXPECT_TRUE(allocator_->CheckConsistency());
// The way we hooked up the helper and engine, it won't process commands
// until it has to wait for something. Which means the token shouldn't have
// passed yet at this point.
- EXPECT_GT(token, engine()->GetToken());
+ EXPECT_GT(token, command_buffer_->GetToken());
// This allocation will need to reclaim the space freed above, so that should
// process the commands until the token is passed.
- offsets[0] = allocator()->Alloc(kSize);
+ offsets[0] = allocator_->Alloc(kSize);
EXPECT_NE(FencedAllocator::kInvalidOffset, offsets[0]);
EXPECT_GE(kBufferSize, offsets[0]+kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Check that the token has indeed passed.
- EXPECT_LE(token, engine()->GetToken());
+ EXPECT_LE(token, command_buffer_->GetToken());
// Free up everything.
for (unsigned int i = 0; i < kAllocCount; ++i) {
- allocator()->Free(offsets[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(offsets[i]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
}
// Tests GetLargestFreeSize
TEST_F(FencedAllocatorTest, TestGetLargestFreeSize) {
- EXPECT_TRUE(allocator()->CheckConsistency());
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeSize());
+ EXPECT_TRUE(allocator_->CheckConsistency());
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSize());
- FencedAllocator::Offset offset = allocator()->Alloc(kBufferSize);
+ FencedAllocator::Offset offset = allocator_->Alloc(kBufferSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
- EXPECT_EQ(0u, allocator()->GetLargestFreeSize());
- allocator()->Free(offset);
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeSize());
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSize());
+ allocator_->Free(offset);
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSize());
const unsigned int kSize = 16;
- offset = allocator()->Alloc(kSize);
+ offset = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
// The following checks that the buffer is allocated "smartly" - which is
// dependent on the implementation. But both first-fit or best-fit would
// ensure that.
- EXPECT_EQ(kBufferSize - kSize, allocator()->GetLargestFreeSize());
+ EXPECT_EQ(kBufferSize - kSize, allocator_->GetLargestFreeSize());
// Allocate 2 more buffers (now 3), and then free the first two. This is to
// ensure a hole. Note that this is dependent on the first-fit current
// implementation.
- FencedAllocator::Offset offset1 = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset1 = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset1);
- FencedAllocator::Offset offset2 = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset2 = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset2);
- allocator()->Free(offset);
- allocator()->Free(offset1);
- EXPECT_EQ(kBufferSize - 3 * kSize, allocator()->GetLargestFreeSize());
+ allocator_->Free(offset);
+ allocator_->Free(offset1);
+ EXPECT_EQ(kBufferSize - 3 * kSize, allocator_->GetLargestFreeSize());
- offset = allocator()->Alloc(kBufferSize - 3 * kSize);
+ offset = allocator_->Alloc(kBufferSize - 3 * kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
- EXPECT_EQ(2 * kSize, allocator()->GetLargestFreeSize());
+ EXPECT_EQ(2 * kSize, allocator_->GetLargestFreeSize());
- offset1 = allocator()->Alloc(2 * kSize);
+ offset1 = allocator_->Alloc(2 * kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset1);
- EXPECT_EQ(0u, allocator()->GetLargestFreeSize());
+ EXPECT_EQ(0u, allocator_->GetLargestFreeSize());
- allocator()->Free(offset);
- allocator()->Free(offset1);
- allocator()->Free(offset2);
+ allocator_->Free(offset);
+ allocator_->Free(offset1);
+ allocator_->Free(offset2);
}
// Tests GetLargestFreeOrPendingSize
TEST_F(FencedAllocatorTest, TestGetLargestFreeOrPendingSize) {
- EXPECT_TRUE(allocator()->CheckConsistency());
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeOrPendingSize());
+ EXPECT_TRUE(allocator_->CheckConsistency());
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize());
- FencedAllocator::Offset offset = allocator()->Alloc(kBufferSize);
+ FencedAllocator::Offset offset = allocator_->Alloc(kBufferSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
- EXPECT_EQ(0u, allocator()->GetLargestFreeOrPendingSize());
- allocator()->Free(offset);
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeOrPendingSize());
+ EXPECT_EQ(0u, allocator_->GetLargestFreeOrPendingSize());
+ allocator_->Free(offset);
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize());
const unsigned int kSize = 16;
- offset = allocator()->Alloc(kSize);
+ offset = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
// The following checks that the buffer is allocates "smartly" - which is
// dependent on the implementation. But both first-fit or best-fit would
// ensure that.
- EXPECT_EQ(kBufferSize - kSize, allocator()->GetLargestFreeOrPendingSize());
+ EXPECT_EQ(kBufferSize - kSize, allocator_->GetLargestFreeOrPendingSize());
// Allocate 2 more buffers (now 3), and then free the first two. This is to
// ensure a hole. Note that this is dependent on the first-fit current
// implementation.
- FencedAllocator::Offset offset1 = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset1 = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset1);
- FencedAllocator::Offset offset2 = allocator()->Alloc(kSize);
+ FencedAllocator::Offset offset2 = allocator_->Alloc(kSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset2);
- allocator()->Free(offset);
- allocator()->Free(offset1);
+ allocator_->Free(offset);
+ allocator_->Free(offset1);
EXPECT_EQ(kBufferSize - 3 * kSize,
- allocator()->GetLargestFreeOrPendingSize());
+ allocator_->GetLargestFreeOrPendingSize());
// Free the last one, pending a token.
- unsigned int token = helper()->InsertToken();
- allocator()->FreePendingToken(offset2, token);
+ int32 token = helper_.get()->InsertToken();
+ allocator_->FreePendingToken(offset2, token);
// Now all the buffers have been freed...
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeOrPendingSize());
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize());
// .. but one is still waiting for the token.
EXPECT_EQ(kBufferSize - 3 * kSize,
- allocator()->GetLargestFreeSize());
+ allocator_->GetLargestFreeSize());
// The way we hooked up the helper and engine, it won't process commands
// until it has to wait for something. Which means the token shouldn't have
// passed yet at this point.
- EXPECT_GT(token, engine()->GetToken());
+ EXPECT_GT(token, command_buffer_->GetToken());
// This allocation will need to reclaim the space freed above, so that should
// process the commands until the token is passed, but it will succeed.
- offset = allocator()->Alloc(kBufferSize);
+ offset = allocator_->Alloc(kBufferSize);
ASSERT_NE(FencedAllocator::kInvalidOffset, offset);
// Check that the token has indeed passed.
- EXPECT_LE(token, engine()->GetToken());
- allocator()->Free(offset);
+ EXPECT_LE(token, command_buffer_->GetToken());
+ allocator_->Free(offset);
// Everything now has been freed...
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeOrPendingSize());
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeOrPendingSize());
// ... for real.
- EXPECT_EQ(kBufferSize, allocator()->GetLargestFreeSize());
+ EXPECT_EQ(kBufferSize, allocator_->GetLargestFreeSize());
}
// Test fixture for FencedAllocatorWrapper test - Creates a
@@ -314,102 +351,71 @@ TEST_F(FencedAllocatorTest, TestGetLargestFreeOrPendingSize) {
// AsyncAPIInterface for its interface (calling it directly, not through the
// RPC mechanism), making sure Noops are ignored and SetToken are properly
// forwarded to the engine.
-class FencedAllocatorWrapperTest : public testing::Test {
- public:
- static const unsigned int kBufferSize = 1024;
-
+class FencedAllocatorWrapperTest : public BaseFencedAllocatorTest {
protected:
virtual void SetUp() {
- api_mock_.reset(new AsyncAPIMock);
- // ignore noops in the mock - we don't want to inspect the internals of the
- // helper.
- EXPECT_CALL(*api_mock_, DoCommand(kNoop, 0, _))
- .WillRepeatedly(Return(BufferSyncInterface::kParseNoError));
- // Forward the SetToken calls to the engine
- EXPECT_CALL(*api_mock(), DoCommand(kSetToken, 1, _))
- .WillRepeatedly(DoAll(Invoke(api_mock(), &AsyncAPIMock::SetToken),
- Return(BufferSyncInterface::kParseNoError)));
- engine_.reset(new CommandBufferEngine(api_mock_.get()));
- api_mock_->set_engine(engine_.get());
-
- nacl::SocketAddress client_address = { "test-socket" };
- client_socket_ = nacl::BoundSocket(&client_address);
- engine_->InitConnection();
- helper_.reset(new CommandBufferHelper(engine_.get()));
- helper_->Init(100);
+ BaseFencedAllocatorTest::SetUp();
// Though allocating this buffer isn't strictly necessary, it makes
// allocations point to valid addresses, so they could be used for
// something.
buffer_.reset(new char[kBufferSize]);
allocator_.reset(new FencedAllocatorWrapper(kBufferSize, helper_.get(),
- base()));
+ buffer_.get()));
}
virtual void TearDown() {
+ // If the GPUProcessor posts any tasks, this forces them to run.
+ MessageLoop::current()->RunAllPending();
+
EXPECT_TRUE(allocator_->CheckConsistency());
allocator_.release();
buffer_.release();
- helper_.release();
- engine_->CloseConnection();
- nacl::Close(client_socket_);
+
+ BaseFencedAllocatorTest::TearDown();
}
- CommandBufferHelper *helper() { return helper_.get(); }
- CommandBufferEngine *engine() { return engine_.get(); }
- AsyncAPIMock *api_mock() { return api_mock_.get(); }
- FencedAllocatorWrapper *allocator() { return allocator_.get(); }
- char *base() { return buffer_.get(); }
- private:
- scoped_ptr<AsyncAPIMock> api_mock_;
- scoped_ptr<CommandBufferEngine> engine_;
- scoped_ptr<CommandBufferHelper> helper_;
scoped_ptr<FencedAllocatorWrapper> allocator_;
scoped_array<char> buffer_;
- nacl::Handle client_socket_;
};
-#ifndef COMPILER_MSVC
-const unsigned int FencedAllocatorWrapperTest::kBufferSize;
-#endif
-
// Checks basic alloc and free.
TEST_F(FencedAllocatorWrapperTest, TestBasic) {
- allocator()->CheckConsistency();
+ allocator_->CheckConsistency();
const unsigned int kSize = 16;
- void *pointer = allocator()->Alloc(kSize);
+ void *pointer = allocator_->Alloc(kSize);
ASSERT_TRUE(pointer);
- EXPECT_LE(base(), static_cast<char *>(pointer));
- EXPECT_GE(kBufferSize, static_cast<char *>(pointer) - base() + kSize);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_LE(buffer_.get(), static_cast<char *>(pointer));
+ EXPECT_GE(kBufferSize, static_cast<char *>(pointer) - buffer_.get() + kSize);
+ EXPECT_TRUE(allocator_->CheckConsistency());
- allocator()->Free(pointer);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(pointer);
+ EXPECT_TRUE(allocator_->CheckConsistency());
- char *pointer_char = allocator()->AllocTyped<char>(kSize);
+ char *pointer_char = allocator_->AllocTyped<char>(kSize);
ASSERT_TRUE(pointer_char);
- EXPECT_LE(base(), pointer_char);
- EXPECT_GE(base() + kBufferSize, pointer_char + kSize);
- allocator()->Free(pointer_char);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_LE(buffer_.get(), pointer_char);
+ EXPECT_GE(buffer_.get() + kBufferSize, pointer_char + kSize);
+ allocator_->Free(pointer_char);
+ EXPECT_TRUE(allocator_->CheckConsistency());
- unsigned int *pointer_uint = allocator()->AllocTyped<unsigned int>(kSize);
+ unsigned int *pointer_uint = allocator_->AllocTyped<unsigned int>(kSize);
ASSERT_TRUE(pointer_uint);
- EXPECT_LE(base(), reinterpret_cast<char *>(pointer_uint));
- EXPECT_GE(base() + kBufferSize,
+ EXPECT_LE(buffer_.get(), reinterpret_cast<char *>(pointer_uint));
+ EXPECT_GE(buffer_.get() + kBufferSize,
reinterpret_cast<char *>(pointer_uint + kSize));
// Check that it did allocate kSize * sizeof(unsigned int). We can't tell
// directly, except from the remaining size.
EXPECT_EQ(kBufferSize - kSize * sizeof(*pointer_uint),
- allocator()->GetLargestFreeSize());
- allocator()->Free(pointer_uint);
+ allocator_->GetLargestFreeSize());
+ allocator_->Free(pointer_uint);
}
// Checks out-of-memory condition.
TEST_F(FencedAllocatorWrapperTest, TestOutOfMemory) {
- allocator()->CheckConsistency();
+ allocator_->CheckConsistency();
const unsigned int kSize = 16;
const unsigned int kAllocCount = kBufferSize / kSize;
@@ -418,38 +424,38 @@ TEST_F(FencedAllocatorWrapperTest, TestOutOfMemory) {
// Allocate several buffers to fill in the memory.
void *pointers[kAllocCount];
for (unsigned int i = 0; i < kAllocCount; ++i) {
- pointers[i] = allocator()->Alloc(kSize);
+ pointers[i] = allocator_->Alloc(kSize);
EXPECT_TRUE(pointers[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
// This allocation should fail.
- void *pointer_failed = allocator()->Alloc(kSize);
+ void *pointer_failed = allocator_->Alloc(kSize);
EXPECT_FALSE(pointer_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free one successful allocation, reallocate with half the size
- allocator()->Free(pointers[0]);
- EXPECT_TRUE(allocator()->CheckConsistency());
- pointers[0] = allocator()->Alloc(kSize/2);
+ allocator_->Free(pointers[0]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
+ pointers[0] = allocator_->Alloc(kSize/2);
EXPECT_TRUE(pointers[0]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// This allocation should fail as well.
- pointer_failed = allocator()->Alloc(kSize);
+ pointer_failed = allocator_->Alloc(kSize);
EXPECT_FALSE(pointer_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free up everything.
for (unsigned int i = 0; i < kAllocCount; ++i) {
- allocator()->Free(pointers[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(pointers[i]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
}
// Checks the free-pending-token mechanism.
TEST_F(FencedAllocatorWrapperTest, TestFreePendingToken) {
- allocator()->CheckConsistency();
+ allocator_->CheckConsistency();
const unsigned int kSize = 16;
const unsigned int kAllocCount = kBufferSize / kSize;
@@ -458,38 +464,38 @@ TEST_F(FencedAllocatorWrapperTest, TestFreePendingToken) {
// Allocate several buffers to fill in the memory.
void *pointers[kAllocCount];
for (unsigned int i = 0; i < kAllocCount; ++i) {
- pointers[i] = allocator()->Alloc(kSize);
+ pointers[i] = allocator_->Alloc(kSize);
EXPECT_TRUE(pointers[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
// This allocation should fail.
- void *pointer_failed = allocator()->Alloc(kSize);
+ void *pointer_failed = allocator_->Alloc(kSize);
EXPECT_FALSE(pointer_failed);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Free one successful allocation, pending fence.
- unsigned int token = helper()->InsertToken();
- allocator()->FreePendingToken(pointers[0], token);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ int32 token = helper_.get()->InsertToken();
+ allocator_->FreePendingToken(pointers[0], token);
+ EXPECT_TRUE(allocator_->CheckConsistency());
// The way we hooked up the helper and engine, it won't process commands
// until it has to wait for something. Which means the token shouldn't have
// passed yet at this point.
- EXPECT_GT(token, engine()->GetToken());
+ EXPECT_GT(token, command_buffer_->GetToken());
// This allocation will need to reclaim the space freed above, so that should
// process the commands until the token is passed.
- pointers[0] = allocator()->Alloc(kSize);
+ pointers[0] = allocator_->Alloc(kSize);
EXPECT_TRUE(pointers[0]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ EXPECT_TRUE(allocator_->CheckConsistency());
// Check that the token has indeed passed.
- EXPECT_LE(token, engine()->GetToken());
+ EXPECT_LE(token, command_buffer_->GetToken());
// Free up everything.
for (unsigned int i = 0; i < kAllocCount; ++i) {
- allocator()->Free(pointers[i]);
- EXPECT_TRUE(allocator()->CheckConsistency());
+ allocator_->Free(pointers[i]);
+ EXPECT_TRUE(allocator_->CheckConsistency());
}
}
diff --git a/o3d/command_buffer/command_buffer.gyp b/o3d/command_buffer/command_buffer.gyp
index d6978c3..9d63cd1 100644
--- a/o3d/command_buffer/command_buffer.gyp
+++ b/o3d/command_buffer/command_buffer.gyp
@@ -32,17 +32,13 @@
{
'target_name': 'command_buffer_common',
'type': 'static_library',
- 'dependencies': [
- '../../native_client/src/shared/imc/imc.gyp:google_nacl_imc',
- '../../native_client/src/shared/imc/imc.gyp:libgoogle_nacl_imc_c',
- '../../native_client/src/shared/platform/platform.gyp:platform',
- '../../native_client/src/trusted/desc/desc.gyp:nrd_xfer',
- '../../native_client/src/trusted/service_runtime/service_runtime.gyp:gio',
- ],
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '..',
+ ],
+ }, # 'all_dependent_settings'
'sources': [
'common/cross/bitfield_helpers.h',
- 'common/cross/buffer_sync_api.cc',
- 'common/cross/buffer_sync_api.h',
'common/cross/cmd_buffer_format.h',
'common/cross/cmd_buffer_format.cc',
'common/cross/gapi_interface.h',
@@ -50,9 +46,6 @@
'common/cross/mocks.h',
'common/cross/resource.cc',
'common/cross/resource.h',
- 'common/cross/rpc.h',
- 'common/cross/rpc_imc.cc',
- 'common/cross/rpc_imc.h',
'common/cross/types.h',
],
},
@@ -62,9 +55,6 @@
'direct_dependent_settings': {
'sources': [
'common/cross/bitfield_helpers_test.cc',
- 'client/cross/cmd_buffer_helper_test.cc',
- 'client/cross/fenced_allocator_test.cc',
- 'client/cross/id_allocator_test.cc',
],
},
},
@@ -73,10 +63,9 @@
'type': 'static_library',
'dependencies': [
'command_buffer_common',
+ '../gpu_plugin/gpu_plugin.gyp:np_utils',
],
'sources': [
- 'client/cross/buffer_sync_proxy.cc',
- 'client/cross/buffer_sync_proxy.h',
'client/cross/cmd_buffer_helper.cc',
'client/cross/cmd_buffer_helper.h',
'client/cross/effect_helper.cc',
@@ -92,7 +81,6 @@
'type': 'none',
'direct_dependent_settings': {
'sources': [
- 'client/cross/buffer_sync_proxy_test.cc',
'client/cross/cmd_buffer_helper_test.cc',
'client/cross/fenced_allocator_test.cc',
'client/cross/id_allocator_test.cc',
@@ -102,13 +90,15 @@
{
'target_name': 'command_buffer_service',
'type': 'static_library',
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '..',
+ ],
+ }, # 'all_dependent_settings'
'dependencies': [
'command_buffer_common',
],
'sources': [
- 'service/cross/buffer_rpc.cc',
- 'service/cross/buffer_rpc.h',
- 'service/cross/cmd_buffer_engine.cc',
'service/cross/cmd_buffer_engine.h',
'service/cross/cmd_parser.cc',
'service/cross/cmd_parser.h',
@@ -155,6 +145,11 @@
'include_dirs': [
'$(DXSDK_DIR)/Include',
],
+ 'all_dependent_settings': {
+ 'include_dirs': [
+ '$(DXSDK_DIR)/Include',
+ ],
+ }, # 'all_dependent_settings'
'sources': [
'service/win/d3d9/d3d9_utils.h',
'service/win/d3d9/effect_d3d9.cc',
@@ -171,11 +166,6 @@
'service/win/d3d9/texture_d3d9.cc',
'service/win/d3d9/texture_d3d9.h',
], # 'sources'
- 'direct_dependent_settings': {
- 'include_dirs': [
- '$(DXSDK_DIR)/Include',
- ],
- }, # 'direct_dependent_settings'
},
],
['cb_service == "gl"',
@@ -200,20 +190,6 @@
], # 'sources'
},
],
- ['cb_service != "none"',
- {
- 'target_name': 'command_buffer_service_test',
- 'type': 'none',
- 'direct_dependent_settings': {
- 'sources': [
- 'service/cross/buffer_rpc_test.cc',
- 'service/cross/cmd_buffer_engine_test.cc',
- 'service/cross/cmd_parser_test.cc',
- 'service/cross/resource_test.cc',
- ],
- },
- },
- ],
['OS == "linux"',
{
'sources': [
@@ -224,6 +200,16 @@
],
], # 'conditions'
},
+ {
+ 'target_name': 'command_buffer_service_test',
+ 'type': 'none',
+ 'direct_dependent_settings': {
+ 'sources': [
+ 'service/cross/cmd_parser_test.cc',
+ 'service/cross/resource_test.cc',
+ ],
+ },
+ },
], # 'targets'
}
diff --git a/o3d/command_buffer/common/build.scons b/o3d/command_buffer/common/build.scons
deleted file mode 100644
index 93f96bb..0000000
--- a/o3d/command_buffer/common/build.scons
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2009, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-Import('env')
-
-INPUTS = [
- 'cross/buffer_sync_api.cc',
- 'cross/cmd_buffer_format.cc',
- 'cross/resource.cc',
- 'cross/rpc_imc.cc',
-]
-
-# Create a target library from the sources called 'o3dCmdBuf_common'
-o3dcmdbuf_lib = env.ComponentLibrary('o3dCmdBuf_common', INPUTS)
diff --git a/o3d/command_buffer/common/cross/buffer_sync_api.h b/o3d/command_buffer/common/cross/buffer_sync_api.h
deleted file mode 100644
index bd61b5e..0000000
--- a/o3d/command_buffer/common/cross/buffer_sync_api.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file defines the Command Buffer Synchronous API.
-
-#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_BUFFER_SYNC_API_H_
-#define O3D_COMMAND_BUFFER_COMMON_CROSS_BUFFER_SYNC_API_H_
-
-#include "command_buffer/common/cross/rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Command buffer type.
-typedef size_t CommandBufferOffset;
-const CommandBufferOffset kInvalidCommandBufferOffset = ~0u;
-
-// Interface class for the Command Buffer Synchronous API.
-// This is the part of the command buffer API that is accessible through the
-// RPC mechanism, synchronously.
-class BufferSyncInterface {
- public:
- // Status of the command buffer service. It does not process commands
- // (meaning: get will not change) unless in kParsing state.
- enum ParserStatus {
- kNotConnected, // The service is not connected - initial state.
- kNoBuffer, // The service is connected but no buffer was set.
- kParsing, // The service is connected, and parsing commands from the
- // buffer.
- kParseError, // Parsing stopped because a parse error was found.
- };
-
- enum ParseError {
- kParseNoError,
- kParseInvalidSize,
- kParseOutOfBounds,
- kParseUnknownCommand,
- kParseInvalidArguments,
- };
-
- // Invalid shared memory Id, returned by RegisterSharedMemory in case of
- // failure.
- static const unsigned int kInvalidSharedMemoryId = 0xffffffffU;
-
- BufferSyncInterface() {}
- virtual ~BufferSyncInterface() {}
-
- // Initializes the connection with the client.
- virtual void InitConnection() = 0;
-
- // Closes the connection with the client.
- virtual void CloseConnection() = 0;
-
- // Registers a shared memory buffer. While a buffer is registered, it can be
- // accessed by the service, including the underlying asynchronous API,
- // through a single identifier.
- // Parameters:
- // buffer: the shared memory buffer handle.
- // Returns:
- // an identifier for the shared memory, or kInvalidSharedMemoryId in case
- // of failure.
- virtual unsigned int RegisterSharedMemory(RPCShmHandle buffer,
- size_t size) = 0;
-
- // Unregisters a shared memory buffer.
- // Parameters:
- // shm_id: the identifier for the shared memory buffer.
- virtual void UnregisterSharedMemory(unsigned int shm_id) = 0;
-
- // Initializes the command buffer.
- // Parameters:
- // shm_id: the registered memory buffer in which the command buffer
- // resides.
- // offset: the offset of the command buffer, relative to the memory
- // buffer.
- // size: the size of the command buffer.
- // start_get: the inital value for the Get pointer, relative to the
- // command buffer, where the parser will start interpreting
- // commands. Put is also initialized to that value.
- virtual void SetCommandBuffer(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get) = 0;
-
- // Sets the value of the Put pointer.
- // Parameters:
- // offset: the new value of the Put pointer, as an offset into the command
- // buffer.
- virtual void Put(CommandBufferOffset offset) = 0;
-
- // Gets the value of the Get pointer.
- // Returns:
- // the current value of the Get pointer, as an offset into the command
- // buffer.
- virtual CommandBufferOffset Get() = 0;
-
- // Gets the current token value.
- // Returns:
- // the current token value.
- virtual unsigned int GetToken() = 0;
-
- // Waits until Get changes from the currently known value.
- // Parameters:
- // current_value: the currently known value. This call will block until
- // Get is different from that value (returning immediately
- // if it is different).
- // Returns:
- // the current (changed) value of Get.
- virtual CommandBufferOffset WaitGetChanges(
- CommandBufferOffset current_value) = 0;
-
- // Asks the service to signal the client when Get changes from the currently
- // known value. This is a non-blocking version of WaitGetChanges.
- // Parameters:
- // current_value: the currently known value of Get.
- // rpc_message_id: the RPC message ID to call on the client when Get is
- // different from current_value. That RPC is called
- // immediately if Get is already different from
- // current_value.
- virtual void SignalGetChanges(CommandBufferOffset current_value,
- int rpc_message_id) = 0;
-
- // Gets the status of the service.
- // Returns:
- // The status of the service.
- virtual ParserStatus GetStatus() = 0;
-
- // Gets the current parse error. The current parse error is set when the
- // service is in the PARSE_ERROR status. It may also be set while in the
- // kParsing state, if a recoverable error (like PARSE_UNKNOWN_METHOD) was
- // encountered. Getting the error resets it to kParseNoError.
- // Returns:
- // The current parse error.
- virtual ParseError GetParseError() = 0;
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_BUFFER_SYNC_API_H_
diff --git a/o3d/command_buffer/service/cross/big_test_helpers.h b/o3d/command_buffer/common/cross/constants.h
index bb90564..f72c5a3 100644
--- a/o3d/command_buffer/service/cross/big_test_helpers.h
+++ b/o3d/command_buffer/common/cross/constants.h
@@ -30,41 +30,44 @@
*/
-// This file contains a few helper functions for running big tests.
+#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_CONSTANTS_H_
+#define O3D_COMMAND_BUFFER_COMMON_CROSS_CONSTANTS_H_
-#ifndef O3D_COMMAND_BUFFER_SERVICE_CROSS_BIG_TEST_HELPERS_H_
-#define O3D_COMMAND_BUFFER_SERVICE_CROSS_BIG_TEST_HELPERS_H_
-
-#include <build/build_config.h>
-#include "core/cross/types.h"
-#include "command_buffer/common/cross/gapi_interface.h"
+#include "base/basictypes.h"
namespace o3d {
namespace command_buffer {
-extern String *g_program_path;
-extern GAPIInterface *g_gapi;
-
-// very simple thread API (hides platform-specific implementations).
-typedef void (* ThreadFunc)(void *param);
-class Thread;
+typedef int32 CommandBufferOffset;
+const CommandBufferOffset kInvalidCommandBufferOffset = -1;
-// Creates and starts a thread.
-Thread *CreateThread(ThreadFunc func, void* param);
+// Status of the command buffer service. It does not process commands
+// (meaning: get will not change) unless in kParsing state.
+namespace parser_status {
+ enum ParserStatus {
+ kNotConnected, // The service is not connected - initial state.
+ kNoBuffer, // The service is connected but no buffer was set.
+ kParsing, // The service is connected, and parsing commands from the
+ // buffer.
+ kParseError, // Parsing stopped because a parse error was found.
+ };
+}
-// Joins (waits for) a thread, destroying it.
-void JoinThread(Thread *thread);
+namespace parse_error {
+ enum ParseError {
+ kParseNoError,
+ kParseInvalidSize,
+ kParseOutOfBounds,
+ kParseUnknownCommand,
+ kParseInvalidArguments,
+ };
+}
-// Processes system messages. Should be called once a frame at least.
-bool ProcessSystemMessages();
+// Invalid shared memory Id, returned by RegisterSharedMemory in case of
+// failure.
+const int32 kInvalidSharedMemoryId = -1;
} // namespace command_buffer
} // namespace o3d
-#ifdef OS_WIN
-int big_test_main(int argc, wchar_t **argv);
-#else
-int big_test_main(int argc, char **argv);
-#endif
-
-#endif // O3D_COMMAND_BUFFER_SERVICE_CROSS_BIG_TEST_HELPERS_H_
+#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_CONSTANTS_H_
diff --git a/o3d/command_buffer/common/cross/gapi_interface.h b/o3d/command_buffer/common/cross/gapi_interface.h
index f72b858..a6f47a3 100644
--- a/o3d/command_buffer/common/cross/gapi_interface.h
+++ b/o3d/command_buffer/common/cross/gapi_interface.h
@@ -36,7 +36,7 @@
#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_GAPI_INTERFACE_H_
#define O3D_COMMAND_BUFFER_COMMON_CROSS_GAPI_INTERFACE_H_
-#include "command_buffer/common/cross/buffer_sync_api.h"
+#include "command_buffer/common/cross/constants.h"
#include "command_buffer/common/cross/resource.h"
#include "command_buffer/common/cross/cmd_buffer_format.h"
@@ -54,7 +54,7 @@ struct RGBA {
// This class defines the low-level graphics API, as a pure interface class.
class GAPIInterface {
public:
- typedef BufferSyncInterface::ParseError ParseError;
+ typedef parse_error::ParseError ParseError;
GAPIInterface() {}
virtual ~GAPIInterface() {}
@@ -92,8 +92,8 @@ class GAPIInterface {
// size: the size of the vertex buffer, in bytes.
// flags: the vertex buffer flags, as a combination of vertex_buffer::Flags
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateVertexBuffer(ResourceId id,
unsigned int size,
unsigned int flags) = 0;
@@ -102,8 +102,8 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the vertex buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid vertex buffer
- // ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid vertex buffer
+ // ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyVertexBuffer(ResourceId id) = 0;
// Sets data into a vertex buffer.
@@ -113,9 +113,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the source data.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments were
+ // parse_error::kParseInvalidArguments if invalid arguments were
// passed: invalid resource ID, or offset or size out of range.
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError SetVertexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
@@ -128,9 +128,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the destination buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments were
+ // parse_error::kParseInvalidArguments if invalid arguments were
// passed: invalid resource ID, or offset or size out of range.
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError GetVertexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
@@ -144,8 +144,8 @@ class GAPIInterface {
// Note that indices are 16 bits unless the index_buffer::INDEX_32BIT
// flag is specified.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateIndexBuffer(ResourceId id,
unsigned int size,
unsigned int flags) = 0;
@@ -154,8 +154,8 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the index buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid index buffer
- // ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid index buffer
+ // ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyIndexBuffer(ResourceId id) = 0;
// Sets data into an index buffer.
@@ -165,9 +165,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the source data.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments were
+ // parse_error::kParseInvalidArguments if invalid arguments were
// passed: invalid resource ID, or offset or size out of range.
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError SetIndexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
@@ -180,9 +180,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the destination buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments were
+ // parse_error::kParseInvalidArguments if invalid arguments were
// passed: invalid resource ID, or offset or size out of range.
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError GetIndexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
@@ -194,8 +194,8 @@ class GAPIInterface {
// id: the resource ID of the vertex struct.
// input_count: the number of input vertex attributes.
// returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateVertexStruct(ResourceId id,
unsigned int input_count) = 0;
@@ -203,8 +203,8 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the vertex struct.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid vertex struct
- // ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid vertex struct
+ // ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyVertexStruct(ResourceId id) = 0;
// Sets an input into a vertex struct.
@@ -219,8 +219,8 @@ class GAPIInterface {
// semantic: the semantic of the input.
// semantic_index: the semantic index of the input.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError SetVertexInput(ResourceId vertex_struct_id,
unsigned int input_index,
ResourceId vertex_buffer_id,
@@ -234,8 +234,8 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the vertex struct.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed (invalid vertex struct), BufferSyncInterface::kParseNoError
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed (invalid vertex struct), parse_error::kParseNoError
// otherwise.
virtual ParseError SetVertexStruct(ResourceId id) = 0;
@@ -245,8 +245,8 @@ class GAPIInterface {
// first: the index of the first vertex.
// count: the number of primitives to draw.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError Draw(PrimitiveType primitive_type,
unsigned int first,
unsigned int count) = 0;
@@ -261,8 +261,8 @@ class GAPIInterface {
// min_index: the lowest index being drawn.
// max_index: the highest index being drawn.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError DrawIndexed(PrimitiveType primitive_type,
ResourceId index_buffer_id,
unsigned int first,
@@ -276,9 +276,9 @@ class GAPIInterface {
// size: the size of data.
// data: the source code for the effect.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed or the effect failed to compile,
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError CreateEffect(ResourceId id,
unsigned int size,
const void *data) = 0;
@@ -287,16 +287,16 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the effect.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid effect ID
- // was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid effect ID
+ // was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyEffect(ResourceId id) = 0;
// Sets the active effect for drawing.
// Parameters:
// id: the resource ID of the effect.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError SetEffect(ResourceId id) = 0;
// Gets the number of parameters in an effect, returning it in a memory
@@ -307,8 +307,8 @@ class GAPIInterface {
// Uint32).
// data: the buffer receiving the data.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError GetParamCount(ResourceId id,
unsigned int size,
void *data) = 0;
@@ -321,9 +321,9 @@ class GAPIInterface {
// the effect source.
// index: the index of the parameter.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, such as invalid effect ID, unmatching data type or invalid
- // index, BufferSyncInterface::kParseNoError otherwise.
+ // index, parse_error::kParseNoError otherwise.
virtual ParseError CreateParam(ResourceId param_id,
ResourceId effect_id,
unsigned int index) = 0;
@@ -338,9 +338,9 @@ class GAPIInterface {
// name: the parameter name, as an array of char. Doesn't have to be
// nul-terminated (though nul will terminate the string).
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, such as invalid effect ID, unmatching data type or no parameter
- // was found with this name, BufferSyncInterface::kParseNoError otherwise.
+ // was found with this name, parse_error::kParseNoError otherwise.
virtual ParseError CreateParamByName(ResourceId param_id,
ResourceId effect_id,
unsigned int size,
@@ -350,8 +350,8 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the parameter.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid parameter ID
- // was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid parameter ID
+ // was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyParam(ResourceId id) = 0;
// Sets the effect parameter data.
@@ -360,9 +360,9 @@ class GAPIInterface {
// size: the size of the data. Must be at least the size of the parameter
// as described by its type.
// data: the parameter data.
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, such as invalid parameter ID, or unmatching data size,
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError SetParamData(ResourceId id,
unsigned int size,
const void *data) = 0;
@@ -382,10 +382,10 @@ class GAPIInterface {
// description. Must be at least sizeof(effect_param::Desc).
// data: the memory buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, such as invalid parameter ID, or unsufficient data size,
- // BufferSyncInterface::kParseNoError otherwise. Note that
- // BufferSyncInterface::kParseNoError will be returned if the structure
+ // parse_error::kParseNoError otherwise. Note that
+ // parse_error::kParseNoError will be returned if the structure
// itself fits, not necessarily the names. To make sure all the information
// is available, the caller should compare the returned size member of the
// effect_param::Desc structure to the size parameter passed in.
@@ -401,8 +401,8 @@ class GAPIInterface {
// Uint32).
// data: the buffer receiving the data.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError GetStreamCount(ResourceId id,
unsigned int size,
void *data) = 0;
@@ -432,8 +432,8 @@ class GAPIInterface {
// flags: the texture flags, as a combination of texture::Flags.
// enable_render_surfaces: bool for whether to enable render surfaces
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateTexture2D(ResourceId id,
unsigned int width,
unsigned int height,
@@ -454,8 +454,8 @@ class GAPIInterface {
// flags: the texture flags, as a combination of texture::Flags.
// enable_render_surfaces: bool for whether to enable render surfaces
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateTexture3D(ResourceId id,
unsigned int width,
unsigned int height,
@@ -475,8 +475,8 @@ class GAPIInterface {
// flags: the texture flags, as a combination of texture::Flags.
// enable_render_surfaces: bool for whether to enable render surfaces
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateTextureCube(ResourceId id,
unsigned int side,
unsigned int levels,
@@ -511,9 +511,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the texel data.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, for example invalid size, or out-of-bounds rectangle/volume,
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError SetTextureData(ResourceId id,
unsigned int x,
unsigned int y,
@@ -555,9 +555,9 @@ class GAPIInterface {
// size: the size of the data.
// data: the destination buffer.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
+ // parse_error::kParseInvalidArguments if invalid arguments are
// passed, for example invalid size, or out-of-bounds rectangle/volume,
- // BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseNoError otherwise.
virtual ParseError GetTextureData(ResourceId id,
unsigned int x,
unsigned int y,
@@ -576,23 +576,23 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the texture.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid texture
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid texture
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyTexture(ResourceId id) = 0;
// Creates a sampler resource.
// Parameters:
// id: the resource ID of the sampler.
// Returns:
- // BufferSyncInterface::kParseNoError.
+ // parse_error::kParseNoError.
virtual ParseError CreateSampler(ResourceId id) = 0;
// Destroys a sampler resource.
// Parameters:
// id: the resource ID of the sampler.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid sampler
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid sampler
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroySampler(ResourceId id) = 0;
// Sets the states in a sampler resource.
@@ -606,8 +606,8 @@ class GAPIInterface {
// mip_filter: the filtering mode for mip-map interpolation textures.
// max_anisotropy: the maximum anisotropy.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid sampler
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid sampler
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError SetSamplerStates(ResourceId id,
sampler::AddressingMode addressing_u,
sampler::AddressingMode addressing_v,
@@ -622,8 +622,8 @@ class GAPIInterface {
// id: the resource ID of the sampler.
// color: the border color.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid sampler
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid sampler
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError SetSamplerBorderColor(ResourceId id,
const RGBA &color) = 0;
@@ -632,8 +632,8 @@ class GAPIInterface {
// id: the resource ID of the sampler.
// texture_id: the resource id of the texture.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid sampler
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if an invalid sampler
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError SetSamplerTexture(ResourceId id,
ResourceId texture_id) = 0;
@@ -772,8 +772,8 @@ class GAPIInterface {
// height: the texture height. Must be positive.
// texture_id: the resource id of the texture.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateRenderSurface(ResourceId id,
unsigned int width,
unsigned int height,
@@ -785,9 +785,9 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the render surface.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid render
+ // parse_error::kParseInvalidArguments if an invalid render
// surface
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyRenderSurface(ResourceId id) = 0;
// Creates a depth stencil surface resource.
@@ -796,8 +796,8 @@ class GAPIInterface {
// width: the texture width. Must be positive.
// height: the texture height. Must be positive.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError CreateDepthSurface(ResourceId id,
unsigned int width,
unsigned int height) = 0;
@@ -806,9 +806,9 @@ class GAPIInterface {
// Parameters:
// id: the resource ID of the depth stencil surface.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if an invalid render
+ // parse_error::kParseInvalidArguments if an invalid render
// surface
- // resource ID was passed, BufferSyncInterface::kParseNoError otherwise.
+ // resource ID was passed, parse_error::kParseNoError otherwise.
virtual ParseError DestroyDepthSurface(ResourceId id) = 0;
// Switches the render surface and depth stencil surface to those
@@ -817,8 +817,8 @@ class GAPIInterface {
// render_surface_id: the resource ID of the render surface.
// depth_stencil_id: the resource ID of the render depth stencil surface.
// Returns:
- // BufferSyncInterface::kParseInvalidArguments if invalid arguments are
- // passed, BufferSyncInterface::kParseNoError otherwise.
+ // parse_error::kParseInvalidArguments if invalid arguments are
+ // passed, parse_error::kParseNoError otherwise.
virtual ParseError SetRenderSurface(ResourceId render_surface_id,
ResourceId depth_stencil_id) = 0;
diff --git a/o3d/command_buffer/common/cross/mocks.h b/o3d/command_buffer/common/cross/mocks.h
deleted file mode 100644
index 7ee8fd6..0000000
--- a/o3d/command_buffer/common/cross/mocks.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file contains definitions for mock objects, used for testing.
-
-// TODO: This file "manually" defines some mock objects. Using gMock
-// would be definitely preferable, unfortunately it doesn't work on Windows
-// yet.
-
-#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_MOCKS_H_
-#define O3D_COMMAND_BUFFER_COMMON_CROSS_MOCKS_H_
-
-#include <vector>
-#include "gmock/gmock.h"
-#include "command_buffer/common/cross/rpc.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Mocks a RPC send interface. This class only mocks SendCall currently.
-// Set call expectations with AddSendCallExpect: one for each call with exact
-// parameters, and desired return value, then run the test.
-class RPCSendInterfaceMock : public RPCSendInterface {
- public:
- RPCSendInterfaceMock() : called_(0) {}
- virtual ~RPCSendInterfaceMock() { Check(); }
-
- // Checks that the expected number of calls actually happened.
- void Check() {
- EXPECT_EQ(expects_.size(), called_);
- }
-
- // Struct describing a SendCall call expectation, with the desired return
- // value.
- struct SendCallExpect {
- RPCImplInterface::ReturnValue _return;
- int message_id;
- const void * data;
- size_t size;
- RPCHandle * handles;
- size_t handle_count;
- };
-
- // Adds an expectation for a SendCall call.
- void AddSendCallExpect(const SendCallExpect &expect) {
- expects_.push_back(expect);
- }
-
- // Mock SendCall implementation. This will check the arguments against the
- // expected values (the values pointed by 'data' are compared, not the
- // pointer), and return the desired return value.
- virtual RPCImplInterface::ReturnValue SendCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) {
- if (called_ < expects_.size()) {
- const SendCallExpect &expect = expects_[called_];
- ++called_;
- EXPECT_EQ(expect.message_id, message_id);
- EXPECT_EQ(expect.size, size);
- if (expect.size != size) return 0;
- EXPECT_EQ(expect.handle_count, handle_count);
- if (expect.handle_count != handle_count) return 0;
- if (size > 0) {
- EXPECT_EQ(0, memcmp(expect.data, data, size));
- } else {
- EXPECT_FALSE(data);
- }
- if (handle_count > 0) {
- for (unsigned int i = 0; i < handle_count; ++i) {
- EXPECT_TRUE(expect.handles[i] == handles[i]);
- }
- } else {
- EXPECT_FALSE(handles);
- }
- return expect._return;
- } else {
- ++called_;
- // This is really an EXPECT_FALSE, but we get to display useful values.
- EXPECT_GE(expects_.size(), called_);
- // We need to return something but we don't know what, we don't have any
- // expectation for this call. 0 will do.
- return 0;
- }
- }
- private:
- size_t called_;
- std::vector<SendCallExpect> expects_;
-};
-
-// Mocks a BufferSyncInterface, using GMock.
-class BufferSyncMock : public BufferSyncInterface {
- public:
- MOCK_METHOD0(InitConnection, void());
- MOCK_METHOD0(CloseConnection, void());
- MOCK_METHOD2(RegisterSharedMemory, unsigned int(RPCShmHandle buffer,
- size_t size));
- MOCK_METHOD1(UnregisterSharedMemory, void(unsigned int shm_id));
- MOCK_METHOD4(SetCommandBuffer, void(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get));
- MOCK_METHOD1(Put, void(CommandBufferOffset offset));
- MOCK_METHOD0(Get, CommandBufferOffset());
- MOCK_METHOD0(GetToken, unsigned int());
- MOCK_METHOD1(WaitGetChanges,
- CommandBufferOffset(CommandBufferOffset current_value));
- MOCK_METHOD2(SignalGetChanges, void(CommandBufferOffset current_value,
- int rpc_message_id));
- MOCK_METHOD0(GetStatus, ParserStatus());
- MOCK_METHOD0(GetParseError, ParseError());
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_MOCKS_H_
diff --git a/o3d/command_buffer/common/cross/rpc.h b/o3d/command_buffer/common/cross/rpc.h
deleted file mode 100644
index 6e95ee2..0000000
--- a/o3d/command_buffer/common/cross/rpc.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_H_
-#define O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_H_
-
-#include "base/basictypes.h"
-
-#include "native_client/src/shared/imc/nacl_htp.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Pre-defined message IDs.
-enum {
- POISONED_MESSAGE_ID, // sent to kill the RPC server.
- RESPONSE_ID, // sent as a response to a RPC call.
-};
-
-typedef nacl::HtpHandle RPCHandle;
-typedef RPCHandle RPCShmHandle;
-typedef RPCHandle RPCSocketHandle;
-static const RPCHandle kRPCInvalidHandle = nacl::kInvalidHtpHandle;
-
-// Interface for a RPC implementation. This class defines the calls a RPC
-// service needs to implement.
-class RPCImplInterface {
- public:
- // The type of return values for RPC calls. The RPC model is an arbitrary
- // set of parameters, but a single return value.
- typedef unsigned int ReturnValue;
-
- RPCImplInterface() {}
- virtual ~RPCImplInterface() {}
-
- // De-multiplexes a RPC call. This function takes the message ID and the data
- // to deduce a proper function to call, with its arguments, returning a
- // single value. Most protocols will select the function from the message ID,
- // and take the arguments from the data.
- // Parameters:
- // message_id: the RPC message ID.
- // data: the RPC message payload.
- // size: the size of the data.
- // Returns:
- // a single return value from the function called.
- virtual ReturnValue DoCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) = 0;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(RPCImplInterface);
-};
-
-class RPCSendInterface {
- public:
- virtual ~RPCSendInterface() {}
- // Sends a call to the server thread. This call will be dispatched by the
- // server thread to the RPC implementation. This call will block until the
- // call is processed and the return value is sent back.
- // Parameters:
- // message_id: the RPC message ID.
- // data: the RPC message payload.
- // size: the size of the data.
- // handles: an array of RPC handles to transmit
- // handle_count: the number of RPC handles in the array
- // Returns:
- // the return value of the RPC call.
- virtual RPCImplInterface::ReturnValue SendCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) = 0;
-};
-
-class RPCProcessInterface {
- public:
- virtual ~RPCProcessInterface() {}
- // Processes one message, blocking if necessary until a message is available
- // or the server is killed. This will dispatch the received message to the
- // RPC implementation, and send back a response message with the return
- // value to the client.
- // Returns:
- // false if the server was killed.
- virtual bool ProcessMessage() = 0;
-
- // Checks whether a message is available for processing - allowing to test if
- // ProcessMessage will block.
- // Returns:
- // true if a message is available.
- virtual bool HasMessage() = 0;
-};
-
-// Creates a RPCSendInterface from a RPCSocketHandle.
-RPCSendInterface *MakeSendInterface(RPCSocketHandle handle);
-
-// Creates a shared memory buffer.
-// Parameters:
-// size: the size of the buffer.
-// Returns:
-// the handle to the shared memory buffer.
-RPCShmHandle CreateShm(size_t size);
-
-// Destroys a shared memory buffer.
-// Parameters:
-// handle: the handle to the shared memory buffer.
-void DestroyShm(RPCShmHandle handle);
-
-// Maps a shared memory buffer into the address space.
-// Parameters:
-// handle: the handle to the shared memory buffer.
-// size: the size of the region to map in the memory buffer. May be smaller
-// than the shared memory region, but the underlying implementation
-// will round it up to the page size or the whole shared memory.
-// Returns:
-// the address of the mapped region, or NULL if failure.
-void *MapShm(RPCShmHandle handle, size_t size);
-
-// Unmaps a previously mapped memory buffer.
-// Parameters:
-// address: the address of the mapped region.
-// size: the size of the region to un-map. It can be a subset of the
-// previously mapped region, but the underlying implementation will
-// round it up to the page size.
-void UnmapShm(void *address, size_t size);
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_H_
diff --git a/o3d/command_buffer/common/cross/rpc_fake.cc b/o3d/command_buffer/common/cross/rpc_fake.cc
deleted file mode 100644
index 028c753..0000000
--- a/o3d/command_buffer/common/cross/rpc_fake.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <windows.h>
-#include "command_buffer/common/cross/rpc_fake.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Create the queue, initializing the synchronization structures: a mutex for
-// the queue itself, and an event to signal the consumers.
-RPCQueue::RPCQueue() {
- event_ = ::CreateEvent(NULL, FALSE, FALSE, NULL);
- ::InitializeCriticalSection(&mutex_);
-}
-
-RPCQueue::~RPCQueue() {
- ::DeleteCriticalSection(&mutex_);
- ::CloseHandle(event_);
-}
-
-// Adds a message into the queue. Signal waiting threads that a new message is
-// available.
-void RPCQueue::AddMessage(const RPCMessage &call) {
- ::EnterCriticalSection(&mutex_);
- queue_.push(call);
- ::SetEvent(event_);
- ::LeaveCriticalSection(&mutex_);
-}
-
-// Checks whether the queue is empty.
-bool RPCQueue::IsEmpty() {
- ::EnterCriticalSection(&mutex_);
- bool result = queue_.empty();
- ::LeaveCriticalSection(&mutex_);
- return result;
-}
-
-// Gets a message, waiting for one if the queue is empty.
-void RPCQueue::GetMessage(RPCMessage *message) {
- ::EnterCriticalSection(&mutex_);
- while (queue_.empty()) {
- ::LeaveCriticalSection(&mutex_);
- ::WaitForSingleObject(event_, INFINITE);
- ::EnterCriticalSection(&mutex_);
- }
- *message = queue_.front();
- queue_.pop();
- ::LeaveCriticalSection(&mutex_);
-}
-
-// Tries to gets a message, returning immediately if the queue is empty.
-bool RPCQueue::TryGetMessage(RPCMessage *message) {
- ::EnterCriticalSection(&mutex_);
- bool result = !queue_.empty();
- if (result) {
- *message = queue_.front();
- queue_.pop();
- }
- ::LeaveCriticalSection(&mutex_);
- return result;
-}
-
-// Creates the RPC server. The RPC server uses 2 RPC Queues, one for "incoming"
-// calls (in_queue_), and one for "outgoing" return values (out_queue_).
-RPCServer::RPCServer(RPCImplInterface * impl) {
- sender_.reset(new Sender(&in_queue_, &out_queue_));
- processor_.reset(new Processor(&in_queue_, &out_queue_, impl));
-}
-
-RPCServer::~RPCServer() {}
-
-// Allocates the data for a message, if needed. Initializes the RPCMessage
-// structure.
-void RPCServer::AllocMessage(int message_id,
- const void *data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count,
- RPCMessage *message) {
- message->message_id = message_id;
- message->size = size;
- message->handle_count = handle_count;
- if (data) {
- message->data = malloc(size);
- memcpy(message->data, data, size);
- } else {
- DCHECK(size == 0);
- message->data = NULL;
- }
- if (handles) {
- DCHECK(handle_count > 0);
- message->handles = new RPCHandle[handle_count];
- for (unsigned int i = 0; i < handle_count; ++i)
- message->handles[i] = handles[i];
- } else {
- DCHECK(handle_count == 0);
- message->handles = NULL;
- }
-}
-
-// Destroys the message data if needed.
-void RPCServer::DestroyMessage(RPCMessage *message) {
- if (message->data) free(message->data);
- if (message->handles) delete [] message->handles;
-}
-
-// Processes one message, getting one from the incoming queue (blocking),
-// dispatching it to the implementation (if not the "poisoned" message), and
-// adding the return value to the outgoing queue.
-bool RPCServer::Processor::ProcessMessage() {
- RPCMessage input;
- in_queue_->GetMessage(&input);
- RPCImplInterface::ReturnValue result = 0;
- bool continue_processing = true;
- if (input.message_id == POISONED_MESSAGE_ID) {
- continue_processing = false;
- } else {
- result = impl_->DoCall(input.message_id, input.data, input.size,
- input.handles, input.handle_count);
- }
- DestroyMessage(&input);
-
- RPCMessage output;
- AllocMessage(RESPONSE_ID, &result, sizeof(result), NULL, 0, &output);
- out_queue_->AddMessage(output);
- return continue_processing;
-}
-
-// Checks if the incoming queue is empty.
-bool RPCServer::Processor::HasMessage() {
- return !in_queue_->IsEmpty();
-}
-
-// Processes all messages until the server is killed.
-void RPCServer::MessageLoop() {
- do {} while (processor_->ProcessMessage());
-}
-
-// Sends a "poisoned" call to the server thread, making it exit the processing
-// loop.
-void RPCServer::KillServer() {
- sender_->SendCall(POISONED_MESSAGE_ID, NULL, 0, NULL, 0);
-}
-
-// Sends a call to the server thread. This puts a message into the "incoming"
-// queue, and waits for the return message on the "outgoing" queue.
-RPCImplInterface::ReturnValue RPCServer::Sender::SendCall(
- int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) {
- RPCMessage input;
- AllocMessage(message_id, data, size, handles, handle_count, &input);
- in_queue_->AddMessage(input);
-
- RPCMessage output;
- out_queue_->GetMessage(&output);
- DCHECK(output.message_id == RESPONSE_ID);
- DCHECK(output.size == sizeof(RPCImplInterface::ReturnValue));
- RPCImplInterface::ReturnValue result =
- *(reinterpret_cast<RPCImplInterface::ReturnValue *>(output.data));
- DestroyMessage(&output);
- return result;
-}
-
-class RPCSendProxy : public RPCSendInterface {
- public:
- explicit RPCSendProxy(RPCSendInterface *interface) : interface_(interface) {}
- virtual ~RPCSendProxy() {}
- virtual RPCImplInterface::ReturnValue SendCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) {
- return interface_->SendCall(message_id, data, size, handles, handle_count);
- }
- private:
- RPCSendInterface *interface_;
-};
-
-// Create a proxy so that it can be managed as a separate object, to have the
-// same semantics as the IMC implementation.
-RPCSendInterface *MakeSendInterface(RPCSocketHandle handle) {
- return new RPCSendProxy(handle->GetSendInterface());
-}
-
-void *MapShm(RPCShmHandle handle, size_t size) {
- return (size <= handle->size) ? return handle->address : NULL;
-}
-
-void UnmapShm(void * address, size_t size) {
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/common/cross/rpc_fake.h b/o3d/command_buffer/common/cross/rpc_fake.h
deleted file mode 100644
index 11eb258..0000000
--- a/o3d/command_buffer/common/cross/rpc_fake.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file defines classes faking the NativeClient RPC mechanism. This is
-// intended as a temporary replacement of NativeClient until it is ready. It
-// assumes the various clients and services run in separate threads of the same
-// process.
-
-#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_FAKE_H_
-#define O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_FAKE_H_
-
-#include <windows.h>
-#include <queue>
-#include "base/scoped_ptr.h"
-#include "core/cross/types.h"
-#include "command_buffer/common/cross/rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-typedef CRITICAL_SECTION Mutex;
-typedef HANDLE Event;
-
-// Struct describing a RPC message, as a message ID and a data payload.
-// It "owns" the data pointer.
-struct RPCMessage {
- int message_id;
- size_t size;
- void *data;
- RPCHandle *handles;
- size_t handle_count;
-};
-
-// Implementation of a (thread-safe) RPC message queue (FIFO). It allows simply
-// to enqueue and dequeue messages, in a blocking or non-blocking fashion.
-class RPCQueue {
- public:
- RPCQueue();
- ~RPCQueue();
-
- // Adds a message into the back of the queue.
- // Parameters:
- // message: the message to enqueue. Ownership of the message data is taken
- // by the queue.
- void AddMessage(const RPCMessage &message);
-
- // Tests whether or not the queue is empty.
- // Returns:
- // true if the queue is empty.
- bool IsEmpty();
-
- // Gets a message from the front of the queue. This call blocks until a
- // message is available in the queue.
- // Parameters:
- // message: a pointer to a RPCMessage structure receiving the message.
- // That structure takes ownership of the message data.
- void GetMessage(RPCMessage *message);
-
- // Try to get a message from the front of the queue, if any. This call will
- // not block if the queue is empty.
- // Parameters:
- // message: a pointer to a RPCMessage structure receiving the message, if
- // any. That structure takes ownership of the message data. If no
- // message is available, that structure is unchanged.
- // Returns:
- // true if a message was available.
- bool TryGetMessage(RPCMessage *message);
-
- private:
- std::queue<RPCMessage> queue_;
- Mutex mutex_;
- Event event_;
-
- DISALLOW_COPY_AND_ASSIGN(RPCQueue);
-};
-
-// Implements a fake RPC server interface. This class is intended to be used
-// across different threads (it is thread safe):
-// - one server thread, that processes messages (using MessageLoop() or
-// ProcessMessage()), to execute the RPC calls.
-// - one or several client threads, that can send RPC calls to it.
-//
-// One of the client threads can "kill" the server so that it exits its
-// processing loop.
-class RPCServer {
- public:
- explicit RPCServer(RPCImplInterface *impl);
- ~RPCServer();
-
- // Server thread functions
-
- // Processes all messages, until the server is killed.
- void MessageLoop();
- RPCProcessInterface *GetProcessInterface() { return processor_.get(); }
-
- // client thread functions
- RPCSendInterface *GetSendInterface() { return sender_.get(); }
-
- // Kills the server thread, making it exit its processing loop. This call
- // will block until the server has finished processing all the previous
- // messages.
- void KillServer();
-
- private:
- static void AllocMessage(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count,
- RPCMessage *message);
- static void DestroyMessage(RPCMessage *message);
-
- class Sender : public RPCSendInterface {
- public:
- Sender(RPCQueue *in_queue, RPCQueue *out_queue)
- : in_queue_(in_queue),
- out_queue_(out_queue) {}
- // Sends a call to the server thread. This call will be dispatched by the
- // server thread to the RPC implementation. This call will block until the
- // call is processed and the return value is sent back.
- // Parameters:
- // message_id: the RPC message ID.
- // data: the RPC message payload.
- // size: the size of the data.
- // handles: an array of RPC handles to transmit
- // handle_count: the number of RPC handles in the array
- // Returns:
- // the return value of the RPC call.
- virtual RPCImplInterface::ReturnValue SendCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count);
- private:
- RPCQueue *in_queue_;
- RPCQueue *out_queue_;
- DISALLOW_COPY_AND_ASSIGN(Sender);
- };
-
- class Processor : public RPCProcessInterface {
- public:
- Processor(RPCQueue *in_queue, RPCQueue *out_queue, RPCImplInterface *impl)
- : in_queue_(in_queue),
- out_queue_(out_queue),
- impl_(impl) {}
- virtual ~Processor() {}
- // Processes one message, blocking if necessary until a message is available
- // or the server is killed. This will dispatch the received message to the
- // RPC implementation, and send back a response message with the return
- // value to the client.
- // Returns:
- // false if the server was killed.
- virtual bool ProcessMessage();
-
- // Checks whether a message is available for processing - allowing to test
- // if ProcessMessage will block.
- // Returns:
- // true if a message is available.
- virtual bool HasMessage();
- private:
- RPCQueue *in_queue_;
- RPCQueue *out_queue_;
- RPCImplInterface *impl_;
- DISALLOW_COPY_AND_ASSIGN(Processor);
- };
-
- RPCQueue in_queue_;
- RPCQueue out_queue_;
- scoped_ptr<Sender> sender_;
- scoped_ptr<Processor> processor_;
- DISALLOW_COPY_AND_ASSIGN(RPCServer);
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_FAKE_H_
diff --git a/o3d/command_buffer/common/cross/rpc_imc.cc b/o3d/command_buffer/common/cross/rpc_imc.cc
deleted file mode 100644
index 391f139..0000000
--- a/o3d/command_buffer/common/cross/rpc_imc.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <algorithm>
-#include "command_buffer/common/cross/logging.h"
-#include "command_buffer/common/cross/rpc_imc.h"
-#include "native_client/src/shared/imc/nacl_htp.h"
-
-namespace o3d {
-namespace command_buffer {
-
-int NaclSendData(nacl::HtpHandle channel,
- const void *data,
- size_t size,
- int flags) {
- nacl::HtpHeader msg;
- nacl::IOVec vec;
- vec.base = const_cast<void *>(data);
- vec.length = size;
- msg.iov = &vec;
- msg.iov_length = 1;
- msg.handles = NULL;
- msg.handle_count = 0;
- msg.flags = 0;
- return nacl::SendDatagram(channel, &msg, flags);
-}
-
-int NaclSendHandles(nacl::HtpHandle channel,
- const nacl::HtpHandle *handles,
- size_t count,
- int flags) {
- nacl::HtpHeader msg;
- msg.iov = NULL;
- msg.iov_length = 0;
- msg.handles = const_cast<nacl::HtpHandle *>(handles);
- msg.handle_count = count;
- msg.flags = 0;
- return nacl::SendDatagram(channel, &msg, flags);
-}
-
-int NaclReceiveData(nacl::HtpHandle channel,
- void *data,
- size_t size,
- int flags) {
- nacl::HtpHeader msg;
- nacl::IOVec vec[1];
- vec[0].base = data;
- vec[0].length = size;
- msg.iov = vec;
- msg.iov_length = 1;
- msg.handles = NULL;
- msg.handle_count = 0;
- msg.flags = 0;
- int result = nacl::ReceiveDatagram(channel, &msg, flags);
- return result;
-}
-
-int NaclReceiveHandles(nacl::HtpHandle channel,
- nacl::HtpHandle *handles,
- size_t count,
- int flags) {
- nacl::HtpHeader msg;
- msg.iov = NULL;
- msg.iov_length = 0;
- msg.handles = handles;
- msg.handle_count = count;
- msg.flags = 0;
- return nacl::ReceiveDatagram(channel, &msg, flags);
-}
-
-struct RPCMessageHeader {
- int message_id;
- size_t size;
- size_t handle_count;
-};
-
-RPCImplInterface::ReturnValue IMCSender::SendCall(
- int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) {
- // Send 3 messages: first contains message id, and data size, second
- // contains data and third handles.
- // The reason for that is to have the size first so that we can allocate the
- // data buffer on the receiving side.
- RPCMessageHeader msg = {message_id, size, handle_count};
- int result = NaclSendData(handle_, &msg, sizeof(msg), 0);
- DCHECK_NE(-1, result);
- if (size > 0) {
- result = NaclSendData(handle_, data, size, 0);
- DCHECK_NE(-1, result);
- }
- if (handle_count > 0) {
- result = NaclSendHandles(handle_, handles, handle_count, 0);
- DCHECK_NE(-1, result);
- }
-
- RPCImplInterface::ReturnValue ret;
- result = NaclReceiveData(handle_, &ret, sizeof(ret), 0);
- DCHECK_EQ(sizeof(ret), static_cast<size_t>(result));
- return ret;
-}
-
-bool IMCMessageProcessor::GetMessageIDSize(bool wait) {
- if (has_message_) return true;
- RPCMessageHeader msg = {0};
- int result = NaclReceiveData(handle_, &msg, sizeof(msg),
- wait ? 0 : nacl::kDontWait);
- if (result != sizeof(msg)) {
- if (result >=0 || wait || !nacl::WouldBlock()) return false;
- has_message_ = false;
- } else {
- incoming_message_id_ = msg.message_id;
- incoming_message_size_ = msg.size;
- incoming_message_handles_ = msg.handle_count;
- has_message_ = true;
- }
- return true;
-}
-
-bool IMCMessageProcessor::ProcessMessage() {
- if (!GetMessageIDSize(true)) return false;
- if (incoming_message_size_ > 0) {
- if (incoming_message_size_ > data_size_) {
- data_size_ = incoming_message_size_;
- data_.reset(new char[incoming_message_size_]);
- }
- int result = NaclReceiveData(handle_, data_.get(), incoming_message_size_,
- 0);
- if (result < 0) return false;
- }
- if (incoming_message_handles_ > 0) {
- if (incoming_message_handles_ > handle_count_) {
- handle_count_ = incoming_message_handles_;
- handles_.reset(new nacl::HtpHandle[incoming_message_handles_]);
- }
- int result = NaclReceiveHandles(handle_, handles_.get(),
- incoming_message_handles_, 0);
- if (result < 0) return false;
- }
- has_message_ = false;
- RPCImplInterface::ReturnValue retval = 0;
- bool continue_processing = true;
- if (incoming_message_id_ == POISONED_MESSAGE_ID) {
- continue_processing = false;
- } else {
- retval = impl_->DoCall(incoming_message_id_, data_.get(),
- incoming_message_size_, handles_.get(),
- incoming_message_handles_);
- // Note: the handles that got received are a "copy" of the original handle,
- // so they need to be closed eventually. It's hard to impose an
- // "ownership" policy onto the RPCImplInterface, because it makes the API
- // very clunky. Currently, we only pass handles across for
- // RegisterSharedMemory, and so we can safely close the handle immediately
- // (the memory will stay mapped).
- // TODO: Fix this. Possibly using a global registration mechanism
- // and ref-counting would make it work nicely.
- for (unsigned int i = 0; i < incoming_message_handles_; ++i) {
- nacl::Close(handles_[i]);
- }
- }
-
- int result = NaclSendData(handle_, &retval, sizeof(retval), 0);
- if (result < 0) return false;
- return continue_processing;
-}
-
-bool IMCMessageProcessor::HasMessage() {
- GetMessageIDSize(false);
- return has_message_;
-}
-
-RPCSendInterface *MakeSendInterface(RPCSocketHandle handle) {
- return new IMCSender(handle);
-}
-
-RPCShmHandle CreateShm(size_t size) {
- size = (size + nacl::kMapPageSize - 1) & ~(nacl::kMapPageSize - 1);
- nacl::Handle nacl_handle = nacl::CreateMemoryObject(size);
- return nacl_handle == nacl::kInvalidHandle ? kRPCInvalidHandle :
- nacl::CreateShmDesc(nacl_handle, size);
-}
-
-void DestroyShm(RPCShmHandle handle) {
- nacl::Close(handle);
-}
-
-void *MapShm(RPCShmHandle handle, size_t size) {
- size = (size + nacl::kMapPageSize - 1) & ~(nacl::kMapPageSize - 1);
- void *address = nacl::Map(NULL, size, nacl::kProtRead | nacl::kProtWrite,
- nacl::kMapShared, handle, 0);
- return address == nacl::kMapFailed ? NULL : address;
-}
-
-void UnmapShm(void *address, size_t size) {
- size = (size + nacl::kMapPageSize - 1) & ~(nacl::kMapPageSize - 1);
- nacl::Unmap(address, size);
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/common/cross/rpc_imc.h b/o3d/command_buffer/common/cross/rpc_imc.h
deleted file mode 100644
index 097fb1c..0000000
--- a/o3d/command_buffer/common/cross/rpc_imc.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#ifndef O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_IMC_H_
-#define O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_IMC_H_
-
-#include "native_client/src/shared/imc/nacl_imc.h"
-#include "base/scoped_ptr.h"
-#include "command_buffer/common/cross/rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-class IMCSender : public RPCSendInterface {
- public:
- explicit IMCSender(nacl::HtpHandle handle) : handle_(handle) {}
- virtual ~IMCSender() {}
- // Sends a call to the server thread. This call will be dispatched by the
- // server thread to the RPC implementation. This call will block until the
- // call is processed and the return value is sent back.
- // Parameters:
- // message_id: the RPC message ID.
- // data: the RPC message payload.
- // size: the size of the data.
- // handles: an array of RPC handles to transmit
- // handle_count: the number of RPC handles in the array
- // Returns:
- // the return value of the RPC call.
- virtual RPCImplInterface::ReturnValue SendCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count);
- private:
- nacl::HtpHandle handle_;
-};
-
-class IMCMessageProcessor : public RPCProcessInterface {
- public:
- IMCMessageProcessor(nacl::HtpHandle handle, RPCImplInterface *impl)
- : handle_(handle),
- impl_(impl),
- has_message_(false),
- incoming_message_id_(0),
- incoming_message_size_(0),
- incoming_message_handles_(0),
- data_size_(0),
- handle_count_(0) {}
- virtual ~IMCMessageProcessor() {}
- // Processes one message, blocking if necessary until a message is available
- // or the server is killed. This will dispatch the received message to the
- // RPC implementation, and send back a response message with the return
- // value to the client.
- // Returns:
- // false if the server was killed.
- virtual bool ProcessMessage();
-
- // Checks whether a message is available for processing - allowing to test if
- // ProcessMessage will block.
- // Returns:
- // true if a message is available.
- virtual bool HasMessage();
- private:
- bool GetMessageIDSize(bool wait);
- nacl::HtpHandle handle_;
- RPCImplInterface *impl_;
- bool has_message_;
- int incoming_message_id_;
- size_t incoming_message_size_;
- size_t incoming_message_handles_;
- size_t data_size_;
- scoped_array<char> data_;
- size_t handle_count_;
- scoped_array<RPCHandle> handles_;
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_COMMON_CROSS_RPC_IMC_H_
diff --git a/o3d/command_buffer/samples/build.scons b/o3d/command_buffer/samples/build.scons
deleted file mode 100644
index 414ee95..0000000
--- a/o3d/command_buffer/samples/build.scons
+++ /dev/null
@@ -1,55 +0,0 @@
-# Copyright 2009, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-Import('env')
-
-env.Append(
- LIBS = [
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- 'google_nacl_npruntime',
- ] + env['NACL_HTP_LIBS'],
- LIBPATH = ['$NACL_LIB_DIR'],
- CPPPATH = ['$NPAPI_DIR', '$NPAPI_DIR/include'],
-)
-
-if env['TARGET_PLATFORM'] == 'NACL':
- env.Append(LIBS=['m', 'pthread'],
- CCFLAGS=['-O3', '-mfpmath=sse', '-msse', '-fomit-frame-pointer'])
-
-BUBBLE_INPUTS = [
- 'bubble/bubble_module.cc',
- 'bubble/cubemap.cc',
- 'bubble/iridescence_texture.cc',
- 'bubble/perlin_noise.cc',
-]
-bubble_sample = env.Program('bubble_module.nexe', BUBBLE_INPUTS)
-artifacts = [bubble_sample, 'bubble/bubble.html']
-env.Replicate('$ARTIFACTS_DIR/samples/bubble', artifacts)
diff --git a/o3d/command_buffer/service/build.scons b/o3d/command_buffer/service/build.scons
deleted file mode 100644
index 3a0a199..0000000
--- a/o3d/command_buffer/service/build.scons
+++ /dev/null
@@ -1,146 +0,0 @@
-# Copyright 2009, Google Inc.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-
-Import('env')
-
-INPUTS = [
- 'cross/buffer_rpc.cc',
- 'cross/cmd_parser.cc',
- 'cross/cmd_buffer_engine.cc',
- 'cross/effect_utils.cc',
- 'cross/gapi_decoder.cc',
- 'cross/resource.cc',
- 'cross/texture_utils.cc',
-]
-
-# Add a precompiled header declaration to the Windows environment.
-if env['TARGET_PLATFORM'] == 'WINDOWS':
- env.Append(
- CCFLAGS = [
- '/Ylcommand_buffer',
- '/FIcommand_buffer/service/cross/precompile.h',
- ],
- )
- pch, pch_obj = env.PCH('cross/precompile.cc')
- env['PCH'] = pch
- env['PCHSTOP'] = 'command_buffer/service/cross/precompile.h'
-else:
- pch_obj = 'cross/precompile.cc'
- env.Append(CCFLAGS = [['-include',
- 'command_buffer/service/cross/precompile.h']])
-
-# Build the big tests
-BIG_TEST_SERVER = [
- 'cross/big_test.cc',
-]
-
-# Add some flags and libraries to the build environment for the unit tests
-env.Append(
- LIBPATH = [
- '$NACL_LIB_DIR',
- ],
- LIBS = [
- 'o3dCmdBuf_service',
- 'o3dCmdBuf_common',
- 'o3d_base',
- ] + env['NACL_HTP_LIBS'] + env['ICU_LIBS'],
-)
-
-if env['TARGET_PLATFORM'] == 'WINDOWS':
- if 'CB_SERVICE_D3D9' in env['CPPDEFINES']:
- env.Append(CCFLAGS = [],
- LIBS = [# System libs.
- 'd3d9',
- # TODO: remove link-time dependency on d3dx9, using
- # dynamic loading instead.
- 'd3dx9',
- 'dxerr',
- 'shell32'],
- LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
- INPUTS += ['win/d3d9/effect_d3d9.cc',
- 'win/d3d9/gapi_d3d9.cc',
- 'win/d3d9/geometry_d3d9.cc',
- 'win/d3d9/render_surface_d3d9.cc',
- 'win/d3d9/sampler_d3d9.cc',
- 'win/d3d9/states_d3d9.cc',
- 'win/d3d9/texture_d3d9.cc']
- elif 'CB_SERVICE_GL' in env['CPPDEFINES']:
- env.Append(CCFLAGS = [],
- LIBS = ['OpenGL32', 'glew32', 'cg', 'cgGL'],
- LIBPATH = ['$CG_DIR/lib', '$GLEW_DIR/lib'],
- CPPPATH = ['$CG_DIR/include', '$GLEW_DIR/include'],
- LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
- INPUTS += ['cross/gl/effect_gl.cc',
- 'cross/gl/gapi_gl.cc',
- 'cross/gl/geometry_gl.cc',
- 'cross/gl/render_surface_gl.cc',
- 'cross/gl/sampler_gl.cc',
- 'cross/gl/states_gl.cc',
- 'cross/gl/texture_gl.cc']
- BIG_TEST_SERVER += ['win/big_test_main.cc']
-elif env['TARGET_PLATFORM'] == 'LINUX':
- env.Append(LIBS = ['GL', 'GLEW', 'Cg', 'CgGL'],
- CPPPATH = ['$CG_DIR/include'])
- INPUTS += ['cross/gl/effect_gl.cc',
- 'cross/gl/gapi_gl.cc',
- 'cross/gl/geometry_gl.cc',
- 'cross/gl/render_surface_gl.cc',
- 'cross/gl/sampler_gl.cc',
- 'cross/gl/states_gl.cc',
- 'cross/gl/texture_gl.cc',
- 'linux/x_utils.cc']
- BIG_TEST_SERVER += ['linux/big_test_main.cc']
-
-# Create a target library from the sources called 'o3dCmdBuf'
-o3dcmdbuf_lib = env.ComponentLibrary('o3dCmdBuf_service', INPUTS)
-
-# TODO: why can't these be ComponentTestProgram?
-
-# Create a target executable program called 'o3dCmdBuf_bigtest_server' from the
-# list of big test server files.
-big_test_server = env.Program('o3dCmdBuf_bigtest_server', BIG_TEST_SERVER)
-
-# Copy the resulting executable to the Artifacts directory.
-env.Replicate('$ARTIFACTS_DIR', big_test_server)
-
-plugin_env = env.Clone();
-plugin_env.Append(CPPPATH = ['$NPAPI_DIR/include'])
-
-PLUGIN_INPUTS = [
- 'cross/plugin.cc',
- plugin_env.SharedObject(
- 'npn_api',
- '$NIXYSA_DIR/static_glue/npapi/npn_api.cc'),
-]
-if env['TARGET_PLATFORM'] == 'WINDOWS':
- PLUGIN_INPUTS += ['win/plugin.def',
- env.RES('win/plugin.rc')]
-plugin = plugin_env.SharedLibrary('npo3d_cb_plugin', PLUGIN_INPUTS)
-plugin_env.Replicate('$ARTIFACTS_DIR', plugin)
diff --git a/o3d/command_buffer/service/cross/big_test.cc b/o3d/command_buffer/service/cross/big_test.cc
deleted file mode 100644
index 0c92508..0000000
--- a/o3d/command_buffer/service/cross/big_test.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file contains a "big" test of the whole command buffer service, making
-// sure all the pieces fit together.
-//
-// Currently this checks that the RPC mechanism properly forwards call to the
-// service thread.
-
-#include <build/build_config.h>
-#include "command_buffer/common/cross/rpc_imc.h"
-#include "command_buffer/service/cross/big_test_helpers.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
-#include "command_buffer/service/cross/gapi_decoder.h"
-#include "third_party/native_client/googleclient/native_client/src/trusted/desc/nrd_all_modules.h"
-
-namespace o3d {
-namespace command_buffer {
-
-nacl::SocketAddress g_address = { "command-buffer" };
-
-// Main function. Creates a socket, and waits for an incoming connection on it.
-// Then run the engine main loop.
-void BigTest() {
- NaClNrdAllModulesInit();
- GAPIDecoder decoder(g_gapi);
- CommandBufferEngine engine(&decoder);
- decoder.set_engine(&engine);
- nacl::Handle server_socket = nacl::BoundSocket(&g_address);
- nacl::Handle handles[1];
- nacl::MessageHeader msg;
- msg.iov = NULL;
- msg.iov_length = 0;
- msg.handles = handles;
- msg.handle_count = 1;
- int r = nacl::ReceiveDatagram(server_socket, &msg, 0);
- DCHECK_NE(r, -1);
- nacl::Close(server_socket);
-
- nacl::HtpHandle htp_handle = nacl::CreateImcDesc(handles[0]);
- IMCMessageProcessor processor(htp_handle, engine.rpc_impl());
- engine.set_process_interface(&processor);
- IMCSender sender(htp_handle);
- engine.set_client_rpc(&sender);
-
- bool result = g_gapi->Initialize();
- DCHECK(result);
-
- bool running = true;
- while (running) {
- running = ProcessSystemMessages();
- if (!running) break;
- // DoWork() will block if there is nothing to be done, meaning we are only
- // going to handle message after commands are sent. It should happen at
- // least once a frame, so it's "good enough".
- // TODO: figure out a way to wait on the socket OR messages with
- // MsgWaitForMultipleObjects. Asynchronous ("overlapped") read on the
- // socket may let us do that on windows.
- running = engine.DoWork();
- }
- g_gapi->Destroy();
- nacl::Close(htp_handle);
- NaClNrdAllModulesFini();
-}
-
-} // namespace command_buffer
-} // namespace o3d
-
-#ifdef OS_WIN
-int big_test_main(int argc, wchar_t **argv) {
-#else
-int big_test_main(int argc, char **argv) {
-#endif
- o3d::command_buffer::BigTest();
- return 0;
-}
diff --git a/o3d/command_buffer/service/cross/buffer_rpc.cc b/o3d/command_buffer/service/cross/buffer_rpc.cc
deleted file mode 100644
index 668cc32..0000000
--- a/o3d/command_buffer/service/cross/buffer_rpc.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file has the implementation of the Command Buffer Synchronous API RPC
-// glue.
-
-#include "command_buffer/common/cross/logging.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Implements the dispatch function, deciding on which function to call based
-// on the message ID, taking the arguments trivially serialized in the data
-// payload.
-BufferRPCImpl::ReturnValue BufferRPCImpl::DoCall(int message_id,
- const void *data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count) {
- switch (message_id) {
- case INIT_CONNECTION: {
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- handler_->InitConnection();
- return 0;
- }
- case CLOSE_CONNECTION:
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- handler_->CloseConnection();
- return 0;
- case REGISTER_SHARED_MEMORY: {
- DCHECK_EQ(sizeof(size_t), size); // NOLINT
- DCHECK_EQ(1u, handle_count);
- RPCShmHandle buffer = static_cast<RPCShmHandle>(handles[0]);
- return handler_->RegisterSharedMemory(buffer,
- *static_cast<const size_t *>(data));
- }
- case UNREGISTER_SHARED_MEMORY: {
- DCHECK_EQ(sizeof(unsigned int), size); // NOLINT
- DCHECK_EQ(0u, handle_count);
- unsigned int shm_id = *(static_cast<const unsigned int *>(data));
- handler_->UnregisterSharedMemory(shm_id);
- return 0;
- }
- case SET_COMMAND_BUFFER: {
- DCHECK_EQ(sizeof(SetCommandBufferStruct), size);
- DCHECK_EQ(0u, handle_count);
- const SetCommandBufferStruct *params =
- static_cast<const SetCommandBufferStruct *>(data);
- handler_->SetCommandBuffer(params->shm_id,
- params->offset,
- params->size,
- params->start_get);
- return 0;
- }
- case PUT: {
- DCHECK_EQ(sizeof(CommandBufferOffset), size);
- DCHECK_EQ(0u, handle_count);
- CommandBufferOffset offset =
- *(static_cast<const CommandBufferOffset *>(data));
- handler_->Put(offset);
- return 0;
- }
- case GET:
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- return handler_->Get();
- case GET_TOKEN:
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- return handler_->GetToken();
- case WAIT_GET_CHANGES: {
- DCHECK_EQ(sizeof(CommandBufferOffset), size);
- DCHECK_EQ(0u, handle_count);
- CommandBufferOffset current_value =
- *(static_cast<const CommandBufferOffset *>(data));
- return handler_->WaitGetChanges(current_value);
- }
- case SIGNAL_GET_CHANGES: {
- DCHECK_EQ(sizeof(SignalGetChangesStruct), size);
- DCHECK_EQ(0u, handle_count);
- const SignalGetChangesStruct *params =
- static_cast<const SignalGetChangesStruct *>(data);
- handler_->SignalGetChanges(params->current_value,
- params->rpc_message_id);
- return 0;
- }
- case GET_STATUS: {
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- return handler_->GetStatus();
- }
- case GET_PARSE_ERROR: {
- DCHECK_EQ(0u, size);
- DCHECK_EQ(0u, handle_count);
- return handler_->GetParseError();
- }
- default:
- LOG(FATAL) << "unsupported RPC";
- return 0;
- }
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/service/cross/buffer_rpc.h b/o3d/command_buffer/service/cross/buffer_rpc.h
deleted file mode 100644
index 952e9b8..0000000
--- a/o3d/command_buffer/service/cross/buffer_rpc.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file defines the RPC glue for the Command Buffer Synchronous API,
-// service side: an implementation of a RPC service, forwarding calls to
-// a Command Buffer API implemention (RPC -> API).
-
-#ifndef O3D_COMMAND_BUFFER_SERVICE_CROSS_BUFFER_RPC_H_
-#define O3D_COMMAND_BUFFER_SERVICE_CROSS_BUFFER_RPC_H_
-
-#include "command_buffer/common/cross/buffer_sync_api.h"
-#include "command_buffer/common/cross/rpc.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// RPC service implementation, implementing the Command Buffer Synchronous API
-// RPC glue. This class is temporary, and will be replaced when the
-// NativeClient RPC mechanism will be available.
-//
-// The API exposed through the RPC mechanism maps 1-to-1 to BufferSyncInterface,
-// trivially serializing arguments.
-class BufferRPCImpl: public RPCImplInterface {
- public:
- explicit BufferRPCImpl(BufferSyncInterface *handler) : handler_(handler) {}
- virtual ~BufferRPCImpl() {}
-
- enum MessageId {
- INIT_CONNECTION = RESPONSE_ID + 1,
- CLOSE_CONNECTION,
- REGISTER_SHARED_MEMORY,
- UNREGISTER_SHARED_MEMORY,
- SET_COMMAND_BUFFER,
- PUT,
- GET,
- GET_TOKEN,
- WAIT_GET_CHANGES,
- SIGNAL_GET_CHANGES,
- GET_STATUS,
- GET_PARSE_ERROR,
- };
-
- // Structure describing the arguments for the SET_COMMAND_BUFFER RPC.
- struct SetCommandBufferStruct {
- unsigned int shm_id;
- ptrdiff_t offset;
- size_t size;
- CommandBufferOffset start_get;
- };
-
- // Structure describing the arguments for the SIGNAL_GET_CHANGES RPC.
- struct SignalGetChangesStruct {
- CommandBufferOffset current_value;
- int rpc_message_id;
- };
-
- // Implements the DoCall interface, interpreting the message with the
- // parameters, and passing the calls with arguments to the handler.
- virtual ReturnValue DoCall(int message_id,
- const void * data,
- size_t size,
- RPCHandle const *handles,
- size_t handle_count);
-
- private:
- BufferSyncInterface *handler_;
-};
-
-} // namespace command_buffer
-} // namespace o3d
-
-#endif // O3D_COMMAND_BUFFER_SERVICE_CROSS_BUFFER_RPC_H_
diff --git a/o3d/command_buffer/service/cross/buffer_rpc_test.cc b/o3d/command_buffer/service/cross/buffer_rpc_test.cc
deleted file mode 100644
index 721b20b..0000000
--- a/o3d/command_buffer/service/cross/buffer_rpc_test.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// Tests for the Command Buffer RPC glue.
-
-#include "tests/common/win/testing_common.h"
-#include "command_buffer/common/cross/mocks.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-#include "command_buffer/service/cross/mocks.h"
-
-namespace o3d {
-namespace command_buffer {
-
-using testing::Return;
-
-// Test fixture for BufferRPCImpl test. Creates a BufferSyncMock and a
-// BufferRPCImpl that uses it.
-class BufferRPCImplTest : public testing::Test {
- protected:
- virtual void SetUp() {
- buffer_sync_mock_.reset(new BufferSyncMock);
- buffer_rpc_impl_.reset(new BufferRPCImpl(buffer_sync_mock_.get()));
- }
- virtual void TearDown() {}
-
- BufferSyncMock &buffer_sync_mock() { return *buffer_sync_mock_.get(); }
- BufferRPCImpl *buffer_rpc_impl() { return buffer_rpc_impl_.get(); }
- private:
- scoped_ptr<BufferSyncMock> buffer_sync_mock_;
- scoped_ptr<BufferRPCImpl> buffer_rpc_impl_;
-};
-
-// Checks that the INIT_CONNECTION RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestInitConnection) {
- EXPECT_CALL(buffer_sync_mock(), InitConnection());
- buffer_rpc_impl()->DoCall(BufferRPCImpl::INIT_CONNECTION, NULL, 0, NULL, 0);
-}
-
-// Checks that the CLOSE_CONNECTION RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestCloseConnection) {
- EXPECT_CALL(buffer_sync_mock(), CloseConnection());
- buffer_rpc_impl()->DoCall(BufferRPCImpl::CLOSE_CONNECTION, NULL, 0, NULL, 0);
-}
-
-// Checks that the REGISTER_SHARED_MEMORY RPC is properly parsed and that the
-// return value is properly forwarded.
-TEST_F(BufferRPCImplTest, TestRegisterSharedMemory) {
- RPCShmHandle shm = reinterpret_cast<RPCShmHandle>(456);
- size_t size = 789;
- EXPECT_CALL(buffer_sync_mock(), RegisterSharedMemory(shm, size))
- .WillOnce(Return(1234));
- RPCHandle handles[1] = {shm};
- EXPECT_EQ(1234u, buffer_rpc_impl()->DoCall(
- BufferRPCImpl::REGISTER_SHARED_MEMORY, &size, sizeof(size), handles, 1));
-}
-
-// Checks that the UNREGISTER_SHARED_MEMORY RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestUnregisterSharedMemory) {
- unsigned int shm_id = 385;
- EXPECT_CALL(buffer_sync_mock(), UnregisterSharedMemory(shm_id));
- buffer_rpc_impl()->DoCall(BufferRPCImpl::UNREGISTER_SHARED_MEMORY, &shm_id,
- sizeof(shm_id), NULL, 0);
-}
-
-// Checks that the SET_COMMAND_BUFFER RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestSetCommandBuffer) {
- EXPECT_CALL(buffer_sync_mock(), SetCommandBuffer(93, 7878, 3434, 5151));
- BufferRPCImpl::SetCommandBufferStruct param;
- param.shm_id = 93;
- param.offset = 7878;
- param.size = 3434;
- param.start_get = 5151;
- buffer_rpc_impl()->DoCall(BufferRPCImpl::SET_COMMAND_BUFFER, &param,
- sizeof(param), NULL, 0);
-}
-
-// Checks that the PUT RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestPut) {
- CommandBufferOffset offset = 8765;
- EXPECT_CALL(buffer_sync_mock(), Put(offset));
- buffer_rpc_impl()->DoCall(BufferRPCImpl::PUT, &offset, sizeof(offset), NULL,
- 0);
-}
-
-// Checks that the GET RPC is properly parsed and that the return value is
-// properly forwarded.
-TEST_F(BufferRPCImplTest, TestGet) {
- EXPECT_CALL(buffer_sync_mock(), Get()).WillOnce(Return(9375));
- EXPECT_EQ(9375u, buffer_rpc_impl()->DoCall(BufferRPCImpl::GET, NULL, 0, NULL,
- 0));
-}
-
-// Checks that the GET_TOKEN RPC is properly parsed and that the return value is
-// properly forwarded.
-TEST_F(BufferRPCImplTest, TestGetToken) {
- EXPECT_CALL(buffer_sync_mock(), GetToken()).WillOnce(Return(1618));
- EXPECT_EQ(1618u, buffer_rpc_impl()->DoCall(BufferRPCImpl::GET_TOKEN, NULL, 0,
- NULL, 0));
-}
-
-// Checks that the WAIT_GET_CHANGES RPC is properly parsed and that the return
-// value is properly forwarded.
-TEST_F(BufferRPCImplTest, TestWaitGetChanges) {
- CommandBufferOffset value = 339;
- EXPECT_CALL(buffer_sync_mock(), WaitGetChanges(value))
- .WillOnce(Return(16180));
- EXPECT_EQ(16180u, buffer_rpc_impl()->DoCall(BufferRPCImpl::WAIT_GET_CHANGES,
- &value, sizeof(value), NULL, 0));
-}
-
-// Checks that the SIGNAL_GET_CHANGES RPC is properly parsed.
-TEST_F(BufferRPCImplTest, TestSignalGetChanges) {
- EXPECT_CALL(buffer_sync_mock(), SignalGetChanges(34, 21));
- BufferRPCImpl::SignalGetChangesStruct param;
- param.current_value = 34;
- param.rpc_message_id = 21;
- buffer_rpc_impl()->DoCall(BufferRPCImpl::SIGNAL_GET_CHANGES, &param,
- sizeof(param), NULL, 0);
-}
-
-// Checks that the GET_STATUS RPC is properly parsed and that the return value
-// is properly forwarded.
-TEST_F(BufferRPCImplTest, TestGetStatus) {
- EXPECT_CALL(buffer_sync_mock(), GetStatus())
- .WillOnce(Return(BufferSyncInterface::kParseError));
- EXPECT_EQ(static_cast<BufferRPCImpl::ReturnValue>(
- BufferSyncInterface::kParseError),
- buffer_rpc_impl()->DoCall(BufferRPCImpl::GET_STATUS, NULL, 0, NULL,
- 0));
-}
-
-// Checks that the GET_STATUS RPC is properly parsed and that the return value
-// is properly forwarded.
-TEST_F(BufferRPCImplTest, TestGetParseError) {
- EXPECT_CALL(buffer_sync_mock(), GetParseError())
- .WillOnce(Return(BufferSyncInterface::kParseOutOfBounds));
- EXPECT_EQ(static_cast<BufferRPCImpl::ReturnValue>(
- BufferSyncInterface::kParseOutOfBounds),
- buffer_rpc_impl()->DoCall(BufferRPCImpl::GET_PARSE_ERROR, NULL, 0,
- NULL, 0));
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/service/cross/cmd_buffer_engine.cc b/o3d/command_buffer/service/cross/cmd_buffer_engine.cc
deleted file mode 100644
index 9637206..0000000
--- a/o3d/command_buffer/service/cross/cmd_buffer_engine.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file contains the implementation of the command buffer engine.
-
-#include "command_buffer/service/cross/buffer_rpc.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// Creates a RPC implementation using 'this' as the handler, and a RPC server
-// for it.
-CommandBufferEngine::CommandBufferEngine(AsyncAPIInterface *handler)
- : buffer_rpc_impl_(),
- process_interface_(NULL),
- parser_(),
- handler_(handler),
- client_rpc_(NULL),
- token_(0),
- status_(kNotConnected),
- signal_change_(false),
- signal_rpc_message_id_(0),
- parse_error_(kParseNoError) {
- buffer_rpc_impl_.reset(new BufferRPCImpl(this));
-}
-
-CommandBufferEngine::~CommandBufferEngine() {}
-
-// Inits the connection. Registers the client RPC service.
-void CommandBufferEngine::InitConnection() {
- status_ = kNoBuffer;
-}
-
-// Closes the connection. Executes all remaining commands.
-void CommandBufferEngine::CloseConnection() {
- FinishParsing();
- status_ = kNotConnected;
- parser_.reset(NULL);
-}
-
-// Adds the shared memory buffer somewhere into the list, return the index in
-// the list as the handle. Either find a hole in the list, or add it at the
-// end. We don't want to invalidate exiting indices.
-unsigned int CommandBufferEngine::RegisterSharedMemory(
- RPCShmHandle handle,
- size_t size) {
- void *address = MapShm(handle, size);
- if (!address) return kInvalidSharedMemoryId;
- MemoryMapping mapping = {address, size};
- for (unsigned int i = 0; i < shared_memory_buffers_.size(); ++i) {
- if (shared_memory_buffers_[i].address == NULL) {
- shared_memory_buffers_[i] = mapping;
- return i;
- }
- }
- shared_memory_buffers_.push_back(mapping);
- return static_cast<unsigned int>(shared_memory_buffers_.size() - 1);
-}
-
-// Sets the list entry for the shared memory buffer to NULL. Don't erase() the
-// entry, We don't want to invalidate exiting indices.
-void CommandBufferEngine::UnregisterSharedMemory(unsigned int shm_id) {
- if ((shm_id >= shared_memory_buffers_.size()) ||
- !shared_memory_buffers_[shm_id].size) {
- LOG(ERROR) << "Trying to unregister a non-registered shared memory";
- return;
- }
- MemoryMapping &mapping = shared_memory_buffers_[shm_id];
- UnmapShm(mapping.address, mapping.size);
- mapping.address = NULL;
- mapping.size = 0;
-}
-
-// Sets the command buffer. Executes all remaining commands in the old buffer
-// (if any) and creates a new command parser.
-void CommandBufferEngine::SetCommandBuffer(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get) {
- if ((shm_id >= shared_memory_buffers_.size()) ||
- !shared_memory_buffers_[shm_id].size) {
- LOG(ERROR) << "Trying to set the command buffer from a non-registered "
- << "shared memory";
- return;
- }
- if (status_ == kNotConnected) return;
- FinishParsing();
- parser_.reset(new CommandParser(shared_memory_buffers_[shm_id].address,
- shared_memory_buffers_[shm_id].size, offset,
- size, start_get, handler_));
- status_ = kParsing;
- parse_error_ = kParseNoError;
-}
-
-// Changes the put value.
-void CommandBufferEngine::Put(CommandBufferOffset offset) {
- if (parser_.get()) {
- parser_->set_put(offset);
- }
-}
-
-// Retrieves the get value. This returns kInvalidCommandBufferOffset
-// if there is no current parser.
-CommandBufferOffset CommandBufferEngine::Get() {
- if (parser_.get()) {
- return parser_->get();
- } else {
- return kInvalidCommandBufferOffset;
- }
-}
-
-// Retrieves the current token value.
-unsigned int CommandBufferEngine::GetToken() {
- return token_;
-}
-
-// Executes commands until get is different from the value passed
-// in. It will return immediately if the get value is already
-// different, or if the engine is not in the kParsing status, or if
-// the buffer is empty. It will return kInvalidCommandBufferOffset
-// if there is no current buffer.
-CommandBufferOffset CommandBufferEngine::WaitGetChanges(
- CommandBufferOffset current_value) {
- if (parser_.get()) {
- while (status_ == kParsing &&
- parser_->get() == current_value &&
- !parser_->IsEmpty()) {
- ProcessOneCommand();
- }
- return parser_->get();
- } else {
- return kInvalidCommandBufferOffset;
- }
-}
-
-// Signals the client when get gets different from the value passed in. If get
-// is already different, or if the engine is not in the kParsing status, that
-// will happen immediately, otherwise it will happen when commands get
-// executed, moving the get pointer.
-void CommandBufferEngine::SignalGetChanges(CommandBufferOffset current_value,
- int rpc_message_id) {
- if (status_ != kParsing || parser_->get() != current_value) {
- DoSignalChangedGet(rpc_message_id);
- } else {
- signal_change_ = true;
- signal_rpc_message_id_ = rpc_message_id;
- }
-}
-
-// Gets the memory address from the list entry.
-void *CommandBufferEngine::GetSharedMemoryAddress(unsigned int shm_id) {
- if ((shm_id >= shared_memory_buffers_.size()) ||
- !shared_memory_buffers_[shm_id].size) {
- LOG(ERROR) << "Trying to get the address of a non-registered shared memory";
- return NULL;
- }
- return shared_memory_buffers_[shm_id].address;
-}
-
-// Gets the memory size from the list entry.
-size_t CommandBufferEngine::GetSharedMemorySize(unsigned int shm_id) {
- if ((shm_id >= shared_memory_buffers_.size()) ||
- !shared_memory_buffers_[shm_id].size) {
- LOG(ERROR) << "Trying to get the size of a non-registered shared memory";
- return 0;
- }
- return shared_memory_buffers_[shm_id].size;
-}
-
-// Gets the status.
-BufferSyncInterface::ParserStatus CommandBufferEngine::GetStatus() {
- return status_;
-}
-
-// Gets the current parse error, reset it to kParseNoError.
-BufferSyncInterface::ParseError CommandBufferEngine::GetParseError() {
- ParseError error = parse_error_;
- parse_error_ = kParseNoError;
- return error;
-}
-
-// Finishes parsing, executing all the commands until the buffer is empty, or a
-// parsing error occurs.
-void CommandBufferEngine::FinishParsing() {
- // terminates current parsing, that is, execute all the commands
- // NOTE: status_ == kParsing implies parser_ != NULL
- while (status_ == kParsing && !parser_->IsEmpty()) {
- ProcessOneCommand();
- }
-}
-
-// Processes one command from the command buffer. This must only be called when
-// in the kParsing status.
-// This will update the status_ and the parse_error_ fields if an error occurs.
-void CommandBufferEngine::ProcessOneCommand() {
- DCHECK_EQ(kParsing, status_);
- DCHECK(parser_.get());
- ParseError result = parser_->ProcessCommand();
- switch (result) {
- case kParseNoError:
- break;
- case kParseOutOfBounds:
- case kParseInvalidSize:
- status_ = kParseError;
- // Always override the error, to properly signal the stopping condition.
- parse_error_ = result;
- break;
- case kParseInvalidArguments:
- case kParseUnknownCommand:
- // Only set the error if it is not set already.
- if (parse_error_ == kParseNoError) {
- parse_error_ = result;
- }
- break;
- }
- // get has changed, signal the client if needed.
- if (signal_change_) {
- DoSignalChangedGet(signal_rpc_message_id_);
- signal_change_ = false;
- }
-}
-
-// Executes the main loop. While there are commands in the buffer, processes
-// them one by one, checking for RPC messages between each of them (executing
-// all of them). If the buffer is empty, block until a RPC message comes.
-void CommandBufferEngine::DoMainLoop() {
- while (DoWork()) { }
- // Clean up if needed: execute all pending commands, then close the
- // connection.
- if (status_ != kNotConnected) CloseConnection();
-}
-
-bool CommandBufferEngine::HasWork() {
- return (status_ == kParsing && !parser_->IsEmpty()) ||
- process_interface_->HasMessage();
-}
-
-bool CommandBufferEngine::DoWork() {
- if (status_ == kParsing && !parser_->IsEmpty()) {
- bool running = true;
- // process as many messages as available but do not block.
- while (process_interface_->HasMessage()) {
- running = process_interface_->ProcessMessage();
- }
- if (running) ProcessOneCommand();
- return running;
- } else {
- // call ProcessMessage, always blocking. We have nothing else to do.
- return process_interface_->ProcessMessage();
- }
-}
-
-// Signals that get has changed, sending a RPC message back to the client. It
-// will send kInvalidCommandBufferOffset if there is no current buffer.
-void CommandBufferEngine::DoSignalChangedGet(int rpc_message_id) {
- DCHECK(client_rpc_);
- CommandBufferOffset get = parser_.get() ? parser_->get() :
- kInvalidCommandBufferOffset;
- client_rpc_->SendCall(rpc_message_id, &get, sizeof(get), NULL, 0);
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/service/cross/cmd_buffer_engine.h b/o3d/command_buffer/service/cross/cmd_buffer_engine.h
index 479c267..20b3143 100644
--- a/o3d/command_buffer/service/cross/cmd_buffer_engine.h
+++ b/o3d/command_buffer/service/cross/cmd_buffer_engine.h
@@ -36,202 +36,34 @@
#ifndef O3D_COMMAND_BUFFER_SERVICE_CROSS_CMD_BUFFER_ENGINE_H_
#define O3D_COMMAND_BUFFER_SERVICE_CROSS_CMD_BUFFER_ENGINE_H_
-#include <vector>
-#include "base/scoped_ptr.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
-#include "command_buffer/service/cross/cmd_parser.h"
+#include "base/basictypes.h"
namespace o3d {
namespace command_buffer {
-class BufferRPCImpl;
-
-class CommandBufferUpcallInterface {
+class CommandBufferEngine {
public:
- CommandBufferUpcallInterface() {
+ CommandBufferEngine() {
}
- virtual ~CommandBufferUpcallInterface() {
+ virtual ~CommandBufferEngine() {
}
// Gets the base address of a registered shared memory buffer.
// Parameters:
// shm_id: the identifier for the shared memory buffer.
- virtual void *GetSharedMemoryAddress(unsigned int shm_id) = 0;
+ virtual void *GetSharedMemoryAddress(int32 shm_id) = 0;
// Gets the size of a registered shared memory buffer.
// Parameters:
// shm_id: the identifier for the shared memory buffer.
- virtual size_t GetSharedMemorySize(unsigned int shm_id) = 0;
+ virtual size_t GetSharedMemorySize(int32 shm_id) = 0;
// Sets the token value.
- virtual void set_token(unsigned int token) = 0;
+ virtual void set_token(int32 token) = 0;
private:
- DISALLOW_COPY_AND_ASSIGN(CommandBufferUpcallInterface);
-};
-
-class CommandBufferEngine : public BufferSyncInterface,
- public CommandBufferUpcallInterface {
- public:
- explicit CommandBufferEngine(AsyncAPIInterface *handler);
- virtual ~CommandBufferEngine();
-
- // Initializes the connection with the client.
- virtual void InitConnection();
-
- // Closes the connection with the client.
- virtual void CloseConnection();
-
- // Registers a shared memory buffer. While a buffer is registered, it can be
- // accessed by the service, including the underlying asynchronous API,
- // through a single identifier.
- // Parameters:
- // buffer: the shared memory buffer handle.
- // Returns:
- // an identifier for the shared memory.
- virtual unsigned int RegisterSharedMemory(RPCShmHandle buffer, size_t size);
-
- // Unregisters a shared memory buffer.
- // Parameters:
- // shm_id: the identifier for the shared memory buffer.
- virtual void UnregisterSharedMemory(unsigned int shm_id);
-
- // Initializes the command buffer.
- // Parameters:
- // buffer: the memory buffer descriptor in which the command buffer
- // resides.
- // offset: the offset of the command buffer, relative to the memory
- // buffer.
- // size: the size of the command buffer.
- // start_get: the inital value for the Get pointer, relative to the
- // command buffer, where the parser will start interpreting
- // commands. Put is also initialized to that value.
- virtual void SetCommandBuffer(unsigned int shm_id,
- ptrdiff_t offset,
- size_t size,
- CommandBufferOffset start_get);
-
- // Sets the value of the Put pointer.
- // Parameters:
- // offset: the new value of the Put pointer, as an offset into the command
- // buffer.
- virtual void Put(CommandBufferOffset offset);
-
- // Gets the value of the Get pointer.
- // Returns:
- // the current value of the Get pointer, as an offset into the command
- // buffer.
- virtual CommandBufferOffset Get();
-
- // Gets the current token value.
- // Returns:
- // the current token value.
- virtual unsigned int GetToken();
-
- // Waits until Get changes from the currently known value.
- // Parameters:
- // current_value: the currently known value. This call will block until
- // Get is different from that value (returning immediately
- // if it is already different).
- // Returns:
- // the current (changed) value of Get.
- virtual CommandBufferOffset WaitGetChanges(
- CommandBufferOffset current_value);
-
- // Asks the service to signal the client when Get changes from the currently
- // known value. This is a non-blocking version of WaitGetChanges.
- // Parameters:
- // current_value: the currently known value of Get.
- // rpc_message_id: the RPC message ID to call on the client when Get is
- // different from current_value. That RPC is called
- // immediately if Get is already different from
- // current_value.
- virtual void SignalGetChanges(CommandBufferOffset current_value,
- int rpc_message_id);
-
- // Gets the status of the service.
- // Returns:
- // The status of the service.
- virtual ParserStatus GetStatus();
-
- // Gets the current parse error. The current parse error is set when the
- // service is in the PARSE_ERROR status. It may also be set while in the
- // kParsing state, if a recoverable error (like PARSE_UNKNOWN_METHOD) was
- // encountered. Getting the error resets it to kParseNoError.
- // Returns:
- // The current parse error.
- virtual ParseError GetParseError();
-
- // Gets the base address of a registered shared memory buffer.
- // Parameters:
- // shm_id: the identifier for the shared memory buffer.
- void *GetSharedMemoryAddress(unsigned int shm_id);
-
- // Gets the size of a registered shared memory buffer.
- // Parameters:
- // shm_id: the identifier for the shared memory buffer.
- size_t GetSharedMemorySize(unsigned int shm_id);
-
- // Executes the main loop: parse commands and execute RPC calls until the
- // server is killed.
- void DoMainLoop();
-
- // Returns whether or not the engine has work to do (process synchronous or
- // asynchronous commands).
- bool HasWork();
-
- // Does some work (process synchronous or asynchronous commands). It will not
- // block if HasWork() returns true.
- // Returns:
- // true if the engine should keep running, false if it has been sent a
- // command to terminate.
- bool DoWork();
-
- // Gets the RPC server.
- BufferRPCImpl *rpc_impl() const { return buffer_rpc_impl_.get(); }
-
- // Sets the RPC processing interface.
- void set_process_interface(RPCProcessInterface *iface) {
- process_interface_ = iface;
- }
-
- // Sets the RPC processing interface.
- void set_client_rpc(RPCSendInterface *iface) {
- client_rpc_ = iface;
- }
-
- // Gets the command parser.
- CommandParser *parser() const { return parser_.get(); }
-
- // Sets the token value.
- void set_token(unsigned int token) { token_ = token; }
- private:
-
- // Processes one command from the command buffer.
- void ProcessOneCommand();
-
- // Sends the signal that get has changed to the client.
- void DoSignalChangedGet(int rpc_message_id);
-
- // Finish parsing and executing all the commands in the buffer.
- void FinishParsing();
-
- scoped_ptr<BufferRPCImpl> buffer_rpc_impl_;
- RPCProcessInterface *process_interface_;
- scoped_ptr<CommandParser> parser_;
- AsyncAPIInterface *handler_;
- RPCSendInterface *client_rpc_;
- unsigned int token_;
- ParserStatus status_;
- bool signal_change_;
- int signal_rpc_message_id_;
- ParseError parse_error_;
- struct MemoryMapping {
- void *address;
- size_t size;
- };
- std::vector<MemoryMapping> shared_memory_buffers_;
+ DISALLOW_COPY_AND_ASSIGN(CommandBufferEngine);
};
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/cmd_buffer_engine_test.cc b/o3d/command_buffer/service/cross/cmd_buffer_engine_test.cc
deleted file mode 100644
index 7f32b3a..0000000
--- a/o3d/command_buffer/service/cross/cmd_buffer_engine_test.cc
+++ /dev/null
@@ -1,625 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// Tests for the Command Buffer Engine.
-
-#include "tests/common/win/testing_common.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
-#include "command_buffer/service/cross/mocks.h"
-
-namespace o3d {
-namespace command_buffer {
-
-using testing::AnyNumber;
-using testing::Return;
-using testing::Mock;
-using testing::Truly;
-using testing::Sequence;
-using testing::_;
-
-// Test fixture for CommandBufferEngine test - Creates a CommandBufferEngine,
-// using a mock AsyncAPIInterface.
-class CommandBufferEngineTest : public testing::Test {
- protected:
- CommandBufferEngineTest()
- : shm_(kRPCInvalidHandle),
- shm_id_(BufferSyncInterface::kInvalidSharedMemoryId) {}
-
- virtual void SetUp() {
- api_mock_.reset(new AsyncAPIMock);
- engine_.reset(new CommandBufferEngine(api_mock_.get()));
- process_mock_.reset(new RPCProcessMock());
- engine_->set_process_interface(process_mock_.get());
- }
- virtual void TearDown() {
- }
-
- // Creates a shared memory buffer for the command buffer, and pass it to the
- // engine.
- CommandBufferEntry *InitCommandBuffer(size_t entries, unsigned int start) {
- CHECK(shm_ == kRPCInvalidHandle);
- CHECK(shm_id_ == BufferSyncInterface::kInvalidSharedMemoryId);
- const size_t kShmSize = entries * sizeof(CommandBufferEntry); // NOLINT
- shm_ = CreateShm(kShmSize);
- EXPECT_NE(kRPCInvalidHandle, shm_);
- if (kRPCInvalidHandle == shm_) return NULL;
- shm_id_ = engine()->RegisterSharedMemory(shm_, kShmSize);
- EXPECT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id_);
- if (shm_id_ == BufferSyncInterface::kInvalidSharedMemoryId) {
- DestroyShm(shm_);
- shm_ = kRPCInvalidHandle;
- return NULL;
- }
- engine()->SetCommandBuffer(shm_id_, 0, kShmSize, start);
- return static_cast<CommandBufferEntry *>(
- engine()->GetSharedMemoryAddress(shm_id_));
- }
-
- // Destroys the command buffer.
- void DestroyCommandBuffer() {
- engine()->UnregisterSharedMemory(shm_id_);
- shm_id_ = BufferSyncInterface::kInvalidSharedMemoryId;
- DestroyShm(shm_);
- shm_ = kRPCInvalidHandle;
- }
-
- // Adds a command to the buffer, while adding it as an expected call on the
- // API mock.
- unsigned int AddCommandWithExpect(CommandBufferEntry *buffer,
- BufferSyncInterface::ParseError _return,
- unsigned int command,
- unsigned int arg_count,
- CommandBufferEntry *args) {
- unsigned int put = 0;
- CommandHeader header;
- header.size = arg_count + 1;
- header.command = command;
- buffer[put++].value_header = header;
- for (unsigned int i = 0; i < arg_count; ++i) {
- buffer[put++].value_uint32 = args[i].value_uint32;
- }
- EXPECT_CALL(*api_mock(), DoCommand(command, arg_count,
- Truly(AsyncAPIMock::IsArgs(arg_count, args))))
- .InSequence(sequence_)
- .WillOnce(Return(_return));
- return put;
- }
-
- CommandBufferEngine *engine() { return engine_.get(); }
- RPCProcessMock *process_mock() { return process_mock_.get(); }
- AsyncAPIMock *api_mock() { return api_mock_.get(); }
- private:
- scoped_ptr<AsyncAPIMock> api_mock_;
- scoped_ptr<CommandBufferEngine> engine_;
- scoped_ptr<RPCProcessMock> process_mock_;
- // handles for the command buffer.
- RPCShmHandle shm_;
- unsigned int shm_id_;
- Sequence sequence_;
-};
-
-// Tests the initialization/termination sequence, checking that it sets the
-// engine in the correct states.
-TEST_F(CommandBufferEngineTest, TestInitialization) {
- // Check initial state
- EXPECT_TRUE(engine()->rpc_impl() != NULL);
- EXPECT_TRUE(engine()->parser() == NULL);
- EXPECT_EQ(BufferSyncInterface::kNotConnected, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(kInvalidCommandBufferOffset, engine()->Get());
- EXPECT_EQ(0u, engine()->GetToken());
-
- engine()->InitConnection();
- EXPECT_EQ(BufferSyncInterface::kNoBuffer, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(kInvalidCommandBufferOffset, engine()->Get());
-
- CommandBufferEntry *entries = InitCommandBuffer(25, 5);
- ASSERT_TRUE(entries != NULL);
-
- EXPECT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(5u, engine()->Get());
- EXPECT_TRUE(engine()->parser() != NULL);
-
- engine()->set_token(5678);
- EXPECT_EQ(5678u, engine()->GetToken());
-
- engine()->CloseConnection();
- DestroyCommandBuffer();
-
- EXPECT_EQ(BufferSyncInterface::kNotConnected, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(kInvalidCommandBufferOffset, engine()->Get());
- EXPECT_TRUE(engine()->parser() == NULL);
-}
-
-// Checks that shared memory registration works.
-TEST_F(CommandBufferEngineTest, TestSharedMemoryRegistration) {
- // Create and register a first shared memory buffer.
- const size_t kShmSize1 = 10;
- RPCShmHandle shm1 = CreateShm(kShmSize1);
- ASSERT_NE(kRPCInvalidHandle, shm1);
- unsigned int shm_id1 = engine()->RegisterSharedMemory(shm1, kShmSize1);
- EXPECT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id1);
- EXPECT_TRUE(engine()->GetSharedMemoryAddress(shm_id1) != NULL);
- EXPECT_EQ(kShmSize1, engine()->GetSharedMemorySize(shm_id1));
-
- // Create and register a second shared memory buffer, check that it has a
- // different memory location than the first one.
- const size_t kShmSize2 = 25;
- RPCShmHandle shm2 = CreateShm(kShmSize2);
- ASSERT_NE(kRPCInvalidHandle, shm2);
- unsigned int shm_id2 = engine()->RegisterSharedMemory(shm2, kShmSize2);
- EXPECT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id2);
- EXPECT_TRUE(engine()->GetSharedMemoryAddress(shm_id2) != NULL);
- EXPECT_EQ(kShmSize2, engine()->GetSharedMemorySize(shm_id2));
- EXPECT_NE(shm_id1, shm_id2);
- EXPECT_NE(engine()->GetSharedMemoryAddress(shm_id1),
- engine()->GetSharedMemoryAddress(shm_id2));
-
- // Create and register a third shared memory buffer, check that it has a
- // different memory location than the first and second ones.
- const size_t kShmSize3 = 33;
- RPCShmHandle shm3 = CreateShm(kShmSize3);
- ASSERT_NE(kRPCInvalidHandle, shm3);
- unsigned int shm_id3 = engine()->RegisterSharedMemory(shm3, kShmSize3);
- EXPECT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id3);
- EXPECT_TRUE(engine()->GetSharedMemoryAddress(shm_id3) != NULL);
- EXPECT_EQ(kShmSize3, engine()->GetSharedMemorySize(shm_id3));
- EXPECT_NE(shm_id1, shm_id3);
- EXPECT_NE(shm_id2, shm_id3);
- EXPECT_NE(engine()->GetSharedMemoryAddress(shm_id1),
- engine()->GetSharedMemoryAddress(shm_id3));
- EXPECT_NE(engine()->GetSharedMemoryAddress(shm_id2),
- engine()->GetSharedMemoryAddress(shm_id3));
-
- engine()->UnregisterSharedMemory(shm_id1);
- EXPECT_EQ(NULL, engine()->GetSharedMemoryAddress(shm_id1));
- EXPECT_EQ(0UL, engine()->GetSharedMemorySize(shm_id1));
- DestroyShm(shm1);
-
- engine()->UnregisterSharedMemory(shm_id2);
- EXPECT_EQ(NULL, engine()->GetSharedMemoryAddress(shm_id2));
- EXPECT_EQ(0UL, engine()->GetSharedMemorySize(shm_id2));
- DestroyShm(shm2);
-
- engine()->UnregisterSharedMemory(shm_id3);
- EXPECT_EQ(NULL, engine()->GetSharedMemoryAddress(shm_id2));
- EXPECT_EQ(0UL, engine()->GetSharedMemorySize(shm_id2));
- DestroyShm(shm3);
-}
-
-// Checks that commands in the buffer are properly executed, and that the
-// status/error stay valid.
-TEST_F(CommandBufferEngineTest, TestCommandProcessing) {
- engine()->InitConnection();
- CommandBufferEntry *entries = InitCommandBuffer(10, 0);
- ASSERT_TRUE(entries != NULL);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Create a command buffer with 3 commands
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
-
- CommandBufferEntry args2[2];
- args2[0].value_uint32 = 5;
- args2[1].value_float = 6.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 2,
- 2,
- args2);
-
- engine()->Put(put);
- while (get != put) {
- // Check that the parsing progresses, and that no error occurs.
- CommandBufferOffset new_get = engine()->WaitGetChanges(get);
- EXPECT_NE(get, new_get);
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(new_get, engine()->Get());
- get = new_get;
- }
- // Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
-
- engine()->CloseConnection();
- DestroyCommandBuffer();
-}
-
-// Checks that commands in the buffer are properly executed when wrapping the
-// buffer, and that the status/error stay valid.
-TEST_F(CommandBufferEngineTest, TestCommandWrapping) {
- engine()->InitConnection();
- CommandBufferEntry *entries = InitCommandBuffer(10, 6);
- ASSERT_TRUE(entries != NULL);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Create a command buffer with 3 commands
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
- DCHECK_EQ(10u, put);
- put = 0;
-
- CommandBufferEntry args2[2];
- args2[0].value_uint32 = 5;
- args2[1].value_float = 6.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 2,
- 2,
- args2);
-
- engine()->Put(put);
- while (get != put) {
- // Check that the parsing progresses, and that no error occurs.
- CommandBufferOffset new_get = engine()->WaitGetChanges(get);
- EXPECT_NE(get, new_get);
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(new_get, engine()->Get());
- get = new_get;
- }
- // Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
-
- engine()->CloseConnection();
- DestroyCommandBuffer();
-}
-
-// Checks that commands in the buffer are properly executed when we change the
-// buffer, and when we close the connection.
-TEST_F(CommandBufferEngineTest, TestSetBufferAndClose) {
- engine()->InitConnection();
- CommandBufferEntry *entries = InitCommandBuffer(10, 0);
- ASSERT_TRUE(entries != NULL);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Create a command buffer with 3 commands
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
-
- CommandBufferEntry args2[2];
- args2[0].value_uint32 = 5;
- args2[1].value_float = 6.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 2,
- 2,
- args2);
-
- engine()->Put(put);
-
- // Setup a new buffer.
- const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT
- RPCShmHandle shm = CreateShm(kShmSize);
- ASSERT_NE(kRPCInvalidHandle, shm);
- unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize);
- ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id);
- CommandBufferEntry *entries2 = static_cast<CommandBufferEntry *>(
- engine()->GetSharedMemoryAddress(shm_id));
- engine()->SetCommandBuffer(shm_id, 0, kShmSize, 0);
- EXPECT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- EXPECT_EQ(0u, engine()->Get());
-
- // Destroy the old command buffer.
- DestroyCommandBuffer();
-
- get = engine()->Get();
- put = get;
- put += AddCommandWithExpect(entries2 + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
-
- engine()->Put(put);
-
- engine()->CloseConnection();
- // Check that all the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
-
- engine()->UnregisterSharedMemory(shm_id);
- DestroyShm(shm);
-}
-
-// Checks that commands in the buffer are properly executed, even if they
-// generate a recoverable error. Check that the error status is properly set,
-// and reset when queried.
-TEST_F(CommandBufferEngineTest, TestRecoverableError) {
- engine()->InitConnection();
- CommandBufferEntry *entries = InitCommandBuffer(10, 0);
- ASSERT_TRUE(entries != NULL);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Create a command buffer with 3 commands, 2 of them generating errors
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseInvalidArguments,
- 1,
- 2,
- args1);
-
- CommandBufferEntry args2[2];
- args2[0].value_uint32 = 5;
- args2[1].value_float = 6.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseUnknownCommand,
- 2,
- 2,
- args2);
-
- engine()->Put(put);
- while (get != put) {
- // Check that the parsing progresses, and that no error occurs.
- CommandBufferOffset new_get = engine()->WaitGetChanges(get);
- EXPECT_NE(get, new_get);
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(new_get, engine()->Get());
- get = new_get;
- }
- // Check that the commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
-
- // Check that the error status was set to the first error.
- EXPECT_EQ(BufferSyncInterface::kParseInvalidArguments,
- engine()->GetParseError());
- // Check that the error status was reset after the query.
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
-
- engine()->CloseConnection();
- DestroyCommandBuffer();
-}
-
-// Checks that commands in the buffer are properly executed up to the point
-// where a parsing error happened. Check that at that point the status and
-// error are properly set.
-TEST_F(CommandBufferEngineTest, TestNonRecoverableError) {
- engine()->InitConnection();
- // Create a buffer with 6 entries, starting at entry 1, but allocate enough
- // memory so that we can add commands that cross over the limit.
- const size_t kShmSize = 10 * sizeof(CommandBufferEntry); // NOLINT
- RPCShmHandle shm = CreateShm(kShmSize);
- ASSERT_NE(kRPCInvalidHandle, shm);
- unsigned int shm_id = engine()->RegisterSharedMemory(shm, kShmSize);
- ASSERT_NE(BufferSyncInterface::kInvalidSharedMemoryId, shm_id);
- CommandBufferEntry *entries = static_cast<CommandBufferEntry *>(
- engine()->GetSharedMemoryAddress(shm_id));
- ASSERT_TRUE(entries != NULL);
- engine()->SetCommandBuffer(shm_id, 0, 6 * sizeof(CommandBufferEntry), 1);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Create a command buffer with 3 commands, the last one overlapping the end
- // of the buffer.
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
-
- CommandHeader header;
- header.size = 3;
- header.command = 4;
- entries[put++].value_header = header;
- entries[put++].value_uint32 = 5;
- entries[put++].value_uint32 = 6;
-
- // we should be beyond the end of the buffer now.
- DCHECK_LT(6U, put);
- put = 0;
-
- engine()->Put(put);
- while (get != put) {
- // When the parsing stop progressing, break.
- CommandBufferOffset new_get = engine()->WaitGetChanges(get);
- if (new_get == get) {
- EXPECT_EQ(new_get, engine()->Get());
- break;
- }
- get = new_get;
- }
- // We should be in an error case now.
- EXPECT_EQ(BufferSyncInterface::kParseError, engine()->GetStatus());
- // Check that the error status was set to the first error.
- EXPECT_EQ(BufferSyncInterface::kParseOutOfBounds,
- engine()->GetParseError());
- // Check that the error status was reset after the query.
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
-
- // Check that the valid commands did happen.
- Mock::VerifyAndClearExpectations(api_mock());
-
- engine()->CloseConnection();
- engine()->UnregisterSharedMemory(shm_id);
- DestroyShm(shm);
-}
-
-// Checks that HasWork() and DoWork() have the correct semantics. If there is
-// work to do, DoWork should never block.
-TEST_F(CommandBufferEngineTest, TestDoWork) {
- engine()->InitConnection();
- CommandBufferEntry *entries = InitCommandBuffer(10, 0);
- ASSERT_TRUE(entries != NULL);
-
- CommandBufferOffset get = engine()->Get();
- CommandBufferOffset put = get;
-
- // Test that if we have no message and no command we will block.
- process_mock()->Reset();
- EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
- EXPECT_FALSE(engine()->HasWork());
- EXPECT_CALL(*process_mock(), ProcessMessage());
- EXPECT_TRUE(engine()->DoWork());
-
- EXPECT_TRUE(process_mock()->would_have_blocked());
- Mock::VerifyAndClearExpectations(process_mock());
-
- // Tests that messages get processed without blocking.
- process_mock()->Reset();
- EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
- process_mock()->set_message_count(3);
- EXPECT_TRUE(engine()->HasWork());
-
- EXPECT_CALL(*process_mock(), ProcessMessage()).Times(3);
- while (engine()->HasWork()) {
- EXPECT_TRUE(engine()->DoWork());
- }
- EXPECT_EQ(0u, process_mock()->message_count());
- EXPECT_FALSE(process_mock()->would_have_blocked());
- Mock::VerifyAndClearExpectations(process_mock());
-
- // Test that if we have commands, we will process them without blocking.
- // Create a command buffer with 3 commands
- process_mock()->Reset();
- EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 0,
- 0,
- NULL);
-
- CommandBufferEntry args1[2];
- args1[0].value_uint32 = 3;
- args1[1].value_float = 4.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 1,
- 2,
- args1);
-
- CommandBufferEntry args2[2];
- args2[0].value_uint32 = 5u;
- args2[1].value_float = 6.f;
- put += AddCommandWithExpect(entries + put,
- BufferSyncInterface::kParseNoError,
- 2,
- 2,
- args2);
-
- EXPECT_FALSE(engine()->HasWork()); // No work yet, until we change put
-
- engine()->Put(put);
- EXPECT_TRUE(engine()->HasWork());
-
- EXPECT_CALL(*process_mock(), ProcessMessage()).Times(0);
- while (engine()->HasWork()) {
- EXPECT_TRUE(engine()->DoWork());
- }
- EXPECT_FALSE(process_mock()->would_have_blocked());
- get = engine()->Get();
- EXPECT_EQ(put, get); // once we're done, we should have executed everything.
- ASSERT_EQ(BufferSyncInterface::kParsing, engine()->GetStatus());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, engine()->GetParseError());
- Mock::VerifyAndClearExpectations(process_mock());
- Mock::VerifyAndClearExpectations(api_mock());
-
- // Test that the engine stops if we send it a "kill" message.
- process_mock()->Reset();
- EXPECT_CALL(*process_mock(), HasMessage()).Times(AnyNumber());
- process_mock()->set_message_count(1);
- EXPECT_TRUE(engine()->HasWork());
-
- EXPECT_CALL(*process_mock(), ProcessMessage()).WillOnce(Return(false));
- EXPECT_FALSE(engine()->DoWork());
- Mock::VerifyAndClearExpectations(process_mock());
-
- engine()->CloseConnection();
- DestroyCommandBuffer();
-}
-
-} // namespace command_buffer
-} // namespace o3d
diff --git a/o3d/command_buffer/service/cross/cmd_parser.cc b/o3d/command_buffer/service/cross/cmd_parser.cc
index 0d450268..d17ab99 100644
--- a/o3d/command_buffer/service/cross/cmd_parser.cc
+++ b/o3d/command_buffer/service/cross/cmd_parser.cc
@@ -64,20 +64,27 @@ CommandParser::CommandParser(void *shm_address,
// conditions). This function only validates the header, leaving the arguments
// validation to the handler, so it can pass a reference to them.
// - get_ is modified *after* the command has been executed.
-BufferSyncInterface::ParseError CommandParser::ProcessCommand() {
+parse_error::ParseError CommandParser::ProcessCommand() {
CommandBufferOffset get = get_;
- if (get == put_) return BufferSyncInterface::kParseNoError;
+ if (get == put_) return parse_error::kParseNoError;
CommandHeader header = buffer_[get].value_header;
- if (header.size == 0) return BufferSyncInterface::kParseInvalidSize;
- if (header.size + get > entry_count_)
- return BufferSyncInterface::kParseOutOfBounds;
- BufferSyncInterface::ParseError result = handler_->DoCommand(
+ if (header.size == 0) {
+ DLOG(INFO) << "Error: zero sized command in command buffer";
+ return parse_error::kParseInvalidSize;
+ }
+
+ if (header.size + get > entry_count_) {
+ DLOG(INFO) << "Error: get offset out of bounds";
+ return parse_error::kParseOutOfBounds;
+ }
+
+ parse_error::ParseError result = handler_->DoCommand(
header.command, header.size - 1, buffer_ + get);
// TODO(gman): If you want to log errors this is the best place to catch them.
// It seems like we need an official way to turn on a debug mode and
// get these errors.
- if (result != BufferSyncInterface::kParseNoError) {
+ if (result != parse_error::kParseNoError) {
DLOG(INFO) << "Error: " << result << " for Command "
<< GetCommandName(static_cast<CommandId>(header.command));
}
@@ -87,12 +94,12 @@ BufferSyncInterface::ParseError CommandParser::ProcessCommand() {
// Processes all the commands, while the buffer is not empty. Stop if an error
// is encountered.
-BufferSyncInterface::ParseError CommandParser::ProcessAllCommands() {
+parse_error::ParseError CommandParser::ProcessAllCommands() {
while (!IsEmpty()) {
- BufferSyncInterface::ParseError error = ProcessCommand();
+ parse_error::ParseError error = ProcessCommand();
if (error) return error;
}
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/cmd_parser.h b/o3d/command_buffer/service/cross/cmd_parser.h
index 425e8d9..89b8269 100644
--- a/o3d/command_buffer/service/cross/cmd_parser.h
+++ b/o3d/command_buffer/service/cross/cmd_parser.h
@@ -36,8 +36,7 @@
#define O3D_COMMAND_BUFFER_SERVICE_CROSS_CMD_PARSER_H_
#include "core/cross/types.h"
-#include "command_buffer/common/cross/rpc.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
+#include "command_buffer/common/cross/constants.h"
#include "command_buffer/common/cross/cmd_buffer_format.h"
namespace o3d {
@@ -73,10 +72,10 @@ class CommandParser {
// Processes one command, updating the get pointer. This will return an error
// if there are no commands in the buffer.
- BufferSyncInterface::ParseError ProcessCommand();
+ parse_error::ParseError ProcessCommand();
// Processes all commands until get == put.
- BufferSyncInterface::ParseError ProcessAllCommands();
+ parse_error::ParseError ProcessAllCommands();
private:
CommandBufferOffset get_;
@@ -99,9 +98,9 @@ class AsyncAPIInterface {
// arg_count: the number of CommandBufferEntry arguments.
// cmd_data: the command data.
// Returns:
- // BufferSyncInterface::NO_ERROR if no error was found, one of
- // BufferSyncInterface::ParseError otherwise.
- virtual BufferSyncInterface::ParseError DoCommand(
+ // parse_error::NO_ERROR if no error was found, one of
+ // parse_error::ParseError otherwise.
+ virtual parse_error::ParseError DoCommand(
unsigned int command,
unsigned int arg_count,
const void* cmd_data) = 0;
diff --git a/o3d/command_buffer/service/cross/cmd_parser_test.cc b/o3d/command_buffer/service/cross/cmd_parser_test.cc
index ae48a9b..d85eb67 100644
--- a/o3d/command_buffer/service/cross/cmd_parser_test.cc
+++ b/o3d/command_buffer/service/cross/cmd_parser_test.cc
@@ -58,7 +58,7 @@ class CommandParserTest : public testing::Test {
virtual void TearDown() {}
// Adds a DoCommand expectation in the mock.
- void AddDoCommandExpect(BufferSyncInterface::ParseError _return,
+ void AddDoCommandExpect(parse_error::ParseError _return,
unsigned int command,
unsigned int arg_count,
CommandBufferEntry *args) {
@@ -115,8 +115,8 @@ TEST_F(CommandParserTest, TestSimple) {
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 123, 0, NULL);
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessCommand());
+ AddDoCommandExpect(parse_error::kParseNoError, 123, 0, NULL);
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessCommand());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
@@ -133,8 +133,8 @@ TEST_F(CommandParserTest, TestSimple) {
CommandBufferEntry param_array[2];
param_array[0].value_int32 = 2134;
param_array[1].value_float = 1.f;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 456, 2, param_array);
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessCommand());
+ AddDoCommandExpect(parse_error::kParseNoError, 456, 2, param_array);
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessCommand());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
}
@@ -162,14 +162,14 @@ TEST_F(CommandParserTest, TestMultipleCommands) {
CommandBufferEntry param_array[2];
param_array[0].value_int32 = 5151;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 789, 1, param_array);
+ AddDoCommandExpect(parse_error::kParseNoError, 789, 1, param_array);
param_array[1].value_int32 = 3434;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 2121, 1,
+ AddDoCommandExpect(parse_error::kParseNoError, 2121, 1,
param_array+1);
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessCommand());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessCommand());
EXPECT_EQ(put_cmd2, parser->get());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessCommand());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessCommand());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
@@ -188,12 +188,12 @@ TEST_F(CommandParserTest, TestMultipleCommands) {
EXPECT_EQ(put, parser->put());
param_array[0].value_int32 = 5656;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 4545, 1, param_array);
+ AddDoCommandExpect(parse_error::kParseNoError, 4545, 1, param_array);
param_array[1].value_int32 = 7878;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 6767, 1,
+ AddDoCommandExpect(parse_error::kParseNoError, 6767, 1,
param_array+1);
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessAllCommands());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessAllCommands());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
}
@@ -209,11 +209,11 @@ TEST_F(CommandParserTest, TestWrap) {
header.size = 1;
header.command = i;
buffer()[put++].value_header = header;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, i, 0, NULL);
+ AddDoCommandExpect(parse_error::kParseNoError, i, 0, NULL);
}
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessAllCommands());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessAllCommands());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
@@ -225,13 +225,13 @@ TEST_F(CommandParserTest, TestWrap) {
buffer()[put++].value_int32 = 5;
CommandBufferEntry param;
param.value_int32 = 5;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 3, 1, &param);
+ AddDoCommandExpect(parse_error::kParseNoError, 3, 1, &param);
DCHECK_EQ(5u, put);
put = 0;
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessAllCommands());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessAllCommands());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
@@ -241,10 +241,10 @@ TEST_F(CommandParserTest, TestWrap) {
buffer()[put++].value_header = header;
buffer()[put++].value_int32 = 6;
param.value_int32 = 6;
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 4, 1, &param);
+ AddDoCommandExpect(parse_error::kParseNoError, 4, 1, &param);
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessAllCommands());
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessAllCommands());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
}
@@ -262,7 +262,7 @@ TEST_F(CommandParserTest, TestError) {
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- EXPECT_EQ(BufferSyncInterface::kParseInvalidSize,
+ EXPECT_EQ(parse_error::kParseInvalidSize,
parser->ProcessAllCommands());
// check that no DoCommand call was made.
Mock::VerifyAndClearExpectations(api_mock());
@@ -277,7 +277,7 @@ TEST_F(CommandParserTest, TestError) {
parser->set_put(put);
EXPECT_EQ(put, parser->put());
- EXPECT_EQ(BufferSyncInterface::kParseOutOfBounds,
+ EXPECT_EQ(parse_error::kParseOutOfBounds,
parser->ProcessAllCommands());
// check that no DoCommand call was made.
Mock::VerifyAndClearExpectations(api_mock());
@@ -297,16 +297,16 @@ TEST_F(CommandParserTest, TestError) {
parser->set_put(put);
EXPECT_EQ(put, parser->put());
// have the first command fail to parse.
- AddDoCommandExpect(BufferSyncInterface::kParseUnknownCommand, 3, 0, NULL);
- EXPECT_EQ(BufferSyncInterface::kParseUnknownCommand,
+ AddDoCommandExpect(parse_error::kParseUnknownCommand, 3, 0, NULL);
+ EXPECT_EQ(parse_error::kParseUnknownCommand,
parser->ProcessAllCommands());
// check that only one command was executed, and that get reflects that
// correctly.
EXPECT_EQ(put_post_fail, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
// make the second one succeed, and check that the parser recovered fine.
- AddDoCommandExpect(BufferSyncInterface::kParseNoError, 4, 0, NULL);
- EXPECT_EQ(BufferSyncInterface::kParseNoError, parser->ProcessAllCommands());
+ AddDoCommandExpect(parse_error::kParseNoError, 4, 0, NULL);
+ EXPECT_EQ(parse_error::kParseNoError, parser->ProcessAllCommands());
EXPECT_EQ(put, parser->get());
Mock::VerifyAndClearExpectations(api_mock());
}
diff --git a/o3d/command_buffer/service/cross/gapi_decoder.cc b/o3d/command_buffer/service/cross/gapi_decoder.cc
index db55421..650d8d9 100644
--- a/o3d/command_buffer/service/cross/gapi_decoder.cc
+++ b/o3d/command_buffer/service/cross/gapi_decoder.cc
@@ -82,7 +82,7 @@ const CommandInfo g_command_info[] = {
// Note: args is a pointer to the command buffer. As such, it could be changed
// by a (malicious) client at any time, so if validation has to happen, it
// should operate on a copy of them.
-BufferSyncInterface::ParseError GAPIDecoder::DoCommand(
+parse_error::ParseError GAPIDecoder::DoCommand(
unsigned int command,
unsigned int arg_count,
const void* cmd_data) {
@@ -103,10 +103,10 @@ BufferSyncInterface::ParseError GAPIDecoder::DoCommand(
#undef O3D_COMMAND_BUFFER_CMD_OP
}
} else {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
}
- return BufferSyncInterface::kParseUnknownCommand;
+ return parse_error::kParseUnknownCommand;
}
void *GAPIDecoder::GetAddressAndCheckSize(unsigned int shm_id,
@@ -119,51 +119,51 @@ void *GAPIDecoder::GetAddressAndCheckSize(unsigned int shm_id,
return static_cast<char *>(shm_addr) + offset;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleNoop(
+parse_error::ParseError GAPIDecoder::HandleNoop(
uint32 arg_count,
const cmd::Noop& args) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetToken(
+parse_error::ParseError GAPIDecoder::HandleSetToken(
uint32 arg_count,
const cmd::SetToken& args) {
engine_->set_token(args.token);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleBeginFrame(
+parse_error::ParseError GAPIDecoder::HandleBeginFrame(
uint32 arg_count,
const cmd::BeginFrame& args) {
gapi_->BeginFrame();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleEndFrame(
+parse_error::ParseError GAPIDecoder::HandleEndFrame(
uint32 arg_count,
const cmd::EndFrame& args) {
gapi_->EndFrame();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleClear(
+parse_error::ParseError GAPIDecoder::HandleClear(
uint32 arg_count,
const cmd::Clear& args) {
// Pull out some values so they can't be changed by another thread after we've
// validated them.
uint32 buffers = args.buffers;
if (buffers & ~command_buffer::kAllBuffers)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
RGBA rgba;
rgba.red = args.red;
rgba.green = args.green;
rgba.blue = args.blue;
rgba.alpha = args.alpha;
gapi_->Clear(buffers, rgba, args.depth, args.stencil);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetViewport(
+parse_error::ParseError GAPIDecoder::HandleSetViewport(
uint32 arg_count,
const cmd::SetViewport& args) {
gapi_->SetViewport(args.left,
@@ -172,35 +172,35 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetViewport(
args.height,
args.z_min,
args.z_max);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateVertexBuffer(
+parse_error::ParseError GAPIDecoder::HandleCreateVertexBuffer(
uint32 arg_count,
const cmd::CreateVertexBuffer& args) {
return gapi_->CreateVertexBuffer(
args.vertex_buffer_id, args.size, args.flags);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyVertexBuffer(
+parse_error::ParseError GAPIDecoder::HandleDestroyVertexBuffer(
uint32 arg_count,
const cmd::DestroyVertexBuffer& args) {
return gapi_->DestroyVertexBuffer(args.vertex_buffer_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexBufferDataImmediate(
+parse_error::ParseError GAPIDecoder::HandleSetVertexBufferDataImmediate(
uint32 arg_count,
const cmd::SetVertexBufferDataImmediate& args) {
uint32 size = ImmediateDataSize(arg_count, args);
if (size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->SetVertexBufferData(args.vertex_buffer_id, args.offset,
size,
AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexBufferData(
+parse_error::ParseError GAPIDecoder::HandleSetVertexBufferData(
uint32 arg_count,
const cmd::SetVertexBufferData& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -209,12 +209,12 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexBufferData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->SetVertexBufferData(
args.vertex_buffer_id, args.offset, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetVertexBufferData(
+parse_error::ParseError GAPIDecoder::HandleGetVertexBufferData(
uint32 arg_count,
const cmd::GetVertexBufferData& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -223,35 +223,35 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetVertexBufferData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetVertexBufferData(
args.vertex_buffer_id, args.offset, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateIndexBuffer(
+parse_error::ParseError GAPIDecoder::HandleCreateIndexBuffer(
uint32 arg_count,
const cmd::CreateIndexBuffer& args) {
return gapi_->CreateIndexBuffer(args.index_buffer_id, args.size, args.flags);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyIndexBuffer(
+parse_error::ParseError GAPIDecoder::HandleDestroyIndexBuffer(
uint32 arg_count,
const cmd::DestroyIndexBuffer& args) {
return gapi_->DestroyIndexBuffer(args.index_buffer_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetIndexBufferDataImmediate(
+parse_error::ParseError GAPIDecoder::HandleSetIndexBufferDataImmediate(
uint32 arg_count,
const cmd::SetIndexBufferDataImmediate& args) {
uint32 size = ImmediateDataSize(arg_count, args);
if (size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->SetIndexBufferData(args.index_buffer_id, args.offset, size,
AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetIndexBufferData(
+parse_error::ParseError GAPIDecoder::HandleSetIndexBufferData(
uint32 arg_count,
const cmd::SetIndexBufferData& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -260,12 +260,12 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetIndexBufferData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->SetIndexBufferData(
args.index_buffer_id, args.offset, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetIndexBufferData(
+parse_error::ParseError GAPIDecoder::HandleGetIndexBufferData(
uint32 arg_count,
const cmd::GetIndexBufferData& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -274,24 +274,24 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetIndexBufferData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetIndexBufferData(
args.index_buffer_id, args.offset, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateVertexStruct(
+parse_error::ParseError GAPIDecoder::HandleCreateVertexStruct(
uint32 arg_count,
const cmd::CreateVertexStruct& args) {
return gapi_->CreateVertexStruct(args.vertex_struct_id, args.input_count);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyVertexStruct(
+parse_error::ParseError GAPIDecoder::HandleDestroyVertexStruct(
uint32 arg_count,
const cmd::DestroyVertexStruct& args) {
return gapi_->DestroyVertexStruct(args.vertex_struct_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexInput(
+parse_error::ParseError GAPIDecoder::HandleSetVertexInput(
uint32 arg_count,
const cmd::SetVertexInput& args) {
unsigned int type_stride_semantic = args.type_stride_semantic;
@@ -305,7 +305,7 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexInput(
cmd::SetVertexInput::Stride::Get(type_stride_semantic);
if (semantic >= vertex_struct::kNumSemantics ||
type >= vertex_struct::kNumTypes || stride == 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
return gapi_->SetVertexInput(
args.vertex_struct_id, args.input_index, args.vertex_buffer_id,
args.offset, stride,
@@ -314,40 +314,40 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexInput(
semantic_index);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetVertexStruct(
+parse_error::ParseError GAPIDecoder::HandleSetVertexStruct(
uint32 arg_count,
const cmd::SetVertexStruct& args) {
return gapi_->SetVertexStruct(args.vertex_struct_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDraw(
+parse_error::ParseError GAPIDecoder::HandleDraw(
uint32 arg_count,
const cmd::Draw& args) {
// Pull out some values so they can't be changed by another thread after we've
// validated them.
uint32 primitive_type = args.primitive_type;
if (primitive_type >= command_buffer::kMaxPrimitiveType)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
return gapi_->Draw(
static_cast<command_buffer::PrimitiveType>(primitive_type),
args.first, args.count);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDrawIndexed(
+parse_error::ParseError GAPIDecoder::HandleDrawIndexed(
uint32 arg_count,
const cmd::DrawIndexed& args) {
// Pull out some values so they can't be changed by another thread after we've
// validated them.
uint32 primitive_type = args.primitive_type;
if (primitive_type >= command_buffer::kMaxPrimitiveType)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
return gapi_->DrawIndexed(
static_cast<command_buffer::PrimitiveType>(primitive_type),
args.index_buffer_id,
args.first, args.count, args.min_index, args.max_index);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateEffect(
+parse_error::ParseError GAPIDecoder::HandleCreateEffect(
uint32 arg_count,
const cmd::CreateEffect& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -356,11 +356,11 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateEffect(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->CreateEffect(args.effect_id, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateEffectImmediate(
+parse_error::ParseError GAPIDecoder::HandleCreateEffectImmediate(
uint32 arg_count,
const cmd::CreateEffectImmediate& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -368,27 +368,27 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateEffectImmediate(
uint32 size = args.size;
uint32 data_size = ImmediateDataSize(arg_count, args);
if (size > data_size) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if (data_size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->CreateEffect(args.effect_id, size, AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyEffect(
+parse_error::ParseError GAPIDecoder::HandleDestroyEffect(
uint32 arg_count,
const cmd::DestroyEffect& args) {
return gapi_->DestroyEffect(args.effect_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetEffect(
+parse_error::ParseError GAPIDecoder::HandleSetEffect(
uint32 arg_count,
const cmd::SetEffect& args) {
return gapi_->SetEffect(args.effect_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetParamCount(
+parse_error::ParseError GAPIDecoder::HandleGetParamCount(
uint32 arg_count,
const cmd::GetParamCount& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -397,17 +397,17 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetParamCount(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetParamCount(args.effect_id, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateParam(
+parse_error::ParseError GAPIDecoder::HandleCreateParam(
uint32 arg_count,
const cmd::CreateParam& args) {
return gapi_->CreateParam(args.param_id, args.effect_id, args.index);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateParamByName(
+parse_error::ParseError GAPIDecoder::HandleCreateParamByName(
uint32 arg_count,
const cmd::CreateParamByName& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -416,12 +416,12 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateParamByName(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->CreateParamByName(args.param_id, args.effect_id, size,
data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateParamByNameImmediate(
+parse_error::ParseError GAPIDecoder::HandleCreateParamByNameImmediate(
uint32 arg_count,
const cmd::CreateParamByNameImmediate& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -429,21 +429,21 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateParamByNameImmediate(
uint32 size = args.size;
uint32 data_size = ImmediateDataSize(arg_count, args);
if (size > data_size)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
if (data_size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->CreateParamByName(args.param_id, args.effect_id, size,
AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyParam(
+parse_error::ParseError GAPIDecoder::HandleDestroyParam(
uint32 arg_count,
const cmd::DestroyParam& args) {
return gapi_->DestroyParam(args.param_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetParamData(
+parse_error::ParseError GAPIDecoder::HandleSetParamData(
uint32 arg_count,
const cmd::SetParamData& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -452,11 +452,11 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetParamData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->SetParamData(args.param_id, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetParamDataImmediate(
+parse_error::ParseError GAPIDecoder::HandleSetParamDataImmediate(
uint32 arg_count,
const cmd::SetParamDataImmediate& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -464,15 +464,15 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetParamDataImmediate(
uint32 size = args.size;
uint32 data_size = ImmediateDataSize(arg_count, args);
if (size > data_size) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if (data_size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->SetParamData(args.param_id, size, AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetParamDesc(
+parse_error::ParseError GAPIDecoder::HandleGetParamDesc(
uint32 arg_count,
const cmd::GetParamDesc& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -481,11 +481,11 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetParamDesc(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetParamDesc(args.param_id, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetStreamCount(
+parse_error::ParseError GAPIDecoder::HandleGetStreamCount(
uint32 arg_count,
const cmd::GetStreamCount& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -494,11 +494,11 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetStreamCount(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetStreamCount(args.effect_id, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetStreamDesc(
+parse_error::ParseError GAPIDecoder::HandleGetStreamDesc(
uint32 arg_count,
const cmd::GetStreamDesc& args) {
// Pull out some values so they can't be changed by another thread after we've
@@ -507,17 +507,17 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetStreamDesc(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset,
size);
- if (!data) return BufferSyncInterface::kParseInvalidArguments;
+ if (!data) return parse_error::kParseInvalidArguments;
return gapi_->GetStreamDesc(args.effect_id, args.index, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyTexture(
+parse_error::ParseError GAPIDecoder::HandleDestroyTexture(
uint32 arg_count,
const cmd::DestroyTexture& args) {
return gapi_->DestroyTexture(args.texture_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTexture2d(
+parse_error::ParseError GAPIDecoder::HandleCreateTexture2d(
uint32 arg_count,
const cmd::CreateTexture2d& args) {
unsigned int width_height = args.width_height;
@@ -532,14 +532,14 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTexture2d(
1 + base::bits::Log2Ceiling(std::max(width, height));
if ((width == 0) || (height == 0) || (levels > max_levels) ||
(unused != 0) || (format == texture::kUnknown) || (levels == 0))
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
bool enable_render_surfaces = !!flags;
return gapi_->CreateTexture2D(args.texture_id, width, height, levels,
static_cast<texture::Format>(format), flags,
enable_render_surfaces);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTexture3d(
+parse_error::ParseError GAPIDecoder::HandleCreateTexture3d(
uint32 arg_count,
const cmd::CreateTexture3d& args) {
unsigned int width_height = args.width_height;
@@ -559,14 +559,14 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTexture3d(
if ((width == 0) || (height == 0) || (depth == 0) ||
(levels > max_levels) || (unused1 != 0) || (unused2 != 0) ||
(format == texture::kUnknown) || (levels == 0))
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
bool enable_render_surfaces = !!flags;
return gapi_->CreateTexture3D(args.texture_id, width, height, depth, levels,
static_cast<texture::Format>(format), flags,
enable_render_surfaces);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTextureCube(
+parse_error::ParseError GAPIDecoder::HandleCreateTextureCube(
uint32 arg_count,
const cmd::CreateTextureCube& args) {
unsigned int side_unused = args.edge_length;
@@ -583,14 +583,14 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateTextureCube(
unsigned int max_levels = 1 + base::bits::Log2Ceiling(side);
if ((side == 0) || (levels > max_levels) || (unused1 != 0) ||
(unused2 != 0) || (format == texture::kUnknown) || (levels == 0))
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
bool enable_render_surfaces = !!flags;
return gapi_->CreateTextureCube(args.texture_id, side, levels,
static_cast<texture::Format>(format),
flags, enable_render_surfaces);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetTextureData(
+parse_error::ParseError GAPIDecoder::HandleSetTextureData(
uint32 arg_count,
const cmd::SetTextureData& args) {
unsigned int x_y = args.x_y;
@@ -610,14 +610,14 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetTextureData(
const void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset, size);
if (face >= 6 || unused != 0 || !data)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
return gapi_->SetTextureData(
args.texture_id, x, y, z, width, height, depth, level,
static_cast<texture::Face>(face), args.row_pitch,
args.slice_pitch, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetTextureDataImmediate(
+parse_error::ParseError GAPIDecoder::HandleSetTextureDataImmediate(
uint32 arg_count,
const cmd::SetTextureDataImmediate& args) {
unsigned int x_y = args.x_y;
@@ -637,9 +637,9 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetTextureDataImmediate(
uint32 data_size = ImmediateDataSize(arg_count, args);
if (face >= 6 || unused != 0 ||
size > data_size)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
if (data_size == 0) {
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
return gapi_->SetTextureData(
args.texture_id, x, y, z, width, height, depth, level,
@@ -647,7 +647,7 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetTextureDataImmediate(
args.slice_pitch, size, AddressAfterStruct(args));
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleGetTextureData(
+parse_error::ParseError GAPIDecoder::HandleGetTextureData(
uint32 arg_count,
const cmd::GetTextureData& args) {
unsigned int x_y = args.x_y;
@@ -667,31 +667,31 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleGetTextureData(
void *data = GetAddressAndCheckSize(args.shared_memory.id,
args.shared_memory.offset, size);
if (face >= 6 || unused != 0 || !data)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
return gapi_->GetTextureData(
args.texture_id, x, y, z, width, height, depth, level,
static_cast<texture::Face>(face), args.row_pitch,
args.slice_pitch, size, data);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateSampler(
+parse_error::ParseError GAPIDecoder::HandleCreateSampler(
uint32 arg_count,
const cmd::CreateSampler& args) {
return gapi_->CreateSampler(args.sampler_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroySampler(
+parse_error::ParseError GAPIDecoder::HandleDestroySampler(
uint32 arg_count,
const cmd::DestroySampler& args) {
return gapi_->DestroySampler(args.sampler_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerStates(
+parse_error::ParseError GAPIDecoder::HandleSetSamplerStates(
uint32 arg_count,
const cmd::SetSamplerStates& args) {
Uint32 arg = args.sampler_states;
if (cmd::SetSamplerStates::Unused::Get(arg) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
unsigned int address_u_value = cmd::SetSamplerStates::AddressingU::Get(arg);
unsigned int address_v_value = cmd::SetSamplerStates::AddressingV::Get(arg);
unsigned int address_w_value = cmd::SetSamplerStates::AddressingW::Get(arg);
@@ -708,7 +708,7 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerStates(
mag_filter_value == sampler::kNone ||
min_filter_value == sampler::kNone ||
max_anisotropy == 0) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
gapi_->SetSamplerStates(
args.sampler_id,
@@ -719,10 +719,10 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerStates(
static_cast<sampler::FilteringMode>(min_filter_value),
static_cast<sampler::FilteringMode>(mip_filter_value),
max_anisotropy);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerBorderColor(
+parse_error::ParseError GAPIDecoder::HandleSetSamplerBorderColor(
uint32 arg_count,
const cmd::SetSamplerBorderColor& args) {
RGBA rgba;
@@ -733,18 +733,18 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerBorderColor(
return gapi_->SetSamplerBorderColor(args.sampler_id, rgba);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetSamplerTexture(
+parse_error::ParseError GAPIDecoder::HandleSetSamplerTexture(
uint32 arg_count,
const cmd::SetSamplerTexture& args) {
return gapi_->SetSamplerTexture(args.sampler_id, args.texture_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetScissor(
+parse_error::ParseError GAPIDecoder::HandleSetScissor(
uint32 arg_count,
const cmd::SetScissor& args) {
Uint32 x_y_enable = args.x_y_enable;
if (cmd::SetScissor::Unused::Get(x_y_enable) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
unsigned int x = cmd::SetScissor::X::Get(x_y_enable);
unsigned int y = cmd::SetScissor::Y::Get(x_y_enable);
bool enable = cmd::SetScissor::Enable::Get(x_y_enable) != 0;
@@ -752,30 +752,30 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetScissor(
unsigned int width = cmd::SetScissor::Width::Get(width_height);
unsigned int height = cmd::SetScissor::Height::Get(width_height);
gapi_->SetScissor(enable, x, y, width, height);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetPolygonOffset(
+parse_error::ParseError GAPIDecoder::HandleSetPolygonOffset(
uint32 arg_count,
const cmd::SetPolygonOffset& args) {
gapi_->SetPolygonOffset(args.slope_factor, args.units);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetPointLineRaster(
+parse_error::ParseError GAPIDecoder::HandleSetPointLineRaster(
uint32 arg_count,
const cmd::SetPointLineRaster& args) {
Uint32 enables = args.enables;
if (cmd::SetPointLineRaster::Unused::Get(enables) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
bool line_smooth = !!cmd::SetPointLineRaster::LineSmoothEnable::Get(enables);
bool point_sprite =
!!cmd::SetPointLineRaster::PointSpriteEnable::Get(enables);
gapi_->SetPointLineRaster(line_smooth, point_sprite, args.point_size);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetPolygonRaster(
+parse_error::ParseError GAPIDecoder::HandleSetPolygonRaster(
uint32 arg_count,
const cmd::SetPolygonRaster& args) {
Uint32 fill_cull = args.fill_cull;
@@ -784,19 +784,19 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetPolygonRaster(
if (cmd::SetPolygonRaster::Unused::Get(fill_cull) != 0 ||
fill_value >= command_buffer::kNumPolygonMode ||
cull_value >= command_buffer::kNumFaceCullMode)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
gapi_->SetPolygonRaster(
static_cast<command_buffer::PolygonMode>(fill_value),
static_cast<command_buffer::FaceCullMode>(cull_value));
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetAlphaTest(
+parse_error::ParseError GAPIDecoder::HandleSetAlphaTest(
uint32 arg_count,
const cmd::SetAlphaTest& args) {
Uint32 func_enable = args.func_enable;
if (cmd::SetAlphaTest::Unused::Get(func_enable) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Check that the bitmask get cannot generate values outside of the
// allowed range.
COMPILE_ASSERT(cmd::SetAlphaTest::Func::kMask <
@@ -806,15 +806,15 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetAlphaTest(
cmd::SetAlphaTest::Func::Get(func_enable));
bool enable = cmd::SetAlphaTest::Enable::Get(func_enable) != 0;
gapi_->SetAlphaTest(enable, args.value, comp);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetDepthTest(
+parse_error::ParseError GAPIDecoder::HandleSetDepthTest(
uint32 arg_count,
const cmd::SetDepthTest& args) {
Uint32 func_enable = args.func_enable;
if (cmd::SetDepthTest::Unused::Get(func_enable) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Check that the bitmask get cannot generate values outside of the
// allowed range.
COMPILE_ASSERT(cmd::SetDepthTest::Func::kMask <
@@ -825,10 +825,10 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetDepthTest(
bool write_enable = cmd::SetDepthTest::WriteEnable::Get(func_enable) != 0;
bool enable = cmd::SetDepthTest::Enable::Get(func_enable) != 0;
gapi_->SetDepthTest(enable, write_enable, comp);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetStencilTest(
+parse_error::ParseError GAPIDecoder::HandleSetStencilTest(
uint32 arg_count,
const cmd::SetStencilTest& args) {
Uint32 arg0 = args.stencil_args0;
@@ -836,7 +836,7 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetStencilTest(
if (cmd::SetStencilTest::Unused0::Get(arg0) != 0 ||
cmd::SetStencilTest::Unused1::Get(arg1) != 0 ||
cmd::SetStencilTest::Unused2::Get(arg1) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
unsigned int write_mask = cmd::SetStencilTest::WriteMask::Get(arg0);
unsigned int compare_mask = cmd::SetStencilTest::CompareMask::Get(arg0);
unsigned int ref = cmd::SetStencilTest::ReferenceValue::Get(arg0);
@@ -844,25 +844,25 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetStencilTest(
bool separate_ccw = cmd::SetStencilTest::SeparateCCW::Get(arg0) != 0;
gapi_->SetStencilTest(enable, separate_ccw, write_mask, compare_mask, ref,
arg1);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetColorWrite(
+parse_error::ParseError GAPIDecoder::HandleSetColorWrite(
uint32 arg_count,
const cmd::SetColorWrite& args) {
Uint32 enables = args.flags;
if (cmd::SetColorWrite::Unused::Get(enables) != 0)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
bool red = cmd::SetColorWrite::RedMask::Get(enables) != 0;
bool green = cmd::SetColorWrite::GreenMask::Get(enables) != 0;
bool blue = cmd::SetColorWrite::BlueMask::Get(enables) != 0;
bool alpha = cmd::SetColorWrite::AlphaMask::Get(enables) != 0;
bool dither = cmd::SetColorWrite::DitherEnable::Get(enables) != 0;
gapi_->SetColorWrite(red, green, blue, alpha, dither);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetBlending(
+parse_error::ParseError GAPIDecoder::HandleSetBlending(
uint32 arg_count,
const cmd::SetBlending& args) {
Uint32 arg = args.blend_settings;
@@ -882,7 +882,7 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetBlending(
alpha_eq >= command_buffer::kNumBlendEq ||
alpha_src >= command_buffer::kNumBlendFunc ||
alpha_dst >= command_buffer::kNumBlendFunc)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
gapi_->SetBlending(enable,
separate_alpha,
static_cast<command_buffer::BlendEq>(color_eq),
@@ -891,10 +891,10 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetBlending(
static_cast<command_buffer::BlendEq>(alpha_eq),
static_cast<command_buffer::BlendFunc>(alpha_src),
static_cast<command_buffer::BlendFunc>(alpha_dst));
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetBlendingColor(
+parse_error::ParseError GAPIDecoder::HandleSetBlendingColor(
uint32 arg_count,
const cmd::SetBlendingColor& args) {
RGBA rgba;
@@ -903,10 +903,10 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleSetBlendingColor(
rgba.blue = args.blue;
rgba.alpha = args.alpha;
gapi_->SetBlendingColor(rgba);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateRenderSurface(
+parse_error::ParseError GAPIDecoder::HandleCreateRenderSurface(
uint32 arg_count,
const cmd::CreateRenderSurface& args) {
unsigned int width_height = args.width_height;
@@ -920,13 +920,13 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateRenderSurface(
side, args.texture_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyRenderSurface(
+parse_error::ParseError GAPIDecoder::HandleDestroyRenderSurface(
uint32 arg_count,
const cmd::DestroyRenderSurface& args) {
return gapi_->DestroyRenderSurface(args.render_surface_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleCreateDepthSurface(
+parse_error::ParseError GAPIDecoder::HandleCreateDepthSurface(
uint32 arg_count,
const cmd::CreateDepthSurface& args) {
unsigned int width_height = args.width_height;
@@ -935,23 +935,23 @@ BufferSyncInterface::ParseError GAPIDecoder::HandleCreateDepthSurface(
return gapi_->CreateDepthSurface(args.depth_surface_id, width, height);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleDestroyDepthSurface(
+parse_error::ParseError GAPIDecoder::HandleDestroyDepthSurface(
uint32 arg_count,
const cmd::DestroyDepthSurface& args) {
return gapi_->DestroyDepthSurface(args.depth_surface_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetRenderSurface(
+parse_error::ParseError GAPIDecoder::HandleSetRenderSurface(
uint32 arg_count,
const cmd::SetRenderSurface& args) {
return gapi_->SetRenderSurface(args.render_surface_id, args.depth_surface_id);
}
-BufferSyncInterface::ParseError GAPIDecoder::HandleSetBackSurfaces(
+parse_error::ParseError GAPIDecoder::HandleSetBackSurfaces(
uint32 arg_count,
const cmd::SetBackSurfaces& args) {
gapi_->SetBackSurfaces();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/gapi_decoder.h b/o3d/command_buffer/service/cross/gapi_decoder.h
index 8779cf2..08555eb 100644
--- a/o3d/command_buffer/service/cross/gapi_decoder.h
+++ b/o3d/command_buffer/service/cross/gapi_decoder.h
@@ -42,13 +42,13 @@ namespace o3d {
namespace command_buffer {
class GAPIInterface;
-class CommandBufferUpcallInterface;
+class CommandBufferEngine;
// This class implements the AsyncAPIInterface interface, decoding GAPI
// commands and sending them to a GAPI interface.
class GAPIDecoder : public AsyncAPIInterface {
public:
- typedef BufferSyncInterface::ParseError ParseError;
+ typedef parse_error::ParseError ParseError;
explicit GAPIDecoder(GAPIInterface *gapi) : gapi_(gapi), engine_(NULL) {}
virtual ~GAPIDecoder() {}
@@ -60,7 +60,7 @@ class GAPIDecoder : public AsyncAPIInterface {
// Sets the engine, to get shared memory buffers from, and to set the token
// to.
- void set_engine(CommandBufferUpcallInterface *engine) { engine_ = engine; }
+ void set_engine(CommandBufferEngine *engine) { engine_ = engine; }
private:
// Gets the address of shared memory data, given a shared memory ID and an
// offset. Also checks that the size is consistent with the shared memory
@@ -88,7 +88,7 @@ class GAPIDecoder : public AsyncAPIInterface {
#undef O3D_COMMAND_BUFFER_CMD_OP
GAPIInterface *gapi_;
- CommandBufferUpcallInterface *engine_;
+ CommandBufferEngine *engine_;
};
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/gl/effect_gl.cc b/o3d/command_buffer/service/cross/gl/effect_gl.cc
index 21c0e04..2d24f7b 100644
--- a/o3d/command_buffer/service/cross/gl/effect_gl.cc
+++ b/o3d/command_buffer/service/cross/gl/effect_gl.cc
@@ -706,7 +706,7 @@ EffectParamGL *EffectGL::CreateParamByName(const char *name) {
return EffectParamGL::Create(this, index);
}
-BufferSyncInterface::ParseError GAPIGL::CreateEffect(ResourceId id,
+parse_error::ParseError GAPIGL::CreateEffect(ResourceId id,
unsigned int size,
const void *data) {
if (id == current_effect_id_) DirtyEffect();
@@ -721,109 +721,109 @@ BufferSyncInterface::ParseError GAPIGL::CreateEffect(ResourceId id,
&vertex_program_entry,
&fragment_program_entry,
&effect_code)) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
EffectGL * effect = EffectGL::Create(this, effect_code,
vertex_program_entry,
fragment_program_entry);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
effects_.Assign(id, effect);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyEffect(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyEffect(ResourceId id) {
if (id == current_effect_id_) DirtyEffect();
return effects_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetEffect(ResourceId id) {
+parse_error::ParseError GAPIGL::SetEffect(ResourceId id) {
DirtyEffect();
current_effect_id_ = id;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::GetParamCount(ResourceId id,
+parse_error::ParseError GAPIGL::GetParamCount(ResourceId id,
unsigned int size,
void *data) {
EffectGL *effect = effects_.Get(id);
if (!effect || size < sizeof(Uint32)) // NOLINT
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
*static_cast<Uint32 *>(data) = effect->GetParamCount();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::CreateParam(ResourceId param_id,
+parse_error::ParseError GAPIGL::CreateParam(ResourceId param_id,
ResourceId effect_id,
unsigned int index) {
EffectGL *effect = effects_.Get(effect_id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
EffectParamGL *param = effect->CreateParam(index);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
effect_params_.Assign(param_id, param);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::CreateParamByName(ResourceId param_id,
+parse_error::ParseError GAPIGL::CreateParamByName(ResourceId param_id,
ResourceId effect_id,
unsigned int size,
const void *name) {
EffectGL *effect = effects_.Get(effect_id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
std::string string_name(static_cast<const char *>(name), size);
EffectParamGL *param = effect->CreateParamByName(string_name.c_str());
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
effect_params_.Assign(param_id, param);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyParam(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyParam(ResourceId id) {
return effect_params_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetParamData(ResourceId id,
+parse_error::ParseError GAPIGL::SetParamData(ResourceId id,
unsigned int size,
const void *data) {
EffectParamGL *param = effect_params_.Get(id);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
return param->SetData(this, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::GetParamDesc(ResourceId id,
+parse_error::ParseError GAPIGL::GetParamDesc(ResourceId id,
unsigned int size,
void *data) {
EffectParamGL *param = effect_params_.Get(id);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
return param->GetDesc(size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::GetStreamCount(
+parse_error::ParseError GAPIGL::GetStreamCount(
ResourceId id,
unsigned int size,
void *data) {
EffectGL *effect = effects_.Get(id);
if (!effect || size < sizeof(Uint32)) // NOLINT
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
*static_cast<Uint32 *>(data) = effect->GetStreamCount();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::GetStreamDesc(ResourceId id,
+parse_error::ParseError GAPIGL::GetStreamDesc(ResourceId id,
unsigned int index,
unsigned int size,
void *data) {
EffectGL *effect = effects_.Get(id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
return effect->GetStreamDesc(index, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// If the current effect is valid, call End on it, and tag for revalidation.
diff --git a/o3d/command_buffer/service/cross/gl/geometry_gl.cc b/o3d/command_buffer/service/cross/gl/geometry_gl.cc
index b290472..47604f1 100644
--- a/o3d/command_buffer/service/cross/gl/geometry_gl.cc
+++ b/o3d/command_buffer/service/cross/gl/geometry_gl.cc
@@ -305,97 +305,97 @@ void VertexStructGL::Compile() {
dirty_ = false;
}
-BufferSyncInterface::ParseError GAPIGL::CreateVertexBuffer(ResourceId id,
+parse_error::ParseError GAPIGL::CreateVertexBuffer(ResourceId id,
unsigned int size,
unsigned int flags) {
VertexBufferGL *vertex_buffer = new VertexBufferGL(size, flags);
vertex_buffer->Create();
vertex_buffers_.Assign(id, vertex_buffer);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyVertexBuffer(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyVertexBuffer(ResourceId id) {
return vertex_buffers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetVertexBufferData(ResourceId id,
+parse_error::ParseError GAPIGL::SetVertexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
const void *data) {
VertexBufferGL *vertex_buffer = vertex_buffers_.Get(id);
- if (!vertex_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!vertex_buffer) return parse_error::kParseInvalidArguments;
return vertex_buffer->SetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::GetVertexBufferData(ResourceId id,
+parse_error::ParseError GAPIGL::GetVertexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
void *data) {
VertexBufferGL *vertex_buffer = vertex_buffers_.Get(id);
- if (!vertex_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!vertex_buffer) return parse_error::kParseInvalidArguments;
return vertex_buffer->GetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::CreateIndexBuffer(ResourceId id,
+parse_error::ParseError GAPIGL::CreateIndexBuffer(ResourceId id,
unsigned int size,
unsigned int flags) {
IndexBufferGL *index_buffer = new IndexBufferGL(size, flags);
index_buffer->Create();
index_buffers_.Assign(id, index_buffer);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyIndexBuffer(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyIndexBuffer(ResourceId id) {
return index_buffers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetIndexBufferData(ResourceId id,
+parse_error::ParseError GAPIGL::SetIndexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
const void *data) {
IndexBufferGL *index_buffer = index_buffers_.Get(id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
return index_buffer->SetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::GetIndexBufferData(ResourceId id,
+parse_error::ParseError GAPIGL::GetIndexBufferData(ResourceId id,
unsigned int offset,
unsigned int size,
void *data) {
IndexBufferGL *index_buffer = index_buffers_.Get(id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
return index_buffer->GetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::CreateVertexStruct(
+parse_error::ParseError GAPIGL::CreateVertexStruct(
ResourceId id,
unsigned int input_count) {
if (id == current_vertex_struct_) validate_streams_ = true;
VertexStructGL *vertex_struct = new VertexStructGL(input_count);
vertex_structs_.Assign(id, vertex_struct);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyVertexStruct(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyVertexStruct(ResourceId id) {
if (id == current_vertex_struct_) validate_streams_ = true;
return vertex_structs_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetVertexInput(
+parse_error::ParseError GAPIGL::SetVertexInput(
ResourceId vertex_struct_id,
unsigned int input_index,
ResourceId vertex_buffer_id,
@@ -407,22 +407,22 @@ BufferSyncInterface::ParseError GAPIGL::SetVertexInput(
switch (semantic) {
case vertex_struct::kPosition:
if (semantic_index != 0) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
break;
case vertex_struct::kNormal:
if (semantic_index != 0) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
break;
case vertex_struct::kColor:
if (semantic_index >= 2) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
break;
case vertex_struct::kTexCoord:
if (semantic_index >= 8) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
break;
default:
@@ -432,16 +432,16 @@ BufferSyncInterface::ParseError GAPIGL::SetVertexInput(
if (vertex_buffer_id == current_vertex_struct_) validate_streams_ = true;
VertexStructGL *vertex_struct = vertex_structs_.Get(vertex_struct_id);
if (!vertex_struct || input_index >= vertex_struct->count())
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
vertex_struct->SetInput(input_index, vertex_buffer_id, offset, stride, type,
semantic, semantic_index);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::SetVertexStruct(ResourceId id) {
+parse_error::ParseError GAPIGL::SetVertexStruct(ResourceId id) {
current_vertex_struct_ = id;
validate_streams_ = true;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
bool GAPIGL::ValidateStreams() {
@@ -493,27 +493,27 @@ void PrimitiveTypeToGL(command_buffer::PrimitiveType primitive_type,
} // anonymous namespace
-BufferSyncInterface::ParseError GAPIGL::Draw(PrimitiveType primitive_type,
+parse_error::ParseError GAPIGL::Draw(PrimitiveType primitive_type,
unsigned int first,
unsigned int count) {
if (validate_effect_ && !ValidateEffect()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
DCHECK(current_effect_);
if (validate_streams_ && !ValidateStreams()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
GLenum gl_mode = GL_POINTS;
PrimitiveTypeToGL(primitive_type, &gl_mode, &count);
if (first + count > max_vertices_) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
glDrawArrays(gl_mode, first, count);
CHECK_GL_ERROR();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DrawIndexed(
+parse_error::ParseError GAPIGL::DrawIndexed(
PrimitiveType primitive_type,
ResourceId index_buffer_id,
unsigned int first,
@@ -521,16 +521,16 @@ BufferSyncInterface::ParseError GAPIGL::DrawIndexed(
unsigned int min_index,
unsigned int max_index) {
IndexBufferGL *index_buffer = index_buffers_.Get(index_buffer_id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
if (validate_effect_ && !ValidateEffect()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
DCHECK(current_effect_);
if (validate_streams_ && !ValidateStreams()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if ((min_index >= max_vertices_) || (max_index > max_vertices_)) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
GLenum gl_mode = GL_POINTS;
PrimitiveTypeToGL(primitive_type, &gl_mode, &count);
@@ -541,12 +541,12 @@ BufferSyncInterface::ParseError GAPIGL::DrawIndexed(
sizeof(GLuint) : sizeof(GLushort); // NOLINT
GLuint offset = first * index_size;
if (offset + count * index_size > index_buffer->size()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
glDrawRangeElements(gl_mode, min_index, max_index, count, index_type,
OffsetToPtr(offset));
CHECK_GL_ERROR();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/gl/render_surface_gl.cc b/o3d/command_buffer/service/cross/gl/render_surface_gl.cc
index c7ed2d7..35634ff 100644
--- a/o3d/command_buffer/service/cross/gl/render_surface_gl.cc
+++ b/o3d/command_buffer/service/cross/gl/render_surface_gl.cc
@@ -109,7 +109,7 @@ RenderDepthStencilSurfaceGL* RenderDepthStencilSurfaceGL::Create(
}
// Copies the data from a texture resource.
-BufferSyncInterface::ParseError GAPIGL::CreateRenderSurface(
+parse_error::ParseError GAPIGL::CreateRenderSurface(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -118,11 +118,11 @@ BufferSyncInterface::ParseError GAPIGL::CreateRenderSurface(
ResourceId texture_id) {
if (id == current_surface_id_) {
// This will delete the current surface which would be bad.
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
TextureGL *texture = textures_.Get(texture_id);
if (!texture->render_surfaces_enabled()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
} else {
RenderSurfaceGL* render_surface = RenderSurfaceGL::Create(width,
height,
@@ -130,46 +130,46 @@ BufferSyncInterface::ParseError GAPIGL::CreateRenderSurface(
side,
texture);
if (render_surface == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
render_surfaces_.Assign(id, render_surface);
}
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyRenderSurface(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyRenderSurface(ResourceId id) {
if (id == current_surface_id_) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
return render_surfaces_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::CreateDepthSurface(
+parse_error::ParseError GAPIGL::CreateDepthSurface(
ResourceId id,
unsigned int width,
unsigned int height) {
if (id == current_depth_surface_id_) {
// This will delete the current surface which would be bad.
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
RenderDepthStencilSurfaceGL* depth_surface =
RenderDepthStencilSurfaceGL::Create(width, height);
if (depth_surface == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
depth_surfaces_.Assign(id, depth_surface);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::DestroyDepthSurface(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyDepthSurface(ResourceId id) {
if (id == current_depth_surface_id_) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
return depth_surfaces_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
void ResetBoundAttachments() {
@@ -219,12 +219,12 @@ bool BindDepthStencilBuffer(const RenderDepthStencilSurfaceGL* gl_surface) {
return true;
}
-BufferSyncInterface::ParseError GAPIGL::SetRenderSurface(
+parse_error::ParseError GAPIGL::SetRenderSurface(
ResourceId render_surface_id,
ResourceId depth_stencil_id) {
if (render_surfaces_.Get(render_surface_id) == NULL &&
depth_surfaces_.Get(depth_stencil_id) == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
::glBindFramebufferEXT(GL_FRAMEBUFFER, render_surface_framebuffer_);
@@ -237,7 +237,7 @@ BufferSyncInterface::ParseError GAPIGL::SetRenderSurface(
if (!render_surface->texture()->
InstallFrameBufferObjects(render_surface) ||
!BindDepthStencilBuffer(depth_surface)) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
// RenderSurface rendering is performed with an inverted Y, so the front
@@ -247,7 +247,7 @@ BufferSyncInterface::ParseError GAPIGL::SetRenderSurface(
current_surface_id_ = render_surface_id;
current_depth_surface_id_ = depth_stencil_id;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
void GAPIGL::SetBackSurfaces() {
diff --git a/o3d/command_buffer/service/cross/gl/sampler_gl.cc b/o3d/command_buffer/service/cross/gl/sampler_gl.cc
index 159e131..7f09a4e 100644
--- a/o3d/command_buffer/service/cross/gl/sampler_gl.cc
+++ b/o3d/command_buffer/service/cross/gl/sampler_gl.cc
@@ -173,24 +173,24 @@ void SamplerGL::SetBorderColor(const RGBA &color) {
gl_border_color_[3] = color.alpha;
}
-BufferSyncInterface::ParseError GAPIGL::CreateSampler(
+parse_error::ParseError GAPIGL::CreateSampler(
ResourceId id) {
// Dirty effect, because this sampler id may be used.
DirtyEffect();
samplers_.Assign(id, new SamplerGL());
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys the Sampler resource.
-BufferSyncInterface::ParseError GAPIGL::DestroySampler(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroySampler(ResourceId id) {
// Dirty effect, because this sampler id may be used.
DirtyEffect();
return samplers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPIGL::SetSamplerStates(
+parse_error::ParseError GAPIGL::SetSamplerStates(
ResourceId id,
sampler::AddressingMode addressing_u,
sampler::AddressingMode addressing_v,
@@ -201,36 +201,36 @@ BufferSyncInterface::ParseError GAPIGL::SetSamplerStates(
unsigned int max_anisotropy) {
SamplerGL *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used.
DirtyEffect();
sampler->SetStates(addressing_u, addressing_v, addressing_w,
mag_filter, min_filter, mip_filter, max_anisotropy);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::SetSamplerBorderColor(
+parse_error::ParseError GAPIGL::SetSamplerBorderColor(
ResourceId id,
const RGBA &color) {
SamplerGL *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used.
DirtyEffect();
sampler->SetBorderColor(color);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPIGL::SetSamplerTexture(
+parse_error::ParseError GAPIGL::SetSamplerTexture(
ResourceId id,
ResourceId texture_id) {
SamplerGL *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used.
DirtyEffect();
sampler->SetTexture(texture_id);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
diff --git a/o3d/command_buffer/service/cross/gl/texture_gl.cc b/o3d/command_buffer/service/cross/gl/texture_gl.cc
index 2b01e48..6a92048 100644
--- a/o3d/command_buffer/service/cross/gl/texture_gl.cc
+++ b/o3d/command_buffer/service/cross/gl/texture_gl.cc
@@ -646,16 +646,16 @@ bool TextureCubeGL::InstallFrameBufferObjects(
// GAPIGL functions.
// Destroys a texture resource.
-BufferSyncInterface::ParseError GAPIGL::DestroyTexture(ResourceId id) {
+parse_error::ParseError GAPIGL::DestroyTexture(ResourceId id) {
// Dirty effect, because this texture id may be used.
DirtyEffect();
return textures_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Creates a 2D texture resource.
-BufferSyncInterface::ParseError GAPIGL::CreateTexture2D(
+parse_error::ParseError GAPIGL::CreateTexture2D(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -665,15 +665,15 @@ BufferSyncInterface::ParseError GAPIGL::CreateTexture2D(
bool enable_render_surfaces) {
Texture2DGL *texture = Texture2DGL::Create(
width, height, levels, format, flags, enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used.
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Creates a 3D texture resource.
-BufferSyncInterface::ParseError GAPIGL::CreateTexture3D(
+parse_error::ParseError GAPIGL::CreateTexture3D(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -684,15 +684,15 @@ BufferSyncInterface::ParseError GAPIGL::CreateTexture3D(
bool enable_render_surfaces) {
Texture3DGL *texture = Texture3DGL::Create(
width, height, depth, levels, format, flags, enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used.
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Creates a cube map texture resource.
-BufferSyncInterface::ParseError GAPIGL::CreateTextureCube(
+parse_error::ParseError GAPIGL::CreateTextureCube(
ResourceId id,
unsigned int side,
unsigned int levels,
@@ -701,15 +701,15 @@ BufferSyncInterface::ParseError GAPIGL::CreateTextureCube(
bool enable_render_surfaces) {
TextureCubeGL *texture = TextureCubeGL::Create(
side, levels, format, flags, enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used.
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Copies the data into a texture resource.
-BufferSyncInterface::ParseError GAPIGL::SetTextureData(
+parse_error::ParseError GAPIGL::SetTextureData(
ResourceId id,
unsigned int x,
unsigned int y,
@@ -725,19 +725,19 @@ BufferSyncInterface::ParseError GAPIGL::SetTextureData(
const void *data) {
TextureGL *texture = textures_.Get(id);
if (!texture)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
Volume volume = {x, y, z, width, height, depth};
// Dirty effect: SetData may need to call glBindTexture which will mess up the
// sampler parameters.
DirtyEffect();
return texture->SetData(volume, level, face, row_pitch, slice_pitch,
size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data from a texture resource.
-BufferSyncInterface::ParseError GAPIGL::GetTextureData(
+parse_error::ParseError GAPIGL::GetTextureData(
ResourceId id,
unsigned int x,
unsigned int y,
@@ -753,15 +753,15 @@ BufferSyncInterface::ParseError GAPIGL::GetTextureData(
void *data) {
TextureGL *texture = textures_.Get(id);
if (!texture)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
Volume volume = {x, y, z, width, height, depth};
// Dirty effect: GetData may need to call glBindTexture which will mess up the
// sampler parameters.
DirtyEffect();
return texture->GetData(volume, level, face, row_pitch, slice_pitch,
size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/cross/mocks.h b/o3d/command_buffer/service/cross/mocks.h
index 3135249..abacb5b 100644
--- a/o3d/command_buffer/service/cross/mocks.h
+++ b/o3d/command_buffer/service/cross/mocks.h
@@ -51,8 +51,8 @@ namespace command_buffer {
class AsyncAPIMock : public AsyncAPIInterface {
public:
AsyncAPIMock() {
- testing::DefaultValue<BufferSyncInterface::ParseError>::Set(
- BufferSyncInterface::kParseNoError);
+ testing::DefaultValue<parse_error::ParseError>::Set(
+ parse_error::kParseNoError);
}
// Predicate that matches args passed to DoCommand, by looking at the values.
@@ -77,7 +77,7 @@ class AsyncAPIMock : public AsyncAPIInterface {
CommandBufferEntry *args_;
};
- MOCK_METHOD3(DoCommand, BufferSyncInterface::ParseError(
+ MOCK_METHOD3(DoCommand, parse_error::ParseError(
unsigned int command,
unsigned int arg_count,
const void* cmd_data));
@@ -100,55 +100,6 @@ class AsyncAPIMock : public AsyncAPIInterface {
CommandBufferEngine *engine_;
};
-class RPCProcessMock : public RPCProcessInterface {
- public:
- RPCProcessMock()
- : would_have_blocked_(false),
- message_count_(0) {
- ON_CALL(*this, ProcessMessage()).WillByDefault(
- testing::Invoke(this, &RPCProcessMock::DefaultProcessMessage));
- ON_CALL(*this, HasMessage()).WillByDefault(
- testing::Invoke(this, &RPCProcessMock::DefaultHasMessage));
- }
- MOCK_METHOD0(ProcessMessage, bool());
- MOCK_METHOD0(HasMessage, bool());
-
- void Reset() {
- would_have_blocked_ = false;
- message_count_ = 0;
- }
-
- bool DefaultProcessMessage() {
- if (message_count_ > 0) {
- --message_count_;
- } else {
- would_have_blocked_ = true;
- }
- return true;
- }
-
- bool DefaultHasMessage() {
- return message_count_ > 0;
- }
-
- bool AddMessage() {
- ++message_count_;
- return true;
- }
-
- bool would_have_blocked() { return would_have_blocked_; }
- void set_would_have_blocked(bool would_have_blocked) {
- would_have_blocked_ = would_have_blocked;
- }
-
- unsigned int message_count() { return message_count_; }
- void set_message_count(unsigned int count) { message_count_ = count; }
- private:
- bool would_have_blocked_;
- unsigned int message_count_;
-};
-
-
} // namespace command_buffer
} // namespace o3d
diff --git a/o3d/command_buffer/service/cross/plugin.cc b/o3d/command_buffer/service/cross/plugin.cc
deleted file mode 100644
index 1a20dd5..0000000
--- a/o3d/command_buffer/service/cross/plugin.cc
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file contains the command renderer service (renderer) plug-in.
-// NOTE: this is only implemented on Windows currently.
-// TODO: other platforms.
-
-#include <npupp.h>
-#include <build/build_config.h>
-#ifdef OS_WIN
-#include <windows.h>
-#endif
-
-#include "command_buffer/common/cross/gapi_interface.h"
-#include "command_buffer/common/cross/rpc_imc.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
-#include "command_buffer/service/cross/gapi_decoder.h"
-#ifdef OS_WIN
-#include "command_buffer/service/win/d3d9/gapi_d3d9.h"
-#endif
-#include "third_party/native_client/googleclient/native_client/src/trusted/desc/nrd_all_modules.h"
-#include "third_party/nixysa/static_glue/npapi/npn_api.h"
-
-namespace o3d {
-namespace command_buffer {
-
-// The Plugin class implements the plug-in instance. It derives from NPObject
-// to be the scriptable object as well.
-class Plugin : public NPObject {
- public:
- // Sets the window used by the plug-in.
- NPError SetWindow(NPWindow *window);
-
- // Gets the NPClass representing the NPAPI entrypoints to the object.
- static NPClass *GetNPClass() {
- return &class_;
- }
-
- private:
- explicit Plugin(NPP npp);
- ~Plugin();
-
- // Creates the renderer using the IMC socket. This is called from Javascript
- // using the create() function.
- void Create(nacl::HtpHandle socket);
-
- // Destroys the renderer. This is called from Javascript using the destroy()
- // function.
- void Destroy();
-
- // NPAPI bindings.
- static NPObject *Allocate(NPP npp, NPClass *npclass);
- static void Deallocate(NPObject *object);
- static bool HasMethod(NPObject *header, NPIdentifier name);
- static bool Invoke(NPObject *header, NPIdentifier name,
- const NPVariant *args, uint32_t argCount,
- NPVariant *result);
- static bool InvokeDefault(NPObject *header, const NPVariant *args,
- uint32_t argCount, NPVariant *result);
- static bool HasProperty(NPObject *header, NPIdentifier name);
- static bool GetProperty(NPObject *header, NPIdentifier name,
- NPVariant *variant);
- static bool SetProperty(NPObject *header, NPIdentifier name,
- const NPVariant *variant);
- static bool Enumerate(NPObject *header, NPIdentifier **value,
- uint32_t *count);
-
-#ifdef OS_WIN
- static DWORD WINAPI ThreadMain(void *param) {
- static_cast<Plugin *>(param)->DoThread();
- return 0;
- }
-#endif
- // Executes the main renderer thread.
- void DoThread();
-
- NPP npp_;
- static NPClass class_;
- NPIdentifier create_id_;
- NPIdentifier destroy_id_;
- NPIdentifier handle_id_;
-
-#ifdef OS_WIN
- HWND hwnd_;
- HANDLE thread_;
- DWORD thread_id_;
-#endif
-
- nacl::HtpHandle handle_;
- scoped_ptr<GAPIInterface> gapi_;
-};
-
-
-Plugin::Plugin(NPP npp)
- : npp_(npp),
-#ifdef OS_WIN
- hwnd_(NULL),
- thread_(NULL),
- thread_id_(0),
-#endif
- handle_(nacl::kInvalidHtpHandle) {
- const char *names[3] = {"create", "destroy", "handle"};
- NPIdentifier ids[3];
- NPN_GetStringIdentifiers(names, 3, ids);
- create_id_ = ids[0];
- destroy_id_ = ids[1];
- handle_id_ = ids[2];
-}
-
-Plugin::~Plugin() {
- if (gapi_.get()) Destroy();
-}
-
-NPError Plugin::SetWindow(NPWindow *window) {
-#ifdef OS_WIN
- HWND hWnd = window ? static_cast<HWND>(window->window) : NULL;
- hwnd_ = hWnd;
- return NPERR_NO_ERROR;
-#endif // OS_WIN
-}
-
-// Creates the renderer. This spawns a thread that answers requests (the D3D
-// context is created in that other thread, so that we don't need to enable
-// multi-threading on it).
-void Plugin::Create(nacl::HtpHandle handle) {
- if (gapi_.get()) return;
- handle_ = handle;
-#ifdef CB_SERVICE_D3D9
- if (!hwnd_) return;
- GAPID3D9 *gapi_d3d = new GAPID3D9;
- gapi_d3d->set_hwnd(hwnd_);
- gapi_.reset(gapi_d3d);
- // TODO: use chrome/base threads.
- thread_ = ::CreateThread(NULL, 0, ThreadMain, this, 0, &thread_id_);
-#endif
-}
-
-// Destroys the renderer. This terminates the renderer thread, and waits until
-// it is finished.
-void Plugin::Destroy() {
- if (!gapi_.get()) return;
-#ifdef OS_WIN
- ::PostThreadMessage(thread_id_, WM_USER, 0, 0);
- ::WaitForSingleObject(thread_, INFINITE);
- ::CloseHandle(thread_);
-#endif
- gapi_.reset(NULL);
-}
-
-// Executes the main renderer thread: answers requests, executes commands.
-void Plugin::DoThread() {
- scoped_ptr<GAPIDecoder> decoder(new GAPIDecoder(gapi_.get()));
- scoped_ptr<CommandBufferEngine> engine(
- new CommandBufferEngine(decoder.get()));
- decoder->set_engine(engine.get());
-
- IMCMessageProcessor processor(handle_, engine->rpc_impl());
- engine->set_process_interface(&processor);
- IMCSender sender(handle_);
- engine->set_client_rpc(&sender);
-
- gapi_->Initialize();
- while (true) {
- bool done = false;
-#ifdef OS_WIN
- MSG msg;
- while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- ::TranslateMessage(&msg);
- ::DispatchMessage(&msg);
- if (msg.message == WM_USER) {
- done = true;
- break;
- }
- }
-#endif
- if (done) break;
- // NOTE: DoWork will block when there is nothing to do. This can be an
- // issue at termination if the browser tries to kill the plug-in before the
- // NaCl module, because then this thread won't terminate, and it will block
- // the main (browser) thread. Workaround: kill the NaCl module (kill the
- // sel_ldr window).
- // TODO: Fix this. It needs select()/poll() or a timeout in the
- // IMC library, and that doesn't exist currently. We could use non-blocking,
- // e.g. HasWork() and sleep if there is nothing to do, but that would
- // translate into unacceptable latencies - 10ms per call.
- if (!engine->DoWork()) break;
- }
- gapi_->Destroy();
-}
-
-NPClass Plugin::class_ = {
- NP_CLASS_STRUCT_VERSION,
- Plugin::Allocate,
- Plugin::Deallocate,
- 0,
- Plugin::HasMethod,
- Plugin::Invoke,
- 0,
- Plugin::HasProperty,
- Plugin::GetProperty,
- Plugin::SetProperty,
- 0,
- Plugin::Enumerate,
-};
-
-NPObject *Plugin::Allocate(NPP npp, NPClass *npclass) {
- return new Plugin(npp);
-}
-
-void Plugin::Deallocate(NPObject *object) {
- delete static_cast<Plugin *>(object);
-}
-
-bool Plugin::HasMethod(NPObject *header, NPIdentifier name) {
- Plugin *plugin = static_cast<Plugin *>(header);
- // 2 methods supported: create(handle) and destroy().
- return (name == plugin->create_id_ ||
- name == plugin->destroy_id_);
-}
-
-bool Plugin::Invoke(NPObject *header, NPIdentifier name,
- const NPVariant *args, uint32_t argCount,
- NPVariant *result) {
- Plugin *plugin = static_cast<Plugin *>(header);
- VOID_TO_NPVARIANT(*result);
- if (name == plugin->create_id_ && argCount == 1 &&
- NPVARIANT_IS_OBJECT(args[0])) {
- // create(handle) was called.
- //
- // Temporary ugly hack: the NPObject is a wrapper around a HtpHandle, but
- // to get that handle we need to get the "handle" property on it which is a
- // string that represents the address in memory of that HtpHandle.
- NPObject *object = NPVARIANT_TO_OBJECT(args[0]);
-
- NPVariant handle_prop;
- bool result = NPN_GetProperty(plugin->npp_, object, plugin->handle_id_,
- &handle_prop);
- if (!result || !NPVARIANT_IS_STRING(handle_prop))
- return false;
- String handle_string(NPVARIANT_TO_STRING(handle_prop).utf8characters,
- NPVARIANT_TO_STRING(handle_prop).utf8length);
- intptr_t handle_value = strtol(handle_string.c_str(), NULL, 0);
- nacl::HtpHandle handle = reinterpret_cast<nacl::HtpHandle>(handle_value);
- plugin->Create(handle);
- return true;
- } else if (name == plugin->destroy_id_ && argCount == 0) {
- // destroy() was called.
- plugin->Destroy();
- return true;
- } else {
- return false;
- }
-}
-
-bool Plugin::InvokeDefault(NPObject *header, const NPVariant *args,
- uint32_t argCount, NPVariant *result) {
- return false;
-}
-
-bool Plugin::HasProperty(NPObject *header, NPIdentifier name) {
- return false;
-}
-
-bool Plugin::GetProperty(NPObject *header, NPIdentifier name,
- NPVariant *variant) {
- return false;
-}
-
-bool Plugin::SetProperty(NPObject *header, NPIdentifier name,
- const NPVariant *variant) {
- return false;
-}
-
-bool Plugin::Enumerate(NPObject *header, NPIdentifier **value,
- uint32_t *count) {
- Plugin *plugin = static_cast<Plugin *>(header);
- *count = 2;
- NPIdentifier *ids = static_cast<NPIdentifier *>(
- NPN_MemAlloc(*count * sizeof(NPIdentifier)));
- ids[0] = plugin->create_id_;
- ids[1] = plugin->destroy_id_;
- *value = ids;
- return true;
-}
-
-} // namespace command_buffer
-} // namespace o3d
-
-using o3d::command_buffer::Plugin;
-
-extern "C" {
-// NPAPI entry points.
-
-char *NP_GetMIMEDescription(void) {
- return "application/vnd.cmdbuf::CommandBuffer MIME";
-}
-
-NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs) {
- NPError retval = InitializeNPNApi(browserFuncs);
- if (retval != NPERR_NO_ERROR) return retval;
- return NPERR_NO_ERROR;
-}
-
-NPError OSCALL NP_GetEntryPoints(NPPluginFuncs *pluginFuncs) {
- pluginFuncs->version = 11;
- pluginFuncs->size = sizeof(pluginFuncs);
- pluginFuncs->newp = NPP_New;
- pluginFuncs->destroy = NPP_Destroy;
- pluginFuncs->setwindow = NPP_SetWindow;
- pluginFuncs->newstream = NPP_NewStream;
- pluginFuncs->destroystream = NPP_DestroyStream;
- pluginFuncs->asfile = NPP_StreamAsFile;
- pluginFuncs->writeready = NPP_WriteReady;
- pluginFuncs->write = NPP_Write;
- pluginFuncs->print = NPP_Print;
- pluginFuncs->event = NPP_HandleEvent;
- pluginFuncs->urlnotify = NPP_URLNotify;
- pluginFuncs->getvalue = NPP_GetValue;
- pluginFuncs->setvalue = NPP_SetValue;
-
- return NPERR_NO_ERROR;
-}
-
-NPError OSCALL NP_Shutdown(void) {
- return NPERR_NO_ERROR;
-}
-
-// Creates a plugin instance.
-NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc,
- char *argn[], char *argv[], NPSavedData *saved) {
- NPObject *object = NPN_CreateObject(instance, Plugin::GetNPClass());
- if (object == NULL) {
- return NPERR_OUT_OF_MEMORY_ERROR;
- }
- instance->pdata = object;
- return NPERR_NO_ERROR;
-}
-
-// Destroys a plugin instance.
-NPError NPP_Destroy(NPP instance, NPSavedData **save) {
- Plugin *obj = static_cast<Plugin*>(instance->pdata);
- if (obj) {
- obj->SetWindow(NULL);
- NPN_ReleaseObject(obj);
- instance->pdata = NULL;
- }
-
- return NPERR_NO_ERROR;
-}
-
-// Sets the window used by the plugin instance.
-NPError NPP_SetWindow(NPP instance, NPWindow *window) {
- Plugin *obj = static_cast<Plugin*>(instance->pdata);
- obj->SetWindow(window);
- return NPERR_NO_ERROR;
-}
-
-// Gets the scriptable object for the plug-in instance.
-NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value) {
- switch (variable) {
- case NPPVpluginScriptableNPObject: {
- void **v = static_cast<void **>(value);
- Plugin *obj = static_cast<Plugin*>(instance->pdata);
- NPN_RetainObject(obj);
- *v = obj;
- return NPERR_NO_ERROR;
- }
- default:
- break;
- }
- return NPERR_GENERIC_ERROR;
-}
-
-NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream,
- NPBool seekable, uint16 *stype) {
- return NPERR_NO_ERROR;
-}
-
-NPError NPP_DestroyStream(NPP instance, NPStream *stream, NPReason reason) {
- return NPERR_NO_ERROR;
-}
-
-int32 NPP_WriteReady(NPP instance, NPStream *stream) {
- return 4096;
-}
-
-int32 NPP_Write(NPP instance, NPStream *stream, int32 offset, int32 len,
- void *buffer) {
- return len;
-}
-
-void NPP_StreamAsFile(NPP instance, NPStream *stream, const char *fname) {
-}
-
-void NPP_Print(NPP instance, NPPrint *platformPrint) {
-}
-
-int16 NPP_HandleEvent(NPP instance, void *event) {
- return 0;
-}
-
-void NPP_URLNotify(NPP instance, const char *url, NPReason reason,
- void *notifyData) {
-}
-
-NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value) {
- return NPERR_GENERIC_ERROR;
-}
-} // extern "C"
diff --git a/o3d/command_buffer/service/win/big_test_main.cc b/o3d/command_buffer/service/win/big_test_main.cc
deleted file mode 100644
index a88dc2d..0000000
--- a/o3d/command_buffer/service/win/big_test_main.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-#include <windows.h>
-#include <Shellapi.h>
-#include "command_buffer/service/cross/big_test_helpers.h"
-
-#if defined(CB_SERVICE_D3D9)
-#include "command_buffer/service/win/d3d9/gapi_d3d9.h"
-#elif defined(CB_SERVICE_GL)
-#include "command_buffer/service/cross/gl/gapi_gl.h"
-#endif
-
-#include "core/cross/types.h"
-
-namespace o3d {
-namespace command_buffer {
-
-String *g_program_path = NULL;
-GAPIInterface *g_gapi = NULL;
-
-class Thread {
- public:
- Thread(ThreadFunc func, void *data)
- : handle_(NULL),
- func_(func),
- data_(data) {
- }
-
- ~Thread() {}
-
- HANDLE handle() const { return handle_; }
- void set_handle(HANDLE handle) { handle_ = handle; }
-
- void * data() const { return data_; }
- ThreadFunc func() const { return func_; }
-
- private:
- HANDLE handle_;
- ThreadFunc func_;
- void * data_;
-};
-
-DWORD WINAPI ThreadMain(LPVOID lpParam) {
- Thread *thread = static_cast<Thread *>(lpParam);
- ThreadFunc func = thread->func();
- func(thread->data());
- return 0;
-}
-
-Thread *CreateThread(ThreadFunc func, void* param) {
- Thread *thread = new Thread(func, param);
- HANDLE handle = ::CreateThread(NULL, 0, ThreadMain, thread, 0, NULL);
- return thread;
-}
-
-void JoinThread(Thread *thread) {
- ::WaitForSingleObject(thread->handle(), INFINITE);
- ::CloseHandle(thread->handle());
- delete thread;
-}
-
-bool ProcessSystemMessages() {
- MSG msg;
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- if (msg.message == WM_QUIT) {
- return false;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return true;
-}
-
-} // namespace command_buffer
-} // namespace o3d
-
-using o3d::String;
-using o3d::command_buffer::g_program_path;
-using o3d::command_buffer::g_gapi;
-
-#if defined(CB_SERVICE_D3D9)
-using o3d::command_buffer::GAPID3D9;
-#elif defined(CB_SERVICE_GL)
-using o3d::command_buffer::GAPIGL;
-#endif
-
-LRESULT CALLBACK WindowProc(HWND hWnd,
- UINT msg,
- WPARAM wParam,
- LPARAM lParam) {
- switch (msg) {
- case WM_CLOSE:
- PostQuitMessage(0);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, msg, wParam, lParam);
- }
- return 0;
-}
-
-int main(int argc, char *argv[]) {
- WNDCLASSEX wc = {
- sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0L, 0L, GetModuleHandle(NULL),
- NULL, NULL, NULL, NULL, L"O3D big test", NULL
- };
- RegisterClassEx(&wc);
-
- // Create the application's window.
- HWND hWnd = CreateWindow(L"O3D big test", L"O3D Big Test",
- WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300,
- 300, GetDesktopWindow(), NULL, wc.hInstance, NULL);
- UpdateWindow(hWnd);
-
-#if defined(CB_SERVICE_D3D9)
- GAPID3D9 gapi;
-#elif defined(CB_SERVICE_GL)
- GAPIGL gapi;
-#endif
-
- gapi.set_hwnd(hWnd);
- g_gapi = &gapi;
-
- wchar_t program_filename[512];
- GetModuleFileName(NULL, program_filename, sizeof(program_filename));
- program_filename[511] = 0;
-
- String program_path = WideToUTF8(std::wstring(program_filename));
-
- // Remove all characters starting with last '\'.
- size_t backslash_pos = program_path.rfind('\\');
- if (backslash_pos != String::npos) {
- program_path.erase(backslash_pos);
- }
- g_program_path = &program_path;
-
- // Convert the command line arguments to an argc, argv format.
- LPWSTR *arg_list = NULL;
- int arg_count;
- arg_list = CommandLineToArgvW(GetCommandLineW(), &arg_count);
-
- int ret = big_test_main(arg_count, arg_list);
-
- g_gapi = NULL;
- g_program_path = NULL;
- return ret;
-}
diff --git a/o3d/command_buffer/service/win/d3d9/effect_d3d9.cc b/o3d/command_buffer/service/win/d3d9/effect_d3d9.cc
index e2a9720..bb80079 100644
--- a/o3d/command_buffer/service/win/d3d9/effect_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/effect_d3d9.cc
@@ -520,7 +520,7 @@ bool EffectParamD3D9::SetData(GAPID3D9 *gapi,
// Calls EffectD3D9::Create, and assign the result to the resource ID.
// If changing the current effect, dirty it.
-BufferSyncInterface::ParseError GAPID3D9::CreateEffect(
+parse_error::ParseError GAPID3D9::CreateEffect(
ResourceId id,
unsigned int size,
const void *data) {
@@ -536,120 +536,120 @@ BufferSyncInterface::ParseError GAPID3D9::CreateEffect(
&vertex_program_entry,
&fragment_program_entry,
&effect_code)) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
EffectD3D9 * effect = EffectD3D9::Create(this, effect_code,
vertex_program_entry,
fragment_program_entry);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
effects_.Assign(id, effect);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys the Effect resource.
// If destroying the current effect, dirty it.
-BufferSyncInterface::ParseError GAPID3D9::DestroyEffect(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyEffect(ResourceId id) {
if (id == current_effect_id_) DirtyEffect();
return effects_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Sets the current effect ID, dirtying the current effect.
-BufferSyncInterface::ParseError GAPID3D9::SetEffect(ResourceId id) {
+parse_error::ParseError GAPID3D9::SetEffect(ResourceId id) {
DirtyEffect();
current_effect_id_ = id;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Gets the param count from the effect and store it in the memory buffer.
-BufferSyncInterface::ParseError GAPID3D9::GetParamCount(
+parse_error::ParseError GAPID3D9::GetParamCount(
ResourceId id,
unsigned int size,
void *data) {
EffectD3D9 *effect = effects_.Get(id);
if (!effect || size < sizeof(Uint32)) // NOLINT
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
*static_cast<Uint32 *>(data) = effect->GetParamCount();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::CreateParam(
+parse_error::ParseError GAPID3D9::CreateParam(
ResourceId param_id,
ResourceId effect_id,
unsigned int index) {
EffectD3D9 *effect = effects_.Get(effect_id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
EffectParamD3D9 *param = effect->CreateParam(index);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
effect_params_.Assign(param_id, param);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::CreateParamByName(
+parse_error::ParseError GAPID3D9::CreateParamByName(
ResourceId param_id,
ResourceId effect_id,
unsigned int size,
const void *name) {
EffectD3D9 *effect = effects_.Get(effect_id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
std::string string_name(static_cast<const char *>(name), size);
EffectParamD3D9 *param = effect->CreateParamByName(string_name.c_str());
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
effect_params_.Assign(param_id, param);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::DestroyParam(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyParam(ResourceId id) {
return effect_params_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPID3D9::SetParamData(
+parse_error::ParseError GAPID3D9::SetParamData(
ResourceId id,
unsigned int size,
const void *data) {
EffectParamD3D9 *param = effect_params_.Get(id);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
return param->SetData(this, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPID3D9::GetParamDesc(
+parse_error::ParseError GAPID3D9::GetParamDesc(
ResourceId id,
unsigned int size,
void *data) {
EffectParamD3D9 *param = effect_params_.Get(id);
- if (!param) return BufferSyncInterface::kParseInvalidArguments;
+ if (!param) return parse_error::kParseInvalidArguments;
return param->GetDesc(size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Gets the stream count from the effect and stores it in the memory buffer.
-BufferSyncInterface::ParseError GAPID3D9::GetStreamCount(
+parse_error::ParseError GAPID3D9::GetStreamCount(
ResourceId id,
unsigned int size,
void *data) {
EffectD3D9 *effect = effects_.Get(id);
if (!effect || size < sizeof(Uint32)) // NOLINT
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
*static_cast<Uint32 *>(data) = effect->GetStreamCount();
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::GetStreamDesc(
+parse_error::ParseError GAPID3D9::GetStreamDesc(
ResourceId id,
unsigned int index,
unsigned int size,
void *data) {
EffectD3D9 *effect = effects_.Get(id);
- if (!effect) return BufferSyncInterface::kParseInvalidArguments;
+ if (!effect) return parse_error::kParseInvalidArguments;
return effect->GetStreamDesc(index, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
diff --git a/o3d/command_buffer/service/win/d3d9/gapi_d3d9.cc b/o3d/command_buffer/service/win/d3d9/gapi_d3d9.cc
index df9cb46..79ada6f 100644
--- a/o3d/command_buffer/service/win/d3d9/gapi_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/gapi_d3d9.cc
@@ -239,10 +239,10 @@ static unsigned int RGBAToARGB(unsigned int rgba) {
}
// Sets the current VertexStruct. Just keep track of the ID.
-BufferSyncInterface::ParseError GAPID3D9::SetVertexStruct(ResourceId id) {
+parse_error::ParseError GAPID3D9::SetVertexStruct(ResourceId id) {
current_vertex_struct_ = id;
validate_streams_ = true;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
bool GAPID3D9::FindDirect3DFunctions() {
@@ -330,32 +330,32 @@ static D3DPRIMITIVETYPE D3DPrimitive(
}
// Draws with the current vertex struct.
-BufferSyncInterface::ParseError GAPID3D9::Draw(
+parse_error::ParseError GAPID3D9::Draw(
PrimitiveType primitive_type,
unsigned int first,
unsigned int count) {
if (validate_streams_ && !ValidateStreams()) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if (validate_effect_ && !ValidateEffect()) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
DCHECK(current_effect_);
if (!current_effect_->CommitParameters()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if (first + count > max_vertices_) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
HR(d3d_device_->DrawPrimitive(D3DPrimitive(primitive_type), first, count));
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Draws with the current vertex struct.
-BufferSyncInterface::ParseError GAPID3D9::DrawIndexed(
+parse_error::ParseError GAPID3D9::DrawIndexed(
PrimitiveType primitive_type,
ResourceId index_buffer_id,
unsigned int first,
@@ -363,29 +363,29 @@ BufferSyncInterface::ParseError GAPID3D9::DrawIndexed(
unsigned int min_index,
unsigned int max_index) {
IndexBufferD3D9 *index_buffer = index_buffers_.Get(index_buffer_id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
if (validate_streams_ && !ValidateStreams()) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if (validate_effect_ && !ValidateEffect()) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
DCHECK(current_effect_);
if (!current_effect_->CommitParameters()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
if ((min_index >= max_vertices_) || (max_index > max_vertices_)) {
// TODO: add proper error management
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
HR(d3d_device_->SetIndices(index_buffer->d3d_index_buffer()));
HR(d3d_device_->DrawIndexedPrimitive(D3DPrimitive(primitive_type), 0,
min_index, max_index - min_index + 1,
first, count));
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/win/d3d9/geometry_d3d9.cc b/o3d/command_buffer/service/win/d3d9/geometry_d3d9.cc
index 0123d49..7674585 100644
--- a/o3d/command_buffer/service/win/d3d9/geometry_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/geometry_d3d9.cc
@@ -309,112 +309,112 @@ void VertexStructD3D9::Compile(IDirect3DDevice9 *d3d_device) {
}
// Creates and assigns a VertexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateVertexBuffer(
+parse_error::ParseError GAPID3D9::CreateVertexBuffer(
ResourceId id,
unsigned int size,
unsigned int flags) {
VertexBufferD3D9 *vertex_buffer = new VertexBufferD3D9(size, flags);
vertex_buffer->Create(this);
vertex_buffers_.Assign(id, vertex_buffer);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys a VertexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::DestroyVertexBuffer(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyVertexBuffer(ResourceId id) {
return vertex_buffers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data into the VertexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::SetVertexBufferData(
+parse_error::ParseError GAPID3D9::SetVertexBufferData(
ResourceId id,
unsigned int offset,
unsigned int size,
const void *data) {
VertexBufferD3D9 *vertex_buffer = vertex_buffers_.Get(id);
- if (!vertex_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!vertex_buffer) return parse_error::kParseInvalidArguments;
return vertex_buffer->SetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data from the VertexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::GetVertexBufferData(
+parse_error::ParseError GAPID3D9::GetVertexBufferData(
ResourceId id,
unsigned int offset,
unsigned int size,
void *data) {
VertexBufferD3D9 *vertex_buffer = vertex_buffers_.Get(id);
- if (!vertex_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!vertex_buffer) return parse_error::kParseInvalidArguments;
return vertex_buffer->GetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Creates and assigns an IndexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateIndexBuffer(
+parse_error::ParseError GAPID3D9::CreateIndexBuffer(
ResourceId id,
unsigned int size,
unsigned int flags) {
IndexBufferD3D9 *index_buffer = new IndexBufferD3D9(size, flags);
index_buffer->Create(this);
index_buffers_.Assign(id, index_buffer);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys an IndexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::DestroyIndexBuffer(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyIndexBuffer(ResourceId id) {
return index_buffers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data into the IndexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::SetIndexBufferData(
+parse_error::ParseError GAPID3D9::SetIndexBufferData(
ResourceId id,
unsigned int offset,
unsigned int size,
const void *data) {
IndexBufferD3D9 *index_buffer = index_buffers_.Get(id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
return index_buffer->SetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data from the IndexBufferD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::GetIndexBufferData(
+parse_error::ParseError GAPID3D9::GetIndexBufferData(
ResourceId id,
unsigned int offset,
unsigned int size,
void *data) {
IndexBufferD3D9 *index_buffer = index_buffers_.Get(id);
- if (!index_buffer) return BufferSyncInterface::kParseInvalidArguments;
+ if (!index_buffer) return parse_error::kParseInvalidArguments;
return index_buffer->GetData(offset, size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Creates and assigns a VertexStructD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateVertexStruct(
+parse_error::ParseError GAPID3D9::CreateVertexStruct(
ResourceId id, unsigned int input_count) {
if (id == current_vertex_struct_) validate_streams_ = true;
VertexStructD3D9 *vertex_struct = new VertexStructD3D9(input_count);
vertex_structs_.Assign(id, vertex_struct);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys a VertexStructD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::DestroyVertexStruct(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyVertexStruct(ResourceId id) {
if (id == current_vertex_struct_) validate_streams_ = true;
return vertex_structs_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Sets an input into a VertexStructD3D9 resource.
-BufferSyncInterface::ParseError GAPID3D9::SetVertexInput(
+parse_error::ParseError GAPID3D9::SetVertexInput(
ResourceId vertex_struct_id,
unsigned int input_index,
ResourceId vertex_buffer_id,
@@ -426,10 +426,10 @@ BufferSyncInterface::ParseError GAPID3D9::SetVertexInput(
if (vertex_buffer_id == current_vertex_struct_) validate_streams_ = true;
VertexStructD3D9 *vertex_struct = vertex_structs_.Get(vertex_struct_id);
if (!vertex_struct || input_index >= vertex_struct->count())
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
vertex_struct->SetInput(input_index, vertex_buffer_id, offset, stride, type,
semantic, semantic_index);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/win/d3d9/render_surface_d3d9.cc b/o3d/command_buffer/service/win/d3d9/render_surface_d3d9.cc
index bf2281f..8141edd 100644
--- a/o3d/command_buffer/service/win/d3d9/render_surface_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/render_surface_d3d9.cc
@@ -127,7 +127,7 @@ RenderDepthStencilSurfaceD3D9* RenderDepthStencilSurfaceD3D9::Create(
// GAPI Interface functions ---------------------------------------------------
// Copies the data from a texture resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateRenderSurface(
+parse_error::ParseError GAPID3D9::CreateRenderSurface(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -136,11 +136,11 @@ BufferSyncInterface::ParseError GAPID3D9::CreateRenderSurface(
ResourceId texture_id) {
if (id == current_surface_id_) {
// This will delete the current surface which would be bad.
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
TextureD3D9 *texture = textures_.Get(texture_id);
if (!texture->render_surfaces_enabled()) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
} else {
RenderSurfaceD3D9 *render_surface = RenderSurfaceD3D9::Create(this,
width,
@@ -149,49 +149,49 @@ BufferSyncInterface::ParseError GAPID3D9::CreateRenderSurface(
side,
texture);
if (render_surface == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
render_surfaces_.Assign(id, render_surface);
}
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::DestroyRenderSurface(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyRenderSurface(ResourceId id) {
if (id == current_surface_id_) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
return render_surfaces_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPID3D9::CreateDepthSurface(
+parse_error::ParseError GAPID3D9::CreateDepthSurface(
ResourceId id,
unsigned int width,
unsigned int height) {
if (id == current_depth_surface_id_) {
// This will delete the current surface which would be bad.
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
RenderDepthStencilSurfaceD3D9 *depth_surface =
RenderDepthStencilSurfaceD3D9::Create(this, width, height);
if (depth_surface == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
depth_surfaces_.Assign(id, depth_surface);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::DestroyDepthSurface(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyDepthSurface(ResourceId id) {
if (id == current_depth_surface_id_) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
return depth_surfaces_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPID3D9::SetRenderSurface(
+parse_error::ParseError GAPID3D9::SetRenderSurface(
ResourceId render_surface_id,
ResourceId depth_stencil_id) {
RenderSurfaceD3D9 *d3d_render_surface =
@@ -200,7 +200,7 @@ BufferSyncInterface::ParseError GAPID3D9::SetRenderSurface(
depth_surfaces_.Get(depth_stencil_id);
if (d3d_render_surface == NULL && d3d_render_depth_surface == NULL) {
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
}
IDirect3DSurface9 *d3d_surface =
@@ -215,7 +215,7 @@ BufferSyncInterface::ParseError GAPID3D9::SetRenderSurface(
HR(device->SetDepthStencilSurface(d3d_depth_surface));
current_surface_id_ = render_surface_id;
current_depth_surface_id_ = depth_stencil_id;
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
void GAPID3D9::SetBackSurfaces() {
diff --git a/o3d/command_buffer/service/win/d3d9/sampler_d3d9.cc b/o3d/command_buffer/service/win/d3d9/sampler_d3d9.cc
index 1e9be7b..3823aae 100644
--- a/o3d/command_buffer/service/win/d3d9/sampler_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/sampler_d3d9.cc
@@ -134,24 +134,24 @@ void SamplerD3D9::SetBorderColor(const RGBA &color) {
d3d_border_color_ = RGBAToD3DCOLOR(color);
}
-BufferSyncInterface::ParseError GAPID3D9::CreateSampler(
+parse_error::ParseError GAPID3D9::CreateSampler(
ResourceId id) {
// Dirty effect, because this sampler id may be used
DirtyEffect();
samplers_.Assign(id, new SamplerD3D9());
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Destroys the Sampler resource.
-BufferSyncInterface::ParseError GAPID3D9::DestroySampler(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroySampler(ResourceId id) {
// Dirty effect, because this sampler id may be used
DirtyEffect();
return samplers_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
-BufferSyncInterface::ParseError GAPID3D9::SetSamplerStates(
+parse_error::ParseError GAPID3D9::SetSamplerStates(
ResourceId id,
sampler::AddressingMode addressing_u,
sampler::AddressingMode addressing_v,
@@ -162,36 +162,36 @@ BufferSyncInterface::ParseError GAPID3D9::SetSamplerStates(
unsigned int max_anisotropy) {
SamplerD3D9 *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used
DirtyEffect();
sampler->SetStates(addressing_u, addressing_v, addressing_w,
mag_filter, min_filter, mip_filter, max_anisotropy);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::SetSamplerBorderColor(
+parse_error::ParseError GAPID3D9::SetSamplerBorderColor(
ResourceId id,
const RGBA &color) {
SamplerD3D9 *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used
DirtyEffect();
sampler->SetBorderColor(color);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
-BufferSyncInterface::ParseError GAPID3D9::SetSamplerTexture(
+parse_error::ParseError GAPID3D9::SetSamplerTexture(
ResourceId id,
ResourceId texture_id) {
SamplerD3D9 *sampler = samplers_.Get(id);
if (!sampler)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
// Dirty effect, because this sampler id may be used
DirtyEffect();
sampler->SetTexture(texture_id);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
diff --git a/o3d/command_buffer/service/win/d3d9/texture_d3d9.cc b/o3d/command_buffer/service/win/d3d9/texture_d3d9.cc
index 4e55edb..f9c235a 100644
--- a/o3d/command_buffer/service/win/d3d9/texture_d3d9.cc
+++ b/o3d/command_buffer/service/win/d3d9/texture_d3d9.cc
@@ -611,16 +611,16 @@ bool TextureCubeD3D9::CreateRenderSurface(
// GAPID3D9 functions.
// Destroys a texture resource.
-BufferSyncInterface::ParseError GAPID3D9::DestroyTexture(ResourceId id) {
+parse_error::ParseError GAPID3D9::DestroyTexture(ResourceId id) {
// Dirty effect, because this texture id may be used
DirtyEffect();
return textures_.Destroy(id) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Creates a 2D texture resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateTexture2D(
+parse_error::ParseError GAPID3D9::CreateTexture2D(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -631,15 +631,15 @@ BufferSyncInterface::ParseError GAPID3D9::CreateTexture2D(
Texture2DD3D9 *texture = Texture2DD3D9::Create(this, width, height, levels,
format, flags,
enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Creates a 3D texture resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateTexture3D(
+parse_error::ParseError GAPID3D9::CreateTexture3D(
ResourceId id,
unsigned int width,
unsigned int height,
@@ -651,15 +651,15 @@ BufferSyncInterface::ParseError GAPID3D9::CreateTexture3D(
Texture3DD3D9 *texture = Texture3DD3D9::Create(this, width, height, depth,
levels, format, flags,
enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Creates a cube map texture resource.
-BufferSyncInterface::ParseError GAPID3D9::CreateTextureCube(
+parse_error::ParseError GAPID3D9::CreateTextureCube(
ResourceId id,
unsigned int side,
unsigned int levels,
@@ -669,15 +669,15 @@ BufferSyncInterface::ParseError GAPID3D9::CreateTextureCube(
TextureCubeD3D9 *texture = TextureCubeD3D9::Create(this, side, levels,
format, flags,
enable_render_surfaces);
- if (!texture) return BufferSyncInterface::kParseInvalidArguments;
+ if (!texture) return parse_error::kParseInvalidArguments;
// Dirty effect, because this texture id may be used
DirtyEffect();
textures_.Assign(id, texture);
- return BufferSyncInterface::kParseNoError;
+ return parse_error::kParseNoError;
}
// Copies the data into a texture resource.
-BufferSyncInterface::ParseError GAPID3D9::SetTextureData(
+parse_error::ParseError GAPID3D9::SetTextureData(
ResourceId id,
unsigned int x,
unsigned int y,
@@ -693,16 +693,16 @@ BufferSyncInterface::ParseError GAPID3D9::SetTextureData(
const void *data) {
TextureD3D9 *texture = textures_.Get(id);
if (!texture)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
Volume volume = {x, y, z, width, height, depth};
return texture->SetData(this, volume, level, face, row_pitch, slice_pitch,
size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
// Copies the data from a texture resource.
-BufferSyncInterface::ParseError GAPID3D9::GetTextureData(
+parse_error::ParseError GAPID3D9::GetTextureData(
ResourceId id,
unsigned int x,
unsigned int y,
@@ -718,12 +718,12 @@ BufferSyncInterface::ParseError GAPID3D9::GetTextureData(
void *data) {
TextureD3D9 *texture = textures_.Get(id);
if (!texture)
- return BufferSyncInterface::kParseInvalidArguments;
+ return parse_error::kParseInvalidArguments;
Volume volume = {x, y, z, width, height, depth};
return texture->GetData(this, volume, level, face, row_pitch, slice_pitch,
size, data) ?
- BufferSyncInterface::kParseNoError :
- BufferSyncInterface::kParseInvalidArguments;
+ parse_error::kParseNoError :
+ parse_error::kParseInvalidArguments;
}
} // namespace command_buffer
diff --git a/o3d/command_buffer/service/win/plugin.def b/o3d/command_buffer/service/win/plugin.def
deleted file mode 100644
index 292cf78..0000000
--- a/o3d/command_buffer/service/win/plugin.def
+++ /dev/null
@@ -1,6 +0,0 @@
-LIBRARY npo3d_cb_plugin
-
-EXPORTS
- NP_GetEntryPoints @1
- NP_Initialize @2
- NP_Shutdown @3
diff --git a/o3d/command_buffer/service/win/plugin.rc b/o3d/command_buffer/service/win/plugin.rc
deleted file mode 100644
index 393668e..0000000
--- a/o3d/command_buffer/service/win/plugin.rc
+++ /dev/null
@@ -1,100 +0,0 @@
-// Microsoft Visual C++ generated resource script.
-//
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// English (U.S.) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
-#ifdef _WIN32
-LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Version
-//
-
-VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,0,0,1
- PRODUCTVERSION 0,0,0,1
- FILEFLAGSMASK 0x17L
-#ifdef _DEBUG
- FILEFLAGS 0x1L
-#else
- FILEFLAGS 0x0L
-#endif
- FILEOS 0x4L
- FILETYPE 0x2L
- FILESUBTYPE 0x0L
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040904e4"
- BEGIN
- VALUE "FileDescription", "CommandBuffer SRV Plugin"
- VALUE "FileVersion", "0,0,0,1"
- VALUE "InternalName", ""
- VALUE "LegalCopyright", "Copyright (C) 2008"
- VALUE "MIMEType", "application/vnd.cmdbuf"
- VALUE "OriginalFilename", "npo3d_cb_plugin.dll"
- VALUE "ProductName", "CommandBuffer SRV Plugin"
- VALUE "ProductVersion", "0,0,0,1"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 0x409, 1252
- END
-END
-
-#endif // English (U.S.) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
diff --git a/o3d/core/build.scons b/o3d/core/build.scons
index bb7217e..62e803e 100644
--- a/o3d/core/build.scons
+++ b/o3d/core/build.scons
@@ -175,29 +175,11 @@ elif 'RENDERER_GL' in env['CPPDEFINES'] :
'cross/gl/utils_gl.cc',
"cross/gl/sampler_gl.cc",
]
-elif 'RENDERER_CB' in env['CPPDEFINES'] :
- platform_inputs += [
- 'cross/command_buffer/buffer_cb.cc',
- 'cross/command_buffer/effect_cb.cc',
- 'cross/command_buffer/install_check.cc',
- 'cross/command_buffer/param_cache_cb.cc',
- 'cross/command_buffer/primitive_cb.cc',
- 'cross/command_buffer/renderer_cb.cc',
- 'cross/command_buffer/render_surface_cb.cc',
- 'cross/command_buffer/sampler_cb.cc',
- 'cross/command_buffer/states_cb.cc',
- 'cross/command_buffer/stream_bank_cb.cc',
- 'cross/command_buffer/texture_cb.cc',
- ]
- if env['TARGET_PLATFORM'] == 'WINDOWS':
- platform_inputs += [
- 'win/command_buffer/win32_cb_server.cc',
- ]
elif 'RENDERER_MOCK' in env['CPPDEFINES'] :
platform_inputs += [ ]
else :
print 'No renderer defined, exiting.\n'
- print """Add 'RENDERER=gl', 'RENDERER=d3d' or 'RENDERER=cb' to the command line."""
+ print """Add 'RENDERER=gl' or 'RENDERER=d3d' to the command line."""
Exit(1)
if env['TARGET_PLATFORM'] == 'MAC':
diff --git a/o3d/core/core.gyp b/o3d/core/core.gyp
index e4bc0f4..9216f36 100644
--- a/o3d/core/core.gyp
+++ b/o3d/core/core.gyp
@@ -318,8 +318,6 @@
'type': 'static_library',
'dependencies': [
'../../skia/skia.gyp:skia',
- '../command_buffer/command_buffer.gyp:command_buffer_client',
- '../command_buffer/command_buffer.gyp:command_buffer_service',
],
'sources': [
],
@@ -396,6 +394,16 @@
],
['renderer == "cb"',
{
+ 'dependencies': [
+ '../command_buffer/command_buffer.gyp:command_buffer_client',
+ '../command_buffer/command_buffer.gyp:command_buffer_service',
+ '../gpu_plugin/gpu_plugin.gyp:np_utils',
+
+ # These dependencies is only needed for RendererCBLocal. They can
+ # be removed when RendererCBLocal is not needed.
+ '../gpu_plugin/gpu_plugin.gyp:command_buffer',
+ '../gpu_plugin/gpu_plugin.gyp:np_utils',
+ ],
'sources': [
'cross/command_buffer/buffer_cb.cc',
'cross/command_buffer/buffer_cb.h',
@@ -422,14 +430,6 @@
],
},
],
- ['renderer == "cb" and OS == "win"',
- {
- 'sources': [
- 'win/command_buffer/win32_cb_server.cc',
- 'win/command_buffer/win32_cb_server.h',
- ],
- },
- ],
],
},
{
diff --git a/o3d/command_buffer/common/cross/buffer_sync_api.cc b/o3d/core/cross/command_buffer/display_window_cb.h
index 6679108..52cd08a 100644
--- a/o3d/command_buffer/common/cross/buffer_sync_api.cc
+++ b/o3d/core/cross/command_buffer/display_window_cb.h
@@ -30,14 +30,61 @@
*/
-#include "command_buffer/common/cross/buffer_sync_api.h"
+#ifndef O3D_CORE_WIN_DISPLAY_WINDOW_CB_H_
+#define O3D_CORE_WIN_DISPLAY_WINDOW_CB_H_
+
+#include "core/cross/display_window.h"
+#include "gpu_plugin/np_utils/np_object_pointer.h"
namespace o3d {
-namespace command_buffer {
-#ifndef COMPILER_MSVC
-const unsigned int BufferSyncInterface::kInvalidSharedMemoryId;
-#endif
+// DisplayWindow subclass without information needed to connect to and use
+// an out-of-process command buffer renderer.
+class DisplayWindowCB : public DisplayWindow {
+ public:
+ DisplayWindowCB() : npp_(NULL), width_(0), height_(0) {}
+ virtual ~DisplayWindowCB() {}
+
+ NPP npp() const {
+ return npp_;
+ }
+
+ void set_npp(NPP npp) {
+ npp_ = npp;
+ }
+
+ gpu_plugin::NPObjectPointer<NPObject> command_buffer() const {
+ return command_buffer_;
+ }
+
+ void set_command_buffer(
+ const gpu_plugin::NPObjectPointer<NPObject> command_buffer) {
+ command_buffer_ = command_buffer;
+ }
+
+ int width() const {
+ return width_;
+ }
+
+ void set_width(int width) {
+ width_ = width;
+ }
+
+ int height() const {
+ return height_;
+ }
+
+ void set_height(int height) {
+ height_ = height;
+ }
+
+ private:
+ NPP npp_;
+ gpu_plugin::NPObjectPointer<NPObject> command_buffer_;
+ int width_;
+ int height_;
+ DISALLOW_COPY_AND_ASSIGN(DisplayWindowCB);
+};
+} // end namespace o3d
-} // namespace command_buffer
-} // namespace o3d
+#endif // O3D_CORE_WIN_DISPLAY_WINDOW_CB_H_
diff --git a/o3d/core/cross/command_buffer/effect_cb.cc b/o3d/core/cross/command_buffer/effect_cb.cc
index b69be352..172d717 100644
--- a/o3d/core/cross/command_buffer/effect_cb.cc
+++ b/o3d/core/cross/command_buffer/effect_cb.cc
@@ -37,18 +37,18 @@
#include "core/cross/semantic_manager.h"
#include "core/cross/service_locator.h"
#include "core/cross/command_buffer/effect_cb.h"
-#include "command_buffer/common/cross/buffer_sync_api.h"
+#include "command_buffer/common/cross/constants.h"
#include "command_buffer/common/cross/cmd_buffer_format.h"
#include "command_buffer/client/cross/fenced_allocator.h"
#include "command_buffer/client/cross/cmd_buffer_helper.h"
namespace o3d {
-using command_buffer::BufferSyncInterface;
using command_buffer::CommandBufferEntry;
using command_buffer::CommandBufferHelper;
using command_buffer::ResourceId;
namespace effect_param = command_buffer::effect_param;
+namespace parse_error = command_buffer::parse_error;
namespace vertex_struct = command_buffer::vertex_struct;
EffectCB::EffectCB(ServiceLocator *service_locator, RendererCB *renderer)
@@ -101,8 +101,7 @@ bool EffectCB::LoadFromFXString(const String& source) {
// NOTE: we're calling Finish to check the command result, to see if
// the effect has succesfully compiled.
helper->Finish();
- if (renderer_->sync_interface()->GetParseError() !=
- BufferSyncInterface::kParseNoError) {
+ if (renderer_->GetParseError() != parse_error::kParseNoError) {
O3D_ERROR(service_locator()) << "Effect failed to compile.";
renderer_->effect_ids().FreeID(resource_id);
return false;
diff --git a/o3d/core/cross/command_buffer/renderer_cb.cc b/o3d/core/cross/command_buffer/renderer_cb.cc
index d576874..4db474f 100644
--- a/o3d/core/cross/command_buffer/renderer_cb.cc
+++ b/o3d/core/cross/command_buffer/renderer_cb.cc
@@ -47,119 +47,66 @@
#include "core/cross/command_buffer/states_cb.h"
#include "core/cross/command_buffer/stream_bank_cb.h"
#include "core/cross/command_buffer/texture_cb.h"
+#include "core/cross/command_buffer/display_window_cb.h"
#include "core/cross/renderer_platform.h"
-
-#ifdef OS_WIN
-#include "core/win/command_buffer/win32_cb_server.h"
-#endif
+#include "gpu_plugin/command_buffer.h"
+#include "gpu_plugin/gpu_processor.h"
+#include "gpu_plugin/np_utils/np_browser.h"
+#include "gpu_plugin/np_utils/np_utils.h"
+#include "gpu_plugin/system_services/shared_memory.h"
namespace o3d {
using command_buffer::GAPIInterface;
using command_buffer::CommandBufferHelper;
+using gpu_plugin::CommandBuffer;
+using gpu_plugin::GPUProcessor;
+using gpu_plugin::NPBrowser;
+using gpu_plugin::NPCreateObject;
+using gpu_plugin::NPGetProperty;
+using gpu_plugin::NPInvoke;
+using gpu_plugin::NPInvokeVoid;
+using gpu_plugin::NPObjectPointer;
+using gpu_plugin::SharedMemory;
RendererCB::RendererCB(ServiceLocator* service_locator,
- unsigned int command_buffer_size,
- unsigned int transfer_memory_size)
+ int32 transfer_memory_size)
: Renderer(service_locator),
- cmd_buffer_size_(command_buffer_size),
transfer_memory_size_(transfer_memory_size),
- transfer_shm_(command_buffer::kRPCInvalidHandle),
- transfer_shm_id_(0),
+ transfer_shm_id_(command_buffer::kInvalidSharedMemoryId),
transfer_shm_address_(NULL),
- sync_interface_(NULL),
+ npp_(NULL),
helper_(NULL),
allocator_(NULL),
- cb_server_(NULL),
frame_token_(0),
state_manager_(new StateManager) {
- DCHECK_GT(command_buffer_size, 0U);
- DCHECK_GT(transfer_memory_size, 0U);
- transfer_shm_ = command_buffer::CreateShm(transfer_memory_size);
- transfer_shm_address_ = command_buffer::MapShm(transfer_shm_,
- transfer_memory_size);
+ DCHECK_GT(transfer_memory_size, 0);
state_manager_->AddStateHandlers(this);
}
RendererCB::~RendererCB() {
Destroy();
- command_buffer::UnmapShm(transfer_shm_address_, transfer_memory_size_);
- command_buffer::DestroyShm(transfer_shm_);
}
-static const unsigned int kDefaultCommandBufferSize = 256 << 10;
-// This should be enough to hold the biggest possible buffer
-// (2048x2048xABGR16F texture = 32MB)
-static const unsigned int kDefaultTransferMemorySize = 32 << 20;
-
-RendererCB *RendererCB::CreateDefault(ServiceLocator* service_locator) {
- return new RendererCB(service_locator, kDefaultCommandBufferSize,
- kDefaultTransferMemorySize);
-}
-
-Renderer::InitStatus RendererCB::InitPlatformSpecific(
- const DisplayWindow& display,
- bool off_screen) {
- if (off_screen) {
- // TODO: Off-screen support ?
- return UNINITIALIZED; // equivalent to 0/false
+void RendererCB::Destroy() {
+ if (transfer_shm_id_ >= 0) {
+ NPInvokeVoid(npp_, command_buffer_, "unregisterObject", transfer_shm_id_);
+ transfer_shm_id_ = command_buffer::kInvalidSharedMemoryId;
}
-#ifdef OS_WIN
- const DisplayWindowWindows &display_platform =
- static_cast<const DisplayWindowWindows&>(display);
- // Creates a Win32CBServer based on the HWND, and creates the
- // command buffer helper, and initializes it. Also, create the
- // FencedAllocator for the transfer memory.
- cb_server_ = new Win32CBServer(display_platform.hwnd(), features());
- sync_interface_ = cb_server_->GetInterface();
-
- RECT windowRect;
- ::GetWindowRect(display_platform.hwnd(), &windowRect);
- int width = windowRect.right - windowRect.left;
- int height = windowRect.bottom - windowRect.top;
- InitCommon(width, height);
- return SUCCESS;
-#else
- // TODO: Implement Mac/Linux support before shipping
- // command buffers.
- return UNINITIALIZED;
-#endif
-}
+ transfer_shm_ = NPObjectPointer<NPObject>();
-void RendererCB::InitCommon(unsigned int width, unsigned int height) {
- sync_interface_->InitConnection();
- transfer_shm_id_ = sync_interface_->RegisterSharedMemory(
- transfer_shm_, transfer_memory_size_);
- helper_ = new CommandBufferHelper(sync_interface_);
- helper_->Init(cmd_buffer_size_);
- frame_token_ = helper_->InsertToken();
- allocator_ = new FencedAllocatorWrapper(transfer_memory_size_,
- helper_,
- transfer_shm_address_);
- SetClientSize(width, height);
-}
-
-void RendererCB::Destroy() {
if (allocator_) {
delete allocator_;
allocator_ = NULL;
}
+
if (helper_) {
helper_->Finish();
- if (sync_interface_) {
- sync_interface_->CloseConnection();
- sync_interface_->UnregisterSharedMemory(transfer_shm_id_);
- sync_interface_ = NULL;
- }
delete helper_;
helper_ = NULL;
}
-#ifdef OS_WIN
- if (cb_server_) {
- delete cb_server_;
- cb_server_ = NULL;
- }
-#endif
+
+ npp_ = NULL;
}
void RendererCB::ApplyDirtyStates() {
@@ -314,10 +261,8 @@ const int* RendererCB::GetRGBAUByteNSwizzleTable() {
return swizzle_table;
}
-// This is a factory function for creating Renderer objects. Since
-// we're implementing command buffers, we only ever return a CB renderer.
-Renderer* Renderer::CreateDefaultRenderer(ServiceLocator* service_locator) {
- return RendererCB::CreateDefault(service_locator);
+command_buffer::parse_error::ParseError RendererCB::GetParseError() {
+ return helper_->GetParseError();
}
// Creates and returns a platform specific RenderDepthStencilSurface object.
@@ -330,4 +275,180 @@ RenderDepthStencilSurface::Ref RendererCB::CreateDepthStencilSurface(
height,
this));
}
+
+Renderer::InitStatus RendererCB::InitPlatformSpecific(
+ const DisplayWindow& display_window,
+ bool off_screen) {
+ if (off_screen) {
+ // TODO: Off-screen support ?
+ return UNINITIALIZED; // equivalent to 0/false
+ }
+
+ const DisplayWindowCB& display_platform =
+ static_cast<const DisplayWindowCB&>(display_window);
+
+ npp_ = display_platform.npp();
+ command_buffer_ = display_platform.command_buffer();
+ DCHECK(command_buffer_.Get());
+
+ // Create and initialize a CommandBufferHelper.
+ helper_ = new CommandBufferHelper(npp_, command_buffer_);
+ if (!helper_->Initialize()) {
+ Destroy();
+ return INITIALIZATION_ERROR;
+ }
+
+ // Create and map a block of memory for the transfer buffer.
+ transfer_shm_ = CreateSharedMemory(transfer_memory_size_, npp_);
+ if (!transfer_shm_.Get()) {
+ Destroy();
+ return INITIALIZATION_ERROR;
+ }
+ size_t size_bytes;
+ transfer_shm_address_ = NPBrowser::get()->MapMemory(npp_,
+ transfer_shm_.Get(),
+ &size_bytes);
+ if (!transfer_shm_address_) {
+ Destroy();
+ return INITIALIZATION_ERROR;
+ }
+ DCHECK(size_bytes == transfer_memory_size_);
+
+ // Register the transfer buffer so it can be identified with an integer
+ // in future commands.
+ if (!NPInvoke(npp_, command_buffer_, "registerObject", transfer_shm_,
+ &transfer_shm_id_)) {
+ Destroy();
+ return INITIALIZATION_ERROR;
+ }
+ DCHECK_GE(transfer_shm_id_, 0);
+
+ // Insert a token.
+ frame_token_ = helper_->InsertToken();
+ if (frame_token_ < 0) {
+ Destroy();
+ return INITIALIZATION_ERROR;
+ }
+
+ // Create a fenced allocator.
+ allocator_ = new FencedAllocatorWrapper(transfer_memory_size_,
+ helper_,
+ transfer_shm_address_);
+
+ SetClientSize(display_platform.width(), display_platform.height());
+
+ return SUCCESS;
+}
+
+static const unsigned int kDefaultCommandBufferSize = 256 << 10;
+
+// This should be enough to hold the biggest possible buffer
+// (2048x2048xABGR16F texture = 32MB)
+static const int32 kDefaultTransferMemorySize = 32 << 20;
+
+RendererCBLocal *RendererCBLocal::CreateDefault(
+ ServiceLocator* service_locator) {
+ return new RendererCBLocal(service_locator,
+ kDefaultTransferMemorySize);
+}
+
+RendererCBLocal::RendererCBLocal(ServiceLocator* service_locator,
+ int32 transfer_memory_size)
+ : RendererCB(service_locator, transfer_memory_size) {
+}
+
+RendererCBLocal::~RendererCBLocal() {
+}
+
+NPObjectPointer<CommandBuffer> RendererCBLocal::CreateCommandBuffer(
+ NPP npp, void* hwnd, int32 size) {
+#if defined(OS_WIN)
+ NPObjectPointer<SharedMemory> ring_buffer =
+ NPCreateObject<SharedMemory>(npp);
+ if (!ring_buffer->Initialize(size))
+ return NPObjectPointer<CommandBuffer>();
+
+ size_t mapped_size;
+ if (!NPBrowser::get()->MapMemory(npp,
+ ring_buffer.Get(),
+ &mapped_size)) {
+ return NPObjectPointer<CommandBuffer>();
+ }
+
+ DCHECK(mapped_size == size);
+
+ NPObjectPointer<CommandBuffer> command_buffer =
+ NPCreateObject<CommandBuffer>(npp);
+ if (!command_buffer->Initialize(ring_buffer))
+ return NPObjectPointer<CommandBuffer>();
+
+ scoped_refptr<GPUProcessor> gpu_processor(
+ new GPUProcessor(npp, command_buffer.Get()));
+ if (!gpu_processor->Initialize(reinterpret_cast<HWND>(hwnd)))
+ return NPObjectPointer<CommandBuffer>();
+
+ command_buffer->SetPutOffsetChangeCallback(
+ NewCallback(gpu_processor.get(), &GPUProcessor::ProcessCommands));
+
+ return command_buffer;
+
+#else
+ return NPObjectPointer<CommandBuffer>();
+#endif
+}
+
+NPObjectPointer<NPObject> RendererCBLocal::CreateSharedMemory(int32 size,
+ NPP npp) {
+ NPObjectPointer<SharedMemory> shared_memory =
+ NPCreateObject<SharedMemory>(npp);
+
+ if (!shared_memory->Initialize(size))
+ return NPObjectPointer<NPObject>();
+
+ return shared_memory;
+}
+
+RendererCBRemote *RendererCBRemote::CreateDefault(
+ ServiceLocator* service_locator) {
+ return new RendererCBRemote(service_locator,
+ kDefaultTransferMemorySize);
+}
+
+RendererCBRemote::RendererCBRemote(ServiceLocator* service_locator,
+ int32 transfer_memory_size)
+ : RendererCB(service_locator, transfer_memory_size) {
+}
+
+RendererCBRemote::~RendererCBRemote() {
+}
+
+NPObjectPointer<NPObject> RendererCBRemote::CreateSharedMemory(int32 size,
+ NPP npp) {
+ NPObjectPointer<NPObject> shared_memory;
+
+ NPObjectPointer<NPObject> window = NPObjectPointer<NPObject>::FromReturned(
+ NPBrowser::get()->GetWindowNPObject(npp));
+ if (!window.Get())
+ return shared_memory;
+
+ NPObjectPointer<NPObject> chromium;
+ if (!NPGetProperty(npp, window, "chromium", &chromium) || !chromium.Get())
+ return shared_memory;
+
+ NPObjectPointer<NPObject> system;
+ if (!NPGetProperty(npp, chromium, "system", &system) || !system.Get())
+ return shared_memory;
+
+ if (!NPInvoke(npp, system, "createSharedMemory", size,
+ &shared_memory)) {
+ return shared_memory;
+ }
+
+ return shared_memory;
+}
+
+Renderer* Renderer::CreateDefaultRenderer(ServiceLocator* service_locator) {
+ return RendererCBLocal::CreateDefault(service_locator);
+}
+
} // namespace o3d
diff --git a/o3d/core/cross/command_buffer/renderer_cb.h b/o3d/core/cross/command_buffer/renderer_cb.h
index 643e05e..5668c21 100644
--- a/o3d/core/cross/command_buffer/renderer_cb.h
+++ b/o3d/core/cross/command_buffer/renderer_cb.h
@@ -38,9 +38,11 @@
#include "core/cross/precompile.h"
#include <vector>
#include "core/cross/renderer.h"
-#include "command_buffer/common/cross/rpc.h"
+#include "command_buffer/common/cross/constants.h"
#include "command_buffer/common/cross/resource.h"
#include "command_buffer/client/cross/id_allocator.h"
+#include "gpu_plugin/command_buffer.h"
+#include "gpu_plugin/np_utils/np_object_pointer.h"
namespace o3d {
namespace command_buffer {
@@ -61,15 +63,7 @@ class RendererCB : public Renderer {
typedef command_buffer::IdAllocator IdAllocator;
typedef command_buffer::FencedAllocatorWrapper FencedAllocatorWrapper;
- // Creates a default RendererCB.
- // The default command buffer is 256K entries.
- // The default transfer buffer is 16MB.
- static RendererCB *CreateDefault(ServiceLocator* service_locator);
- ~RendererCB();
-
- // Initialises the renderer for use, claiming hardware resources.
- virtual InitStatus InitPlatformSpecific(const DisplayWindow& display_window,
- bool off_screen);
+ virtual ~RendererCB();
// Handles the plugin resize event.
virtual void Resize(int width, int height);
@@ -170,13 +164,8 @@ class RendererCB : public Renderer {
// Gets the command buffer helper.
command_buffer::CommandBufferHelper *helper() const { return helper_; }
- // Gets the sync interface.
- command_buffer::BufferSyncInterface *sync_interface() const {
- return sync_interface_;
- }
-
// Gets the registered ID of the transfer shared memory.
- unsigned int transfer_shm_id() const { return transfer_shm_id_; }
+ int32 transfer_shm_id() const { return transfer_shm_id_; }
// Gets the base address of the transfer shared memory.
void *transfer_shm_address() const { return transfer_shm_address_; }
@@ -189,10 +178,11 @@ class RendererCB : public Renderer {
// Overridden from Renderer.
virtual const int* GetRGBAUByteNSwizzleTable();
+ command_buffer::parse_error::ParseError GetParseError();
+
protected:
// Protected so that callers are forced to call the factory method.
- RendererCB(ServiceLocator* service_locator, unsigned int command_buffer_size,
- unsigned int transfer_memory_size);
+ RendererCB(ServiceLocator* service_locator, int32 transfer_memory_size);
// Overridden from Renderer.
virtual bool PlatformSpecificBeginDraw();
@@ -254,19 +244,24 @@ class RendererCB : public Renderer {
// Overridden from Renderer.
virtual void ApplyDirtyStates();
- private:
- // Performs cross-platform initialization.
- void InitCommon(unsigned int width, unsigned int height);
+ protected:
+ // Initializes the renderer for use, claiming hardware resources.
+ virtual InitStatus InitPlatformSpecific(const DisplayWindow& display_window,
+ bool off_screen);
- unsigned int cmd_buffer_size_;
- unsigned int transfer_memory_size_;
- command_buffer::RPCShmHandle transfer_shm_;
- unsigned int transfer_shm_id_;
+ // Create a shared memory object of the given size.
+ virtual gpu_plugin::NPObjectPointer<NPObject>
+ CreateSharedMemory(int32 size, NPP npp) = 0;
+
+ private:
+ int32 transfer_memory_size_;
+ gpu_plugin::NPObjectPointer<NPObject> transfer_shm_;
+ int32 transfer_shm_id_;
void *transfer_shm_address_;
- command_buffer::BufferSyncInterface *sync_interface_;
+ NPP npp_;
+ gpu_plugin::NPObjectPointer<NPObject> command_buffer_;
command_buffer::CommandBufferHelper *helper_;
FencedAllocatorWrapper *allocator_;
- Win32CBServer *cb_server_;
IdAllocator vertex_buffer_ids_;
IdAllocator index_buffer_ids_;
@@ -277,7 +272,7 @@ class RendererCB : public Renderer {
IdAllocator sampler_ids_;
IdAllocator render_surface_ids_;
IdAllocator depth_surface_ids_;
- unsigned int frame_token_;
+ int32 frame_token_;
class StateManager;
scoped_ptr<StateManager> state_manager_;
@@ -285,6 +280,53 @@ class RendererCB : public Renderer {
DISALLOW_COPY_AND_ASSIGN(RendererCB);
};
+// This subclass initializes itself with a locally created in-process
+// CommandBuffer and GPUProcessor. This class will eventually go away and the
+// code in RendererCBRemote will be merged into RendererCB.
+class RendererCBLocal : public RendererCB {
+ public:
+ static gpu_plugin::NPObjectPointer<gpu_plugin::CommandBuffer>
+ CreateCommandBuffer(NPP npp, void* hwnd, int32 size);
+
+ // Creates a default RendererCBLocal.
+ static RendererCBLocal *CreateDefault(ServiceLocator* service_locator);
+
+ protected:
+ RendererCBLocal(ServiceLocator* service_locator,
+ int32 transfer_memory_size);
+ virtual ~RendererCBLocal();
+
+ // Create a shared memory object of the given size using the system services
+ // library directly.
+ virtual gpu_plugin::NPObjectPointer<NPObject>
+ CreateSharedMemory(int32 size, NPP npp);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(RendererCBLocal);
+};
+
+// This subclass initializes itself with a remotely created, potentially out-
+// of-process CommandBuffer. It requires that the browser supports the "system
+// service" to create shared memory, which is not available in the mange branch
+// of Chrome. Use RendererCBLocal for now.
+class RendererCBRemote : public RendererCB {
+ public:
+ // Creates a default RendererCBRemote.
+ static RendererCBRemote *CreateDefault(ServiceLocator* service_locator);
+
+ protected:
+ RendererCBRemote(ServiceLocator* service_locator, int32 transfer_memory_size);
+ virtual ~RendererCBRemote();
+
+ // Create a shared memory object using the browser's
+ // chromium.system.createSharedMemory method.
+ virtual gpu_plugin::NPObjectPointer<NPObject>
+ CreateSharedMemory(int32 size, NPP npp);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(RendererCBRemote);
+};
+
} // namespace o3d
#endif // O3D_CORE_CROSS_COMMAND_BUFFER_RENDERER_CB_H_
diff --git a/o3d/core/cross/renderer_test.cc b/o3d/core/cross/renderer_test.cc
index 680d377..2cde1a9 100644
--- a/o3d/core/cross/renderer_test.cc
+++ b/o3d/core/cross/renderer_test.cc
@@ -78,6 +78,10 @@ TEST_F(RendererTest, CreateDefaultRenderer) {
TEST_F(RendererTest, InitAndDestroyRenderer) {
+// TODO(apatrick): This test will not work as is with command buffers because
+// it attempts to create a Renderer using the same ring buffer as the
+// Renderer created in main.
+#if !defined(RENDERER_CB)
scoped_ptr<Renderer> renderer(
Renderer::CreateDefaultRenderer(service_locator()));
EXPECT_TRUE(renderer->Init(*g_display_window, false));
@@ -100,6 +104,7 @@ TEST_F(RendererTest, InitAndDestroyRenderer) {
// check that the renderer no longer has a Cg Context.
EXPECT_FALSE(gl_renderer->cg_context() != NULL);
#endif
+#endif // RENDERER_CB
}
// Offscreen is only supported on D3D currently
diff --git a/o3d/core/win/command_buffer/win32_cb_server.cc b/o3d/core/win/command_buffer/win32_cb_server.cc
deleted file mode 100644
index 7b70466..0000000
--- a/o3d/core/win/command_buffer/win32_cb_server.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file contains the implementation of the Win32CBServer class.
-
-#include "core/cross/precompile.h"
-#include "core/win/command_buffer/win32_cb_server.h"
-#include "command_buffer/service/cross/buffer_rpc.h"
-#include "command_buffer/service/cross/cmd_buffer_engine.h"
-#include "command_buffer/service/cross/gapi_decoder.h"
-
-namespace o3d {
-
-using command_buffer::GAPIDecoder;
-using command_buffer::IMCSender;
-using command_buffer::IMCMessageProcessor;
-using command_buffer::BufferSyncProxy;
-using command_buffer::CommandBufferEngine;
-
-Win32CBServer::Win32CBServer(HWND window, Features* features)
- : gapi_(),
- proxy_(NULL),
- imc_sender_(NULL),
- thread_(NULL) {
- gapi_.set_hwnd(window);
-
-#if defined(CB_RENDERER_GL)
- gapi_.set_anti_aliased(!features->not_anti_aliased());
-#endif
-
- nacl::Handle handles[2];
- nacl::SocketPair(handles);
-
- socket_pair_[0] = nacl::CreateImcDesc(handles[0]);
- socket_pair_[1] = nacl::CreateImcDesc(handles[1]);
- imc_sender_.reset(new IMCSender(socket_pair_[0]));
- proxy_.reset(new BufferSyncProxy(imc_sender_.get()));
-
- thread_ = ::CreateThread(NULL, 0, ThreadMain, this, 0, NULL);
-}
-
-Win32CBServer::~Win32CBServer() {
- imc_sender_->SendCall(command_buffer::POISONED_MESSAGE_ID, NULL, 0, NULL,
- 0);
- ::WaitForSingleObject(thread_, INFINITE);
- ::CloseHandle(thread_);
-
- nacl::Close(socket_pair_[0]);
- nacl::Close(socket_pair_[1]);
-}
-
-DWORD WINAPI Win32CBServer::ThreadMain(LPVOID param) {
- Win32CBServer *server = static_cast<Win32CBServer *>(param);
-
- scoped_ptr<GAPIDecoder> decoder(new GAPIDecoder(&server->gapi_));
- scoped_ptr<CommandBufferEngine> engine(
- new CommandBufferEngine(decoder.get()));
- decoder->set_engine(engine.get());
-
- IMCMessageProcessor processor(server->socket_pair_[1], engine->rpc_impl());
- engine->set_process_interface(&processor);
- IMCSender sender(server->socket_pair_[1]);
- engine->set_client_rpc(&sender);
-
- server->gapi_.Initialize();
- bool running = true;
- while (running) {
- MSG msg;
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- if (msg.message == WM_QUIT) {
- running = false;
- break;
- }
- }
- if (!running) break;
- // DoWork() will block if there is nothing to be done, meaning we are only
- // going to handle message after commands are sent. It should happen at
- // least once a frame, so it's OK.
- // TODO: figure out a way to wait on the socket OR messages with
- // MsgWaitForMultipleObjects. Asynchronous ("overlapped") read on the
- // socket may let us do that.
- running = engine->DoWork();
- }
- server->gapi_.Destroy();
-
- return 0;
-}
-
-} // namespace o3d
diff --git a/o3d/core/win/command_buffer/win32_cb_server.h b/o3d/core/win/command_buffer/win32_cb_server.h
deleted file mode 100644
index 49a34f7..0000000
--- a/o3d/core/win/command_buffer/win32_cb_server.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2009, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-// This file declares the Win32CBServer class, helper class that runs a command
-// buffer server in a separate win32 thread.
-
-#ifndef O3D_CORE_WIN_COMMAND_BUFFER_WIN32_CB_SERVER_H_
-#define O3D_CORE_WIN_COMMAND_BUFFER_WIN32_CB_SERVER_H_
-
-#include "core/cross/precompile.h"
-#include "core/cross/features.h"
-#include "command_buffer/common/cross/rpc_imc.h"
-#include "command_buffer/client/cross/buffer_sync_proxy.h"
-#if defined(CB_SERVICE_D3D9)
-#include "command_buffer/service/win/d3d9/gapi_d3d9.h"
-#elif defined(CB_SERVICE_GL)
-#include "command_buffer/service/cross/gl/gapi_gl.h"
-#endif
-
-
-namespace o3d {
-
-// The current Renderer API assumes we connect directly to the window. This
-// class creates a command buffer server in a separate thread, and sets up the
-// communication socket.
-// This code will go away once we fix the API, and provide a separate mechanism
-// to connect to the service.
-class Win32CBServer {
- public:
- explicit Win32CBServer(HWND window, Features* features);
- ~Win32CBServer();
-
- // Gets the (client-side) command buffer interface.
- command_buffer::BufferSyncInterface *GetInterface() { return proxy_.get(); }
-
- private:
- static DWORD WINAPI ThreadMain(LPVOID param);
-
-#if defined(CB_SERVICE_D3D9)
- command_buffer::GAPID3D9 gapi_;
-#elif defined(CB_SERVICE_GL)
- command_buffer::GAPIGL gapi_;
-#endif
- nacl::HtpHandle socket_pair_[2];
- scoped_ptr<command_buffer::IMCSender> imc_sender_;
- scoped_ptr<command_buffer::BufferSyncProxy> proxy_;
- HANDLE thread_;
-};
-
-} // namespace o3d
-
-#endif // O3D_CORE_WIN_COMMAND_BUFFER_WIN32_CB_SERVER_H_
diff --git a/o3d/gpu_plugin/command_buffer.cc b/o3d/gpu_plugin/command_buffer.cc
index 3dc35b8..2bdb686 100644
--- a/o3d/gpu_plugin/command_buffer.cc
+++ b/o3d/gpu_plugin/command_buffer.cc
@@ -143,5 +143,11 @@ int32 CommandBuffer::ResetParseError() {
return last_error;
}
+void CommandBuffer::SetParseError(int32 parse_error) {
+ if (parse_error_ == 0) {
+ parse_error_ = parse_error;
+ }
+}
+
} // namespace gpu_plugin
} // namespace o3d
diff --git a/o3d/gpu_plugin/command_buffer.h b/o3d/gpu_plugin/command_buffer.h
index 492bb18..51ce2d0 100644
--- a/o3d/gpu_plugin/command_buffer.h
+++ b/o3d/gpu_plugin/command_buffer.h
@@ -90,9 +90,7 @@ class CommandBuffer : public DefaultNPObject<NPObject> {
int32 ResetParseError();
// Allows the reader to set the current parse error.
- void SetParseError(int32 parse_error) {
- parse_error_ = parse_error;
- }
+ void SetParseError(int32 parse_error);
// Returns whether the command buffer is in the error state.
bool GetErrorStatus() {
diff --git a/o3d/gpu_plugin/gpu_plugin.gyp b/o3d/gpu_plugin/gpu_plugin.gyp
index 8ec77c7..cf23d18 100644
--- a/o3d/gpu_plugin/gpu_plugin.gyp
+++ b/o3d/gpu_plugin/gpu_plugin.gyp
@@ -15,22 +15,10 @@
],
'include_dirs': [
'../..',
- '../../third_party/npapi',
-
- # Chrome NPAPI header dir appears before the O3D one so it takes
- # priority. TODO(apatrick): one set of NPAPI headers.
- '../../third_party/npapi/bindings',
- '../../third_party/npapi/include',
],
'all_dependent_settings': {
'include_dirs': [
'../..',
- '../../third_party/npapi',
-
- # Chrome NPAPI header dir appears before the O3D one so it takes
- # priority. TODO(apatrick): one set of NPAPI headers.
- '../../third_party/npapi/bindings',
- '../../third_party/npapi/include',
],
}, # 'all_dependent_settings'
'sources': [
@@ -50,13 +38,16 @@
'np_utils/np_object_mock.h',
'np_utils/np_object_pointer.h',
'np_utils/np_plugin_object.h',
+ 'np_utils/np_plugin_object_mock.h',
'np_utils/np_plugin_object_factory.cc',
'np_utils/np_plugin_object_factory.h',
'np_utils/np_plugin_object_factory_mock.h',
- 'np_utils/np_plugin_object_mock.h',
'np_utils/np_utils.cc',
'np_utils/np_utils.h',
'np_utils/webkit_browser.h',
+ 'system_services/shared_memory.cc',
+ 'system_services/shared_memory.h',
+ 'system_services/shared_memory_mock.h',
],
},
@@ -80,165 +71,10 @@
'np_utils/np_class_unittest.cc',
'np_utils/np_object_pointer_unittest.cc',
'np_utils/np_utils_unittest.cc',
- ],
- },
-
- {
- 'target_name': 'system_services',
- 'type': '<(library)',
- 'dependencies': [
- '../../base/base.gyp:base',
- 'np_utils',
- ],
- 'include_dirs': [
- '../..',
- ],
- 'sources': [
- 'system_services/shared_memory.cc',
- 'system_services/shared_memory.h',
- 'system_services/shared_memory_mock.h',
- 'system_services/shared_memory_public.h',
- ],
- },
-
- # This is a standalone executable until O3D is fully moved over to using
- # gyp. At that point these can become part of the regular O3D unit tests.
- {
- 'target_name': 'system_services_unittests',
- 'type': 'executable',
- 'dependencies': [
- 'system_services',
- '../../testing/gmock.gyp:gmock',
- '../../testing/gmock.gyp:gmockmain',
- '../../testing/gtest.gyp:gtest',
- ],
- 'include_dirs': [
- '../..',
- ],
- 'sources': [
'system_services/shared_memory_unittest.cc',
],
},
- # This builds a subset of the O3D command buffer common library. This is a
- # separate library for the time being because I need a subset that is not
- # dependent on NaCl.
- {
- 'target_name': 'command_buffer_common_subset',
- 'type': '<(library)',
- 'include_dirs': [
- '..',
- '../..',
- ],
- 'all_dependent_settings': {
- 'include_dirs': [
- '..',
- ],
- }, # 'all_dependent_settings'
- 'sources': [
- '../command_buffer/common/cross/bitfield_helpers.h',
- '../command_buffer/common/cross/cmd_buffer_format.h',
- '../command_buffer/common/cross/gapi_interface.h',
- '../command_buffer/common/cross/logging.h',
- '../command_buffer/common/cross/mocks.h',
- '../command_buffer/common/cross/resource.cc',
- '../command_buffer/common/cross/resource.h',
- '../command_buffer/common/cross/types.h',
- ],
- },
-
- # This builds a subset of the O3D command buffer service. This is a separate
- # library for the time being because I need a subset that is not dependent
- # on NaCl.
- {
- 'target_name': 'command_buffer_service_subset',
- 'type': '<(library)',
- 'include_dirs': [
- '..',
- '../..',
- ],
- 'all_dependent_settings': {
- 'include_dirs': [
- '..',
- ],
- }, # 'all_dependent_settings'
- 'dependencies': [
- 'command_buffer_common_subset',
- ],
- 'sources': [
- '../command_buffer/service/cross/cmd_parser.cc',
- '../command_buffer/service/cross/cmd_parser.h',
- '../command_buffer/service/cross/effect_utils.cc',
- '../command_buffer/service/cross/effect_utils.h',
- '../command_buffer/service/cross/gapi_decoder.cc',
- '../command_buffer/service/cross/gapi_decoder.h',
- '../command_buffer/service/cross/mocks.h',
- '../command_buffer/service/cross/precompile.cc',
- '../command_buffer/service/cross/precompile.h',
- '../command_buffer/service/cross/resource.cc',
- '../command_buffer/service/cross/resource.h',
- '../command_buffer/service/cross/texture_utils.cc',
- '../command_buffer/service/cross/texture_utils.h',
- ],
-
- 'conditions': [
- ['OS == "win"',
- {
- 'sources': [
- '../command_buffer/service/win/d3d9/d3d9_utils.h',
- '../command_buffer/service/win/d3d9/effect_d3d9.cc',
- '../command_buffer/service/win/d3d9/effect_d3d9.h',
- '../command_buffer/service/win/d3d9/gapi_d3d9.cc',
- '../command_buffer/service/win/d3d9/gapi_d3d9.h',
- '../command_buffer/service/win/d3d9/geometry_d3d9.cc',
- '../command_buffer/service/win/d3d9/geometry_d3d9.h',
- '../command_buffer/service/win/d3d9/render_surface_d3d9.cc',
- '../command_buffer/service/win/d3d9/render_surface_d3d9.h',
- '../command_buffer/service/win/d3d9/sampler_d3d9.cc',
- '../command_buffer/service/win/d3d9/sampler_d3d9.h',
- '../command_buffer/service/win/d3d9/states_d3d9.cc',
- '../command_buffer/service/win/d3d9/texture_d3d9.cc',
- '../command_buffer/service/win/d3d9/texture_d3d9.h',
- ], # 'sources'
- 'include_dirs': [
- '$(DXSDK_DIR)/Include',
- ],
- 'all_dependent_settings': {
- 'include_dirs': [
- '$(DXSDK_DIR)/Include',
- ],
- }, # 'all_dependent_settings'
- },
- ],
- ['OS == "mac" or OS == "linux"',
- {
- 'sources': [
- '../command_buffer/service/cross/gl/effect_gl.cc',
- '../command_buffer/service/cross/gl/effect_gl.h',
- '../command_buffer/service/cross/gl/gapi_gl.cc',
- '../command_buffer/service/cross/gl/gapi_gl.h',
- '../command_buffer/service/cross/gl/geometry_gl.cc',
- '../command_buffer/service/cross/gl/geometry_gl.h',
- '../command_buffer/service/cross/gl/gl_utils.h',
- '../command_buffer/service/cross/gl/sampler_gl.cc',
- '../command_buffer/service/cross/gl/sampler_gl.h',
- '../command_buffer/service/cross/gl/states_gl.cc',
- '../command_buffer/service/cross/gl/texture_gl.cc',
- '../command_buffer/service/cross/gl/texture_gl.h',
- ], # 'sources'
- },
- ],
- ['OS == "linux"',
- {
- 'sources': [
- '../command_buffer/service/linux/x_utils.cc',
- '../command_buffer/service/linux/x_utils.h',
- ],
- },
- ],
- ],
- },
-
# These can eventually be merged back into the gpu_plugin target. There
# separated for now so O3D can statically link against them and use command
# buffers in-process without the GPU plugin.
@@ -247,16 +83,14 @@
'type': '<(library)',
'dependencies': [
'../../base/base.gyp:base',
- 'command_buffer_service_subset',
+ '../command_buffer/command_buffer.gyp:command_buffer_service',
'np_utils',
],
'include_dirs': [
- '..',
'../..',
],
'all_dependent_settings': {
'include_dirs': [
- '..',
'../..',
],
}, # 'all_dependent_settings'
@@ -298,10 +132,9 @@
'target_name': 'gpu_plugin_unittests',
'type': 'executable',
'dependencies': [
- 'command_buffer_service_subset',
+ '../command_buffer/command_buffer.gyp:command_buffer_service',
'gpu_plugin',
'np_utils',
- 'system_services',
'../../testing/gmock.gyp:gmock',
'../../testing/gmock.gyp:gmockmain',
'../../testing/gtest.gyp:gtest',
diff --git a/o3d/gpu_plugin/gpu_processor.cc b/o3d/gpu_plugin/gpu_processor.cc
index b757a37..058ffa5 100644
--- a/o3d/gpu_plugin/gpu_processor.cc
+++ b/o3d/gpu_plugin/gpu_processor.cc
@@ -7,6 +7,9 @@
namespace o3d {
namespace gpu_plugin {
+GPUProcessor::~GPUProcessor() {
+}
+
namespace {
void InvokeProcessCommands(void* data) {
static_cast<GPUProcessor*>(data)->ProcessCommands();
@@ -21,16 +24,16 @@ void GPUProcessor::ProcessCommands() {
int commands_processed = 0;
while (commands_processed < commands_per_update_ && !parser_->IsEmpty()) {
- command_buffer::BufferSyncInterface::ParseError parse_error =
+ command_buffer::parse_error::ParseError parse_error =
parser_->ProcessCommand();
switch (parse_error) {
- case command_buffer::BufferSyncInterface::kParseUnknownCommand:
- case command_buffer::BufferSyncInterface::kParseInvalidArguments:
+ case command_buffer::parse_error::kParseUnknownCommand:
+ case command_buffer::parse_error::kParseInvalidArguments:
command_buffer_->SetParseError(parse_error);
break;
- case command_buffer::BufferSyncInterface::kParseInvalidSize:
- case command_buffer::BufferSyncInterface::kParseOutOfBounds:
+ case command_buffer::parse_error::kParseInvalidSize:
+ case command_buffer::parse_error::kParseOutOfBounds:
command_buffer_->SetParseError(parse_error);
command_buffer_->RaiseErrorStatus();
return;
@@ -46,9 +49,9 @@ void GPUProcessor::ProcessCommands() {
}
}
-void *GPUProcessor::GetSharedMemoryAddress(unsigned int shm_id) {
+void *GPUProcessor::GetSharedMemoryAddress(int32 shm_id) {
NPObjectPointer<NPObject> shared_memory =
- command_buffer_->GetRegisteredObject(static_cast<int32>(shm_id));
+ command_buffer_->GetRegisteredObject(shm_id);
size_t size;
return NPBrowser::get()->MapMemory(npp_, shared_memory.Get(), &size);
@@ -56,9 +59,9 @@ void *GPUProcessor::GetSharedMemoryAddress(unsigned int shm_id) {
// TODO(apatrick): Consolidate this with the above and return both the address
// and size.
-size_t GPUProcessor::GetSharedMemorySize(unsigned int shm_id) {
+size_t GPUProcessor::GetSharedMemorySize(int32 shm_id) {
NPObjectPointer<NPObject> shared_memory =
- command_buffer_->GetRegisteredObject(static_cast<int32>(shm_id));
+ command_buffer_->GetRegisteredObject(shm_id);
size_t size;
NPBrowser::get()->MapMemory(npp_, shared_memory.Get(), &size);
@@ -66,8 +69,8 @@ size_t GPUProcessor::GetSharedMemorySize(unsigned int shm_id) {
return size;
}
-void GPUProcessor::set_token(unsigned int token) {
- command_buffer_->SetToken(static_cast<int32>(token));
+void GPUProcessor::set_token(int32 token) {
+ command_buffer_->SetToken(token);
}
} // namespace gpu_plugin
diff --git a/o3d/gpu_plugin/gpu_processor.h b/o3d/gpu_plugin/gpu_processor.h
index 246b277..f0b9a4b 100644
--- a/o3d/gpu_plugin/gpu_processor.h
+++ b/o3d/gpu_plugin/gpu_processor.h
@@ -5,6 +5,7 @@
#ifndef O3D_GPU_PLUGIN_GPU_PROCESSOR_H_
#define O3D_GPU_PLUGIN_GPU_PROCESSOR_H_
+#include "base/ref_counted.h"
#include "base/scoped_ptr.h"
#include "base/shared_memory.h"
#include "o3d/command_buffer/service/cross/cmd_buffer_engine.h"
@@ -22,16 +23,16 @@ namespace gpu_plugin {
// This class processes commands in a command buffer. It is event driven and
// posts tasks to the current message loop to do additional work.
-class GPUProcessor : public base::RefCountedThreadSafe<GPUProcessor>,
- public command_buffer::CommandBufferUpcallInterface {
+class GPUProcessor : public ::base::RefCounted<GPUProcessor>,
+ public command_buffer::CommandBufferEngine {
public:
GPUProcessor(NPP npp,
- const NPObjectPointer<CommandBuffer>& command_buffer);
+ CommandBuffer* command_buffer);
#if defined(OS_WIN)
// This constructor is for unit tests.
GPUProcessor(NPP npp,
- const NPObjectPointer<CommandBuffer>& command_buffer,
+ CommandBuffer* command_buffer,
command_buffer::GAPID3D9* gapi,
command_buffer::GAPIDecoder* decoder,
command_buffer::CommandParser* parser,
@@ -40,6 +41,8 @@ class GPUProcessor : public base::RefCountedThreadSafe<GPUProcessor>,
bool Initialize(HWND hwnd);
#endif // OS_WIN
+ virtual ~GPUProcessor();
+
void Destroy();
void ProcessCommands();
@@ -48,25 +51,30 @@ class GPUProcessor : public base::RefCountedThreadSafe<GPUProcessor>,
void SetWindow(HWND handle, int width, int height);
#endif
- // Implementation of CommandBufferUpcallInterface.
+ // Implementation of CommandBufferEngine.
// Gets the base address of a registered shared memory buffer.
// Parameters:
// shm_id: the identifier for the shared memory buffer.
- virtual void *GetSharedMemoryAddress(unsigned int shm_id);
+ virtual void *GetSharedMemoryAddress(int32 shm_id);
// Gets the size of a registered shared memory buffer.
// Parameters:
// shm_id: the identifier for the shared memory buffer.
- virtual size_t GetSharedMemorySize(unsigned int shm_id);
+ virtual size_t GetSharedMemorySize(int32 shm_id);
// Sets the token value.
- virtual void set_token(unsigned int token);
+ virtual void set_token(int32 token);
private:
NPP npp_;
- NPObjectPointer<CommandBuffer> command_buffer_;
- scoped_ptr<base::SharedMemory> mapped_ring_buffer_;
+
+ // The GPUProcessor holds a weak reference to the CommandBuffer. The
+ // CommandBuffer owns the GPUProcessor and holds a strong reference to it
+ // through the ProcessCommands callback.
+ CommandBuffer* command_buffer_;
+
+ scoped_ptr< ::base::SharedMemory> mapped_ring_buffer_;
int commands_per_update_;
#if defined(OS_WIN)
@@ -79,4 +87,27 @@ class GPUProcessor : public base::RefCountedThreadSafe<GPUProcessor>,
} // namespace gpu_plugin
} // namespace o3d
+// Callbacks to the GPUProcessor hold a reference count.
+template <typename Method>
+class CallbackStorage<o3d::gpu_plugin::GPUProcessor, Method> {
+ public:
+ CallbackStorage(o3d::gpu_plugin::GPUProcessor* obj, Method method)
+ : obj_(obj),
+ meth_(method) {
+ DCHECK(obj_);
+ obj_->AddRef();
+ }
+
+ ~CallbackStorage() {
+ obj_->Release();
+ }
+
+ protected:
+ o3d::gpu_plugin::GPUProcessor* obj_;
+ Method meth_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CallbackStorage);
+};
+
#endif // O3D_GPU_PLUGIN_GPU_PROCESSOR_H_
diff --git a/o3d/gpu_plugin/gpu_processor_win.cc b/o3d/gpu_plugin/gpu_processor_win.cc
index 30f963f..a9fdae1 100644
--- a/o3d/gpu_plugin/gpu_processor_win.cc
+++ b/o3d/gpu_plugin/gpu_processor_win.cc
@@ -10,17 +10,18 @@ namespace o3d {
namespace gpu_plugin {
GPUProcessor::GPUProcessor(NPP npp,
- const NPObjectPointer<CommandBuffer>& command_buffer)
+ CommandBuffer* command_buffer)
: npp_(npp),
command_buffer_(command_buffer),
commands_per_update_(100) {
+ DCHECK(command_buffer);
gapi_.reset(new command_buffer::GAPID3D9);
decoder_.reset(new command_buffer::GAPIDecoder(gapi_.get()));
decoder_->set_engine(this);
}
GPUProcessor::GPUProcessor(NPP npp,
- const NPObjectPointer<CommandBuffer>& command_buffer,
+ CommandBuffer* command_buffer,
command_buffer::GAPID3D9* gapi,
command_buffer::GAPIDecoder* decoder,
command_buffer::CommandParser* parser,
@@ -28,6 +29,7 @@ GPUProcessor::GPUProcessor(NPP npp,
: npp_(npp),
command_buffer_(command_buffer),
commands_per_update_(commands_per_update) {
+ DCHECK(command_buffer);
gapi_.reset(gapi);
decoder_.reset(decoder);
parser_.reset(parser);
diff --git a/o3d/gpu_plugin/np_utils/np_browser.cc b/o3d/gpu_plugin/np_utils/np_browser.cc
index f6f8189..e3756c7 100644
--- a/o3d/gpu_plugin/np_utils/np_browser.cc
+++ b/o3d/gpu_plugin/np_utils/np_browser.cc
@@ -8,7 +8,10 @@
#if defined(O3D_IN_CHROME)
#include "webkit/glue/plugins/nphostapi.h"
#else
-#include "npupp.h"
+#include "o3d/third_party/npapi/include/npupp.h"
+
+// TODO: Remove this when we figure out what to do about NPN_MapMemory.
+#include "o3d/gpu_plugin/system_services/shared_memory.h"
#endif
namespace o3d {
@@ -118,7 +121,13 @@ void NPBrowser::PluginThreadAsyncCall(NPP npp,
void* NPBrowser::MapMemory(NPP npp,
NPObject* object,
size_t* size) {
+ // NPN_MapMemory is an experiment. It only exists in NPNetscapeFuncs in
+ // a hacked version of Chromium.
+#if defined(O3D_IN_CHROME)
return netscape_funcs_->mapmemory(npp, object, size);
+#else
+ return NPN_MapMemory(npp, object, size);
+#endif
}
} // namespace gpu_plugin
diff --git a/o3d/gpu_plugin/np_utils/np_browser_stub.cc b/o3d/gpu_plugin/np_utils/np_browser_stub.cc
index d6d3e87..c04affe 100644
--- a/o3d/gpu_plugin/np_utils/np_browser_stub.cc
+++ b/o3d/gpu_plugin/np_utils/np_browser_stub.cc
@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "o3d/gpu_plugin/np_utils/np_browser_stub.h"
+#include "o3d/gpu_plugin/system_services/shared_memory.h"
#include "base/logging.h"
#include "base/message_loop.h"
@@ -116,8 +117,7 @@ void StubNPBrowser::PluginThreadAsyncCall(
void* StubNPBrowser::MapMemory(NPP npp,
NPObject* object,
size_t* size) {
- *size = 0;
- return NULL;
+ return NPN_MapMemory(npp, object, size);
}
} // namespace gpu_plugin
diff --git a/o3d/gpu_plugin/np_utils/np_headers.h b/o3d/gpu_plugin/np_utils/np_headers.h
index 6a2a3c6..f11a054 100644
--- a/o3d/gpu_plugin/np_utils/np_headers.h
+++ b/o3d/gpu_plugin/np_utils/np_headers.h
@@ -9,10 +9,19 @@
// Chrome and O3D NPAPI headers.
#define utf8characters UTF8Characters
#define utf8length UTF8Length
+
+#if defined(O3D_IN_CHROME)
+#include "third_party/npapi/bindings/npapi.h"
+#include "third_party/npapi/bindings/npruntime.h"
+#else
+#include "o3d/third_party/npapi/include/npapi.h"
+#include "o3d/third_party/npapi/include/npruntime.h"
+#endif
+
// Deliberately not including a directory name because Chromium and O3D put
// these headers in different directories.
-#include "npapi.h"
-#include "npruntime.h"
+//#include "npapi.h"
+//#include "npruntime.h"
#undef utf8characters
#undef utf8length
diff --git a/o3d/gpu_plugin/system_services/shared_memory.h b/o3d/gpu_plugin/system_services/shared_memory.h
index 1ee7df4..da47644 100644
--- a/o3d/gpu_plugin/system_services/shared_memory.h
+++ b/o3d/gpu_plugin/system_services/shared_memory.h
@@ -10,7 +10,7 @@
#include "o3d/gpu_plugin/np_utils/default_np_object.h"
#include "o3d/gpu_plugin/np_utils/np_dispatcher.h"
#include "o3d/gpu_plugin/np_utils/np_object_pointer.h"
-#include "third_party/npapi/bindings/npruntime.h"
+#include "o3d/gpu_plugin/np_utils/np_headers.h"
namespace o3d {
namespace gpu_plugin {
@@ -25,7 +25,7 @@ class SharedMemory : public DefaultNPObject<NPObject> {
virtual int32 GetSize();
- base::SharedMemory* shared_memory() const {
+ ::base::SharedMemory* shared_memory() const {
return shared_memory_.get();
}
@@ -36,7 +36,7 @@ class SharedMemory : public DefaultNPObject<NPObject> {
private:
NPP npp_;
- scoped_ptr<base::SharedMemory> shared_memory_;
+ scoped_ptr< ::base::SharedMemory> shared_memory_;
DISALLOW_COPY_AND_ASSIGN(SharedMemory);
};
diff --git a/o3d/main.scons b/o3d/main.scons
index c9ae0bf..10976da 100644
--- a/o3d/main.scons
+++ b/o3d/main.scons
@@ -482,146 +482,6 @@ windows_gl_optimized_env.Append(BUILD_GROUPS = ['most'])
AddWindowsOptimizedSettings(windows_gl_optimized_env)
environment_list.append(windows_gl_optimized_env)
-windows_cb_env = windows_env.Clone()
-windows_cb_env.Append(
- CPPDEFINES = ['RENDERER_CB', 'CB_SERVICE_D3D9'],
- BUILD_COMPONENTS = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client'
- ],
- RENDERER_INCLUDE_PATH = [],
- RENDERER_LIB_PATH = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client',
- ],
- # TODO: remove link-time dependency on d3dx9, using dynamic loading
- # instead.
- RENDERER_LIBS = [
- 'o3dCmdBuf_service',
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- 'd3d9', 'dxerr', 'd3dx9'
- ] + nacl_htp_all_libs
-)
-
-windows_cb_debug_env = windows_cb_env.Clone(
- BUILD_TYPE = 'dbg-cb',
- BUILD_TYPE_DESCRIPTION = 'Windows Command Buffer debug build',
-)
-
-AddWindowsDebugSettings(windows_cb_debug_env)
-environment_list.append(windows_cb_debug_env)
-
-
-windows_cb_optimized_env = windows_cb_env.Clone(
- BUILD_TYPE = 'opt-cb',
- BUILD_TYPE_DESCRIPTION = 'Windows Command Buffer optimized build',
-)
-
-AddWindowsOptimizedSettings(windows_cb_optimized_env)
-environment_list.append(windows_cb_optimized_env)
-
-
-windows_cb_gl_env = windows_env.Clone()
-windows_cb_gl_env.Append(
- CPPDEFINES = ['RENDERER_CB', 'CB_SERVICE_GL'],
- BUILD_COMPONENTS = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client'
- ],
- RENDERER_INCLUDE_PATH = [
- '$GLEW_DIR/include',
- '$CG_DIR/include',
- ],
- RENDERER_LIB_PATH = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client',
- '$CG_DIR/lib',
- '$GLEW_DIR/lib',
- ],
- RENDERER_LIBS = [
- 'o3dCmdBuf_service',
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- 'OpenGL32',
- 'glew32',
- 'cg',
- 'cgGL',
- ] + nacl_htp_all_libs,
-)
-
-windows_cb_gl_debug_env = windows_cb_gl_env.Clone(
- BUILD_TYPE = 'dbg-cb-gl',
- BUILD_TYPE_DESCRIPTION =
- 'Windows Command Buffer using OpenGL debug build'
-)
-
-AddWindowsDebugSettings(windows_cb_gl_debug_env)
-environment_list.append(windows_cb_gl_debug_env)
-
-windows_cb_gl_optimized_env = windows_cb_gl_env.Clone(
- BUILD_TYPE = 'opt-cb-gl',
- BUILD_TYPE_DESCRIPTION =
- 'Windows Command Buffer using OpenGL optimized build',
-)
-
-AddWindowsOptimizedSettings(windows_cb_gl_optimized_env)
-environment_list.append(windows_cb_gl_optimized_env)
-
-
-# These configs are highly very experimental, and just including them
-# necessitate downloading the nacl sdk even if they are not active. So include
-# them only when a specific flag is passed on the command line.
-if ARGUMENTS.get('enable-nacl', ''):
- nacl_env = binaries_env.Clone(
- tools = ['naclsdk'],
- BUILD_COMPONENTS = [
- 'command_buffer/common',
- 'command_buffer/client',
- 'command_buffer/samples',
- ],
- # This should be set by hammer but is not...
- TARGET_PLATFORM = 'NACL',
- # Only the base IMC lib is necessary in nacl
- NACL_HTP_LIBS = [nacl_imc_lib],
- CCFLAGS = ['-Wstrict-aliasing'],
- NACL_VARIANT = 'nacl',
- )
- nacl_env.Append(
- CPPDEFINES = ['RENDERER_CB'],
- RENDERER_INCLUDE_PATH = [],
- RENDERER_LIB_PATH = [
- 'command_buffer/common',
- 'command_buffer/client',
- ],
- RENDERER_LIBS = [
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- nacl_imc_lib,
- ],
- )
- nacl_dbg_env = nacl_env.Clone(
- BUILD_TYPE = 'dbg-nacl',
- BUILD_TYPE_DESCRIPTION = 'NaCl debug build',
- )
- nacl_dbg_env.Append(
- CCFLAGS = ['-g'],
- )
- environment_list.append(nacl_dbg_env)
- nacl_opt_env = nacl_env.Clone(
- BUILD_TYPE = 'opt-nacl',
- BUILD_TYPE_DESCRIPTION = 'NaCl debug build',
- )
- nacl_opt_env.Append(
- CCFLAGS = ['-O3'],
- CPPDEFINES = ['NDEBUG'],
- )
- environment_list.append(nacl_opt_env)
-
# MacOS ------------------------------------------------------------------
mac_env = binaries_env.Clone(
@@ -707,47 +567,6 @@ mac_optimized_env = mac_env.Clone(
AddMacOptimizedSettings(mac_optimized_env)
environment_list.append(mac_optimized_env)
-mac_cb_env = mac_env.Clone()
-
-mac_cb_env.Append(
- CPPDEFINES = ['RENDERER_CB'],
- BUILD_COMPONENTS = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client'
- ],
- RENDERER_INCLUDE_PATH = [],
- RENDERER_LIB_PATH = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client',
- ],
- RENDERER_LIBS = [
- 'o3dCmdBuf_service',
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- 'MacStaticGLEW'
- ] + nacl_htp_all_libs
-)
-
-mac_cb_debug_env = mac_cb_env.Clone(
- BUILD_TYPE = 'dbg-mac-cb',
- BUILD_TYPE_DESCRIPTION = 'Mac command buffer debug build',
- DEBUG = True,
- NACL_VARIANT = 'dbg-mac'
-)
-
-AddMacDebugSettings(mac_cb_debug_env)
-environment_list.append(mac_cb_debug_env)
-
-mac_cb_optimized_env = mac_cb_env.Clone(
- BUILD_TYPE = 'opt-mac-cb',
- BUILD_TYPE_DESCRIPTION = 'Mac Command Buffer optimized build',
-)
-
-AddMacOptimizedSettings(mac_cb_optimized_env)
-environment_list.append(mac_cb_optimized_env)
-
mac_test_optimized_env = mac_optimized_env.Clone(
BUILD_TYPE = 'test-opt-mac',
BUILD_TYPE_DESCRIPTION = 'MacOS optimized build for testing',
@@ -837,55 +656,6 @@ linux_optimized_env.Append(
)
environment_list.append(linux_optimized_env)
-linux_cb_env = linux_env.Clone()
-linux_cb_env.FilterOut(CPPDEFINES = ['RENDERER_GL'])
-linux_cb_env.Append(
- CPPDEFINES = ['RENDERER_CB'],
- BUILD_COMPONENTS = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client'
- ],
- RENDERER_INCLUDE_PATH = [],
- RENDERER_LIB_PATH = [
- 'command_buffer/common',
- 'command_buffer/service',
- 'command_buffer/client',
- ],
- RENDERER_LIBS = [
- 'o3dCmdBuf_service',
- 'o3dCmdBuf_client',
- 'o3dCmdBuf_common',
- 'GL',
- 'GLEW',
- 'Cg',
- 'CgGL',
- ] + linux_cb_env['NACL_HTP_LIBS'],
-)
-
-linux_cb_debug_env = linux_cb_env.Clone(
- BUILD_TYPE = 'dbg-linux-cb',
- BUILD_TYPE_DESCRIPTION = 'Linux Command Buffer debug build',
- DEBUG = True,
- NACL_VARIANT = 'dbg-linux',
-)
-linux_cb_debug_env.Append(
- CCFLAGS = ['-g'],
-)
-environment_list.append(linux_cb_debug_env)
-
-linux_cb_optimized_env = linux_cb_env.Clone(
- BUILD_TYPE = 'opt-linux-cb',
- BUILD_TYPE_DESCRIPTION = 'Linux Command Buffer optimized build',
- DEBUG = False,
- NACL_VARIANT = 'opt-linux',
-)
-linux_cb_optimized_env.Append(
- CCFLAGS = ['-O3'],
- CPPDEFINES = ['-DNDEBUG'],
-)
-environment_list.append(linux_cb_optimized_env)
-
# Documentation -------------------------------------------------------------
docs_env = base_env.Clone(
diff --git a/o3d/plugin/cross/o3d_glue.cc b/o3d/plugin/cross/o3d_glue.cc
index d041907..c52e242 100644
--- a/o3d/plugin/cross/o3d_glue.cc
+++ b/o3d/plugin/cross/o3d_glue.cc
@@ -29,7 +29,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
#include <build/build_config.h>
#ifdef OS_WIN
#include <windows.h>
@@ -40,12 +39,12 @@
#include <algorithm>
#include "core/cross/renderer.h"
#include "core/cross/client_info.h"
+#include "gpu_plugin/np_utils/np_headers.h"
#include "plugin/cross/o3d_glue.h"
#include "plugin/cross/config.h"
#include "plugin/cross/stream_manager.h"
#include "client_glue.h"
#include "globals_glue.h"
-#include "third_party/nixysa/static_glue/npapi/common.h"
#ifdef OS_MACOSX
#include "plugin_mac.h"
@@ -659,14 +658,15 @@ void PluginObject::Resize(int width, int height) {
if (prev_width_ != width || prev_height_ != height) {
prev_width_ = width;
prev_height_ = height;
+
if (renderer_ && !fullscreen_) {
// Tell the renderer and client that our window has been resized.
// If we're in fullscreen mode when this happens, we don't want to pass
// the information through; the renderer will pick it up when we switch
// back to plugin mode.
- renderer_->Resize(width, height);
+ renderer_->Resize(prev_width_, prev_height_);
// This is just so that the client can send an event to the user.
- client()->SendResizeEvent(width, height, fullscreen_);
+ client()->SendResizeEvent(prev_width_, prev_height_, fullscreen_);
}
}
}
@@ -721,8 +721,8 @@ void PluginObject::RedirectToFile(const char *url) {
NPObject *global_object;
NPN_GetValue(npp(), NPNVWindowNPObject, &global_object);
NPString string;
- string.utf8characters = full_cmd.get();
- string.utf8length = strlen(string.utf8characters);
+ string.UTF8Characters = full_cmd.get();
+ string.UTF8Length = strlen(string.UTF8Characters);
NPVariant result;
bool temp = NPN_Evaluate(npp(), global_object, &string, &result);
if (temp) {
diff --git a/o3d/plugin/plugin.gyp b/o3d/plugin/plugin.gyp
index 45d3fe2..27248dc 100644
--- a/o3d/plugin/plugin.gyp
+++ b/o3d/plugin/plugin.gyp
@@ -50,6 +50,7 @@
'../../v8/tools/gyp/v8.gyp:v8',
'../core/core.gyp:o3dCore',
'../core/core.gyp:o3dCorePlatform',
+ '../gpu_plugin/gpu_plugin.gyp:np_utils',
'../import/archive.gyp:o3dArchive',
'../utils/utils.gyp:o3dUtils',
'../../native_client/src/shared/imc/imc.gyp:google_nacl_imc',
diff --git a/o3d/plugin/win/main_win.cc b/o3d/plugin/win/main_win.cc
index 9458819..33561c7 100644
--- a/o3d/plugin/win/main_win.cc
+++ b/o3d/plugin/win/main_win.cc
@@ -42,6 +42,7 @@
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/logging.h"
+#include "base/ref_counted.h"
#include "core/cross/display_mode.h"
#include "core/cross/event.h"
#include "plugin/cross/plugin_logging.h"
@@ -50,14 +51,32 @@
#include "v8/include/v8.h"
#include "breakpad/win/bluescreen_detector.h"
+#if defined(RENDERER_CB)
+#include "core/cross/command_buffer/renderer_cb.h"
+#include "core/cross/command_buffer/display_window_cb.h"
+#include "gpu_plugin/command_buffer.h"
+#endif
+
using glue::_o3d::PluginObject;
using glue::StreamManager;
using o3d::DisplayWindowWindows;
using o3d::Event;
+#if defined(RENDERER_CB)
+using o3d::gpu_plugin::CommandBuffer;
+using o3d::gpu_plugin::NPObjectPointer;
+#endif
+
namespace {
// The instance handle of the O3D DLL.
HINSTANCE g_module_instance;
+
+// TODO(apatrick): We can have an NPBrowser in the other configurations when we
+// move over to gyp. This is just to avoid having to write scons files for
+// np_utils.
+#if defined(RENDERER_CB)
+o3d::gpu_plugin::NPBrowser* g_browser;
+#endif
} // namespace anonymous
#if !defined(O3D_INTERNAL_PLUGIN)
@@ -717,6 +736,11 @@ extern "C" {
NPError OSCALL NP_Initialize(NPNetscapeFuncs *browserFuncs) {
HANDLE_CRASHES;
+
+#if defined(RENDERER_CB)
+ g_browser = new o3d::gpu_plugin::NPBrowser(browserFuncs);
+#endif
+
NPError retval = InitializeNPNApi(browserFuncs);
if (retval != NPERR_NO_ERROR) return retval;
return InitializePlugin();
@@ -755,6 +779,11 @@ NPError OSCALL NP_Shutdown(void) {
g_bluescreen_detector = NULL;
}
+#if defined(RENDERER_CB)
+ delete g_browser;
+ g_browser = NULL;
+#endif
+
#endif // O3D_INTERNAL_PLUGIN
return NPERR_NO_ERROR;
@@ -887,11 +916,26 @@ NPError NPP_SetWindow(NPP instance, NPWindow *window) {
::ShowWindow(content_window, SW_SHOW);
// create and assign the graphics context
+#if defined(RENDERER_CB)
+ const unsigned int kDefaultCommandBufferSize = 256 << 10;
+ NPObjectPointer<CommandBuffer> command_buffer =
+ RendererCBLocal::CreateCommandBuffer(instance,
+ obj->GetHWnd(),
+ kDefaultCommandBufferSize);
+
+ DisplayWindowCB default_display;
+ default_display.set_npp(instance);
+ default_display.set_command_buffer(command_buffer);
+
+ obj->CreateRenderer(default_display);
+ obj->renderer()->Resize(window->width, window->height);
+ obj->client()->Init();
+#else
DisplayWindowWindows default_display;
default_display.set_hwnd(obj->GetHWnd());
-
obj->CreateRenderer(default_display);
obj->client()->Init();
+#endif
// we set the timer to 10ms or 100fps. At the time of this comment
// the renderer does a vsync the max fps it will run will be the refresh
diff --git a/o3d/tests/build.scons b/o3d/tests/build.scons
index d26e4bf..7d20e6c 100644
--- a/o3d/tests/build.scons
+++ b/o3d/tests/build.scons
@@ -279,21 +279,6 @@ if env['TARGET_PLATFORM']=='WINDOWS':
]
)
-# add command buffer renderer unit tests only on that renderer platform.
-if 'RENDERER_CB' in env['CPPDEFINES']:
- tests += [
- 'command_buffer/client/cross/id_allocator_test.cc',
- 'command_buffer/common/cross/bitfield_helpers_test.cc',
- 'command_buffer/service/cross/effect_utils_test.cc',
- 'command_buffer/service/cross/resource_test.cc',
- 'command_buffer/client/cross/cmd_buffer_helper_test.cc',
- 'command_buffer/client/cross/fenced_allocator_test.cc',
- 'command_buffer/client/cross/buffer_sync_proxy_test.cc',
- 'command_buffer/service/cross/buffer_rpc_test.cc',
- 'command_buffer/service/cross/cmd_buffer_engine_test.cc',
- 'command_buffer/service/cross/cmd_parser_test.cc',
- ]
-
unit_tests = env.Program('unit_tests', tests)
# After building the test executable, force the windows executable to output
diff --git a/o3d/tests/common/cross/main.cc b/o3d/tests/common/cross/main.cc
index b8c3fc3..540107d 100644
--- a/o3d/tests/common/cross/main.cc
+++ b/o3d/tests/common/cross/main.cc
@@ -33,6 +33,7 @@
// defines the common main() for all unit tests
#include <build/build_config.h>
#include "base/at_exit.h"
+#include "base/message_loop.h"
#include "gtest/gtest.h"
#ifdef OS_WIN
@@ -41,6 +42,7 @@ int test_main(int argc, wchar_t **argv) {
int test_main(int argc, char **argv) {
#endif
::base::AtExitManager at_exit_manager;
+ MessageLoop message_loop;
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
diff --git a/o3d/tests/common/win/testing_common.cc b/o3d/tests/common/win/testing_common.cc
index e498331..0a31823 100644
--- a/o3d/tests/common/win/testing_common.cc
+++ b/o3d/tests/common/win/testing_common.cc
@@ -29,7 +29,6 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
// Contains windows-specific code for setting up the Client object
// used in the unit tests. Defines WinMain and a WindowProc for running
// the GUnit tests
@@ -49,6 +48,27 @@
#include "core/cross/renderer.h"
#include "core/cross/renderer_platform.h"
#include "core/cross/types.h"
+#include "core/win/display_window_win.h"
+
+#if defined(RENDERER_CB)
+#include "core/cross/command_buffer/renderer_cb.h"
+#include "core/cross/command_buffer/display_window_cb.h"
+#include "gpu_plugin/command_buffer.h"
+#include "gpu_plugin/np_utils/np_browser_stub.h"
+#endif
+
+using o3d::DisplayWindowWindows;
+
+#if defined(RENDERER_CB)
+using o3d::DisplayWindowCB;
+using o3d::gpu_plugin::CommandBuffer;
+using o3d::gpu_plugin::NPObjectPointer;
+using o3d::gpu_plugin::StubNPBrowser;
+using o3d::RendererCBLocal;
+#endif
+
+const int kWindowWidth = 512;
+const int kWindowHeight = 512;
o3d::ServiceLocator* g_service_locator = NULL;
o3d::DisplayWindow* g_display_window = NULL;
@@ -112,8 +132,8 @@ int WINAPI WinMain(HINSTANCE instance,
WS_OVERLAPPEDWINDOW,
-1000,
0,
- 512,
- 512,
+ kWindowWidth,
+ kWindowHeight,
0,
0,
instance,
@@ -153,16 +173,36 @@ int WINAPI WinMain(HINSTANCE instance,
o3d::Profiler profiler(g_service_locator);
o3d::Features features(g_service_locator);
+ // TODO(apatrick): We can have an NPBrowser in the other configurations when
+ // we move over to gyp. This is just to avoid having to write scons files
+ // for np_utils.
+#if defined(RENDERER_CB)
+ StubNPBrowser browser;
+#endif
+
// create a renderer device based on the current platform
g_renderer = o3d::Renderer::CreateDefaultRenderer(g_service_locator);
// Initialize the renderer for off-screen rendering if kOffScreenRenderer
// is in the environment.
bool success;
- o3d::DisplayWindowWindows* display_window =
- new o3d::DisplayWindowWindows();
- display_window = display_window;
+
+#if defined(RENDERER_CB)
+ const unsigned int kDefaultCommandBufferSize = 256 << 10;
+
+ DisplayWindowCB* display_window = new o3d::DisplayWindowCB;
+ display_window->set_npp(NULL);
+ display_window->set_command_buffer(RendererCBLocal::CreateCommandBuffer(
+ NULL,
+ g_window_handle,
+ kDefaultCommandBufferSize));
+ display_window->set_width(kWindowWidth);
+ display_window->set_height(kWindowHeight);
+#else
+ DisplayWindowWindows* display_window = new o3d::DisplayWindowWindows;
display_window->set_hwnd(g_window_handle);
+#endif
+
g_display_window = display_window;
bool offscreen = (::GetEnvironmentVariableW(kOffScreenRenderer,
NULL, 0) != 0);
diff --git a/o3d/tests/tests.gyp b/o3d/tests/tests.gyp
index 92d4fbf..1aef0cc 100644
--- a/o3d/tests/tests.gyp
+++ b/o3d/tests/tests.gyp
@@ -102,6 +102,16 @@
],
},
],
+ ['renderer == "cb"',
+ {
+ 'dependencies': [
+ '../command_buffer/command_buffer.gyp:command_buffer_client_test',
+ '../command_buffer/command_buffer.gyp:command_buffer_common_test',
+ '../command_buffer/command_buffer.gyp:command_buffer_service_test',
+ '../gpu_plugin/gpu_plugin.gyp:np_utils',
+ ]
+ },
+ ],
['OS == "mac"',
{
'dependencies': [
@@ -226,15 +236,6 @@
],
},
],
- ['cb_service != "none"',
- {
- 'dependencies' : [
- '../command_buffer/command_buffer.gyp:command_buffer_client_test',
- '../command_buffer/command_buffer.gyp:command_buffer_common_test',
- '../command_buffer/command_buffer.gyp:command_buffer_service_test',
- ],
- },
- ],
],
},
],