| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // This file contains the common parts of command buffer formats. | 5 // This file contains the common parts of command buffer formats. |
| 6 | 6 |
| 7 #ifndef GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ | 7 #ifndef GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ |
| 8 #define GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ | 8 #define GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ |
| 9 | 9 |
| 10 #include <stddef.h> | 10 #include <stddef.h> |
| 11 #include <stdint.h> |
| 11 | 12 |
| 12 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/macros.h" |
| 13 #include "gpu/command_buffer/common/bitfield_helpers.h" | 15 #include "gpu/command_buffer/common/bitfield_helpers.h" |
| 14 #include "gpu/command_buffer/common/types.h" | |
| 15 #include "gpu/gpu_export.h" | 16 #include "gpu/gpu_export.h" |
| 16 | 17 |
| 17 namespace gpu { | 18 namespace gpu { |
| 18 | 19 |
| 19 namespace cmd { | 20 namespace cmd { |
| 20 enum ArgFlags { | 21 enum ArgFlags { |
| 21 kFixed = 0x0, | 22 kFixed = 0x0, |
| 22 kAtLeastN = 0x1 | 23 kAtLeastN = 0x1 |
| 23 }; | 24 }; |
| 24 } // namespace cmd | 25 } // namespace cmd |
| 25 | 26 |
| 26 // Pack & unpack Command cmd_flags | 27 // Pack & unpack Command cmd_flags |
| 27 #define CMD_FLAG_SET_TRACE_LEVEL(level) ((level & 3) << 0) | 28 #define CMD_FLAG_SET_TRACE_LEVEL(level) ((level & 3) << 0) |
| 28 #define CMD_FLAG_GET_TRACE_LEVEL(cmd_flags) ((cmd_flags >> 0) & 3) | 29 #define CMD_FLAG_GET_TRACE_LEVEL(cmd_flags) ((cmd_flags >> 0) & 3) |
| 29 | 30 |
| 30 // Computes the number of command buffer entries needed for a certain size. In | 31 // Computes the number of command buffer entries needed for a certain size. In |
| 31 // other words it rounds up to a multiple of entries. | 32 // other words it rounds up to a multiple of entries. |
| 32 inline uint32 ComputeNumEntries(size_t size_in_bytes) { | 33 inline uint32_t ComputeNumEntries(size_t size_in_bytes) { |
| 33 return static_cast<uint32>( | 34 return static_cast<uint32_t>( |
| 34 (size_in_bytes + sizeof(uint32) - 1) / sizeof(uint32)); // NOLINT | 35 (size_in_bytes + sizeof(uint32_t) - 1) / sizeof(uint32_t)); // NOLINT |
| 35 } | 36 } |
| 36 | 37 |
| 37 // Rounds up to a multiple of entries in bytes. | 38 // Rounds up to a multiple of entries in bytes. |
| 38 inline size_t RoundSizeToMultipleOfEntries(size_t size_in_bytes) { | 39 inline size_t RoundSizeToMultipleOfEntries(size_t size_in_bytes) { |
| 39 return ComputeNumEntries(size_in_bytes) * sizeof(uint32); // NOLINT | 40 return ComputeNumEntries(size_in_bytes) * sizeof(uint32_t); // NOLINT |
| 40 } | 41 } |
| 41 | 42 |
| 42 // Struct that defines the command header in the command buffer. | 43 // Struct that defines the command header in the command buffer. |
| 43 struct CommandHeader { | 44 struct CommandHeader { |
| 44 uint32 size:21; | 45 uint32_t size:21; |
| 45 uint32 command:11; | 46 uint32_t command:11; |
| 46 | 47 |
| 47 GPU_EXPORT static const int32 kMaxSize = (1 << 21) - 1; | 48 GPU_EXPORT static const int32_t kMaxSize = (1 << 21) - 1; |
| 48 | 49 |
| 49 void Init(uint32 _command, int32 _size) { | 50 void Init(uint32_t _command, int32_t _size) { |
| 50 DCHECK_LE(_size, kMaxSize); | 51 DCHECK_LE(_size, kMaxSize); |
| 51 command = _command; | 52 command = _command; |
| 52 size = _size; | 53 size = _size; |
| 53 } | 54 } |
| 54 | 55 |
| 55 // Sets the header based on the passed in command. Can not be used for | 56 // Sets the header based on the passed in command. Can not be used for |
| 56 // variable sized commands like immediate commands or Noop. | 57 // variable sized commands like immediate commands or Noop. |
| 57 template <typename T> | 58 template <typename T> |
| 58 void SetCmd() { | 59 void SetCmd() { |
| 59 COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); | 60 COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); |
| 60 Init(T::kCmdId, ComputeNumEntries(sizeof(T))); // NOLINT | 61 Init(T::kCmdId, ComputeNumEntries(sizeof(T))); // NOLINT |
| 61 } | 62 } |
| 62 | 63 |
| 63 // Sets the header by a size in bytes of the immediate data after the command. | 64 // Sets the header by a size in bytes of the immediate data after the command. |
| 64 template <typename T> | 65 template <typename T> |
| 65 void SetCmdBySize(uint32 size_of_data_in_bytes) { | 66 void SetCmdBySize(uint32_t size_of_data_in_bytes) { |
| 66 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); | 67 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); |
| 67 Init(T::kCmdId, | 68 Init(T::kCmdId, |
| 68 ComputeNumEntries(sizeof(T) + size_of_data_in_bytes)); // NOLINT | 69 ComputeNumEntries(sizeof(T) + size_of_data_in_bytes)); // NOLINT |
| 69 } | 70 } |
| 70 | 71 |
| 71 // Sets the header by a size in bytes. | 72 // Sets the header by a size in bytes. |
| 72 template <typename T> | 73 template <typename T> |
| 73 void SetCmdByTotalSize(uint32 size_in_bytes) { | 74 void SetCmdByTotalSize(uint32_t size_in_bytes) { |
| 74 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); | 75 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); |
| 75 DCHECK_GE(size_in_bytes, sizeof(T)); // NOLINT | 76 DCHECK_GE(size_in_bytes, sizeof(T)); // NOLINT |
| 76 Init(T::kCmdId, ComputeNumEntries(size_in_bytes)); | 77 Init(T::kCmdId, ComputeNumEntries(size_in_bytes)); |
| 77 } | 78 } |
| 78 }; | 79 }; |
| 79 | 80 |
| 80 COMPILE_ASSERT(sizeof(CommandHeader) == 4, Sizeof_CommandHeader_is_not_4); | 81 COMPILE_ASSERT(sizeof(CommandHeader) == 4, Sizeof_CommandHeader_is_not_4); |
| 81 | 82 |
| 82 // Union that defines possible command buffer entries. | 83 // Union that defines possible command buffer entries. |
| 83 union CommandBufferEntry { | 84 union CommandBufferEntry { |
| 84 CommandHeader value_header; | 85 CommandHeader value_header; |
| 85 uint32 value_uint32; | 86 uint32_t value_uint32; |
| 86 int32 value_int32; | 87 int32_t value_int32; |
| 87 float value_float; | 88 float value_float; |
| 88 }; | 89 }; |
| 89 | 90 |
| 90 #define GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT 4 | 91 #define GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT 4 |
| 91 const size_t kCommandBufferEntrySize = GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT; | 92 const size_t kCommandBufferEntrySize = GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT; |
| 92 | 93 |
| 93 COMPILE_ASSERT(sizeof(CommandBufferEntry) == kCommandBufferEntrySize, | 94 COMPILE_ASSERT(sizeof(CommandBufferEntry) == kCommandBufferEntrySize, |
| 94 Sizeof_CommandBufferEntry_is_not_4); | 95 Sizeof_CommandBufferEntry_is_not_4); |
| 95 | 96 |
| 96 // Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. | 97 // Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 116 COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); | 117 COMPILE_ASSERT(T::kArgFlags == cmd::kFixed, Cmd_kArgFlags_not_kFixed); |
| 117 return reinterpret_cast<char*>(cmd) + sizeof(T); | 118 return reinterpret_cast<char*>(cmd) + sizeof(T); |
| 118 } | 119 } |
| 119 | 120 |
| 120 // Gets the address of the place to put the next command in a typesafe way. | 121 // Gets the address of the place to put the next command in a typesafe way. |
| 121 // This can only be used for variable sized command like IMMEDIATE commands. | 122 // This can only be used for variable sized command like IMMEDIATE commands. |
| 122 // Parameters: | 123 // Parameters: |
| 123 // cmd: Address of command. | 124 // cmd: Address of command. |
| 124 // size_of_data_in_bytes: Size of the data for the command. | 125 // size_of_data_in_bytes: Size of the data for the command. |
| 125 template <typename T> | 126 template <typename T> |
| 126 void* NextImmediateCmdAddress(void* cmd, uint32 size_of_data_in_bytes) { | 127 void* NextImmediateCmdAddress(void* cmd, uint32_t size_of_data_in_bytes) { |
| 127 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); | 128 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); |
| 128 return reinterpret_cast<char*>(cmd) + sizeof(T) + // NOLINT | 129 return reinterpret_cast<char*>(cmd) + sizeof(T) + // NOLINT |
| 129 RoundSizeToMultipleOfEntries(size_of_data_in_bytes); | 130 RoundSizeToMultipleOfEntries(size_of_data_in_bytes); |
| 130 } | 131 } |
| 131 | 132 |
| 132 // Gets the address of the place to put the next command in a typesafe way. | 133 // Gets the address of the place to put the next command in a typesafe way. |
| 133 // This can only be used for variable sized command like IMMEDIATE commands. | 134 // This can only be used for variable sized command like IMMEDIATE commands. |
| 134 // Parameters: | 135 // Parameters: |
| 135 // cmd: Address of command. | 136 // cmd: Address of command. |
| 136 // size_of_cmd_in_bytes: Size of the cmd and data. | 137 // size_of_cmd_in_bytes: Size of the cmd and data. |
| 137 template <typename T> | 138 template <typename T> |
| 138 void* NextImmediateCmdAddressTotalSize(void* cmd, uint32 total_size_in_bytes) { | 139 void* NextImmediateCmdAddressTotalSize(void* cmd, |
| 140 uint32_t total_size_in_bytes) { |
| 139 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); | 141 COMPILE_ASSERT(T::kArgFlags == cmd::kAtLeastN, Cmd_kArgFlags_not_kAtLeastN); |
| 140 DCHECK_GE(total_size_in_bytes, sizeof(T)); // NOLINT | 142 DCHECK_GE(total_size_in_bytes, sizeof(T)); // NOLINT |
| 141 return reinterpret_cast<char*>(cmd) + | 143 return reinterpret_cast<char*>(cmd) + |
| 142 RoundSizeToMultipleOfEntries(total_size_in_bytes); | 144 RoundSizeToMultipleOfEntries(total_size_in_bytes); |
| 143 } | 145 } |
| 144 | 146 |
| 145 namespace cmd { | 147 namespace cmd { |
| 146 | 148 |
| 147 // This macro is used to safely and convienently expand the list of commnad | 149 // This macro is used to safely and convienently expand the list of commnad |
| 148 // buffer commands in to various lists and never have them get out of sync. To | 150 // buffer commands in to various lists and never have them get out of sync. To |
| (...skipping 25 matching lines...) Expand all Loading... |
| 174 | 176 |
| 175 COMPILE_ASSERT(kNumCommands - 1 <= kLastCommonId, Too_many_common_commands); | 177 COMPILE_ASSERT(kNumCommands - 1 <= kLastCommonId, Too_many_common_commands); |
| 176 | 178 |
| 177 const char* GetCommandName(CommandId id); | 179 const char* GetCommandName(CommandId id); |
| 178 | 180 |
| 179 // A Noop command. | 181 // A Noop command. |
| 180 struct Noop { | 182 struct Noop { |
| 181 typedef Noop ValueType; | 183 typedef Noop ValueType; |
| 182 static const CommandId kCmdId = kNoop; | 184 static const CommandId kCmdId = kNoop; |
| 183 static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; | 185 static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; |
| 184 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 186 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 185 | 187 |
| 186 void SetHeader(uint32 skip_count) { | 188 void SetHeader(uint32_t skip_count) { |
| 187 DCHECK_GT(skip_count, 0u); | 189 DCHECK_GT(skip_count, 0u); |
| 188 header.Init(kCmdId, skip_count); | 190 header.Init(kCmdId, skip_count); |
| 189 } | 191 } |
| 190 | 192 |
| 191 void Init(uint32 skip_count) { | 193 void Init(uint32_t skip_count) { |
| 192 SetHeader(skip_count); | 194 SetHeader(skip_count); |
| 193 } | 195 } |
| 194 | 196 |
| 195 static void* Set(void* cmd, uint32 skip_count) { | 197 static void* Set(void* cmd, uint32_t skip_count) { |
| 196 static_cast<ValueType*>(cmd)->Init(skip_count); | 198 static_cast<ValueType*>(cmd)->Init(skip_count); |
| 197 return NextImmediateCmdAddress<ValueType>( | 199 return NextImmediateCmdAddress<ValueType>( |
| 198 cmd, skip_count * sizeof(CommandBufferEntry)); // NOLINT | 200 cmd, skip_count * sizeof(CommandBufferEntry)); // NOLINT |
| 199 } | 201 } |
| 200 | 202 |
| 201 CommandHeader header; | 203 CommandHeader header; |
| 202 }; | 204 }; |
| 203 | 205 |
| 204 COMPILE_ASSERT(sizeof(Noop) == 4, Sizeof_Noop_is_not_4); | 206 COMPILE_ASSERT(sizeof(Noop) == 4, Sizeof_Noop_is_not_4); |
| 205 COMPILE_ASSERT(offsetof(Noop, header) == 0, Offsetof_Noop_header_not_0); | 207 COMPILE_ASSERT(offsetof(Noop, header) == 0, Offsetof_Noop_header_not_0); |
| 206 | 208 |
| 207 // The SetToken command puts a token in the command stream that you can | 209 // The SetToken command puts a token in the command stream that you can |
| 208 // use to check if that token has been passed in the command stream. | 210 // use to check if that token has been passed in the command stream. |
| 209 struct SetToken { | 211 struct SetToken { |
| 210 typedef SetToken ValueType; | 212 typedef SetToken ValueType; |
| 211 static const CommandId kCmdId = kSetToken; | 213 static const CommandId kCmdId = kSetToken; |
| 212 static const cmd::ArgFlags kArgFlags = cmd::kFixed; | 214 static const cmd::ArgFlags kArgFlags = cmd::kFixed; |
| 213 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 215 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 214 | 216 |
| 215 void SetHeader() { | 217 void SetHeader() { |
| 216 header.SetCmd<ValueType>(); | 218 header.SetCmd<ValueType>(); |
| 217 } | 219 } |
| 218 | 220 |
| 219 void Init(uint32 _token) { | 221 void Init(uint32_t _token) { |
| 220 SetHeader(); | 222 SetHeader(); |
| 221 token = _token; | 223 token = _token; |
| 222 } | 224 } |
| 223 static void* Set(void* cmd, uint32 token) { | 225 static void* Set(void* cmd, uint32_t token) { |
| 224 static_cast<ValueType*>(cmd)->Init(token); | 226 static_cast<ValueType*>(cmd)->Init(token); |
| 225 return NextCmdAddress<ValueType>(cmd); | 227 return NextCmdAddress<ValueType>(cmd); |
| 226 } | 228 } |
| 227 | 229 |
| 228 CommandHeader header; | 230 CommandHeader header; |
| 229 uint32 token; | 231 uint32_t token; |
| 230 }; | 232 }; |
| 231 | 233 |
| 232 COMPILE_ASSERT(sizeof(SetToken) == 8, Sizeof_SetToken_is_not_8); | 234 COMPILE_ASSERT(sizeof(SetToken) == 8, Sizeof_SetToken_is_not_8); |
| 233 COMPILE_ASSERT(offsetof(SetToken, header) == 0, | 235 COMPILE_ASSERT(offsetof(SetToken, header) == 0, |
| 234 Offsetof_SetToken_header_not_0); | 236 Offsetof_SetToken_header_not_0); |
| 235 COMPILE_ASSERT(offsetof(SetToken, token) == 4, | 237 COMPILE_ASSERT(offsetof(SetToken, token) == 4, |
| 236 Offsetof_SetToken_token_not_4); | 238 Offsetof_SetToken_token_not_4); |
| 237 | 239 |
| 238 // Sets the size of a bucket for collecting data on the service side. | 240 // Sets the size of a bucket for collecting data on the service side. |
| 239 // This is a utility for gathering data on the service side so it can be used | 241 // This is a utility for gathering data on the service side so it can be used |
| 240 // all at once when some service side API is called. It removes the need to add | 242 // all at once when some service side API is called. It removes the need to add |
| 241 // special commands just to support a particular API. For example, any API | 243 // special commands just to support a particular API. For example, any API |
| 242 // command that needs a string needs a way to send that string to the API over | 244 // command that needs a string needs a way to send that string to the API over |
| 243 // the command buffers. While you can require that the command buffer or | 245 // the command buffers. While you can require that the command buffer or |
| 244 // transfer buffer be large enough to hold the largest string you can send, | 246 // transfer buffer be large enough to hold the largest string you can send, |
| 245 // using this command removes that restriction by letting you send smaller | 247 // using this command removes that restriction by letting you send smaller |
| 246 // pieces over and build up the data on the service side. | 248 // pieces over and build up the data on the service side. |
| 247 // | 249 // |
| 248 // You can clear a bucket on the service side and thereby free memory by sending | 250 // You can clear a bucket on the service side and thereby free memory by sending |
| 249 // a size of 0. | 251 // a size of 0. |
| 250 struct SetBucketSize { | 252 struct SetBucketSize { |
| 251 typedef SetBucketSize ValueType; | 253 typedef SetBucketSize ValueType; |
| 252 static const CommandId kCmdId = kSetBucketSize; | 254 static const CommandId kCmdId = kSetBucketSize; |
| 253 static const cmd::ArgFlags kArgFlags = cmd::kFixed; | 255 static const cmd::ArgFlags kArgFlags = cmd::kFixed; |
| 254 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 256 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 255 | 257 |
| 256 void SetHeader() { | 258 void SetHeader() { |
| 257 header.SetCmd<ValueType>(); | 259 header.SetCmd<ValueType>(); |
| 258 } | 260 } |
| 259 | 261 |
| 260 void Init(uint32 _bucket_id, uint32 _size) { | 262 void Init(uint32_t _bucket_id, uint32_t _size) { |
| 261 SetHeader(); | 263 SetHeader(); |
| 262 bucket_id = _bucket_id; | 264 bucket_id = _bucket_id; |
| 263 size = _size; | 265 size = _size; |
| 264 } | 266 } |
| 265 static void* Set(void* cmd, uint32 _bucket_id, uint32 _size) { | 267 static void* Set(void* cmd, uint32_t _bucket_id, uint32_t _size) { |
| 266 static_cast<ValueType*>(cmd)->Init(_bucket_id, _size); | 268 static_cast<ValueType*>(cmd)->Init(_bucket_id, _size); |
| 267 return NextCmdAddress<ValueType>(cmd); | 269 return NextCmdAddress<ValueType>(cmd); |
| 268 } | 270 } |
| 269 | 271 |
| 270 CommandHeader header; | 272 CommandHeader header; |
| 271 uint32 bucket_id; | 273 uint32_t bucket_id; |
| 272 uint32 size; | 274 uint32_t size; |
| 273 }; | 275 }; |
| 274 | 276 |
| 275 COMPILE_ASSERT(sizeof(SetBucketSize) == 12, Sizeof_SetBucketSize_is_not_8); | 277 COMPILE_ASSERT(sizeof(SetBucketSize) == 12, Sizeof_SetBucketSize_is_not_8); |
| 276 COMPILE_ASSERT(offsetof(SetBucketSize, header) == 0, | 278 COMPILE_ASSERT(offsetof(SetBucketSize, header) == 0, |
| 277 Offsetof_SetBucketSize_header_not_0); | 279 Offsetof_SetBucketSize_header_not_0); |
| 278 COMPILE_ASSERT(offsetof(SetBucketSize, bucket_id) == 4, | 280 COMPILE_ASSERT(offsetof(SetBucketSize, bucket_id) == 4, |
| 279 Offsetof_SetBucketSize_bucket_id_4); | 281 Offsetof_SetBucketSize_bucket_id_4); |
| 280 COMPILE_ASSERT(offsetof(SetBucketSize, size) == 8, | 282 COMPILE_ASSERT(offsetof(SetBucketSize, size) == 8, |
| 281 Offsetof_SetBucketSize_size_8); | 283 Offsetof_SetBucketSize_size_8); |
| 282 | 284 |
| 283 // Sets the contents of a portion of a bucket on the service side from data in | 285 // Sets the contents of a portion of a bucket on the service side from data in |
| 284 // shared memory. | 286 // shared memory. |
| 285 // See SetBucketSize. | 287 // See SetBucketSize. |
| 286 struct SetBucketData { | 288 struct SetBucketData { |
| 287 typedef SetBucketData ValueType; | 289 typedef SetBucketData ValueType; |
| 288 static const CommandId kCmdId = kSetBucketData; | 290 static const CommandId kCmdId = kSetBucketData; |
| 289 static const cmd::ArgFlags kArgFlags = cmd::kFixed; | 291 static const cmd::ArgFlags kArgFlags = cmd::kFixed; |
| 290 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 292 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 291 | 293 |
| 292 void SetHeader() { | 294 void SetHeader() { |
| 293 header.SetCmd<ValueType>(); | 295 header.SetCmd<ValueType>(); |
| 294 } | 296 } |
| 295 | 297 |
| 296 void Init(uint32 _bucket_id, | 298 void Init(uint32_t _bucket_id, |
| 297 uint32 _offset, | 299 uint32_t _offset, |
| 298 uint32 _size, | 300 uint32_t _size, |
| 299 uint32 _shared_memory_id, | 301 uint32_t _shared_memory_id, |
| 300 uint32 _shared_memory_offset) { | 302 uint32_t _shared_memory_offset) { |
| 301 SetHeader(); | 303 SetHeader(); |
| 302 bucket_id = _bucket_id; | 304 bucket_id = _bucket_id; |
| 303 offset = _offset; | 305 offset = _offset; |
| 304 size = _size; | 306 size = _size; |
| 305 shared_memory_id = _shared_memory_id; | 307 shared_memory_id = _shared_memory_id; |
| 306 shared_memory_offset = _shared_memory_offset; | 308 shared_memory_offset = _shared_memory_offset; |
| 307 } | 309 } |
| 308 static void* Set(void* cmd, | 310 static void* Set(void* cmd, |
| 309 uint32 _bucket_id, | 311 uint32_t _bucket_id, |
| 310 uint32 _offset, | 312 uint32_t _offset, |
| 311 uint32 _size, | 313 uint32_t _size, |
| 312 uint32 _shared_memory_id, | 314 uint32_t _shared_memory_id, |
| 313 uint32 _shared_memory_offset) { | 315 uint32_t _shared_memory_offset) { |
| 314 static_cast<ValueType*>(cmd)->Init( | 316 static_cast<ValueType*>(cmd)->Init( |
| 315 _bucket_id, | 317 _bucket_id, |
| 316 _offset, | 318 _offset, |
| 317 _size, | 319 _size, |
| 318 _shared_memory_id, | 320 _shared_memory_id, |
| 319 _shared_memory_offset); | 321 _shared_memory_offset); |
| 320 return NextCmdAddress<ValueType>(cmd); | 322 return NextCmdAddress<ValueType>(cmd); |
| 321 } | 323 } |
| 322 | 324 |
| 323 CommandHeader header; | 325 CommandHeader header; |
| 324 uint32 bucket_id; | 326 uint32_t bucket_id; |
| 325 uint32 offset; | 327 uint32_t offset; |
| 326 uint32 size; | 328 uint32_t size; |
| 327 uint32 shared_memory_id; | 329 uint32_t shared_memory_id; |
| 328 uint32 shared_memory_offset; | 330 uint32_t shared_memory_offset; |
| 329 }; | 331 }; |
| 330 | 332 |
| 331 COMPILE_ASSERT(sizeof(SetBucketData) == 24, Sizeof_SetBucketData_is_not_24); | 333 COMPILE_ASSERT(sizeof(SetBucketData) == 24, Sizeof_SetBucketData_is_not_24); |
| 332 COMPILE_ASSERT(offsetof(SetBucketData, header) == 0, | 334 COMPILE_ASSERT(offsetof(SetBucketData, header) == 0, |
| 333 Offsetof_SetBucketData_header_not_0); | 335 Offsetof_SetBucketData_header_not_0); |
| 334 COMPILE_ASSERT(offsetof(SetBucketData, bucket_id) == 4, | 336 COMPILE_ASSERT(offsetof(SetBucketData, bucket_id) == 4, |
| 335 Offsetof_SetBucketData_bucket_id_not_4); | 337 Offsetof_SetBucketData_bucket_id_not_4); |
| 336 COMPILE_ASSERT(offsetof(SetBucketData, offset) == 8, | 338 COMPILE_ASSERT(offsetof(SetBucketData, offset) == 8, |
| 337 Offsetof_SetBucketData_offset_not_8); | 339 Offsetof_SetBucketData_offset_not_8); |
| 338 COMPILE_ASSERT(offsetof(SetBucketData, size) == 12, | 340 COMPILE_ASSERT(offsetof(SetBucketData, size) == 12, |
| 339 Offsetof_SetBucketData_size_not_12); | 341 Offsetof_SetBucketData_size_not_12); |
| 340 COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_id) == 16, | 342 COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_id) == 16, |
| 341 Offsetof_SetBucketData_shared_memory_id_not_16); | 343 Offsetof_SetBucketData_shared_memory_id_not_16); |
| 342 COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_offset) == 20, | 344 COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_offset) == 20, |
| 343 Offsetof_SetBucketData_shared_memory_offset_not_20); | 345 Offsetof_SetBucketData_shared_memory_offset_not_20); |
| 344 | 346 |
| 345 // Sets the contents of a portion of a bucket on the service side from data in | 347 // Sets the contents of a portion of a bucket on the service side from data in |
| 346 // the command buffer. | 348 // the command buffer. |
| 347 // See SetBucketSize. | 349 // See SetBucketSize. |
| 348 struct SetBucketDataImmediate { | 350 struct SetBucketDataImmediate { |
| 349 typedef SetBucketDataImmediate ValueType; | 351 typedef SetBucketDataImmediate ValueType; |
| 350 static const CommandId kCmdId = kSetBucketDataImmediate; | 352 static const CommandId kCmdId = kSetBucketDataImmediate; |
| 351 static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; | 353 static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN; |
| 352 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 354 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 353 | 355 |
| 354 void SetHeader(uint32 size) { | 356 void SetHeader(uint32_t size) { |
| 355 header.SetCmdBySize<ValueType>(size); | 357 header.SetCmdBySize<ValueType>(size); |
| 356 } | 358 } |
| 357 | 359 |
| 358 void Init(uint32 _bucket_id, | 360 void Init(uint32_t _bucket_id, |
| 359 uint32 _offset, | 361 uint32_t _offset, |
| 360 uint32 _size) { | 362 uint32_t _size) { |
| 361 SetHeader(_size); | 363 SetHeader(_size); |
| 362 bucket_id = _bucket_id; | 364 bucket_id = _bucket_id; |
| 363 offset = _offset; | 365 offset = _offset; |
| 364 size = _size; | 366 size = _size; |
| 365 } | 367 } |
| 366 static void* Set(void* cmd, | 368 static void* Set(void* cmd, |
| 367 uint32 _bucket_id, | 369 uint32_t _bucket_id, |
| 368 uint32 _offset, | 370 uint32_t _offset, |
| 369 uint32 _size) { | 371 uint32_t _size) { |
| 370 static_cast<ValueType*>(cmd)->Init( | 372 static_cast<ValueType*>(cmd)->Init( |
| 371 _bucket_id, | 373 _bucket_id, |
| 372 _offset, | 374 _offset, |
| 373 _size); | 375 _size); |
| 374 return NextImmediateCmdAddress<ValueType>(cmd, _size); | 376 return NextImmediateCmdAddress<ValueType>(cmd, _size); |
| 375 } | 377 } |
| 376 | 378 |
| 377 CommandHeader header; | 379 CommandHeader header; |
| 378 uint32 bucket_id; | 380 uint32_t bucket_id; |
| 379 uint32 offset; | 381 uint32_t offset; |
| 380 uint32 size; | 382 uint32_t size; |
| 381 }; | 383 }; |
| 382 | 384 |
| 383 COMPILE_ASSERT(sizeof(SetBucketDataImmediate) == 16, | 385 COMPILE_ASSERT(sizeof(SetBucketDataImmediate) == 16, |
| 384 Sizeof_SetBucketDataImmediate_is_not_24); | 386 Sizeof_SetBucketDataImmediate_is_not_24); |
| 385 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, header) == 0, | 387 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, header) == 0, |
| 386 Offsetof_SetBucketDataImmediate_header_not_0); | 388 Offsetof_SetBucketDataImmediate_header_not_0); |
| 387 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, bucket_id) == 4, | 389 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, bucket_id) == 4, |
| 388 Offsetof_SetBucketDataImmediate_bucket_id_not_4); | 390 Offsetof_SetBucketDataImmediate_bucket_id_not_4); |
| 389 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, offset) == 8, | 391 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, offset) == 8, |
| 390 Offsetof_SetBucketDataImmediate_offset_not_8); | 392 Offsetof_SetBucketDataImmediate_offset_not_8); |
| 391 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, size) == 12, | 393 COMPILE_ASSERT(offsetof(SetBucketDataImmediate, size) == 12, |
| 392 Offsetof_SetBucketDataImmediate_size_not_12); | 394 Offsetof_SetBucketDataImmediate_size_not_12); |
| 393 | 395 |
| 394 // Gets the start of a bucket the service has available. Sending a variable size | 396 // Gets the start of a bucket the service has available. Sending a variable size |
| 395 // result back to the client and the portion of that result that fits in the | 397 // result back to the client and the portion of that result that fits in the |
| 396 // supplied shared memory. If the size of the result is larger than the supplied | 398 // supplied shared memory. If the size of the result is larger than the supplied |
| 397 // shared memory the rest of the bucket's contents can be retrieved with | 399 // shared memory the rest of the bucket's contents can be retrieved with |
| 398 // GetBucketData. | 400 // GetBucketData. |
| 399 // | 401 // |
| 400 // This is used for example for any API that returns a string. The problem is | 402 // This is used for example for any API that returns a string. The problem is |
| 401 // the largest thing you can send back in 1 command is the size of your shared | 403 // the largest thing you can send back in 1 command is the size of your shared |
| 402 // memory. This command along with GetBucketData implements a way to get a | 404 // memory. This command along with GetBucketData implements a way to get a |
| 403 // result a piece at a time to help solve that problem in a generic way. | 405 // result a piece at a time to help solve that problem in a generic way. |
| 404 struct GetBucketStart { | 406 struct GetBucketStart { |
| 405 typedef GetBucketStart ValueType; | 407 typedef GetBucketStart ValueType; |
| 406 static const CommandId kCmdId = kGetBucketStart; | 408 static const CommandId kCmdId = kGetBucketStart; |
| 407 static const cmd::ArgFlags kArgFlags = cmd::kFixed; | 409 static const cmd::ArgFlags kArgFlags = cmd::kFixed; |
| 408 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 410 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 409 | 411 |
| 410 typedef uint32 Result; | 412 typedef uint32_t Result; |
| 411 | 413 |
| 412 void SetHeader() { | 414 void SetHeader() { |
| 413 header.SetCmd<ValueType>(); | 415 header.SetCmd<ValueType>(); |
| 414 } | 416 } |
| 415 | 417 |
| 416 void Init(uint32 _bucket_id, | 418 void Init(uint32_t _bucket_id, |
| 417 uint32 _result_memory_id, | 419 uint32_t _result_memory_id, |
| 418 uint32 _result_memory_offset, | 420 uint32_t _result_memory_offset, |
| 419 uint32 _data_memory_size, | 421 uint32_t _data_memory_size, |
| 420 uint32 _data_memory_id, | 422 uint32_t _data_memory_id, |
| 421 uint32 _data_memory_offset) { | 423 uint32_t _data_memory_offset) { |
| 422 SetHeader(); | 424 SetHeader(); |
| 423 bucket_id = _bucket_id; | 425 bucket_id = _bucket_id; |
| 424 result_memory_id = _result_memory_id; | 426 result_memory_id = _result_memory_id; |
| 425 result_memory_offset = _result_memory_offset; | 427 result_memory_offset = _result_memory_offset; |
| 426 data_memory_size = _data_memory_size; | 428 data_memory_size = _data_memory_size; |
| 427 data_memory_id = _data_memory_id; | 429 data_memory_id = _data_memory_id; |
| 428 data_memory_offset = _data_memory_offset; | 430 data_memory_offset = _data_memory_offset; |
| 429 } | 431 } |
| 430 static void* Set(void* cmd, | 432 static void* Set(void* cmd, |
| 431 uint32 _bucket_id, | 433 uint32_t _bucket_id, |
| 432 uint32 _result_memory_id, | 434 uint32_t _result_memory_id, |
| 433 uint32 _result_memory_offset, | 435 uint32_t _result_memory_offset, |
| 434 uint32 _data_memory_size, | 436 uint32_t _data_memory_size, |
| 435 uint32 _data_memory_id, | 437 uint32_t _data_memory_id, |
| 436 uint32 _data_memory_offset) { | 438 uint32_t _data_memory_offset) { |
| 437 static_cast<ValueType*>(cmd)->Init( | 439 static_cast<ValueType*>(cmd)->Init( |
| 438 _bucket_id, | 440 _bucket_id, |
| 439 _result_memory_id, | 441 _result_memory_id, |
| 440 _result_memory_offset, | 442 _result_memory_offset, |
| 441 _data_memory_size, | 443 _data_memory_size, |
| 442 _data_memory_id, | 444 _data_memory_id, |
| 443 _data_memory_offset); | 445 _data_memory_offset); |
| 444 return NextCmdAddress<ValueType>(cmd); | 446 return NextCmdAddress<ValueType>(cmd); |
| 445 } | 447 } |
| 446 | 448 |
| 447 CommandHeader header; | 449 CommandHeader header; |
| 448 uint32 bucket_id; | 450 uint32_t bucket_id; |
| 449 uint32 result_memory_id; | 451 uint32_t result_memory_id; |
| 450 uint32 result_memory_offset; | 452 uint32_t result_memory_offset; |
| 451 uint32 data_memory_size; | 453 uint32_t data_memory_size; |
| 452 uint32 data_memory_id; | 454 uint32_t data_memory_id; |
| 453 uint32 data_memory_offset; | 455 uint32_t data_memory_offset; |
| 454 }; | 456 }; |
| 455 | 457 |
| 456 COMPILE_ASSERT(sizeof(GetBucketStart) == 28, Sizeof_GetBucketStart_is_not_28); | 458 COMPILE_ASSERT(sizeof(GetBucketStart) == 28, Sizeof_GetBucketStart_is_not_28); |
| 457 COMPILE_ASSERT(offsetof(GetBucketStart, header) == 0, | 459 COMPILE_ASSERT(offsetof(GetBucketStart, header) == 0, |
| 458 Offsetof_GetBucketStart_header_not_0); | 460 Offsetof_GetBucketStart_header_not_0); |
| 459 COMPILE_ASSERT(offsetof(GetBucketStart, bucket_id) == 4, | 461 COMPILE_ASSERT(offsetof(GetBucketStart, bucket_id) == 4, |
| 460 Offsetof_GetBucketStart_bucket_id_not_4); | 462 Offsetof_GetBucketStart_bucket_id_not_4); |
| 461 COMPILE_ASSERT(offsetof(GetBucketStart, result_memory_id) == 8, | 463 COMPILE_ASSERT(offsetof(GetBucketStart, result_memory_id) == 8, |
| 462 Offsetof_GetBucketStart_result_memory_id_not_8); | 464 Offsetof_GetBucketStart_result_memory_id_not_8); |
| 463 COMPILE_ASSERT(offsetof(GetBucketStart, result_memory_offset) == 12, | 465 COMPILE_ASSERT(offsetof(GetBucketStart, result_memory_offset) == 12, |
| 464 Offsetof_GetBucketStart_result_memory_offset_not_12); | 466 Offsetof_GetBucketStart_result_memory_offset_not_12); |
| 465 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_size) == 16, | 467 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_size) == 16, |
| 466 Offsetof_GetBucketStart_data_memory_size_not_16); | 468 Offsetof_GetBucketStart_data_memory_size_not_16); |
| 467 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_id) == 20, | 469 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_id) == 20, |
| 468 Offsetof_GetBucketStart_data_memory_id_not_20); | 470 Offsetof_GetBucketStart_data_memory_id_not_20); |
| 469 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_offset) == 24, | 471 COMPILE_ASSERT(offsetof(GetBucketStart, data_memory_offset) == 24, |
| 470 Offsetof_GetBucketStart_data_memory_offset_not_24); | 472 Offsetof_GetBucketStart_data_memory_offset_not_24); |
| 471 | 473 |
| 472 // Gets a piece of a result the service as available. | 474 // Gets a piece of a result the service as available. |
| 473 // See GetBucketSize. | 475 // See GetBucketSize. |
| 474 struct GetBucketData { | 476 struct GetBucketData { |
| 475 typedef GetBucketData ValueType; | 477 typedef GetBucketData ValueType; |
| 476 static const CommandId kCmdId = kGetBucketData; | 478 static const CommandId kCmdId = kGetBucketData; |
| 477 static const cmd::ArgFlags kArgFlags = cmd::kFixed; | 479 static const cmd::ArgFlags kArgFlags = cmd::kFixed; |
| 478 static const uint8 cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); | 480 static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3); |
| 479 | 481 |
| 480 void SetHeader() { | 482 void SetHeader() { |
| 481 header.SetCmd<ValueType>(); | 483 header.SetCmd<ValueType>(); |
| 482 } | 484 } |
| 483 | 485 |
| 484 void Init(uint32 _bucket_id, | 486 void Init(uint32_t _bucket_id, |
| 485 uint32 _offset, | 487 uint32_t _offset, |
| 486 uint32 _size, | 488 uint32_t _size, |
| 487 uint32 _shared_memory_id, | 489 uint32_t _shared_memory_id, |
| 488 uint32 _shared_memory_offset) { | 490 uint32_t _shared_memory_offset) { |
| 489 SetHeader(); | 491 SetHeader(); |
| 490 bucket_id = _bucket_id; | 492 bucket_id = _bucket_id; |
| 491 offset = _offset; | 493 offset = _offset; |
| 492 size = _size; | 494 size = _size; |
| 493 shared_memory_id = _shared_memory_id; | 495 shared_memory_id = _shared_memory_id; |
| 494 shared_memory_offset = _shared_memory_offset; | 496 shared_memory_offset = _shared_memory_offset; |
| 495 } | 497 } |
| 496 static void* Set(void* cmd, | 498 static void* Set(void* cmd, |
| 497 uint32 _bucket_id, | 499 uint32_t _bucket_id, |
| 498 uint32 _offset, | 500 uint32_t _offset, |
| 499 uint32 _size, | 501 uint32_t _size, |
| 500 uint32 _shared_memory_id, | 502 uint32_t _shared_memory_id, |
| 501 uint32 _shared_memory_offset) { | 503 uint32_t _shared_memory_offset) { |
| 502 static_cast<ValueType*>(cmd)->Init( | 504 static_cast<ValueType*>(cmd)->Init( |
| 503 _bucket_id, | 505 _bucket_id, |
| 504 _offset, | 506 _offset, |
| 505 _size, | 507 _size, |
| 506 _shared_memory_id, | 508 _shared_memory_id, |
| 507 _shared_memory_offset); | 509 _shared_memory_offset); |
| 508 return NextCmdAddress<ValueType>(cmd); | 510 return NextCmdAddress<ValueType>(cmd); |
| 509 } | 511 } |
| 510 | 512 |
| 511 CommandHeader header; | 513 CommandHeader header; |
| 512 uint32 bucket_id; | 514 uint32_t bucket_id; |
| 513 uint32 offset; | 515 uint32_t offset; |
| 514 uint32 size; | 516 uint32_t size; |
| 515 uint32 shared_memory_id; | 517 uint32_t shared_memory_id; |
| 516 uint32 shared_memory_offset; | 518 uint32_t shared_memory_offset; |
| 517 }; | 519 }; |
| 518 | 520 |
| 519 COMPILE_ASSERT(sizeof(GetBucketData) == 24, Sizeof_GetBucketData_is_not_20); | 521 COMPILE_ASSERT(sizeof(GetBucketData) == 24, Sizeof_GetBucketData_is_not_20); |
| 520 COMPILE_ASSERT(offsetof(GetBucketData, header) == 0, | 522 COMPILE_ASSERT(offsetof(GetBucketData, header) == 0, |
| 521 Offsetof_GetBucketData_header_not_0); | 523 Offsetof_GetBucketData_header_not_0); |
| 522 COMPILE_ASSERT(offsetof(GetBucketData, bucket_id) == 4, | 524 COMPILE_ASSERT(offsetof(GetBucketData, bucket_id) == 4, |
| 523 Offsetof_GetBucketData_bucket_id_not_4); | 525 Offsetof_GetBucketData_bucket_id_not_4); |
| 524 COMPILE_ASSERT(offsetof(GetBucketData, offset) == 8, | 526 COMPILE_ASSERT(offsetof(GetBucketData, offset) == 8, |
| 525 Offsetof_GetBucketData_offset_not_8); | 527 Offsetof_GetBucketData_offset_not_8); |
| 526 COMPILE_ASSERT(offsetof(GetBucketData, size) == 12, | 528 COMPILE_ASSERT(offsetof(GetBucketData, size) == 12, |
| 527 Offsetof_GetBucketData_size_not_12); | 529 Offsetof_GetBucketData_size_not_12); |
| 528 COMPILE_ASSERT(offsetof(GetBucketData, shared_memory_id) == 16, | 530 COMPILE_ASSERT(offsetof(GetBucketData, shared_memory_id) == 16, |
| 529 Offsetof_GetBucketData_shared_memory_id_not_16); | 531 Offsetof_GetBucketData_shared_memory_id_not_16); |
| 530 COMPILE_ASSERT(offsetof(GetBucketData, shared_memory_offset) == 20, | 532 COMPILE_ASSERT(offsetof(GetBucketData, shared_memory_offset) == 20, |
| 531 Offsetof_GetBucketData_shared_memory_offset_not_20); | 533 Offsetof_GetBucketData_shared_memory_offset_not_20); |
| 532 | 534 |
| 533 } // namespace cmd | 535 } // namespace cmd |
| 534 | 536 |
| 535 #pragma pack(pop) | 537 #pragma pack(pop) |
| 536 | 538 |
| 537 } // namespace gpu | 539 } // namespace gpu |
| 538 | 540 |
| 539 #endif // GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ | 541 #endif // GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ |
| 540 | 542 |
| OLD | NEW |