| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
| 3 | #pragma once |
| 4 | |
| 5 | #include "BsCorePrerequisites.h" |
| 6 | |
| 7 | namespace bs { namespace ct |
| 8 | { |
| 9 | /** @addtogroup RenderAPI |
| 10 | * @{ |
| 11 | */ |
| 12 | |
| 13 | /** Mask that determines synchronization between command buffers executing on different hardware queues. */ |
| 14 | class BS_CORE_EXPORT CommandSyncMask |
| 15 | { |
| 16 | public: |
| 17 | /** |
| 18 | * Registers a dependency on a command buffer. Use getMask() to get the new mask value after registering all |
| 19 | * dependencies. |
| 20 | */ |
| 21 | void addDependency(const SPtr<CommandBuffer>& buffer); |
| 22 | |
| 23 | /** Returns a combined mask that contains all the required dependencies. */ |
| 24 | UINT32 getMask() const { return mMask; } |
| 25 | |
| 26 | /** Uses the queue type and index to generate a mask with a bit set for that queue's global index. */ |
| 27 | static UINT32 getGlobalQueueMask(GpuQueueType type, UINT32 queueIdx); |
| 28 | |
| 29 | /** Uses the queue type and index to generate a global queue index. */ |
| 30 | static UINT32 getGlobalQueueIdx(GpuQueueType type, UINT32 queueIdx); |
| 31 | |
| 32 | /** Uses the global queue index to retrieve local queue index and queue type. */ |
| 33 | static UINT32 getQueueIdxAndType(UINT32 globalQueueIdx, GpuQueueType& type); |
| 34 | |
| 35 | private: |
| 36 | UINT32 mMask = 0; |
| 37 | }; |
| 38 | |
| 39 | /** |
| 40 | * Contains a list of render API commands that can be queued for execution on the GPU. User is allowed to populate the |
| 41 | * command buffer from any thread, ensuring render API command generation can be multi-threaded. Command buffers |
| 42 | * must always be created on the core thread. Same command buffer cannot be used on multiple threads simulateously |
| 43 | * without external synchronization. |
| 44 | */ |
| 45 | class BS_CORE_EXPORT CommandBuffer |
| 46 | { |
| 47 | public: |
| 48 | virtual ~CommandBuffer() = default; |
| 49 | |
| 50 | /** |
| 51 | * Creates a new CommandBuffer. |
| 52 | * |
| 53 | * @param[in] type Determines what type of commands can be added to the command buffer. |
| 54 | * @param[in] deviceIdx Index of the GPU the command buffer will be used to queue commands on. 0 is always |
| 55 | * the primary available GPU. |
| 56 | * @param[in] queueIdx Index of the GPU queue the command buffer will be used on. Command buffers with |
| 57 | * the same index will execute sequentially, but command buffers with different queue |
| 58 | * indices may execute in parallel, for a potential performance improvement. |
| 59 | * |
| 60 | * Caller must ensure to synchronize operations executing on different queues via |
| 61 | * sync masks. Command buffer dependant on another command buffer should provide a sync |
| 62 | * mask when being submitted (see RenderAPI::executeCommands). |
| 63 | * |
| 64 | * Queue indices are unique per buffer type (e.g. upload index 0 and graphics index 0 may |
| 65 | * map to different queues internally). Must be in range [0, 7]. |
| 66 | * @param[in] secondary If true the command buffer will not be allowed to execute on its own, but it can |
| 67 | * be appended to a primary command buffer. |
| 68 | * @return New CommandBuffer instance. |
| 69 | */ |
| 70 | static SPtr<CommandBuffer> create(GpuQueueType type, UINT32 deviceIdx = 0, UINT32 queueIdx = 0, |
| 71 | bool secondary = false); |
| 72 | |
| 73 | /** Returns the type of queue the command buffer will execute on. */ |
| 74 | GpuQueueType getType() const { return mType; } |
| 75 | |
| 76 | /** Returns the index of the queue the command buffer will execute on. */ |
| 77 | UINT32 getQueueIdx() const { return mQueueIdx; } |
| 78 | |
| 79 | /** Returns the device index this buffer will execute on. */ |
| 80 | UINT32 getDeviceIdx() const { return mDeviceIdx; } |
| 81 | |
| 82 | protected: |
| 83 | CommandBuffer(GpuQueueType type, UINT32 deviceIdx, UINT32 queueIdx, bool secondary); |
| 84 | |
| 85 | GpuQueueType mType; |
| 86 | UINT32 mDeviceIdx; |
| 87 | UINT32 mQueueIdx; |
| 88 | bool mIsSecondary; |
| 89 | }; |
| 90 | |
| 91 | /** @} */ |
| 92 | }} |