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

Unified Diff: gpu/command_buffer/common/cmd_buffer_common.h

Issue 465013: TBR=apatrick@chromium.org... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gpu/command_buffer/build_gles2_cmd_buffer.py ('k') | gpu/command_buffer/common/gles2_cmd_id_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gpu/command_buffer/common/cmd_buffer_common.h
===================================================================
--- gpu/command_buffer/common/cmd_buffer_common.h (revision 33603)
+++ gpu/command_buffer/common/cmd_buffer_common.h (working copy)
@@ -63,11 +63,11 @@
// Struct that defines the command header in the command buffer.
struct CommandHeader {
- Uint32 size:8;
- Uint32 command:24;
+ Uint32 size:21;
+ Uint32 command:11;
void Init(uint32 _command, uint32 _size) {
- DCHECK_LT(_size, 256u);
+ DCHECK_LE(_size, 1u << 22);
command = _command;
size = _size;
}
@@ -161,22 +161,6 @@
RoundSizeToMultipleOfEntries(total_size_in_bytes);
}
-struct SharedMemory {
- void Init(uint32 _id, uint32 _offset) {
- id = _id;
- offset = _offset;
- }
-
- uint32 id;
- uint32 offset;
-};
-
-COMPILE_ASSERT(offsetof(SharedMemory, id) == 0,
- Offsetof_SharedMemory_id_not_0);
-COMPILE_ASSERT(offsetof(SharedMemory, offset) == 4,
- Offsetof_SharedMemory_offset_not_4);
-
-
namespace cmd {
// This macro is used to safely and convienently expand the list of commnad
@@ -189,6 +173,16 @@
#define COMMON_COMMAND_BUFFER_CMDS(OP) \
OP(Noop) /* 0 */ \
OP(SetToken) /* 1 */ \
+ OP(Jump) /* 2 */ \
+ OP(JumpRelative) /* 3 */ \
+ OP(Call) /* 4 */ \
+ OP(CallRelative) /* 5 */ \
+ OP(Return) /* 6 */ \
+ OP(SetBucketSize) /* 7 */ \
+ OP(SetBucketData) /* 8 */ \
+ OP(SetBucketDataImmediate) /* 9 */ \
+ OP(GetResultSize) /* 10 */ \
+ OP(GetResultData) /* 11 */ \
// Common commands.
enum CommandId {
@@ -199,13 +193,14 @@
#undef COMMON_COMMAND_BUFFER_CMD_OP
kNumCommands,
- kLastCommonId = 1023, // reserve 1024 spaces for common commands.
+ kLastCommonId = 255, // reserve 256 spaces for common commands.
};
COMPILE_ASSERT(kNumCommands - 1 <= kLastCommonId, Too_many_common_commands);
const char* GetCommandName(CommandId id);
+// A Noop command.
struct Noop {
typedef Noop ValueType;
static const CommandId kCmdId = kNoop;
@@ -231,6 +226,8 @@
COMPILE_ASSERT(sizeof(Noop) == 4, Sizeof_Noop_is_not_4);
COMPILE_ASSERT(offsetof(Noop, header) == 0, Offsetof_Noop_header_not_0);
+// The SetToken command puts a token in the command stream that you can
+// use to check if that token has been passed in the command stream.
struct SetToken {
typedef SetToken ValueType;
static const CommandId kCmdId = kSetToken;
@@ -259,6 +256,412 @@
COMPILE_ASSERT(offsetof(SetToken, token) == 4,
Offsetof_SetToken_token_not_4);
+// The Jump command jumps to another place in the command buffer.
+struct Jump {
+ typedef Jump ValueType;
+ static const CommandId kCmdId = kJump;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _shared_memory_id, uint32 _shared_memory_offset) {
+ SetHeader();
+ shared_memory_id = _shared_memory_id;
+ shared_memory_offset = _shared_memory_offset;
+ }
+ static void* Set(
+ void* cmd, uint32 _shared_memory_id, uint32 _shared_memory_offset) {
+ static_cast<ValueType*>(cmd)->Init(
+ _shared_memory_id, _shared_memory_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ uint32 shared_memory_id;
+ uint32 shared_memory_offset;
+};
+
+COMPILE_ASSERT(sizeof(Jump) == 12, Sizeof_Jump_is_not_12);
+COMPILE_ASSERT(offsetof(Jump, header) == 0,
+ Offsetof_Jump_header_not_0);
+COMPILE_ASSERT(offsetof(Jump, shared_memory_id) == 4,
+ Offsetof_Jump_shared_memory_id_not_4);
+COMPILE_ASSERT(offsetof(Jump, shared_memory_offset) == 8,
+ Offsetof_Jump_shared_memory_offset_not_8);
+
+// The JumpRelative command jumps to another place in the command buffer
+// relative to the end of this command. In other words. JumpRelative with an
+// offset of zero is effectively a noop.
+struct JumpRelative {
+ typedef JumpRelative ValueType;
+ static const CommandId kCmdId = kJumpRelative;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(int32 _offset) {
+ SetHeader();
+ offset = _offset;
+ }
+ static void* Set(void* cmd, int32 _offset) {
+ static_cast<ValueType*>(cmd)->Init(_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ int32 offset;
+};
+
+COMPILE_ASSERT(sizeof(JumpRelative) == 8, Sizeof_JumpRelative_is_not_8);
+COMPILE_ASSERT(offsetof(JumpRelative, header) == 0,
+ Offsetof_JumpRelative_header_not_0);
+COMPILE_ASSERT(offsetof(JumpRelative, offset) == 4,
+ Offsetof_JumpRelative_offset_4);
+
+// The Call command jumps to a subroutine which can be returned from with the
+// Return command.
+struct Call {
+ typedef Call ValueType;
+ static const CommandId kCmdId = kCall;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _shared_memory_id, uint32 _shared_memory_offset) {
+ SetHeader();
+ shared_memory_id = _shared_memory_id;
+ shared_memory_offset = _shared_memory_offset;
+ }
+ static void* Set(
+ void* cmd, uint32 _shared_memory_id, uint32 _shared_memory_offset) {
+ static_cast<ValueType*>(cmd)->Init(
+ _shared_memory_id, _shared_memory_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ uint32 shared_memory_id;
+ uint32 shared_memory_offset;
+};
+
+COMPILE_ASSERT(sizeof(Call) == 12, Sizeof_Call_is_not_12);
+COMPILE_ASSERT(offsetof(Call, header) == 0,
+ Offsetof_Call_header_not_0);
+COMPILE_ASSERT(offsetof(Call, shared_memory_id) == 4,
+ Offsetof_Call_shared_memory_id_not_4);
+COMPILE_ASSERT(offsetof(Call, shared_memory_offset) == 8,
+ Offsetof_Call_shared_memory_offset_not_8);
+
+// The CallRelative command jumps to a subroutine using a relative offset. The
+// offset is relative to the end of this command..
+struct CallRelative {
+ typedef CallRelative ValueType;
+ static const CommandId kCmdId = kCallRelative;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(int32 _offset) {
+ SetHeader();
+ offset = _offset;
+ }
+ static void* Set(void* cmd, int32 _offset) {
+ static_cast<ValueType*>(cmd)->Init(_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ int32 offset;
+};
+
+COMPILE_ASSERT(sizeof(CallRelative) == 8, Sizeof_CallRelative_is_not_8);
+COMPILE_ASSERT(offsetof(CallRelative, header) == 0,
+ Offsetof_CallRelative_header_not_0);
+COMPILE_ASSERT(offsetof(CallRelative, offset) == 4,
+ Offsetof_CallRelative_offset_4);
+
+// Returns from a subroutine called by the Call or CallRelative commands.
+struct Return {
+ typedef Return ValueType;
+ static const CommandId kCmdId = kReturn;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init() {
+ SetHeader();
+ }
+ static void* Set(void* cmd) {
+ static_cast<ValueType*>(cmd)->Init();
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+};
+
+COMPILE_ASSERT(sizeof(Return) == 4, Sizeof_Return_is_not_4);
+COMPILE_ASSERT(offsetof(Return, header) == 0,
+ Offsetof_Return_header_not_0);
+
+// Sets the size of a bucket for collecting data on the service side.
+// This is a utility for gathering data on the service side so it can be used
+// all at once when some service side API is called. It removes the need to add
+// special commands just to support a particular API. For example, any API
+// command that needs a string needs a way to send that string to the API over
+// the command buffers. While you can require that the command buffer or
+// transfer buffer be large enough to hold the largest string you can send,
+// using this command removes that restriction by letting you send smaller
+// pieces over and build up the data on the service side.
+//
+// You can clear a bucket on the service side and thereby free memory by sending
+// a size of 0.
+struct SetBucketSize {
+ typedef SetBucketSize ValueType;
+ static const CommandId kCmdId = kSetBucketSize;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _bucket_id, uint32 _size) {
+ SetHeader();
+ bucket_id = _bucket_id;
+ size = _size;
+ }
+ static void* Set(void* cmd, uint32 _bucket_id, uint32 _size) {
+ static_cast<ValueType*>(cmd)->Init(_bucket_id, _size);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ utin32 bucket_id;
+ uint32 size;
+};
+
+COMPILE_ASSERT(sizeof(SetBucketSize) == 12, Sizeof_SetBucketSize_is_not_8);
+COMPILE_ASSERT(offsetof(SetBucketSize, header) == 0,
+ Offsetof_SetBucketSize_header_not_0);
+COMPILE_ASSERT(offsetof(SetBucketSize, bucket_id) == 4,
+ Offsetof_SetBucketSize_bucket_id_4);
+COMPILE_ASSERT(offsetof(SetBucketSize, size) == 8,
+ Offsetof_SetBucketSize_size_8);
+
+// Sets the contents of a portion of a bucket on the service side from data in
+// shared memory.
+// See SetBucketSize.
+struct SetBucketData {
+ typedef SetBucketData ValueType;
+ static const CommandId kCmdId = kSetBucketData;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _bucket_id,
+ uint32 _offset,
+ uint32 _size,
+ uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ SetHeader();
+ bucket_id = _bucket_id;
+ offset = _offset;
+ size = _size;
+ shared_memory_id = _shared_memory_id;
+ shared_memory_offset = _shared_memory_offset;
+ }
+ static void* Set(void* cmd,
+ uint32 _bucket_id,
+ uint32 _offset,
+ uint32 _size,
+ uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ static_cast<ValueType*>(cmd)->Init(
+ _bucket_id,
+ _offset,
+ _size,
+ _shared_memory_id,
+ _shared_memory_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ uint32 bucket_id;
+ uint32 offset;
+ uint32 size;
+ uint32 shared_memory_id;
+ uint32 shared_memory_offset;
+};
+
+COMPILE_ASSERT(sizeof(SetBucketData) == 24, Sizeof_SetBucketData_is_not_24);
+COMPILE_ASSERT(offsetof(SetBucketData, header) == 0,
+ Offsetof_SetBucketData_header_not_0);
+COMPILE_ASSERT(offsetof(SetBucketData, bucket_id) == 4,
+ Offsetof_SetBucketData_bucket_id_not_4);
+COMPILE_ASSERT(offsetof(SetBucketData, offset) == 8,
+ Offsetof_SetBucketData_offset_not_8);
+COMPILE_ASSERT(offsetof(SetBucketData, size) == 12,
+ Offsetof_SetBucketData_size_not_12);
+COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_id) == 16,
+ Offsetof_SetBucketData_shared_memory_id_not_16);
+COMPILE_ASSERT(offsetof(SetBucketData, shared_memory_offset) == 20,
+ Offsetof_SetBucketData_shared_memory_offset_not_20);
+
+// Sets the contents of a portion of a bucket on the service side from data in
+// the command buffer.
+// See SetBucketSize.
+struct SetBucketDataImmediate {
+ typedef SetBucketDataImmediate ValueType;
+ static const CommandId kCmdId = kSetBucketDataImmediate;
+ static const cmd::ArgFlags kArgFlags = cmd::kAtLeastN;
+
+ void SetHeader(uint32 size) {
+ header.SetCmdBySize<ValueType>(size);
+ }
+
+ void Init(uint32 _bucket_id,
+ uint32 _offset,
+ uint32 _size) {
+ SetHeader(_size);
+ bucket_id = _bucket_id;
+ offset = _offset;
+ size = _size;
+ }
+ static void* Set(void* cmd,
+ uint32 _bucket_id,
+ uint32 _offset,
+ uint32 _size) {
+ static_cast<ValueType*>(cmd)->Init(
+ _bucket_id,
+ _offset,
+ _size);
+ return NextImmediateCmdAddress<ValueType>(cmd, _size);
+ }
+
+ CommandHeader header;
+ uint32 bucket_id;
+ uint32 offset;
+ uint32 size;
+};
+
+COMPILE_ASSERT(sizeof(SetBucketDataImmediate) == 16,
+ Sizeof_SetBucketDataImmediate_is_not_24);
+COMPILE_ASSERT(offsetof(SetBucketDataImmediate, header) == 0,
+ Offsetof_SetBucketDataImmediate_header_not_0);
+COMPILE_ASSERT(offsetof(SetBucketDataImmediate, bucket_id) == 4,
+ Offsetof_SetBucketDataImmediate_bucket_id_not_4);
+COMPILE_ASSERT(offsetof(SetBucketDataImmediate, offset) == 8,
+ Offsetof_SetBucketDataImmediate_offset_not_8);
+COMPILE_ASSERT(offsetof(SetBucketDataImmediate, size) == 12,
+ Offsetof_SetBucketDataImmediate_size_not_12);
+
+// Gets the size of a result the service has available.
+// Sending a variable size result back to the client, for example any API that
+// returns a string, is problematic since the largest thing you can send back is
+// the size of your shared memory. This command along with GetResultData
+// implement a way to get a result a piece at a time to help solve that problem
+// in a generic way.
+struct GetResultSize {
+ typedef GetResultSize ValueType;
+ static const CommandId kCmdId = kGetResultSize;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ SetHeader();
+ shared_memory_id = _shared_memory_id;
+ shared_memory_offset = _shared_memory_offset;
+ }
+ static void* Set(void* cmd,
+ uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ static_cast<ValueType*>(cmd)->Init(
+ _shared_memory_id,
+ _shared_memory_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ uint32 shared_memory_id;
+ uint32 shared_memory_offset;
+};
+
+COMPILE_ASSERT(sizeof(GetResultSize) == 12, Sizeof_GetResultSize_is_not_12);
+COMPILE_ASSERT(offsetof(GetResultSize, header) == 0,
+ Offsetof_GetResultSize_header_not_0);
+COMPILE_ASSERT(offsetof(GetResultSize, shared_memory_id) == 4,
+ Offsetof_GetResultSize_shared_memory_id_not_4);
+COMPILE_ASSERT(offsetof(GetResultSize, shared_memory_offset) == 8,
+ Offsetof_GetResultSize_shared_memory_offset_not_8);
+
+// Gets a piece of a result the service as available.
+// See GetResultSize.
+struct GetResultData {
+ typedef GetResultData ValueType;
+ static const CommandId kCmdId = kGetResultData;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(uint32 _offset,
+ uint32 _size,
+ uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ SetHeader();
+ offset = _offset;
+ size = _size;
+ shared_memory_id = _shared_memory_id;
+ shared_memory_offset = _shared_memory_offset;
+ }
+ static void* Set(void* cmd,
+ uint32 _offset,
+ uint32 _size,
+ uint32 _shared_memory_id,
+ uint32 _shared_memory_offset) {
+ static_cast<ValueType*>(cmd)->Init(
+ _offset,
+ _size,
+ _shared_memory_id,
+ _shared_memory_offset);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ CommandHeader header;
+ uint32 offset;
+ uint32 size;
+ uint32 shared_memory_id;
+ uint32 shared_memory_offset;
+};
+
+COMPILE_ASSERT(sizeof(GetResultData) == 20, Sizeof_GetResultData_is_not_20);
+COMPILE_ASSERT(offsetof(GetResultData, header) == 0,
+ Offsetof_GetResultData_header_not_0);
+COMPILE_ASSERT(offsetof(GetResultData, offset) == 4,
+ Offsetof_GetResultData_offset_not_4);
+COMPILE_ASSERT(offsetof(GetResultData, size) == 8,
+ Offsetof_GetResultData_size_not_8);
+COMPILE_ASSERT(offsetof(GetResultData, shared_memory_id) == 12,
+ Offsetof_GetResultData_shared_memory_id_not_12);
+COMPILE_ASSERT(offsetof(GetResultData, shared_memory_offset) == 16,
+ Offsetof_GetResultData_shared_memory_offset_not_16);
+
} // namespace cmd
#pragma pack(pop)
« no previous file with comments | « gpu/command_buffer/build_gles2_cmd_buffer.py ('k') | gpu/command_buffer/common/gles2_cmd_id_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698