// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif // This file contains the common parts of command buffer formats. #ifndef GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ #define GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_ #include <stddef.h> #include <stdint.h> #include "base/check_op.h" #include "gpu/gpu_export.h" namespace gpu { namespace cmd { enum ArgFlags { … }; } // namespace cmd // Pack & unpack Command cmd_flags #define CMD_FLAG_SET_TRACE_LEVEL(level) … #define CMD_FLAG_GET_TRACE_LEVEL(cmd_flags) … // Computes the number of command buffer entries needed for a certain size. In // other words it rounds up to a multiple of entries. inline uint32_t ComputeNumEntries(size_t size_in_bytes) { … } // Rounds up to a multiple of entries in bytes. inline size_t RoundSizeToMultipleOfEntries(size_t size_in_bytes) { … } // Struct that defines the command header in the command buffer. struct CommandHeader { … }; static_assert …; // Union that defines possible command buffer entries. CommandBufferEntry; #define GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT … const size_t kCommandBufferEntrySize = …; static_assert …; // Command buffer is GPU_COMMAND_BUFFER_ENTRY_ALIGNMENT byte aligned. #pragma pack(push, 4) static_assert …; // Gets the address of memory just after a structure in a typesafe way. This is // used for IMMEDIATE commands to get the address of the place to put the data. // Immediate command put their data direclty in the command buffer. // Parameters: // cmd: Address of command. template <typename T> void* ImmediateDataAddress(T* cmd) { … } // Gets the address of the place to put the next command in a typesafe way. // This can only be used for fixed sized commands. template <typename T> // Parameters: // cmd: Address of command. void* NextCmdAddress(void* cmd) { … } // Gets the address of the place to put the next command in a typesafe way. // This can only be used for variable sized command like IMMEDIATE commands. // Parameters: // cmd: Address of command. // size_of_data_in_bytes: Size of the data for the command. template <typename T> void* NextImmediateCmdAddress(void* cmd, uint32_t size_of_data_in_bytes) { … } // Gets the address of the place to put the next command in a typesafe way. // This can only be used for variable sized command like IMMEDIATE commands. // Parameters: // cmd: Address of command. // size_of_cmd_in_bytes: Size of the cmd and data. template <typename T> void* NextImmediateCmdAddressTotalSize(void* cmd, uint32_t total_size_in_bytes) { … } namespace cmd { // This macro is used to safely and convienently expand the list of commnad // buffer commands in to various lists and never have them get out of sync. To // add a new command, add it this list, create the corresponding structure below // and then add a function in gapi_decoder.cc called Handle_COMMAND_NAME where // COMMAND_NAME is the name of your command structure. // // NOTE: THE ORDER OF THESE MUST NOT CHANGE (their id is derived by order) #define COMMON_COMMAND_BUFFER_CMDS(OP) … // Common commands. enum CommandId { … }; static_assert …; const char* GetCommandName(CommandId id); // A Noop command. struct Noop { … }; static_assert …; static_assert …; // 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 { … }; static_assert …; static_assert …; static_assert …; // 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 { … }; static_assert …; static_assert …; static_assert …; static_assert …; // Sets the contents of a portion of a bucket on the service side from data in // shared memory. // See SetBucketSize. struct SetBucketData { … }; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; // Sets the contents of a portion of a bucket on the service side from data in // the command buffer. // See SetBucketSize. struct SetBucketDataImmediate { … }; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; // Gets the start of a bucket the service has available. Sending a variable size // result back to the client and the portion of that result that fits in the // supplied shared memory. If the size of the result is larger than the supplied // shared memory the rest of the bucket's contents can be retrieved with // GetBucketData. // // This is used for example for any API that returns a string. The problem is // the largest thing you can send back in 1 command is the size of your shared // memory. This command along with GetBucketData implements a way to get a // result a piece at a time to help solve that problem in a generic way. struct GetBucketStart { … }; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; // Gets a piece of a result the service as available. // See GetBucketSize. struct GetBucketData { … }; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; static_assert …; struct InsertFenceSync { … }; static_assert …; static_assert …; static_assert …; static_assert …; } // namespace cmd #pragma pack(pop) } // namespace gpu #endif // GPU_COMMAND_BUFFER_COMMON_CMD_BUFFER_COMMON_H_