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

Side by Side Diff: command_buffer/service/cross/gapi_decoder.cc

Issue 332036: move all O3D specific command buffer stuff to command_buffer::o3d... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: Created 11 years, 1 month 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
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 22 matching lines...) Expand all
33 // This class contains the implementation of the GAPI decoder class, decoding 33 // This class contains the implementation of the GAPI decoder class, decoding
34 // GAPI commands into calls to a GAPIInterface class. 34 // GAPI commands into calls to a GAPIInterface class.
35 35
36 #include "base/cross/bits.h" 36 #include "base/cross/bits.h"
37 #include "command_buffer/common/cross/gapi_interface.h" 37 #include "command_buffer/common/cross/gapi_interface.h"
38 #include "command_buffer/service/cross/gapi_decoder.h" 38 #include "command_buffer/service/cross/gapi_decoder.h"
39 #include "command_buffer/service/cross/cmd_buffer_engine.h" 39 #include "command_buffer/service/cross/cmd_buffer_engine.h"
40 40
41 namespace o3d { 41 namespace o3d {
42 namespace command_buffer { 42 namespace command_buffer {
43 namespace o3d {
43 44
44 namespace { 45 namespace {
45 46
46 // Returns the address of the first byte after a struct. 47 // Returns the address of the first byte after a struct.
47 template <typename T> 48 template <typename T>
48 const void* AddressAfterStruct(const T& pod) { 49 const void* AddressAfterStruct(const T& pod) {
49 return reinterpret_cast<const uint8*>(&pod) + sizeof(pod); 50 return reinterpret_cast<const uint8*>(&pod) + sizeof(pod);
50 } 51 }
51 52
52 // Returns the size in bytes of the data of an Immediate command, a command with 53 // Returns the size in bytes of the data of an Immediate command, a command with
53 // its data inline in the command buffer. 54 // its data inline in the command buffer.
54 template <typename T> 55 template <typename T>
55 unsigned int ImmediateDataSize(uint32 arg_count, const T& pod) { 56 unsigned int ImmediateDataSize(uint32 arg_count, const T& pod) {
56 return static_cast<unsigned int>( 57 return static_cast<unsigned int>(
57 (arg_count + 1 - ComputeNumEntries(sizeof(pod))) * 58 (arg_count + 1 - ComputeNumEntries(sizeof(pod))) *
58 sizeof(CommandBufferEntry)); // NOLINT 59 sizeof(CommandBufferEntry)); // NOLINT
59 } 60 }
60 61
61 // A struct to hold info about each command. 62 // A struct to hold info about each command.
62 struct CommandInfo { 63 struct CommandInfo {
63 int arg_flags; // How to handle the arguments for this command 64 int arg_flags; // How to handle the arguments for this command
64 int arg_count; // How many arguments are expected for this command. 65 int arg_count; // How many arguments are expected for this command.
65 }; 66 };
66 67
67 // A table of CommandInfo for all the commands. 68 // A table of CommandInfo for all the commands.
68 const CommandInfo g_command_info[] = { 69 const CommandInfo g_command_info[] = {
69 #define O3D_COMMAND_BUFFER_CMD_OP(name) { \ 70 #define O3D_COMMAND_BUFFER_CMD_OP(name) { \
70 cmd::name::kArgFlags, \ 71 name::kArgFlags, \
71 sizeof(cmd::name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \ 72 sizeof(name) / sizeof(CommandBufferEntry) - 1, }, /* NOLINT */ \
72 73
73 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) 74 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP)
74 75
75 #undef O3D_COMMAND_BUFFER_CMD_OP 76 #undef O3D_COMMAND_BUFFER_CMD_OP
76 }; 77 };
77 78
78 } // anonymous namespace. 79 } // anonymous namespace.
79 80
80 // Decode command with its arguments, and call the corresponding GAPIInterface 81 // Decode command with its arguments, and call the corresponding GAPIInterface
81 // method. 82 // method.
82 // Note: args is a pointer to the command buffer. As such, it could be changed 83 // Note: args is a pointer to the command buffer. As such, it could be changed
83 // by a (malicious) client at any time, so if validation has to happen, it 84 // by a (malicious) client at any time, so if validation has to happen, it
84 // should operate on a copy of them. 85 // should operate on a copy of them.
85 parse_error::ParseError GAPIDecoder::DoCommand( 86 parse_error::ParseError GAPIDecoder::DoCommand(
86 unsigned int command, 87 unsigned int command,
87 unsigned int arg_count, 88 unsigned int arg_count,
88 const void* cmd_data) { 89 const void* cmd_data) {
89 if (command < arraysize(g_command_info)) { 90 if (command < arraysize(g_command_info)) {
90 const CommandInfo& info = g_command_info[command]; 91 const CommandInfo& info = g_command_info[command];
91 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count); 92 unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count);
92 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) || 93 if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) ||
93 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) { 94 (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) {
94 switch (command) { 95 switch (command) {
95 #define O3D_COMMAND_BUFFER_CMD_OP(name) \ 96 #define O3D_COMMAND_BUFFER_CMD_OP(name) \
96 case cmd::name::kCmdId: \ 97 case name::kCmdId: \
97 return Handle ## name( \ 98 return Handle ## name( \
98 arg_count, \ 99 arg_count, \
99 *static_cast<const cmd::name*>(cmd_data)); \ 100 *static_cast<const name*>(cmd_data)); \
100 101
101 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP) 102 O3D_COMMAND_BUFFER_CMDS(O3D_COMMAND_BUFFER_CMD_OP)
102 103
103 #undef O3D_COMMAND_BUFFER_CMD_OP 104 #undef O3D_COMMAND_BUFFER_CMD_OP
104 } 105 }
105 } else { 106 } else {
106 return parse_error::kParseInvalidArguments; 107 return parse_error::kParseInvalidArguments;
107 } 108 }
108 } 109 }
109 return parse_error::kParseUnknownCommand; 110 return parse_error::kParseUnknownCommand;
110 } 111 }
111 112
112 void *GAPIDecoder::GetAddressAndCheckSize(unsigned int shm_id, 113 void *GAPIDecoder::GetAddressAndCheckSize(unsigned int shm_id,
113 unsigned int offset, 114 unsigned int offset,
114 unsigned int size) { 115 unsigned int size) {
115 void * shm_addr = engine_->GetSharedMemoryAddress(shm_id); 116 void * shm_addr = engine_->GetSharedMemoryAddress(shm_id);
116 if (!shm_addr) return NULL; 117 if (!shm_addr) return NULL;
117 size_t shm_size = engine_->GetSharedMemorySize(shm_id); 118 size_t shm_size = engine_->GetSharedMemorySize(shm_id);
118 if (offset + size > shm_size) return NULL; 119 if (offset + size > shm_size) return NULL;
119 return static_cast<char *>(shm_addr) + offset; 120 return static_cast<char *>(shm_addr) + offset;
120 } 121 }
121 122
122 parse_error::ParseError GAPIDecoder::HandleNoop( 123 parse_error::ParseError GAPIDecoder::HandleNoop(
123 uint32 arg_count, 124 uint32 arg_count,
124 const cmd::Noop& args) { 125 const Noop& args) {
125 return parse_error::kParseNoError; 126 return parse_error::kParseNoError;
126 } 127 }
127 128
128 parse_error::ParseError GAPIDecoder::HandleSetToken( 129 parse_error::ParseError GAPIDecoder::HandleSetToken(
129 uint32 arg_count, 130 uint32 arg_count,
130 const cmd::SetToken& args) { 131 const SetToken& args) {
131 engine_->set_token(args.token); 132 engine_->set_token(args.token);
132 return parse_error::kParseNoError; 133 return parse_error::kParseNoError;
133 } 134 }
134 135
135 parse_error::ParseError GAPIDecoder::HandleBeginFrame( 136 parse_error::ParseError GAPIDecoder::HandleBeginFrame(
136 uint32 arg_count, 137 uint32 arg_count,
137 const cmd::BeginFrame& args) { 138 const BeginFrame& args) {
138 gapi_->BeginFrame(); 139 gapi_->BeginFrame();
139 return parse_error::kParseNoError; 140 return parse_error::kParseNoError;
140 } 141 }
141 142
142 parse_error::ParseError GAPIDecoder::HandleEndFrame( 143 parse_error::ParseError GAPIDecoder::HandleEndFrame(
143 uint32 arg_count, 144 uint32 arg_count,
144 const cmd::EndFrame& args) { 145 const EndFrame& args) {
145 gapi_->EndFrame(); 146 gapi_->EndFrame();
146 return parse_error::kParseNoError; 147 return parse_error::kParseNoError;
147 } 148 }
148 149
149 parse_error::ParseError GAPIDecoder::HandleClear( 150 parse_error::ParseError GAPIDecoder::HandleClear(
150 uint32 arg_count, 151 uint32 arg_count,
151 const cmd::Clear& args) { 152 const Clear& args) {
152 // Pull out some values so they can't be changed by another thread after we've 153 // Pull out some values so they can't be changed by another thread after we've
153 // validated them. 154 // validated them.
154 uint32 buffers = args.buffers; 155 uint32 buffers = args.buffers;
155 if (buffers & ~command_buffer::kAllBuffers) 156 if (buffers & ~kAllBuffers)
156 return parse_error::kParseInvalidArguments; 157 return parse_error::kParseInvalidArguments;
157 RGBA rgba; 158 RGBA rgba;
158 rgba.red = args.red; 159 rgba.red = args.red;
159 rgba.green = args.green; 160 rgba.green = args.green;
160 rgba.blue = args.blue; 161 rgba.blue = args.blue;
161 rgba.alpha = args.alpha; 162 rgba.alpha = args.alpha;
162 gapi_->Clear(buffers, rgba, args.depth, args.stencil); 163 gapi_->Clear(buffers, rgba, args.depth, args.stencil);
163 return parse_error::kParseNoError; 164 return parse_error::kParseNoError;
164 } 165 }
165 166
166 parse_error::ParseError GAPIDecoder::HandleSetViewport( 167 parse_error::ParseError GAPIDecoder::HandleSetViewport(
167 uint32 arg_count, 168 uint32 arg_count,
168 const cmd::SetViewport& args) { 169 const SetViewport& args) {
169 gapi_->SetViewport(args.left, 170 gapi_->SetViewport(args.left,
170 args.top, 171 args.top,
171 args.width, 172 args.width,
172 args.height, 173 args.height,
173 args.z_min, 174 args.z_min,
174 args.z_max); 175 args.z_max);
175 return parse_error::kParseNoError; 176 return parse_error::kParseNoError;
176 } 177 }
177 178
178 parse_error::ParseError GAPIDecoder::HandleCreateVertexBuffer( 179 parse_error::ParseError GAPIDecoder::HandleCreateVertexBuffer(
179 uint32 arg_count, 180 uint32 arg_count,
180 const cmd::CreateVertexBuffer& args) { 181 const CreateVertexBuffer& args) {
181 return gapi_->CreateVertexBuffer( 182 return gapi_->CreateVertexBuffer(
182 args.vertex_buffer_id, args.size, args.flags); 183 args.vertex_buffer_id, args.size, args.flags);
183 } 184 }
184 185
185 parse_error::ParseError GAPIDecoder::HandleDestroyVertexBuffer( 186 parse_error::ParseError GAPIDecoder::HandleDestroyVertexBuffer(
186 uint32 arg_count, 187 uint32 arg_count,
187 const cmd::DestroyVertexBuffer& args) { 188 const DestroyVertexBuffer& args) {
188 return gapi_->DestroyVertexBuffer(args.vertex_buffer_id); 189 return gapi_->DestroyVertexBuffer(args.vertex_buffer_id);
189 } 190 }
190 191
191 parse_error::ParseError GAPIDecoder::HandleSetVertexBufferDataImmediate( 192 parse_error::ParseError GAPIDecoder::HandleSetVertexBufferDataImmediate(
192 uint32 arg_count, 193 uint32 arg_count,
193 const cmd::SetVertexBufferDataImmediate& args) { 194 const SetVertexBufferDataImmediate& args) {
194 uint32 size = ImmediateDataSize(arg_count, args); 195 uint32 size = ImmediateDataSize(arg_count, args);
195 if (size == 0) { 196 if (size == 0) {
196 return parse_error::kParseNoError; 197 return parse_error::kParseNoError;
197 } 198 }
198 return gapi_->SetVertexBufferData(args.vertex_buffer_id, args.offset, 199 return gapi_->SetVertexBufferData(args.vertex_buffer_id, args.offset,
199 size, 200 size,
200 AddressAfterStruct(args)); 201 AddressAfterStruct(args));
201 } 202 }
202 203
203 parse_error::ParseError GAPIDecoder::HandleSetVertexBufferData( 204 parse_error::ParseError GAPIDecoder::HandleSetVertexBufferData(
204 uint32 arg_count, 205 uint32 arg_count,
205 const cmd::SetVertexBufferData& args) { 206 const SetVertexBufferData& args) {
206 // Pull out some values so they can't be changed by another thread after we've 207 // Pull out some values so they can't be changed by another thread after we've
207 // validated them. 208 // validated them.
208 uint32 size = args.size; 209 uint32 size = args.size;
209 void *data = GetAddressAndCheckSize(args.shared_memory.id, 210 void *data = GetAddressAndCheckSize(args.shared_memory.id,
210 args.shared_memory.offset, 211 args.shared_memory.offset,
211 size); 212 size);
212 if (!data) return parse_error::kParseInvalidArguments; 213 if (!data) return parse_error::kParseInvalidArguments;
213 return gapi_->SetVertexBufferData( 214 return gapi_->SetVertexBufferData(
214 args.vertex_buffer_id, args.offset, size, data); 215 args.vertex_buffer_id, args.offset, size, data);
215 } 216 }
216 217
217 parse_error::ParseError GAPIDecoder::HandleGetVertexBufferData( 218 parse_error::ParseError GAPIDecoder::HandleGetVertexBufferData(
218 uint32 arg_count, 219 uint32 arg_count,
219 const cmd::GetVertexBufferData& args) { 220 const GetVertexBufferData& args) {
220 // Pull out some values so they can't be changed by another thread after we've 221 // Pull out some values so they can't be changed by another thread after we've
221 // validated them. 222 // validated them.
222 uint32 size = args.size; 223 uint32 size = args.size;
223 void *data = GetAddressAndCheckSize(args.shared_memory.id, 224 void *data = GetAddressAndCheckSize(args.shared_memory.id,
224 args.shared_memory.offset, 225 args.shared_memory.offset,
225 size); 226 size);
226 if (!data) return parse_error::kParseInvalidArguments; 227 if (!data) return parse_error::kParseInvalidArguments;
227 return gapi_->GetVertexBufferData( 228 return gapi_->GetVertexBufferData(
228 args.vertex_buffer_id, args.offset, size, data); 229 args.vertex_buffer_id, args.offset, size, data);
229 } 230 }
230 231
231 parse_error::ParseError GAPIDecoder::HandleCreateIndexBuffer( 232 parse_error::ParseError GAPIDecoder::HandleCreateIndexBuffer(
232 uint32 arg_count, 233 uint32 arg_count,
233 const cmd::CreateIndexBuffer& args) { 234 const CreateIndexBuffer& args) {
234 return gapi_->CreateIndexBuffer(args.index_buffer_id, args.size, args.flags); 235 return gapi_->CreateIndexBuffer(args.index_buffer_id, args.size, args.flags);
235 } 236 }
236 237
237 parse_error::ParseError GAPIDecoder::HandleDestroyIndexBuffer( 238 parse_error::ParseError GAPIDecoder::HandleDestroyIndexBuffer(
238 uint32 arg_count, 239 uint32 arg_count,
239 const cmd::DestroyIndexBuffer& args) { 240 const DestroyIndexBuffer& args) {
240 return gapi_->DestroyIndexBuffer(args.index_buffer_id); 241 return gapi_->DestroyIndexBuffer(args.index_buffer_id);
241 } 242 }
242 243
243 parse_error::ParseError GAPIDecoder::HandleSetIndexBufferDataImmediate( 244 parse_error::ParseError GAPIDecoder::HandleSetIndexBufferDataImmediate(
244 uint32 arg_count, 245 uint32 arg_count,
245 const cmd::SetIndexBufferDataImmediate& args) { 246 const SetIndexBufferDataImmediate& args) {
246 uint32 size = ImmediateDataSize(arg_count, args); 247 uint32 size = ImmediateDataSize(arg_count, args);
247 if (size == 0) { 248 if (size == 0) {
248 return parse_error::kParseNoError; 249 return parse_error::kParseNoError;
249 } 250 }
250 return gapi_->SetIndexBufferData(args.index_buffer_id, args.offset, size, 251 return gapi_->SetIndexBufferData(args.index_buffer_id, args.offset, size,
251 AddressAfterStruct(args)); 252 AddressAfterStruct(args));
252 } 253 }
253 254
254 parse_error::ParseError GAPIDecoder::HandleSetIndexBufferData( 255 parse_error::ParseError GAPIDecoder::HandleSetIndexBufferData(
255 uint32 arg_count, 256 uint32 arg_count,
256 const cmd::SetIndexBufferData& args) { 257 const SetIndexBufferData& args) {
257 // Pull out some values so they can't be changed by another thread after we've 258 // Pull out some values so they can't be changed by another thread after we've
258 // validated them. 259 // validated them.
259 uint32 size = args.size; 260 uint32 size = args.size;
260 void *data = GetAddressAndCheckSize(args.shared_memory.id, 261 void *data = GetAddressAndCheckSize(args.shared_memory.id,
261 args.shared_memory.offset, 262 args.shared_memory.offset,
262 size); 263 size);
263 if (!data) return parse_error::kParseInvalidArguments; 264 if (!data) return parse_error::kParseInvalidArguments;
264 return gapi_->SetIndexBufferData( 265 return gapi_->SetIndexBufferData(
265 args.index_buffer_id, args.offset, size, data); 266 args.index_buffer_id, args.offset, size, data);
266 } 267 }
267 268
268 parse_error::ParseError GAPIDecoder::HandleGetIndexBufferData( 269 parse_error::ParseError GAPIDecoder::HandleGetIndexBufferData(
269 uint32 arg_count, 270 uint32 arg_count,
270 const cmd::GetIndexBufferData& args) { 271 const GetIndexBufferData& args) {
271 // Pull out some values so they can't be changed by another thread after we've 272 // Pull out some values so they can't be changed by another thread after we've
272 // validated them. 273 // validated them.
273 uint32 size = args.size; 274 uint32 size = args.size;
274 void *data = GetAddressAndCheckSize(args.shared_memory.id, 275 void *data = GetAddressAndCheckSize(args.shared_memory.id,
275 args.shared_memory.offset, 276 args.shared_memory.offset,
276 size); 277 size);
277 if (!data) return parse_error::kParseInvalidArguments; 278 if (!data) return parse_error::kParseInvalidArguments;
278 return gapi_->GetIndexBufferData( 279 return gapi_->GetIndexBufferData(
279 args.index_buffer_id, args.offset, size, data); 280 args.index_buffer_id, args.offset, size, data);
280 } 281 }
281 282
282 parse_error::ParseError GAPIDecoder::HandleCreateVertexStruct( 283 parse_error::ParseError GAPIDecoder::HandleCreateVertexStruct(
283 uint32 arg_count, 284 uint32 arg_count,
284 const cmd::CreateVertexStruct& args) { 285 const CreateVertexStruct& args) {
285 return gapi_->CreateVertexStruct(args.vertex_struct_id, args.input_count); 286 return gapi_->CreateVertexStruct(args.vertex_struct_id, args.input_count);
286 } 287 }
287 288
288 parse_error::ParseError GAPIDecoder::HandleDestroyVertexStruct( 289 parse_error::ParseError GAPIDecoder::HandleDestroyVertexStruct(
289 uint32 arg_count, 290 uint32 arg_count,
290 const cmd::DestroyVertexStruct& args) { 291 const DestroyVertexStruct& args) {
291 return gapi_->DestroyVertexStruct(args.vertex_struct_id); 292 return gapi_->DestroyVertexStruct(args.vertex_struct_id);
292 } 293 }
293 294
294 parse_error::ParseError GAPIDecoder::HandleSetVertexInput( 295 parse_error::ParseError GAPIDecoder::HandleSetVertexInput(
295 uint32 arg_count, 296 uint32 arg_count,
296 const cmd::SetVertexInput& args) { 297 const SetVertexInput& args) {
297 unsigned int type_stride_semantic = args.type_stride_semantic; 298 unsigned int type_stride_semantic = args.type_stride_semantic;
298 unsigned int semantic_index = 299 unsigned int semantic_index =
299 cmd::SetVertexInput::SemanticIndex::Get(type_stride_semantic); 300 SetVertexInput::SemanticIndex::Get(type_stride_semantic);
300 unsigned int semantic = 301 unsigned int semantic =
301 cmd::SetVertexInput::Semantic::Get(type_stride_semantic); 302 SetVertexInput::Semantic::Get(type_stride_semantic);
302 unsigned int type = 303 unsigned int type =
303 cmd::SetVertexInput::Type::Get(type_stride_semantic); 304 SetVertexInput::Type::Get(type_stride_semantic);
304 unsigned int stride = 305 unsigned int stride =
305 cmd::SetVertexInput::Stride::Get(type_stride_semantic); 306 SetVertexInput::Stride::Get(type_stride_semantic);
306 if (semantic >= vertex_struct::kNumSemantics || 307 if (semantic >= vertex_struct::kNumSemantics ||
307 type >= vertex_struct::kNumTypes || stride == 0) 308 type >= vertex_struct::kNumTypes || stride == 0)
308 return parse_error::kParseInvalidArguments; 309 return parse_error::kParseInvalidArguments;
309 return gapi_->SetVertexInput( 310 return gapi_->SetVertexInput(
310 args.vertex_struct_id, args.input_index, args.vertex_buffer_id, 311 args.vertex_struct_id, args.input_index, args.vertex_buffer_id,
311 args.offset, stride, 312 args.offset, stride,
312 static_cast<vertex_struct::Type>(type), 313 static_cast<vertex_struct::Type>(type),
313 static_cast<vertex_struct::Semantic>(semantic), 314 static_cast<vertex_struct::Semantic>(semantic),
314 semantic_index); 315 semantic_index);
315 } 316 }
316 317
317 parse_error::ParseError GAPIDecoder::HandleSetVertexStruct( 318 parse_error::ParseError GAPIDecoder::HandleSetVertexStruct(
318 uint32 arg_count, 319 uint32 arg_count,
319 const cmd::SetVertexStruct& args) { 320 const SetVertexStruct& args) {
320 return gapi_->SetVertexStruct(args.vertex_struct_id); 321 return gapi_->SetVertexStruct(args.vertex_struct_id);
321 } 322 }
322 323
323 parse_error::ParseError GAPIDecoder::HandleDraw( 324 parse_error::ParseError GAPIDecoder::HandleDraw(
324 uint32 arg_count, 325 uint32 arg_count,
325 const cmd::Draw& args) { 326 const Draw& args) {
326 // Pull out some values so they can't be changed by another thread after we've 327 // Pull out some values so they can't be changed by another thread after we've
327 // validated them. 328 // validated them.
328 uint32 primitive_type = args.primitive_type; 329 uint32 primitive_type = args.primitive_type;
329 if (primitive_type >= command_buffer::kMaxPrimitiveType) 330 if (primitive_type >= kMaxPrimitiveType)
330 return parse_error::kParseInvalidArguments; 331 return parse_error::kParseInvalidArguments;
331 return gapi_->Draw( 332 return gapi_->Draw(
332 static_cast<command_buffer::PrimitiveType>(primitive_type), 333 static_cast<PrimitiveType>(primitive_type),
333 args.first, args.count); 334 args.first, args.count);
334 } 335 }
335 336
336 parse_error::ParseError GAPIDecoder::HandleDrawIndexed( 337 parse_error::ParseError GAPIDecoder::HandleDrawIndexed(
337 uint32 arg_count, 338 uint32 arg_count,
338 const cmd::DrawIndexed& args) { 339 const DrawIndexed& args) {
339 // Pull out some values so they can't be changed by another thread after we've 340 // Pull out some values so they can't be changed by another thread after we've
340 // validated them. 341 // validated them.
341 uint32 primitive_type = args.primitive_type; 342 uint32 primitive_type = args.primitive_type;
342 if (primitive_type >= command_buffer::kMaxPrimitiveType) 343 if (primitive_type >= kMaxPrimitiveType)
343 return parse_error::kParseInvalidArguments; 344 return parse_error::kParseInvalidArguments;
344 return gapi_->DrawIndexed( 345 return gapi_->DrawIndexed(
345 static_cast<command_buffer::PrimitiveType>(primitive_type), 346 static_cast<PrimitiveType>(primitive_type),
346 args.index_buffer_id, 347 args.index_buffer_id,
347 args.first, args.count, args.min_index, args.max_index); 348 args.first, args.count, args.min_index, args.max_index);
348 } 349 }
349 350
350 parse_error::ParseError GAPIDecoder::HandleCreateEffect( 351 parse_error::ParseError GAPIDecoder::HandleCreateEffect(
351 uint32 arg_count, 352 uint32 arg_count,
352 const cmd::CreateEffect& args) { 353 const CreateEffect& args) {
353 // Pull out some values so they can't be changed by another thread after we've 354 // Pull out some values so they can't be changed by another thread after we've
354 // validated them. 355 // validated them.
355 uint32 size = args.size; 356 uint32 size = args.size;
356 void *data = GetAddressAndCheckSize(args.shared_memory.id, 357 void *data = GetAddressAndCheckSize(args.shared_memory.id,
357 args.shared_memory.offset, 358 args.shared_memory.offset,
358 size); 359 size);
359 if (!data) return parse_error::kParseInvalidArguments; 360 if (!data) return parse_error::kParseInvalidArguments;
360 return gapi_->CreateEffect(args.effect_id, size, data); 361 return gapi_->CreateEffect(args.effect_id, size, data);
361 } 362 }
362 363
363 parse_error::ParseError GAPIDecoder::HandleCreateEffectImmediate( 364 parse_error::ParseError GAPIDecoder::HandleCreateEffectImmediate(
364 uint32 arg_count, 365 uint32 arg_count,
365 const cmd::CreateEffectImmediate& args) { 366 const CreateEffectImmediate& args) {
366 // Pull out some values so they can't be changed by another thread after we've 367 // Pull out some values so they can't be changed by another thread after we've
367 // validated them. 368 // validated them.
368 uint32 size = args.size; 369 uint32 size = args.size;
369 uint32 data_size = ImmediateDataSize(arg_count, args); 370 uint32 data_size = ImmediateDataSize(arg_count, args);
370 if (size > data_size) { 371 if (size > data_size) {
371 return parse_error::kParseInvalidArguments; 372 return parse_error::kParseInvalidArguments;
372 } 373 }
373 if (data_size == 0) { 374 if (data_size == 0) {
374 return parse_error::kParseNoError; 375 return parse_error::kParseNoError;
375 } 376 }
376 return gapi_->CreateEffect(args.effect_id, size, AddressAfterStruct(args)); 377 return gapi_->CreateEffect(args.effect_id, size, AddressAfterStruct(args));
377 } 378 }
378 379
379 parse_error::ParseError GAPIDecoder::HandleDestroyEffect( 380 parse_error::ParseError GAPIDecoder::HandleDestroyEffect(
380 uint32 arg_count, 381 uint32 arg_count,
381 const cmd::DestroyEffect& args) { 382 const DestroyEffect& args) {
382 return gapi_->DestroyEffect(args.effect_id); 383 return gapi_->DestroyEffect(args.effect_id);
383 } 384 }
384 385
385 parse_error::ParseError GAPIDecoder::HandleSetEffect( 386 parse_error::ParseError GAPIDecoder::HandleSetEffect(
386 uint32 arg_count, 387 uint32 arg_count,
387 const cmd::SetEffect& args) { 388 const SetEffect& args) {
388 return gapi_->SetEffect(args.effect_id); 389 return gapi_->SetEffect(args.effect_id);
389 } 390 }
390 391
391 parse_error::ParseError GAPIDecoder::HandleGetParamCount( 392 parse_error::ParseError GAPIDecoder::HandleGetParamCount(
392 uint32 arg_count, 393 uint32 arg_count,
393 const cmd::GetParamCount& args) { 394 const GetParamCount& args) {
394 // Pull out some values so they can't be changed by another thread after we've 395 // Pull out some values so they can't be changed by another thread after we've
395 // validated them. 396 // validated them.
396 uint32 size = args.size; 397 uint32 size = args.size;
397 void *data = GetAddressAndCheckSize(args.shared_memory.id, 398 void *data = GetAddressAndCheckSize(args.shared_memory.id,
398 args.shared_memory.offset, 399 args.shared_memory.offset,
399 size); 400 size);
400 if (!data) return parse_error::kParseInvalidArguments; 401 if (!data) return parse_error::kParseInvalidArguments;
401 return gapi_->GetParamCount(args.effect_id, size, data); 402 return gapi_->GetParamCount(args.effect_id, size, data);
402 } 403 }
403 404
404 parse_error::ParseError GAPIDecoder::HandleCreateParam( 405 parse_error::ParseError GAPIDecoder::HandleCreateParam(
405 uint32 arg_count, 406 uint32 arg_count,
406 const cmd::CreateParam& args) { 407 const CreateParam& args) {
407 return gapi_->CreateParam(args.param_id, args.effect_id, args.index); 408 return gapi_->CreateParam(args.param_id, args.effect_id, args.index);
408 } 409 }
409 410
410 parse_error::ParseError GAPIDecoder::HandleCreateParamByName( 411 parse_error::ParseError GAPIDecoder::HandleCreateParamByName(
411 uint32 arg_count, 412 uint32 arg_count,
412 const cmd::CreateParamByName& args) { 413 const CreateParamByName& args) {
413 // Pull out some values so they can't be changed by another thread after we've 414 // Pull out some values so they can't be changed by another thread after we've
414 // validated them. 415 // validated them.
415 uint32 size = args.size; 416 uint32 size = args.size;
416 void *data = GetAddressAndCheckSize(args.shared_memory.id, 417 void *data = GetAddressAndCheckSize(args.shared_memory.id,
417 args.shared_memory.offset, 418 args.shared_memory.offset,
418 size); 419 size);
419 if (!data) return parse_error::kParseInvalidArguments; 420 if (!data) return parse_error::kParseInvalidArguments;
420 return gapi_->CreateParamByName(args.param_id, args.effect_id, size, 421 return gapi_->CreateParamByName(args.param_id, args.effect_id, size,
421 data); 422 data);
422 } 423 }
423 424
424 parse_error::ParseError GAPIDecoder::HandleCreateParamByNameImmediate( 425 parse_error::ParseError GAPIDecoder::HandleCreateParamByNameImmediate(
425 uint32 arg_count, 426 uint32 arg_count,
426 const cmd::CreateParamByNameImmediate& args) { 427 const CreateParamByNameImmediate& args) {
427 // Pull out some values so they can't be changed by another thread after we've 428 // Pull out some values so they can't be changed by another thread after we've
428 // validated them. 429 // validated them.
429 uint32 size = args.size; 430 uint32 size = args.size;
430 uint32 data_size = ImmediateDataSize(arg_count, args); 431 uint32 data_size = ImmediateDataSize(arg_count, args);
431 if (size > data_size) 432 if (size > data_size)
432 return parse_error::kParseInvalidArguments; 433 return parse_error::kParseInvalidArguments;
433 if (data_size == 0) { 434 if (data_size == 0) {
434 return parse_error::kParseNoError; 435 return parse_error::kParseNoError;
435 } 436 }
436 return gapi_->CreateParamByName(args.param_id, args.effect_id, size, 437 return gapi_->CreateParamByName(args.param_id, args.effect_id, size,
437 AddressAfterStruct(args)); 438 AddressAfterStruct(args));
438 } 439 }
439 440
440 parse_error::ParseError GAPIDecoder::HandleDestroyParam( 441 parse_error::ParseError GAPIDecoder::HandleDestroyParam(
441 uint32 arg_count, 442 uint32 arg_count,
442 const cmd::DestroyParam& args) { 443 const DestroyParam& args) {
443 return gapi_->DestroyParam(args.param_id); 444 return gapi_->DestroyParam(args.param_id);
444 } 445 }
445 446
446 parse_error::ParseError GAPIDecoder::HandleSetParamData( 447 parse_error::ParseError GAPIDecoder::HandleSetParamData(
447 uint32 arg_count, 448 uint32 arg_count,
448 const cmd::SetParamData& args) { 449 const SetParamData& args) {
449 // Pull out some values so they can't be changed by another thread after we've 450 // Pull out some values so they can't be changed by another thread after we've
450 // validated them. 451 // validated them.
451 uint32 size = args.size; 452 uint32 size = args.size;
452 void *data = GetAddressAndCheckSize(args.shared_memory.id, 453 void *data = GetAddressAndCheckSize(args.shared_memory.id,
453 args.shared_memory.offset, 454 args.shared_memory.offset,
454 size); 455 size);
455 if (!data) return parse_error::kParseInvalidArguments; 456 if (!data) return parse_error::kParseInvalidArguments;
456 return gapi_->SetParamData(args.param_id, size, data); 457 return gapi_->SetParamData(args.param_id, size, data);
457 } 458 }
458 459
459 parse_error::ParseError GAPIDecoder::HandleSetParamDataImmediate( 460 parse_error::ParseError GAPIDecoder::HandleSetParamDataImmediate(
460 uint32 arg_count, 461 uint32 arg_count,
461 const cmd::SetParamDataImmediate& args) { 462 const SetParamDataImmediate& args) {
462 // Pull out some values so they can't be changed by another thread after we've 463 // Pull out some values so they can't be changed by another thread after we've
463 // validated them. 464 // validated them.
464 uint32 size = args.size; 465 uint32 size = args.size;
465 uint32 data_size = ImmediateDataSize(arg_count, args); 466 uint32 data_size = ImmediateDataSize(arg_count, args);
466 if (size > data_size) { 467 if (size > data_size) {
467 return parse_error::kParseInvalidArguments; 468 return parse_error::kParseInvalidArguments;
468 } 469 }
469 if (data_size == 0) { 470 if (data_size == 0) {
470 return parse_error::kParseNoError; 471 return parse_error::kParseNoError;
471 } 472 }
472 return gapi_->SetParamData(args.param_id, size, AddressAfterStruct(args)); 473 return gapi_->SetParamData(args.param_id, size, AddressAfterStruct(args));
473 } 474 }
474 475
475 parse_error::ParseError GAPIDecoder::HandleGetParamDesc( 476 parse_error::ParseError GAPIDecoder::HandleGetParamDesc(
476 uint32 arg_count, 477 uint32 arg_count,
477 const cmd::GetParamDesc& args) { 478 const GetParamDesc& args) {
478 // Pull out some values so they can't be changed by another thread after we've 479 // Pull out some values so they can't be changed by another thread after we've
479 // validated them. 480 // validated them.
480 uint32 size = args.size; 481 uint32 size = args.size;
481 void *data = GetAddressAndCheckSize(args.shared_memory.id, 482 void *data = GetAddressAndCheckSize(args.shared_memory.id,
482 args.shared_memory.offset, 483 args.shared_memory.offset,
483 size); 484 size);
484 if (!data) return parse_error::kParseInvalidArguments; 485 if (!data) return parse_error::kParseInvalidArguments;
485 return gapi_->GetParamDesc(args.param_id, size, data); 486 return gapi_->GetParamDesc(args.param_id, size, data);
486 } 487 }
487 488
488 parse_error::ParseError GAPIDecoder::HandleGetStreamCount( 489 parse_error::ParseError GAPIDecoder::HandleGetStreamCount(
489 uint32 arg_count, 490 uint32 arg_count,
490 const cmd::GetStreamCount& args) { 491 const GetStreamCount& args) {
491 // Pull out some values so they can't be changed by another thread after we've 492 // Pull out some values so they can't be changed by another thread after we've
492 // validated them. 493 // validated them.
493 uint32 size = args.size; 494 uint32 size = args.size;
494 void *data = GetAddressAndCheckSize(args.shared_memory.id, 495 void *data = GetAddressAndCheckSize(args.shared_memory.id,
495 args.shared_memory.offset, 496 args.shared_memory.offset,
496 size); 497 size);
497 if (!data) return parse_error::kParseInvalidArguments; 498 if (!data) return parse_error::kParseInvalidArguments;
498 return gapi_->GetStreamCount(args.effect_id, size, data); 499 return gapi_->GetStreamCount(args.effect_id, size, data);
499 } 500 }
500 501
501 parse_error::ParseError GAPIDecoder::HandleGetStreamDesc( 502 parse_error::ParseError GAPIDecoder::HandleGetStreamDesc(
502 uint32 arg_count, 503 uint32 arg_count,
503 const cmd::GetStreamDesc& args) { 504 const GetStreamDesc& args) {
504 // Pull out some values so they can't be changed by another thread after we've 505 // Pull out some values so they can't be changed by another thread after we've
505 // validated them. 506 // validated them.
506 uint32 size = args.size; 507 uint32 size = args.size;
507 void *data = GetAddressAndCheckSize(args.shared_memory.id, 508 void *data = GetAddressAndCheckSize(args.shared_memory.id,
508 args.shared_memory.offset, 509 args.shared_memory.offset,
509 size); 510 size);
510 if (!data) return parse_error::kParseInvalidArguments; 511 if (!data) return parse_error::kParseInvalidArguments;
511 return gapi_->GetStreamDesc(args.effect_id, args.index, size, data); 512 return gapi_->GetStreamDesc(args.effect_id, args.index, size, data);
512 } 513 }
513 514
514 parse_error::ParseError GAPIDecoder::HandleDestroyTexture( 515 parse_error::ParseError GAPIDecoder::HandleDestroyTexture(
515 uint32 arg_count, 516 uint32 arg_count,
516 const cmd::DestroyTexture& args) { 517 const DestroyTexture& args) {
517 return gapi_->DestroyTexture(args.texture_id); 518 return gapi_->DestroyTexture(args.texture_id);
518 } 519 }
519 520
520 parse_error::ParseError GAPIDecoder::HandleCreateTexture2d( 521 parse_error::ParseError GAPIDecoder::HandleCreateTexture2d(
521 uint32 arg_count, 522 uint32 arg_count,
522 const cmd::CreateTexture2d& args) { 523 const CreateTexture2d& args) {
523 unsigned int width_height = args.width_height; 524 unsigned int width_height = args.width_height;
524 unsigned int levels_format_flags = args.levels_format_flags; 525 unsigned int levels_format_flags = args.levels_format_flags;
525 unsigned int width = cmd::CreateTexture2d::Width::Get(width_height); 526 unsigned int width = CreateTexture2d::Width::Get(width_height);
526 unsigned int height = cmd::CreateTexture2d::Height::Get(width_height); 527 unsigned int height = CreateTexture2d::Height::Get(width_height);
527 unsigned int levels = cmd::CreateTexture2d::Levels::Get(levels_format_flags); 528 unsigned int levels = CreateTexture2d::Levels::Get(levels_format_flags);
528 unsigned int unused = cmd::CreateTexture2d::Unused::Get(levels_format_flags); 529 unsigned int unused = CreateTexture2d::Unused::Get(levels_format_flags);
529 unsigned int format = cmd::CreateTexture2d::Format::Get(levels_format_flags); 530 unsigned int format = CreateTexture2d::Format::Get(levels_format_flags);
530 unsigned int flags = cmd::CreateTexture2d::Flags::Get(levels_format_flags); 531 unsigned int flags = CreateTexture2d::Flags::Get(levels_format_flags);
531 unsigned int max_levels = 532 unsigned int max_levels =
532 1 + base::bits::Log2Ceiling(std::max(width, height)); 533 1 + base::bits::Log2Ceiling(std::max(width, height));
533 if ((width == 0) || (height == 0) || (levels > max_levels) || 534 if ((width == 0) || (height == 0) || (levels > max_levels) ||
534 (unused != 0) || (format == texture::kUnknown) || (levels == 0)) 535 (unused != 0) || (format == texture::kUnknown) || (levels == 0))
535 return parse_error::kParseInvalidArguments; 536 return parse_error::kParseInvalidArguments;
536 bool enable_render_surfaces = !!flags; 537 bool enable_render_surfaces = !!flags;
537 return gapi_->CreateTexture2D(args.texture_id, width, height, levels, 538 return gapi_->CreateTexture2D(args.texture_id, width, height, levels,
538 static_cast<texture::Format>(format), flags, 539 static_cast<texture::Format>(format), flags,
539 enable_render_surfaces); 540 enable_render_surfaces);
540 } 541 }
541 542
542 parse_error::ParseError GAPIDecoder::HandleCreateTexture3d( 543 parse_error::ParseError GAPIDecoder::HandleCreateTexture3d(
543 uint32 arg_count, 544 uint32 arg_count,
544 const cmd::CreateTexture3d& args) { 545 const CreateTexture3d& args) {
545 unsigned int width_height = args.width_height; 546 unsigned int width_height = args.width_height;
546 unsigned int depth_unused = args.depth_unused; 547 unsigned int depth_unused = args.depth_unused;
547 unsigned int levels_format_flags = args.levels_format_flags; 548 unsigned int levels_format_flags = args.levels_format_flags;
548 unsigned int width = cmd::CreateTexture3d::Width::Get(width_height); 549 unsigned int width = CreateTexture3d::Width::Get(width_height);
549 unsigned int height = cmd::CreateTexture3d::Height::Get(width_height); 550 unsigned int height = CreateTexture3d::Height::Get(width_height);
550 unsigned int depth = cmd::CreateTexture3d::Depth::Get(depth_unused); 551 unsigned int depth = CreateTexture3d::Depth::Get(depth_unused);
551 unsigned int unused1 = cmd::CreateTexture3d::Unused1::Get(depth_unused); 552 unsigned int unused1 = CreateTexture3d::Unused1::Get(depth_unused);
552 unsigned int levels = cmd::CreateTexture3d::Levels::Get(levels_format_flags); 553 unsigned int levels = CreateTexture3d::Levels::Get(levels_format_flags);
553 unsigned int unused2 = 554 unsigned int unused2 = CreateTexture3d::Unused2::Get(levels_format_flags);
554 cmd::CreateTexture3d::Unused2::Get(levels_format_flags); 555 unsigned int format = CreateTexture3d::Format::Get(levels_format_flags);
555 unsigned int format = cmd::CreateTexture3d::Format::Get(levels_format_flags); 556 unsigned int flags = CreateTexture3d::Flags::Get(levels_format_flags);
556 unsigned int flags = cmd::CreateTexture3d::Flags::Get(levels_format_flags);
557 unsigned int max_levels = 557 unsigned int max_levels =
558 1 + base::bits::Log2Ceiling(std::max(depth, std::max(width, height))); 558 1 + base::bits::Log2Ceiling(std::max(depth, std::max(width, height)));
559 if ((width == 0) || (height == 0) || (depth == 0) || 559 if ((width == 0) || (height == 0) || (depth == 0) ||
560 (levels > max_levels) || (unused1 != 0) || (unused2 != 0) || 560 (levels > max_levels) || (unused1 != 0) || (unused2 != 0) ||
561 (format == texture::kUnknown) || (levels == 0)) 561 (format == texture::kUnknown) || (levels == 0))
562 return parse_error::kParseInvalidArguments; 562 return parse_error::kParseInvalidArguments;
563 bool enable_render_surfaces = !!flags; 563 bool enable_render_surfaces = !!flags;
564 return gapi_->CreateTexture3D(args.texture_id, width, height, depth, levels, 564 return gapi_->CreateTexture3D(args.texture_id, width, height, depth, levels,
565 static_cast<texture::Format>(format), flags, 565 static_cast<texture::Format>(format), flags,
566 enable_render_surfaces); 566 enable_render_surfaces);
567 } 567 }
568 568
569 parse_error::ParseError GAPIDecoder::HandleCreateTextureCube( 569 parse_error::ParseError GAPIDecoder::HandleCreateTextureCube(
570 uint32 arg_count, 570 uint32 arg_count,
571 const cmd::CreateTextureCube& args) { 571 const CreateTextureCube& args) {
572 unsigned int side_unused = args.edge_length; 572 unsigned int side_unused = args.edge_length;
573 unsigned int levels_format_flags = args.levels_format_flags; 573 unsigned int levels_format_flags = args.levels_format_flags;
574 unsigned int side = cmd::CreateTextureCube::Side::Get(side_unused); 574 unsigned int side = CreateTextureCube::Side::Get(side_unused);
575 unsigned int unused1 = cmd::CreateTextureCube::Unused1::Get(side_unused); 575 unsigned int unused1 = CreateTextureCube::Unused1::Get(side_unused);
576 unsigned int levels = 576 unsigned int levels = CreateTextureCube::Levels::Get(levels_format_flags);
577 cmd::CreateTextureCube::Levels::Get(levels_format_flags); 577 unsigned int unused2 = CreateTextureCube::Unused2::Get(levels_format_flags);
578 unsigned int unused2 = 578 unsigned int format = CreateTextureCube::Format::Get(levels_format_flags);
579 cmd::CreateTextureCube::Unused2::Get(levels_format_flags); 579 unsigned int flags = CreateTextureCube::Flags::Get(levels_format_flags);
580 unsigned int format =
581 cmd::CreateTextureCube::Format::Get(levels_format_flags);
582 unsigned int flags = cmd::CreateTextureCube::Flags::Get(levels_format_flags);
583 unsigned int max_levels = 1 + base::bits::Log2Ceiling(side); 580 unsigned int max_levels = 1 + base::bits::Log2Ceiling(side);
584 if ((side == 0) || (levels > max_levels) || (unused1 != 0) || 581 if ((side == 0) || (levels > max_levels) || (unused1 != 0) ||
585 (unused2 != 0) || (format == texture::kUnknown) || (levels == 0)) 582 (unused2 != 0) || (format == texture::kUnknown) || (levels == 0))
586 return parse_error::kParseInvalidArguments; 583 return parse_error::kParseInvalidArguments;
587 bool enable_render_surfaces = !!flags; 584 bool enable_render_surfaces = !!flags;
588 return gapi_->CreateTextureCube(args.texture_id, side, levels, 585 return gapi_->CreateTextureCube(args.texture_id, side, levels,
589 static_cast<texture::Format>(format), 586 static_cast<texture::Format>(format),
590 flags, enable_render_surfaces); 587 flags, enable_render_surfaces);
591 } 588 }
592 589
593 parse_error::ParseError GAPIDecoder::HandleSetTextureData( 590 parse_error::ParseError GAPIDecoder::HandleSetTextureData(
594 uint32 arg_count, 591 uint32 arg_count,
595 const cmd::SetTextureData& args) { 592 const SetTextureData& args) {
596 unsigned int x_y = args.x_y; 593 unsigned int x_y = args.x_y;
597 unsigned int width_height = args.width_height; 594 unsigned int width_height = args.width_height;
598 unsigned int z_depth = args.z_depth; 595 unsigned int z_depth = args.z_depth;
599 unsigned int level_face = args.level_face; 596 unsigned int level_face = args.level_face;
600 unsigned int size = args.size; 597 unsigned int size = args.size;
601 unsigned int x = cmd::SetTextureData::X::Get(x_y); 598 unsigned int x = SetTextureData::X::Get(x_y);
602 unsigned int y = cmd::SetTextureData::Y::Get(x_y); 599 unsigned int y = SetTextureData::Y::Get(x_y);
603 unsigned int width = cmd::SetTextureData::Width::Get(width_height); 600 unsigned int width = SetTextureData::Width::Get(width_height);
604 unsigned int height = cmd::SetTextureData::Height::Get(width_height); 601 unsigned int height = SetTextureData::Height::Get(width_height);
605 unsigned int z = cmd::SetTextureData::Z::Get(z_depth); 602 unsigned int z = SetTextureData::Z::Get(z_depth);
606 unsigned int depth = cmd::SetTextureData::Depth::Get(z_depth); 603 unsigned int depth = SetTextureData::Depth::Get(z_depth);
607 unsigned int level = cmd::SetTextureData::Level::Get(level_face); 604 unsigned int level = SetTextureData::Level::Get(level_face);
608 unsigned int face = cmd::SetTextureData::Face::Get(level_face); 605 unsigned int face = SetTextureData::Face::Get(level_face);
609 unsigned int unused = cmd::SetTextureData::Unused::Get(level_face); 606 unsigned int unused = SetTextureData::Unused::Get(level_face);
610 const void *data = GetAddressAndCheckSize(args.shared_memory.id, 607 const void *data = GetAddressAndCheckSize(args.shared_memory.id,
611 args.shared_memory.offset, size); 608 args.shared_memory.offset, size);
612 if (face >= 6 || unused != 0 || !data) 609 if (face >= 6 || unused != 0 || !data)
613 return parse_error::kParseInvalidArguments; 610 return parse_error::kParseInvalidArguments;
614 return gapi_->SetTextureData( 611 return gapi_->SetTextureData(
615 args.texture_id, x, y, z, width, height, depth, level, 612 args.texture_id, x, y, z, width, height, depth, level,
616 static_cast<texture::Face>(face), args.row_pitch, 613 static_cast<texture::Face>(face), args.row_pitch,
617 args.slice_pitch, size, data); 614 args.slice_pitch, size, data);
618 } 615 }
619 616
620 parse_error::ParseError GAPIDecoder::HandleSetTextureDataImmediate( 617 parse_error::ParseError GAPIDecoder::HandleSetTextureDataImmediate(
621 uint32 arg_count, 618 uint32 arg_count,
622 const cmd::SetTextureDataImmediate& args) { 619 const SetTextureDataImmediate& args) {
623 unsigned int x_y = args.x_y; 620 unsigned int x_y = args.x_y;
624 unsigned int width_height = args.width_height; 621 unsigned int width_height = args.width_height;
625 unsigned int z_depth = args.z_depth; 622 unsigned int z_depth = args.z_depth;
626 unsigned int level_face = args.level_face; 623 unsigned int level_face = args.level_face;
627 unsigned int size = args.size; 624 unsigned int size = args.size;
628 unsigned int x = cmd::SetTextureDataImmediate::X::Get(x_y); 625 unsigned int x = SetTextureDataImmediate::X::Get(x_y);
629 unsigned int y = cmd::SetTextureDataImmediate::Y::Get(x_y); 626 unsigned int y = SetTextureDataImmediate::Y::Get(x_y);
630 unsigned int width = cmd::SetTextureDataImmediate::Width::Get(width_height); 627 unsigned int width = SetTextureDataImmediate::Width::Get(width_height);
631 unsigned int height = cmd::SetTextureDataImmediate::Height::Get(width_height); 628 unsigned int height = SetTextureDataImmediate::Height::Get(width_height);
632 unsigned int z = cmd::SetTextureDataImmediate::Z::Get(z_depth); 629 unsigned int z = SetTextureDataImmediate::Z::Get(z_depth);
633 unsigned int depth = cmd::SetTextureDataImmediate::Depth::Get(z_depth); 630 unsigned int depth = SetTextureDataImmediate::Depth::Get(z_depth);
634 unsigned int level = cmd::SetTextureDataImmediate::Level::Get(level_face); 631 unsigned int level = SetTextureDataImmediate::Level::Get(level_face);
635 unsigned int face = cmd::SetTextureDataImmediate::Face::Get(level_face); 632 unsigned int face = SetTextureDataImmediate::Face::Get(level_face);
636 unsigned int unused = cmd::SetTextureDataImmediate::Unused::Get(level_face); 633 unsigned int unused = SetTextureDataImmediate::Unused::Get(level_face);
637 uint32 data_size = ImmediateDataSize(arg_count, args); 634 uint32 data_size = ImmediateDataSize(arg_count, args);
638 if (face >= 6 || unused != 0 || 635 if (face >= 6 || unused != 0 ||
639 size > data_size) 636 size > data_size)
640 return parse_error::kParseInvalidArguments; 637 return parse_error::kParseInvalidArguments;
641 if (data_size == 0) { 638 if (data_size == 0) {
642 return parse_error::kParseNoError; 639 return parse_error::kParseNoError;
643 } 640 }
644 return gapi_->SetTextureData( 641 return gapi_->SetTextureData(
645 args.texture_id, x, y, z, width, height, depth, level, 642 args.texture_id, x, y, z, width, height, depth, level,
646 static_cast<texture::Face>(face), args.row_pitch, 643 static_cast<texture::Face>(face), args.row_pitch,
647 args.slice_pitch, size, AddressAfterStruct(args)); 644 args.slice_pitch, size, AddressAfterStruct(args));
648 } 645 }
649 646
650 parse_error::ParseError GAPIDecoder::HandleGetTextureData( 647 parse_error::ParseError GAPIDecoder::HandleGetTextureData(
651 uint32 arg_count, 648 uint32 arg_count,
652 const cmd::GetTextureData& args) { 649 const GetTextureData& args) {
653 unsigned int x_y = args.x_y; 650 unsigned int x_y = args.x_y;
654 unsigned int width_height = args.width_height; 651 unsigned int width_height = args.width_height;
655 unsigned int z_depth = args.z_depth; 652 unsigned int z_depth = args.z_depth;
656 unsigned int level_face = args.level_face; 653 unsigned int level_face = args.level_face;
657 unsigned int size = args.size; 654 unsigned int size = args.size;
658 unsigned int x = cmd::GetTextureData::X::Get(x_y); 655 unsigned int x = GetTextureData::X::Get(x_y);
659 unsigned int y = cmd::GetTextureData::Y::Get(x_y); 656 unsigned int y = GetTextureData::Y::Get(x_y);
660 unsigned int width = cmd::GetTextureData::Width::Get(width_height); 657 unsigned int width = GetTextureData::Width::Get(width_height);
661 unsigned int height = cmd::GetTextureData::Height::Get(width_height); 658 unsigned int height = GetTextureData::Height::Get(width_height);
662 unsigned int z = cmd::GetTextureData::Z::Get(z_depth); 659 unsigned int z = GetTextureData::Z::Get(z_depth);
663 unsigned int depth = cmd::GetTextureData::Depth::Get(z_depth); 660 unsigned int depth = GetTextureData::Depth::Get(z_depth);
664 unsigned int level = cmd::GetTextureData::Level::Get(level_face); 661 unsigned int level = GetTextureData::Level::Get(level_face);
665 unsigned int face = cmd::GetTextureData::Face::Get(level_face); 662 unsigned int face = GetTextureData::Face::Get(level_face);
666 unsigned int unused = cmd::GetTextureData::Unused::Get(level_face); 663 unsigned int unused = GetTextureData::Unused::Get(level_face);
667 void *data = GetAddressAndCheckSize(args.shared_memory.id, 664 void *data = GetAddressAndCheckSize(args.shared_memory.id,
668 args.shared_memory.offset, size); 665 args.shared_memory.offset, size);
669 if (face >= 6 || unused != 0 || !data) 666 if (face >= 6 || unused != 0 || !data)
670 return parse_error::kParseInvalidArguments; 667 return parse_error::kParseInvalidArguments;
671 return gapi_->GetTextureData( 668 return gapi_->GetTextureData(
672 args.texture_id, x, y, z, width, height, depth, level, 669 args.texture_id, x, y, z, width, height, depth, level,
673 static_cast<texture::Face>(face), args.row_pitch, 670 static_cast<texture::Face>(face), args.row_pitch,
674 args.slice_pitch, size, data); 671 args.slice_pitch, size, data);
675 } 672 }
676 673
677 parse_error::ParseError GAPIDecoder::HandleCreateSampler( 674 parse_error::ParseError GAPIDecoder::HandleCreateSampler(
678 uint32 arg_count, 675 uint32 arg_count,
679 const cmd::CreateSampler& args) { 676 const CreateSampler& args) {
680 return gapi_->CreateSampler(args.sampler_id); 677 return gapi_->CreateSampler(args.sampler_id);
681 } 678 }
682 679
683 parse_error::ParseError GAPIDecoder::HandleDestroySampler( 680 parse_error::ParseError GAPIDecoder::HandleDestroySampler(
684 uint32 arg_count, 681 uint32 arg_count,
685 const cmd::DestroySampler& args) { 682 const DestroySampler& args) {
686 return gapi_->DestroySampler(args.sampler_id); 683 return gapi_->DestroySampler(args.sampler_id);
687 } 684 }
688 685
689 parse_error::ParseError GAPIDecoder::HandleSetSamplerStates( 686 parse_error::ParseError GAPIDecoder::HandleSetSamplerStates(
690 uint32 arg_count, 687 uint32 arg_count,
691 const cmd::SetSamplerStates& args) { 688 const SetSamplerStates& args) {
692 Uint32 arg = args.sampler_states; 689 Uint32 arg = args.sampler_states;
693 if (cmd::SetSamplerStates::Unused::Get(arg) != 0) 690 if (SetSamplerStates::Unused::Get(arg) != 0)
694 return parse_error::kParseInvalidArguments; 691 return parse_error::kParseInvalidArguments;
695 unsigned int address_u_value = cmd::SetSamplerStates::AddressingU::Get(arg); 692 unsigned int address_u_value = SetSamplerStates::AddressingU::Get(arg);
696 unsigned int address_v_value = cmd::SetSamplerStates::AddressingV::Get(arg); 693 unsigned int address_v_value = SetSamplerStates::AddressingV::Get(arg);
697 unsigned int address_w_value = cmd::SetSamplerStates::AddressingW::Get(arg); 694 unsigned int address_w_value = SetSamplerStates::AddressingW::Get(arg);
698 unsigned int mag_filter_value = cmd::SetSamplerStates::MagFilter::Get(arg); 695 unsigned int mag_filter_value = SetSamplerStates::MagFilter::Get(arg);
699 unsigned int min_filter_value = cmd::SetSamplerStates::MinFilter::Get(arg); 696 unsigned int min_filter_value = SetSamplerStates::MinFilter::Get(arg);
700 unsigned int mip_filter_value = cmd::SetSamplerStates::MipFilter::Get(arg); 697 unsigned int mip_filter_value = SetSamplerStates::MipFilter::Get(arg);
701 unsigned int max_anisotropy = cmd::SetSamplerStates::MaxAnisotropy::Get(arg); 698 unsigned int max_anisotropy = SetSamplerStates::MaxAnisotropy::Get(arg);
702 if (address_u_value >= sampler::kNumAddressingMode || 699 if (address_u_value >= sampler::kNumAddressingMode ||
703 address_v_value >= sampler::kNumAddressingMode || 700 address_v_value >= sampler::kNumAddressingMode ||
704 address_w_value >= sampler::kNumAddressingMode || 701 address_w_value >= sampler::kNumAddressingMode ||
705 mag_filter_value >= sampler::kNumFilteringMode || 702 mag_filter_value >= sampler::kNumFilteringMode ||
706 min_filter_value >= sampler::kNumFilteringMode || 703 min_filter_value >= sampler::kNumFilteringMode ||
707 mip_filter_value >= sampler::kNumFilteringMode || 704 mip_filter_value >= sampler::kNumFilteringMode ||
708 mag_filter_value == sampler::kNone || 705 mag_filter_value == sampler::kNone ||
709 min_filter_value == sampler::kNone || 706 min_filter_value == sampler::kNone ||
710 max_anisotropy == 0) { 707 max_anisotropy == 0) {
711 return parse_error::kParseInvalidArguments; 708 return parse_error::kParseInvalidArguments;
712 } 709 }
713 gapi_->SetSamplerStates( 710 gapi_->SetSamplerStates(
714 args.sampler_id, 711 args.sampler_id,
715 static_cast<sampler::AddressingMode>(address_u_value), 712 static_cast<sampler::AddressingMode>(address_u_value),
716 static_cast<sampler::AddressingMode>(address_v_value), 713 static_cast<sampler::AddressingMode>(address_v_value),
717 static_cast<sampler::AddressingMode>(address_w_value), 714 static_cast<sampler::AddressingMode>(address_w_value),
718 static_cast<sampler::FilteringMode>(mag_filter_value), 715 static_cast<sampler::FilteringMode>(mag_filter_value),
719 static_cast<sampler::FilteringMode>(min_filter_value), 716 static_cast<sampler::FilteringMode>(min_filter_value),
720 static_cast<sampler::FilteringMode>(mip_filter_value), 717 static_cast<sampler::FilteringMode>(mip_filter_value),
721 max_anisotropy); 718 max_anisotropy);
722 return parse_error::kParseNoError; 719 return parse_error::kParseNoError;
723 } 720 }
724 721
725 parse_error::ParseError GAPIDecoder::HandleSetSamplerBorderColor( 722 parse_error::ParseError GAPIDecoder::HandleSetSamplerBorderColor(
726 uint32 arg_count, 723 uint32 arg_count,
727 const cmd::SetSamplerBorderColor& args) { 724 const SetSamplerBorderColor& args) {
728 RGBA rgba; 725 RGBA rgba;
729 rgba.red = args.red; 726 rgba.red = args.red;
730 rgba.green = args.green; 727 rgba.green = args.green;
731 rgba.blue = args.blue; 728 rgba.blue = args.blue;
732 rgba.alpha = args.alpha; 729 rgba.alpha = args.alpha;
733 return gapi_->SetSamplerBorderColor(args.sampler_id, rgba); 730 return gapi_->SetSamplerBorderColor(args.sampler_id, rgba);
734 } 731 }
735 732
736 parse_error::ParseError GAPIDecoder::HandleSetSamplerTexture( 733 parse_error::ParseError GAPIDecoder::HandleSetSamplerTexture(
737 uint32 arg_count, 734 uint32 arg_count,
738 const cmd::SetSamplerTexture& args) { 735 const SetSamplerTexture& args) {
739 return gapi_->SetSamplerTexture(args.sampler_id, args.texture_id); 736 return gapi_->SetSamplerTexture(args.sampler_id, args.texture_id);
740 } 737 }
741 738
742 parse_error::ParseError GAPIDecoder::HandleSetScissor( 739 parse_error::ParseError GAPIDecoder::HandleSetScissor(
743 uint32 arg_count, 740 uint32 arg_count,
744 const cmd::SetScissor& args) { 741 const SetScissor& args) {
745 Uint32 x_y_enable = args.x_y_enable; 742 Uint32 x_y_enable = args.x_y_enable;
746 if (cmd::SetScissor::Unused::Get(x_y_enable) != 0) 743 if (SetScissor::Unused::Get(x_y_enable) != 0)
747 return parse_error::kParseInvalidArguments; 744 return parse_error::kParseInvalidArguments;
748 unsigned int x = cmd::SetScissor::X::Get(x_y_enable); 745 unsigned int x = SetScissor::X::Get(x_y_enable);
749 unsigned int y = cmd::SetScissor::Y::Get(x_y_enable); 746 unsigned int y = SetScissor::Y::Get(x_y_enable);
750 bool enable = cmd::SetScissor::Enable::Get(x_y_enable) != 0; 747 bool enable = SetScissor::Enable::Get(x_y_enable) != 0;
751 Uint32 width_height = args.width_height; 748 Uint32 width_height = args.width_height;
752 unsigned int width = cmd::SetScissor::Width::Get(width_height); 749 unsigned int width = SetScissor::Width::Get(width_height);
753 unsigned int height = cmd::SetScissor::Height::Get(width_height); 750 unsigned int height = SetScissor::Height::Get(width_height);
754 gapi_->SetScissor(enable, x, y, width, height); 751 gapi_->SetScissor(enable, x, y, width, height);
755 return parse_error::kParseNoError; 752 return parse_error::kParseNoError;
756 } 753 }
757 754
758 parse_error::ParseError GAPIDecoder::HandleSetPolygonOffset( 755 parse_error::ParseError GAPIDecoder::HandleSetPolygonOffset(
759 uint32 arg_count, 756 uint32 arg_count,
760 const cmd::SetPolygonOffset& args) { 757 const SetPolygonOffset& args) {
761 gapi_->SetPolygonOffset(args.slope_factor, args.units); 758 gapi_->SetPolygonOffset(args.slope_factor, args.units);
762 return parse_error::kParseNoError; 759 return parse_error::kParseNoError;
763 } 760 }
764 761
765 parse_error::ParseError GAPIDecoder::HandleSetPointLineRaster( 762 parse_error::ParseError GAPIDecoder::HandleSetPointLineRaster(
766 uint32 arg_count, 763 uint32 arg_count,
767 const cmd::SetPointLineRaster& args) { 764 const SetPointLineRaster& args) {
768 Uint32 enables = args.enables; 765 Uint32 enables = args.enables;
769 if (cmd::SetPointLineRaster::Unused::Get(enables) != 0) 766 if (SetPointLineRaster::Unused::Get(enables) != 0)
770 return parse_error::kParseInvalidArguments; 767 return parse_error::kParseInvalidArguments;
771 bool line_smooth = !!cmd::SetPointLineRaster::LineSmoothEnable::Get(enables); 768 bool line_smooth = !!SetPointLineRaster::LineSmoothEnable::Get(enables);
772 bool point_sprite = 769 bool point_sprite = !!SetPointLineRaster::PointSpriteEnable::Get(enables);
773 !!cmd::SetPointLineRaster::PointSpriteEnable::Get(enables);
774 gapi_->SetPointLineRaster(line_smooth, point_sprite, args.point_size); 770 gapi_->SetPointLineRaster(line_smooth, point_sprite, args.point_size);
775 return parse_error::kParseNoError; 771 return parse_error::kParseNoError;
776 } 772 }
777 773
778 parse_error::ParseError GAPIDecoder::HandleSetPolygonRaster( 774 parse_error::ParseError GAPIDecoder::HandleSetPolygonRaster(
779 uint32 arg_count, 775 uint32 arg_count,
780 const cmd::SetPolygonRaster& args) { 776 const SetPolygonRaster& args) {
781 Uint32 fill_cull = args.fill_cull; 777 Uint32 fill_cull = args.fill_cull;
782 unsigned int fill_value = cmd::SetPolygonRaster::FillMode::Get(fill_cull); 778 unsigned int fill_value = SetPolygonRaster::FillMode::Get(fill_cull);
783 unsigned int cull_value = cmd::SetPolygonRaster::CullMode::Get(fill_cull); 779 unsigned int cull_value = SetPolygonRaster::CullMode::Get(fill_cull);
784 if (cmd::SetPolygonRaster::Unused::Get(fill_cull) != 0 || 780 if (SetPolygonRaster::Unused::Get(fill_cull) != 0 ||
785 fill_value >= command_buffer::kNumPolygonMode || 781 fill_value >= kNumPolygonMode ||
786 cull_value >= command_buffer::kNumFaceCullMode) 782 cull_value >= kNumFaceCullMode)
787 return parse_error::kParseInvalidArguments; 783 return parse_error::kParseInvalidArguments;
788 gapi_->SetPolygonRaster( 784 gapi_->SetPolygonRaster(
789 static_cast<command_buffer::PolygonMode>(fill_value), 785 static_cast<PolygonMode>(fill_value),
790 static_cast<command_buffer::FaceCullMode>(cull_value)); 786 static_cast<FaceCullMode>(cull_value));
791 return parse_error::kParseNoError; 787 return parse_error::kParseNoError;
792 } 788 }
793 789
794 parse_error::ParseError GAPIDecoder::HandleSetAlphaTest( 790 parse_error::ParseError GAPIDecoder::HandleSetAlphaTest(
795 uint32 arg_count, 791 uint32 arg_count,
796 const cmd::SetAlphaTest& args) { 792 const SetAlphaTest& args) {
797 Uint32 func_enable = args.func_enable; 793 Uint32 func_enable = args.func_enable;
798 if (cmd::SetAlphaTest::Unused::Get(func_enable) != 0) 794 if (SetAlphaTest::Unused::Get(func_enable) != 0)
799 return parse_error::kParseInvalidArguments; 795 return parse_error::kParseInvalidArguments;
800 // Check that the bitmask get cannot generate values outside of the 796 // Check that the bitmask get cannot generate values outside of the
801 // allowed range. 797 // allowed range.
802 COMPILE_ASSERT(cmd::SetAlphaTest::Func::kMask < 798 COMPILE_ASSERT(SetAlphaTest::Func::kMask <
803 command_buffer::kNumComparison, 799 kNumComparison,
804 set_alpha_test_Func_may_produce_invalid_values); 800 set_alpha_test_Func_may_produce_invalid_values);
805 command_buffer::Comparison comp = static_cast<command_buffer::Comparison>( 801 Comparison comp = static_cast<Comparison>(
806 cmd::SetAlphaTest::Func::Get(func_enable)); 802 SetAlphaTest::Func::Get(func_enable));
807 bool enable = cmd::SetAlphaTest::Enable::Get(func_enable) != 0; 803 bool enable = SetAlphaTest::Enable::Get(func_enable) != 0;
808 gapi_->SetAlphaTest(enable, args.value, comp); 804 gapi_->SetAlphaTest(enable, args.value, comp);
809 return parse_error::kParseNoError; 805 return parse_error::kParseNoError;
810 } 806 }
811 807
812 parse_error::ParseError GAPIDecoder::HandleSetDepthTest( 808 parse_error::ParseError GAPIDecoder::HandleSetDepthTest(
813 uint32 arg_count, 809 uint32 arg_count,
814 const cmd::SetDepthTest& args) { 810 const SetDepthTest& args) {
815 Uint32 func_enable = args.func_enable; 811 Uint32 func_enable = args.func_enable;
816 if (cmd::SetDepthTest::Unused::Get(func_enable) != 0) 812 if (SetDepthTest::Unused::Get(func_enable) != 0)
817 return parse_error::kParseInvalidArguments; 813 return parse_error::kParseInvalidArguments;
818 // Check that the bitmask get cannot generate values outside of the 814 // Check that the bitmask get cannot generate values outside of the
819 // allowed range. 815 // allowed range.
820 COMPILE_ASSERT(cmd::SetDepthTest::Func::kMask < 816 COMPILE_ASSERT(SetDepthTest::Func::kMask <
821 command_buffer::kNumComparison, 817 kNumComparison,
822 set_alpha_test_Func_may_produce_invalid_values); 818 set_alpha_test_Func_may_produce_invalid_values);
823 command_buffer::Comparison comp = static_cast<command_buffer::Comparison>( 819 Comparison comp = static_cast<Comparison>(
824 cmd::SetDepthTest::Func::Get(func_enable)); 820 SetDepthTest::Func::Get(func_enable));
825 bool write_enable = cmd::SetDepthTest::WriteEnable::Get(func_enable) != 0; 821 bool write_enable = SetDepthTest::WriteEnable::Get(func_enable) != 0;
826 bool enable = cmd::SetDepthTest::Enable::Get(func_enable) != 0; 822 bool enable = SetDepthTest::Enable::Get(func_enable) != 0;
827 gapi_->SetDepthTest(enable, write_enable, comp); 823 gapi_->SetDepthTest(enable, write_enable, comp);
828 return parse_error::kParseNoError; 824 return parse_error::kParseNoError;
829 } 825 }
830 826
831 parse_error::ParseError GAPIDecoder::HandleSetStencilTest( 827 parse_error::ParseError GAPIDecoder::HandleSetStencilTest(
832 uint32 arg_count, 828 uint32 arg_count,
833 const cmd::SetStencilTest& args) { 829 const SetStencilTest& args) {
834 Uint32 arg0 = args.stencil_args0; 830 Uint32 arg0 = args.stencil_args0;
835 Uint32 arg1 = args.stencil_args1; 831 Uint32 arg1 = args.stencil_args1;
836 if (cmd::SetStencilTest::Unused0::Get(arg0) != 0 || 832 if (SetStencilTest::Unused0::Get(arg0) != 0 ||
837 cmd::SetStencilTest::Unused1::Get(arg1) != 0 || 833 SetStencilTest::Unused1::Get(arg1) != 0 ||
838 cmd::SetStencilTest::Unused2::Get(arg1) != 0) 834 SetStencilTest::Unused2::Get(arg1) != 0)
839 return parse_error::kParseInvalidArguments; 835 return parse_error::kParseInvalidArguments;
840 unsigned int write_mask = cmd::SetStencilTest::WriteMask::Get(arg0); 836 unsigned int write_mask = SetStencilTest::WriteMask::Get(arg0);
841 unsigned int compare_mask = cmd::SetStencilTest::CompareMask::Get(arg0); 837 unsigned int compare_mask = SetStencilTest::CompareMask::Get(arg0);
842 unsigned int ref = cmd::SetStencilTest::ReferenceValue::Get(arg0); 838 unsigned int ref = SetStencilTest::ReferenceValue::Get(arg0);
843 bool enable = cmd::SetStencilTest::Enable::Get(arg0) != 0; 839 bool enable = SetStencilTest::Enable::Get(arg0) != 0;
844 bool separate_ccw = cmd::SetStencilTest::SeparateCCW::Get(arg0) != 0; 840 bool separate_ccw = SetStencilTest::SeparateCCW::Get(arg0) != 0;
845 gapi_->SetStencilTest(enable, separate_ccw, write_mask, compare_mask, ref, 841 gapi_->SetStencilTest(enable, separate_ccw, write_mask, compare_mask, ref,
846 arg1); 842 arg1);
847 return parse_error::kParseNoError; 843 return parse_error::kParseNoError;
848 } 844 }
849 845
850 parse_error::ParseError GAPIDecoder::HandleSetColorWrite( 846 parse_error::ParseError GAPIDecoder::HandleSetColorWrite(
851 uint32 arg_count, 847 uint32 arg_count,
852 const cmd::SetColorWrite& args) { 848 const SetColorWrite& args) {
853 Uint32 enables = args.flags; 849 Uint32 enables = args.flags;
854 if (cmd::SetColorWrite::Unused::Get(enables) != 0) 850 if (SetColorWrite::Unused::Get(enables) != 0)
855 return parse_error::kParseInvalidArguments; 851 return parse_error::kParseInvalidArguments;
856 bool red = cmd::SetColorWrite::RedMask::Get(enables) != 0; 852 bool red = SetColorWrite::RedMask::Get(enables) != 0;
857 bool green = cmd::SetColorWrite::GreenMask::Get(enables) != 0; 853 bool green = SetColorWrite::GreenMask::Get(enables) != 0;
858 bool blue = cmd::SetColorWrite::BlueMask::Get(enables) != 0; 854 bool blue = SetColorWrite::BlueMask::Get(enables) != 0;
859 bool alpha = cmd::SetColorWrite::AlphaMask::Get(enables) != 0; 855 bool alpha = SetColorWrite::AlphaMask::Get(enables) != 0;
860 bool dither = cmd::SetColorWrite::DitherEnable::Get(enables) != 0; 856 bool dither = SetColorWrite::DitherEnable::Get(enables) != 0;
861 gapi_->SetColorWrite(red, green, blue, alpha, dither); 857 gapi_->SetColorWrite(red, green, blue, alpha, dither);
862 return parse_error::kParseNoError; 858 return parse_error::kParseNoError;
863 } 859 }
864 860
865 parse_error::ParseError GAPIDecoder::HandleSetBlending( 861 parse_error::ParseError GAPIDecoder::HandleSetBlending(
866 uint32 arg_count, 862 uint32 arg_count,
867 const cmd::SetBlending& args) { 863 const SetBlending& args) {
868 Uint32 arg = args.blend_settings; 864 Uint32 arg = args.blend_settings;
869 bool enable = cmd::SetBlending::Enable::Get(arg) != 0; 865 bool enable = SetBlending::Enable::Get(arg) != 0;
870 bool separate_alpha = cmd::SetBlending::SeparateAlpha::Get(arg) != 0; 866 bool separate_alpha = SetBlending::SeparateAlpha::Get(arg) != 0;
871 unsigned int color_eq = cmd::SetBlending::ColorEq::Get(arg); 867 unsigned int color_eq = SetBlending::ColorEq::Get(arg);
872 unsigned int color_src = cmd::SetBlending::ColorSrcFunc::Get(arg); 868 unsigned int color_src = SetBlending::ColorSrcFunc::Get(arg);
873 unsigned int color_dst = cmd::SetBlending::ColorDstFunc::Get(arg); 869 unsigned int color_dst = SetBlending::ColorDstFunc::Get(arg);
874 unsigned int alpha_eq = cmd::SetBlending::AlphaEq::Get(arg); 870 unsigned int alpha_eq = SetBlending::AlphaEq::Get(arg);
875 unsigned int alpha_src = cmd::SetBlending::AlphaSrcFunc::Get(arg); 871 unsigned int alpha_src = SetBlending::AlphaSrcFunc::Get(arg);
876 unsigned int alpha_dst = cmd::SetBlending::AlphaDstFunc::Get(arg); 872 unsigned int alpha_dst = SetBlending::AlphaDstFunc::Get(arg);
877 if (cmd::SetBlending::Unused0::Get(arg) != 0 || 873 if (SetBlending::Unused0::Get(arg) != 0 ||
878 cmd::SetBlending::Unused1::Get(arg) != 0 || 874 SetBlending::Unused1::Get(arg) != 0 ||
879 color_eq >= command_buffer::kNumBlendEq || 875 color_eq >= kNumBlendEq ||
880 color_src >= command_buffer::kNumBlendFunc || 876 color_src >= kNumBlendFunc ||
881 color_dst >= command_buffer::kNumBlendFunc || 877 color_dst >= kNumBlendFunc ||
882 alpha_eq >= command_buffer::kNumBlendEq || 878 alpha_eq >= kNumBlendEq ||
883 alpha_src >= command_buffer::kNumBlendFunc || 879 alpha_src >= kNumBlendFunc ||
884 alpha_dst >= command_buffer::kNumBlendFunc) 880 alpha_dst >= kNumBlendFunc)
885 return parse_error::kParseInvalidArguments; 881 return parse_error::kParseInvalidArguments;
886 gapi_->SetBlending(enable, 882 gapi_->SetBlending(enable,
887 separate_alpha, 883 separate_alpha,
888 static_cast<command_buffer::BlendEq>(color_eq), 884 static_cast<BlendEq>(color_eq),
889 static_cast<command_buffer::BlendFunc>(color_src), 885 static_cast<BlendFunc>(color_src),
890 static_cast<command_buffer::BlendFunc>(color_dst), 886 static_cast<BlendFunc>(color_dst),
891 static_cast<command_buffer::BlendEq>(alpha_eq), 887 static_cast<BlendEq>(alpha_eq),
892 static_cast<command_buffer::BlendFunc>(alpha_src), 888 static_cast<BlendFunc>(alpha_src),
893 static_cast<command_buffer::BlendFunc>(alpha_dst)); 889 static_cast<BlendFunc>(alpha_dst));
894 return parse_error::kParseNoError; 890 return parse_error::kParseNoError;
895 } 891 }
896 892
897 parse_error::ParseError GAPIDecoder::HandleSetBlendingColor( 893 parse_error::ParseError GAPIDecoder::HandleSetBlendingColor(
898 uint32 arg_count, 894 uint32 arg_count,
899 const cmd::SetBlendingColor& args) { 895 const SetBlendingColor& args) {
900 RGBA rgba; 896 RGBA rgba;
901 rgba.red = args.red; 897 rgba.red = args.red;
902 rgba.green = args.green; 898 rgba.green = args.green;
903 rgba.blue = args.blue; 899 rgba.blue = args.blue;
904 rgba.alpha = args.alpha; 900 rgba.alpha = args.alpha;
905 gapi_->SetBlendingColor(rgba); 901 gapi_->SetBlendingColor(rgba);
906 return parse_error::kParseNoError; 902 return parse_error::kParseNoError;
907 } 903 }
908 904
909 parse_error::ParseError GAPIDecoder::HandleCreateRenderSurface( 905 parse_error::ParseError GAPIDecoder::HandleCreateRenderSurface(
910 uint32 arg_count, 906 uint32 arg_count,
911 const cmd::CreateRenderSurface& args) { 907 const CreateRenderSurface& args) {
912 unsigned int width_height = args.width_height; 908 unsigned int width_height = args.width_height;
913 unsigned int width = cmd::CreateRenderSurface::Width::Get(width_height); 909 unsigned int width = CreateRenderSurface::Width::Get(width_height);
914 unsigned int height = cmd::CreateRenderSurface::Height::Get(width_height); 910 unsigned int height = CreateRenderSurface::Height::Get(width_height);
915 unsigned int levels_side = args.levels_side; 911 unsigned int levels_side = args.levels_side;
916 unsigned int mip_level = cmd::CreateRenderSurface::Levels::Get(levels_side); 912 unsigned int mip_level = CreateRenderSurface::Levels::Get(levels_side);
917 unsigned int side = cmd::CreateRenderSurface::Side::Get(levels_side); 913 unsigned int side = CreateRenderSurface::Side::Get(levels_side);
918 return gapi_->CreateRenderSurface(args.render_surface_id, 914 return gapi_->CreateRenderSurface(args.render_surface_id,
919 width, height, mip_level, 915 width, height, mip_level,
920 side, args.texture_id); 916 side, args.texture_id);
921 } 917 }
922 918
923 parse_error::ParseError GAPIDecoder::HandleDestroyRenderSurface( 919 parse_error::ParseError GAPIDecoder::HandleDestroyRenderSurface(
924 uint32 arg_count, 920 uint32 arg_count,
925 const cmd::DestroyRenderSurface& args) { 921 const DestroyRenderSurface& args) {
926 return gapi_->DestroyRenderSurface(args.render_surface_id); 922 return gapi_->DestroyRenderSurface(args.render_surface_id);
927 } 923 }
928 924
929 parse_error::ParseError GAPIDecoder::HandleCreateDepthSurface( 925 parse_error::ParseError GAPIDecoder::HandleCreateDepthSurface(
930 uint32 arg_count, 926 uint32 arg_count,
931 const cmd::CreateDepthSurface& args) { 927 const CreateDepthSurface& args) {
932 unsigned int width_height = args.width_height; 928 unsigned int width_height = args.width_height;
933 unsigned int width = cmd::CreateDepthSurface::Width::Get(width_height); 929 unsigned int width = CreateDepthSurface::Width::Get(width_height);
934 unsigned int height = cmd::CreateDepthSurface::Height::Get(width_height); 930 unsigned int height = CreateDepthSurface::Height::Get(width_height);
935 return gapi_->CreateDepthSurface(args.depth_surface_id, width, height); 931 return gapi_->CreateDepthSurface(args.depth_surface_id, width, height);
936 } 932 }
937 933
938 parse_error::ParseError GAPIDecoder::HandleDestroyDepthSurface( 934 parse_error::ParseError GAPIDecoder::HandleDestroyDepthSurface(
939 uint32 arg_count, 935 uint32 arg_count,
940 const cmd::DestroyDepthSurface& args) { 936 const DestroyDepthSurface& args) {
941 return gapi_->DestroyDepthSurface(args.depth_surface_id); 937 return gapi_->DestroyDepthSurface(args.depth_surface_id);
942 } 938 }
943 939
944 parse_error::ParseError GAPIDecoder::HandleSetRenderSurface( 940 parse_error::ParseError GAPIDecoder::HandleSetRenderSurface(
945 uint32 arg_count, 941 uint32 arg_count,
946 const cmd::SetRenderSurface& args) { 942 const SetRenderSurface& args) {
947 return gapi_->SetRenderSurface(args.render_surface_id, args.depth_surface_id); 943 return gapi_->SetRenderSurface(args.render_surface_id, args.depth_surface_id);
948 } 944 }
949 945
950 parse_error::ParseError GAPIDecoder::HandleSetBackSurfaces( 946 parse_error::ParseError GAPIDecoder::HandleSetBackSurfaces(
951 uint32 arg_count, 947 uint32 arg_count,
952 const cmd::SetBackSurfaces& args) { 948 const SetBackSurfaces& args) {
953 gapi_->SetBackSurfaces(); 949 gapi_->SetBackSurfaces();
954 return parse_error::kParseNoError; 950 return parse_error::kParseNoError;
955 } 951 }
956 952
953 } // namespace o3d
957 } // namespace command_buffer 954 } // namespace command_buffer
958 } // namespace o3d 955 } // namespace o3d
OLDNEW
« no previous file with comments | « command_buffer/service/cross/gapi_decoder.h ('k') | command_buffer/service/cross/gl/effect_gl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698