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

Side by Side Diff: command_buffer/client/cross/big_test_client.cc

Issue 212018: Change command buffer client code to use structures.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: '' Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | command_buffer/client/cross/buffer_sync_proxy_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2009, Google Inc. 2 * Copyright 2009, Google Inc.
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are 6 * modification, are permitted provided that the following conditions are
7 * met: 7 * met:
8 * 8 *
9 * * Redistributions of source code must retain the above copyright 9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 29 matching lines...) Expand all
40 #include "command_buffer/common/cross/rpc_imc.h" 40 #include "command_buffer/common/cross/rpc_imc.h"
41 #include "command_buffer/client/cross/cmd_buffer_helper.h" 41 #include "command_buffer/client/cross/cmd_buffer_helper.h"
42 #include "command_buffer/client/cross/buffer_sync_proxy.h" 42 #include "command_buffer/client/cross/buffer_sync_proxy.h"
43 #include "third_party/vectormath/files/vectormathlibrary/include/vectormath/scal ar/cpp/vectormath_aos.h" // NOLINT 43 #include "third_party/vectormath/files/vectormathlibrary/include/vectormath/scal ar/cpp/vectormath_aos.h" // NOLINT
44 44
45 namespace o3d { 45 namespace o3d {
46 namespace command_buffer { 46 namespace command_buffer {
47 47
48 namespace math = Vectormath::Aos; 48 namespace math = Vectormath::Aos;
49 49
50 // Adds a Clear command into the command buffer.
51 // Parameters:
52 // cmd_buffer: the command buffer helper.
53 // buffers: a bitfield of which buffers to clear (a combination of
54 // GAPIInterface::COLOR, GAPIInterface::DEPTH and GAPIInterface::STENCIL).
55 // color: the color buffer clear value.
56 // depth: the depth buffer clear value.
57 // stencil: the stencil buffer clear value.
58 void ClearCmd(CommandBufferHelper *cmd_buffer,
59 const unsigned int buffers,
60 const RGBA &color,
61 float depth,
62 unsigned int stencil) {
63 CommandBufferEntry args[7];
64 args[0].value_uint32 = buffers;
65 args[1].value_float = color.red;
66 args[2].value_float = color.green;
67 args[3].value_float = color.blue;
68 args[4].value_float = color.alpha;
69 args[5].value_float = depth;
70 args[6].value_uint32 = stencil;
71 cmd_buffer->AddCommand(command_buffer::CLEAR, 7, args);
72 }
73
74 // Adds a SetViewport command into the buffer. 50 // Adds a SetViewport command into the buffer.
75 // Parameters: 51 // Parameters:
76 // cmd_buffer: the command buffer helper. 52 // cmd_buffer: the command buffer helper.
77 // x, y, width, height: the dimensions of the Viewport. 53 // x, y, width, height: the dimensions of the Viewport.
78 // z_near, z_far: the near and far clip plane distances. 54 // z_near, z_far: the near and far clip plane distances.
79 void SetViewportCmd(CommandBufferHelper *cmd_buffer, 55 void SetViewportCmd(CommandBufferHelper *cmd_buffer,
80 unsigned int x, 56 unsigned int x,
81 unsigned int y, 57 unsigned int y,
82 unsigned int width, 58 unsigned int width,
83 unsigned int height, 59 unsigned int height,
84 float z_near, 60 float z_near,
85 float z_far) { 61 float z_far) {
86 CommandBufferEntry args[6]; 62 cmd_buffer->SetViewport(x, y, width, height, z_near, z_far);
87 args[0].value_uint32 = x;
88 args[1].value_uint32 = y;
89 args[2].value_uint32 = width;
90 args[3].value_uint32 = height;
91 args[4].value_float = z_near;
92 args[5].value_float = z_far;
93 cmd_buffer->AddCommand(command_buffer::SET_VIEWPORT, 6, args);
94 } 63 }
95 64
96 // Copy a data buffer to args, for IMMEDIATE commands. Returns the number of 65 // Copy a data buffer to args, for IMMEDIATE commands. Returns the number of
97 // args used. 66 // args used.
98 unsigned int CopyToArgs(CommandBufferEntry *args, 67 unsigned int CopyToArgs(CommandBufferEntry *args,
99 const void *data, 68 const void *data,
100 size_t size) { 69 size_t size) {
101 memcpy(args, data, size); 70 memcpy(args, data, size);
102 const unsigned int arg_size = sizeof(args[0]); 71 const unsigned int arg_size = sizeof(args[0]);
103 return static_cast<unsigned int>((size + arg_size - 1) / arg_size); 72 return static_cast<unsigned int>((size + arg_size - 1) / arg_size);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 RPCShmHandle shm = CreateShm(kShmSize); 105 RPCShmHandle shm = CreateShm(kShmSize);
137 void *shm_address = MapShm(shm, kShmSize); 106 void *shm_address = MapShm(shm, kShmSize);
138 unsigned int shm_id = proxy.RegisterSharedMemory(shm, kShmSize); 107 unsigned int shm_id = proxy.RegisterSharedMemory(shm, kShmSize);
139 108
140 { 109 {
141 CommandBufferHelper cmd_buffer(&proxy); 110 CommandBufferHelper cmd_buffer(&proxy);
142 cmd_buffer.Init(500); 111 cmd_buffer.Init(500);
143 112
144 // Clear the buffers. 113 // Clear the buffers.
145 RGBA color = {0.2f, 0.2f, 0.2f, 1.f}; 114 RGBA color = {0.2f, 0.2f, 0.2f, 1.f};
146 ClearCmd(&cmd_buffer, GAPIInterface::COLOR | GAPIInterface::DEPTH, color, 115 cmd_buffer.Clear(GAPIInterface::COLOR | GAPIInterface::DEPTH,
147 1.f, 0); 116 color.red, color.green, color.blue, color.alpha,
117 1.f, 0);
148 118
149 const ResourceID vertex_buffer_id = 1; 119 const ResourceID vertex_buffer_id = 1;
150 const ResourceID vertex_struct_id = 1; 120 const ResourceID vertex_struct_id = 1;
151 121
152 // AddCommand copies the args, so it is safe to re-use args across various 122 static const CustomVertex vertices[4] = {
153 // calls.
154 // 20 is the largest command we use (SET_PARAM_DATA_IMMEDIATE for matrices).
155 CommandBufferEntry args[20];
156
157 CustomVertex vertices[4] = {
158 {-.5f, -.5f, 0.f, 1.f, 0, 0}, 123 {-.5f, -.5f, 0.f, 1.f, 0, 0},
159 {.5f, -.5f, 0.f, 1.f, 1, 0}, 124 {.5f, -.5f, 0.f, 1.f, 1, 0},
160 {-.5f, .5f, 0.f, 1.f, 0, 1}, 125 {-.5f, .5f, 0.f, 1.f, 0, 1},
161 {.5f, .5f, 0.f, 1.f, 1, 1}, 126 {.5f, .5f, 0.f, 1.f, 1, 1},
162 }; 127 };
163 args[0].value_uint32 = vertex_buffer_id; 128 cmd_buffer.CreateVertexBuffer(vertex_buffer_id, sizeof(vertices), 0);
164 args[1].value_uint32 = sizeof(vertices); // size
165 args[2].value_uint32 = 0; // flags
166 cmd_buffer.AddCommand(command_buffer::CREATE_VERTEX_BUFFER, 3, args);
167 129
168 memcpy(shm_address, vertices, sizeof(vertices)); 130 memcpy(shm_address, vertices, sizeof(vertices));
169 args[0].value_uint32 = vertex_buffer_id; 131 cmd_buffer.SetVertexBufferData(
170 args[1].value_uint32 = 0; // offset in VB 132 vertex_buffer_id, 0, sizeof(vertices), shm_id, 0);
171 args[2].value_uint32 = sizeof(vertices); // size
172 args[3].value_uint32 = shm_id; // shm
173 args[4].value_uint32 = 0; // offset in shm
174 cmd_buffer.AddCommand(command_buffer::SET_VERTEX_BUFFER_DATA, 5, args);
175 unsigned int token = cmd_buffer.InsertToken(); 133 unsigned int token = cmd_buffer.InsertToken();
176 134
177 args[0].value_uint32 = vertex_struct_id; 135 cmd_buffer.CreateVertexStruct(vertex_struct_id, 2);
178 args[1].value_uint32 = 2; // input count
179 cmd_buffer.AddCommand(command_buffer::CREATE_VERTEX_STRUCT, 2, args);
180 136
181 // Set POSITION input stream 137 // Set POSITION input stream
182 args[0].value_uint32 = vertex_struct_id; 138 cmd_buffer.SetVertexInput(vertex_struct_id, 0, vertex_buffer_id, 0,
183 args[1].value_uint32 = 0; // input 139 vertex_struct::POSITION, 0,
184 args[2].value_uint32 = vertex_buffer_id; // buffer 140 vertex_struct::FLOAT4, sizeof(CustomVertex));
185 args[3].value_uint32 = 0; // offset
186 args[4].value_uint32 =
187 set_vertex_input_cmd::Stride::MakeValue(sizeof(CustomVertex)) |
188 set_vertex_input_cmd::Type::MakeValue(vertex_struct::FLOAT4) |
189 set_vertex_input_cmd::Semantic::MakeValue(vertex_struct::POSITION) |
190 set_vertex_input_cmd::SemanticIndex::MakeValue(0);
191 cmd_buffer.AddCommand(command_buffer::SET_VERTEX_INPUT, 5, args);
192 141
193 // Set TEXCOORD0 input stream 142 // Set TEXCOORD0 input stream
194 args[1].value_uint32 = 1; // input 143 cmd_buffer.SetVertexInput(vertex_struct_id, 1, vertex_buffer_id, 16,
195 args[3].value_uint32 = 16; // offset 144 vertex_struct::TEX_COORD, 0,
196 args[4].value_uint32 = 145 vertex_struct::FLOAT2, sizeof(CustomVertex));
197 set_vertex_input_cmd::Stride::MakeValue(sizeof(CustomVertex)) |
198 set_vertex_input_cmd::Type::MakeValue(vertex_struct::FLOAT2) |
199 set_vertex_input_cmd::Semantic::MakeValue(vertex_struct::TEX_COORD) |
200 set_vertex_input_cmd::SemanticIndex::MakeValue(0);
201 cmd_buffer.AddCommand(command_buffer::SET_VERTEX_INPUT, 5, args);
202 146
203 // wait for previous transfer to be executed, so that we can re-use the 147 // wait for previous transfer to be executed, so that we can re-use the
204 // transfer shared memory buffer. 148 // transfer shared memory buffer.
205 cmd_buffer.WaitForToken(token); 149 cmd_buffer.WaitForToken(token);
206 memcpy(shm_address, effect_data, sizeof(effect_data)); 150 memcpy(shm_address, effect_data, sizeof(effect_data));
207 const ResourceID effect_id = 1; 151 const ResourceID effect_id = 1;
208 args[0].value_uint32 = effect_id; 152 cmd_buffer.CreateEffect(effect_id, sizeof(effect_data), shm_id, 0);
209 args[1].value_uint32 = sizeof(effect_data); // size
210 args[2].value_uint32 = shm_id; // shm
211 args[3].value_uint32 = 0; // offset in shm
212 cmd_buffer.AddCommand(command_buffer::CREATE_EFFECT, 4, args);
213 token = cmd_buffer.InsertToken(); 153 token = cmd_buffer.InsertToken();
214 154
215 // Create a 4x4 2D texture. 155 // Create a 4x4 2D texture.
216 const ResourceID texture_id = 1; 156 const ResourceID texture_id = 1;
217 args[0].value_uint32 = texture_id; 157 // TODO(gman): the 0 should be a 1?!?!
218 args[1].value_uint32 = 158 cmd_buffer.CreateTexture2d(texture_id, 4, 4, 0, texture::ARGB8, 0);
219 create_texture_2d_cmd::Width::MakeValue(4) |
220 create_texture_2d_cmd::Height::MakeValue(4);
221 args[2].value_uint32 =
222 create_texture_2d_cmd::Levels::MakeValue(0) |
223 create_texture_2d_cmd::Format::MakeValue(texture::ARGB8) |
224 create_texture_2d_cmd::Flags::MakeValue(0);
225 cmd_buffer.AddCommand(command_buffer::CREATE_TEXTURE_2D, 3, args);
226 159
227 unsigned int texels[4] = { 160 static const unsigned int texels[4] = {
228 0xff0000ff, 161 0xff0000ff,
229 0xffff00ff, 162 0xffff00ff,
230 0xff00ffff, 163 0xff00ffff,
231 0xffffffff, 164 0xffffffff,
232 }; 165 };
233 // wait for previous transfer to be executed, so that we can re-use the 166 // wait for previous transfer to be executed, so that we can re-use the
234 // transfer shared memory buffer. 167 // transfer shared memory buffer.
235 cmd_buffer.WaitForToken(token); 168 cmd_buffer.WaitForToken(token);
236 memcpy(shm_address, texels, sizeof(texels)); 169 memcpy(shm_address, texels, sizeof(texels));
237 // Creates a 4x4 texture by uploading 2x2 data in each quadrant. 170 // Creates a 4x4 texture by uploading 2x2 data in each quadrant.
238 for (unsigned int x = 0; x < 2; ++x) 171 for (unsigned int x = 0; x < 2; ++x)
239 for (unsigned int y = 0; y < 2; ++y) { 172 for (unsigned int y = 0; y < 2; ++y) {
240 args[0].value_uint32 = texture_id; 173 cmd_buffer.SetTextureData(texture_id, x * 2, y * 2, 0, 2, 2, 1, 0, 0,
241 args[1].value_uint32 = 174 sizeof(texels[0]) * 2, // row_pitch
242 set_texture_data_cmd::X::MakeValue(x*2) | 175 0, // slice_pitch
243 set_texture_data_cmd::Y::MakeValue(y*2); 176 sizeof(texels), // size
244 args[2].value_uint32 = 177 shm_id,
245 set_texture_data_cmd::Width::MakeValue(2) | 178 0);
246 set_texture_data_cmd::Height::MakeValue(2);
247 args[3].value_uint32 =
248 set_texture_data_cmd::Z::MakeValue(0) |
249 set_texture_data_cmd::Depth::MakeValue(1);
250 args[4].value_uint32 = set_texture_data_cmd::Level::MakeValue(0);
251 args[5].value_uint32 = sizeof(texels[0]) * 2; // row_pitch
252 args[6].value_uint32 = 0; // slice_pitch
253 args[7].value_uint32 = sizeof(texels); // size
254 args[8].value_uint32 = shm_id;
255 args[9].value_uint32 = 0;
256 cmd_buffer.AddCommand(command_buffer::SET_TEXTURE_DATA, 10, args);
257 } 179 }
258 token = cmd_buffer.InsertToken(); 180 token = cmd_buffer.InsertToken();
259 181
260 const ResourceID sampler_id = 1; 182 const ResourceID sampler_id = 1;
261 args[0].value_uint32 = sampler_id; 183 cmd_buffer.CreateSampler(sampler_id);
262 cmd_buffer.AddCommand(command_buffer::CREATE_SAMPLER, 1, args); 184 cmd_buffer.SetSamplerTexture(sampler_id, texture_id);
263 185 cmd_buffer.SetSamplerStates(sampler_id,
264 args[0].value_uint32 = sampler_id; 186 sampler::CLAMP_TO_EDGE,
265 args[1].value_uint32 = texture_id; 187 sampler::CLAMP_TO_EDGE,
266 cmd_buffer.AddCommand(command_buffer::SET_SAMPLER_TEXTURE, 2, args); 188 sampler::CLAMP_TO_EDGE,
267 189 sampler::POINT,
268 args[0].value_uint32 = sampler_id; 190 sampler::POINT,
269 args[1].value_uint32 = 191 sampler::NONE,
270 set_sampler_states::AddressingU::MakeValue(sampler::CLAMP_TO_EDGE) | 192 1);
271 set_sampler_states::AddressingV::MakeValue(sampler::CLAMP_TO_EDGE) |
272 set_sampler_states::AddressingW::MakeValue(sampler::CLAMP_TO_EDGE) |
273 set_sampler_states::MagFilter::MakeValue(sampler::POINT) |
274 set_sampler_states::MinFilter::MakeValue(sampler::POINT) |
275 set_sampler_states::MipFilter::MakeValue(sampler::NONE) |
276 set_sampler_states::MaxAnisotropy::MakeValue(1);
277 cmd_buffer.AddCommand(command_buffer::SET_SAMPLER_STATES, 2, args);
278 193
279 // Create a parameter for the sampler. 194 // Create a parameter for the sampler.
280 const ResourceID sampler_param_id = 1; 195 const ResourceID sampler_param_id = 1;
281 { 196 {
282 const char param_name[] = "s0"; 197 static const char param_name[] = "s0";
283 args[0].value_uint32 = sampler_param_id; 198 cmd_buffer.CreateParamByNameImmediate(sampler_param_id, effect_id,
284 args[1].value_uint32 = effect_id; 199 sizeof(param_name), param_name);
285 args[2].value_uint32 = sizeof(param_name);
286 unsigned int arg_count = CopyToArgs(args + 3, param_name,
287 sizeof(param_name));
288 cmd_buffer.AddCommand(command_buffer::CREATE_PARAM_BY_NAME_IMMEDIATE,
289 3 + arg_count, args);
290 } 200 }
291 201
292 const ResourceID matrix_param_id = 2; 202 const ResourceID matrix_param_id = 2;
293 { 203 {
294 const char param_name[] = "worldViewProj"; 204 static const char param_name[] = "worldViewProj";
295 args[0].value_uint32 = matrix_param_id; 205 cmd_buffer.CreateParamByNameImmediate(matrix_param_id, effect_id,
296 args[1].value_uint32 = effect_id; 206 sizeof(param_name), param_name);
297 args[2].value_uint32 = sizeof(param_name);
298 unsigned int arg_count = CopyToArgs(args + 3, param_name,
299 sizeof(param_name));
300 cmd_buffer.AddCommand(command_buffer::CREATE_PARAM_BY_NAME_IMMEDIATE,
301 3 + arg_count, args);
302 } 207 }
303 208
304 float t = 0.f; 209 float t = 0.f;
305 while (true) { 210 while (true) {
306 t = fmodf(t + .01f, 1.f); 211 t = fmodf(t + .01f, 1.f);
307 math::Matrix4 m = 212 math::Matrix4 m =
308 math::Matrix4::translation(math::Vector3(0.f, 0.f, .5f)); 213 math::Matrix4::translation(math::Vector3(0.f, 0.f, .5f));
309 m *= math::Matrix4::rotationY(t * 2 * 3.1415926f); 214 m *= math::Matrix4::rotationY(t * 2 * 3.1415926f);
310 cmd_buffer.AddCommand(command_buffer::BEGIN_FRAME, 0 , NULL); 215 cmd_buffer.BeginFrame();
311 // Clear the background with an animated color (black to red). 216 // Clear the background with an animated color (black to red).
312 ClearCmd(&cmd_buffer, GAPIInterface::COLOR | GAPIInterface::DEPTH, color, 217 cmd_buffer.Clear(GAPIInterface::COLOR | GAPIInterface::DEPTH,
313 1.f, 0); 218 color.red, color.green, color.blue, color.alpha,
219 1.f, 0);
314 220
315 args[0].value_uint32 = vertex_struct_id; 221 cmd_buffer.SetVertexStruct(vertex_struct_id);
316 cmd_buffer.AddCommand(command_buffer::SET_VERTEX_STRUCT, 1, args); 222 cmd_buffer.SetEffect(effect_id);
223 cmd_buffer.SetParamDataImmediate(
224 sampler_param_id, sizeof(uint32), &sampler_id);
225 cmd_buffer.SetParamDataImmediate(
226 matrix_param_id, sizeof(m), &m);
227 cmd_buffer.Draw(GAPIInterface::TRIANGLE_STRIPS, 0, 2);
317 228
318 args[0].value_uint32 = effect_id; 229 cmd_buffer.EndFrame();
319 cmd_buffer.AddCommand(command_buffer::SET_EFFECT, 1, args);
320
321 args[0].value_uint32 = sampler_param_id;
322 args[1].value_uint32 = sizeof(Uint32); // NOLINT
323 args[2].value_uint32 = sampler_id;
324 cmd_buffer.AddCommand(command_buffer::SET_PARAM_DATA_IMMEDIATE, 3, args);
325
326 args[0].value_uint32 = matrix_param_id;
327 args[1].value_uint32 = sizeof(m);
328 unsigned int arg_count = CopyToArgs(args + 2, &m, sizeof(m));
329 cmd_buffer.AddCommand(command_buffer::SET_PARAM_DATA_IMMEDIATE,
330 2 + arg_count, args);
331
332 args[0].value_uint32 = GAPIInterface::TRIANGLE_STRIPS;
333 args[1].value_uint32 = 0; // first
334 args[2].value_uint32 = 2; // primitive count
335 cmd_buffer.AddCommand(command_buffer::DRAW, 3, args);
336
337 cmd_buffer.AddCommand(command_buffer::END_FRAME, 0 , NULL);
338 cmd_buffer.Flush(); 230 cmd_buffer.Flush();
339 } 231 }
340 232
341 cmd_buffer.Finish(); 233 cmd_buffer.Finish();
342 } 234 }
343 235
344 proxy.CloseConnection(); 236 proxy.CloseConnection();
345 proxy.UnregisterSharedMemory(shm_id); 237 proxy.UnregisterSharedMemory(shm_id);
346 DestroyShm(shm); 238 DestroyShm(shm);
347 239
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 int main(int argc, char **argv) { 290 int main(int argc, char **argv) {
399 nacl::HtpHandle htp_handle = InitConnection(argc, argv); 291 nacl::HtpHandle htp_handle = InitConnection(argc, argv);
400 if (htp_handle == nacl::kInvalidHtpHandle) { 292 if (htp_handle == nacl::kInvalidHtpHandle) {
401 return 1; 293 return 1;
402 } 294 }
403 295
404 o3d::command_buffer::BigTestClient(htp_handle); 296 o3d::command_buffer::BigTestClient(htp_handle);
405 CloseConnection(htp_handle); 297 CloseConnection(htp_handle);
406 return 0; 298 return 0;
407 } 299 }
OLDNEW
« no previous file with comments | « no previous file | command_buffer/client/cross/buffer_sync_proxy_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698