| 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 | #include "Utility/BsModule.h" |
| 7 | #include "RenderAPI/BsVertexBuffer.h" |
| 8 | #include "RenderAPI/BsIndexBuffer.h" |
| 9 | #include "RenderAPI/BsVertexDeclaration.h" |
| 10 | |
| 11 | namespace bs |
| 12 | { |
| 13 | struct GPU_BUFFER_DESC; |
| 14 | struct GPU_PARAMS_DESC; |
| 15 | |
| 16 | /** @addtogroup RenderAPI-Internal |
| 17 | * @{ |
| 18 | */ |
| 19 | |
| 20 | /** |
| 21 | * Handles creation of various hardware buffers. |
| 22 | * |
| 23 | * @note Sim thread only. |
| 24 | */ |
| 25 | class BS_CORE_EXPORT HardwareBufferManager : public Module<HardwareBufferManager> |
| 26 | { |
| 27 | public: |
| 28 | HardwareBufferManager() = default; |
| 29 | virtual ~HardwareBufferManager() = default; |
| 30 | |
| 31 | /** |
| 32 | * Creates a new vertex buffer used for holding number of vertices and other per-vertex data. Buffer can be bound |
| 33 | * to the pipeline and its data can be passed to the active vertex GPU program. |
| 34 | * |
| 35 | * @param[in] desc Description of the buffer to create. |
| 36 | */ |
| 37 | SPtr<VertexBuffer> createVertexBuffer(const VERTEX_BUFFER_DESC& desc); |
| 38 | |
| 39 | /** |
| 40 | * Creates a new index buffer that holds indices referencing vertices in a vertex buffer. Indices are interpreted |
| 41 | * by the pipeline and vertices are drawn in the order specified in the index buffer. |
| 42 | * |
| 43 | * @param[in] desc Description of the buffer to create. |
| 44 | */ |
| 45 | SPtr<IndexBuffer> createIndexBuffer(const INDEX_BUFFER_DESC& desc); |
| 46 | |
| 47 | /** |
| 48 | * Creates an GPU parameter block that you can use for setting parameters for GPU programs. Parameter blocks may be |
| 49 | * used for sharing parameter data between multiple GPU programs, requiring you to update only one buffer for all of |
| 50 | * them, potentially improving performance. |
| 51 | * |
| 52 | * @param[in] size Size of the parameter buffer in bytes. |
| 53 | * @param[in] usage Usage that tells the hardware how will be buffer be used. |
| 54 | */ |
| 55 | SPtr<GpuParamBlockBuffer> createGpuParamBlockBuffer(UINT32 size, GpuBufferUsage usage = GBU_DYNAMIC); |
| 56 | |
| 57 | /** |
| 58 | * Creates a generic buffer that can be passed as a parameter to a GPU program. This type of buffer can hold various |
| 59 | * type of data and can be used for various purposes. See GpuBufferType for explanation of different buffer types. |
| 60 | * |
| 61 | * @param[in] desc Description of the buffer to create. |
| 62 | */ |
| 63 | SPtr<GpuBuffer> createGpuBuffer(const GPU_BUFFER_DESC& desc); |
| 64 | |
| 65 | /** |
| 66 | * Creates a new vertex declaration from a list of vertex elements. |
| 67 | * |
| 68 | * @param[in] desc Description of the object to create. |
| 69 | */ |
| 70 | SPtr<VertexDeclaration> createVertexDeclaration(const SPtr<VertexDataDesc>& desc); |
| 71 | |
| 72 | /** @copydoc GpuParams::create(const SPtr<GpuPipelineParamInfo>&) */ |
| 73 | SPtr<GpuParams> createGpuParams(const SPtr<GpuPipelineParamInfo>& paramInfo); |
| 74 | }; |
| 75 | |
| 76 | namespace ct |
| 77 | { |
| 78 | |
| 79 | /** |
| 80 | * Handles creation of various hardware buffers. |
| 81 | * |
| 82 | * @note Core thread only. |
| 83 | */ |
| 84 | class BS_CORE_EXPORT HardwareBufferManager : public Module<HardwareBufferManager> |
| 85 | { |
| 86 | public: |
| 87 | virtual ~HardwareBufferManager() { } |
| 88 | |
| 89 | /** |
| 90 | * @copydoc bs::HardwareBufferManager::createVertexBuffer |
| 91 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 92 | */ |
| 93 | SPtr<VertexBuffer> createVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 94 | |
| 95 | /** |
| 96 | * @copydoc bs::HardwareBufferManager::createIndexBuffer |
| 97 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 98 | */ |
| 99 | SPtr<IndexBuffer> createIndexBuffer(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 100 | |
| 101 | /** |
| 102 | * @copydoc bs::HardwareBufferManager::createVertexDeclaration |
| 103 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 104 | */ |
| 105 | SPtr<VertexDeclaration> createVertexDeclaration(const SPtr<VertexDataDesc>& desc, |
| 106 | GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 107 | |
| 108 | /** |
| 109 | * Creates a new vertex declaration from a list of vertex elements. |
| 110 | * |
| 111 | * @param[in] elements List of elements to initialize the declaration with. |
| 112 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 113 | */ |
| 114 | SPtr<VertexDeclaration> createVertexDeclaration(const Vector<VertexElement>& elements, |
| 115 | GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 116 | |
| 117 | /** |
| 118 | * @copydoc bs::HardwareBufferManager::createGpuParamBlockBuffer |
| 119 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 120 | */ |
| 121 | SPtr<GpuParamBlockBuffer> createGpuParamBlockBuffer(UINT32 size, |
| 122 | GpuBufferUsage usage = GBU_DYNAMIC, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 123 | |
| 124 | /** |
| 125 | * @copydoc bs::HardwareBufferManager::createGpuBuffer |
| 126 | * @param[in] deviceMask Mask that determines on which GPU devices should the object be created on. |
| 127 | */ |
| 128 | SPtr<GpuBuffer> createGpuBuffer(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 129 | |
| 130 | /** @copydoc GpuBuffer::create(const GPU_BUFFER_DESC&, SPtr<HardwareBuffer>) */ |
| 131 | SPtr<GpuBuffer> createGpuBuffer(const GPU_BUFFER_DESC& desc, SPtr<HardwareBuffer> underlyingBuffer); |
| 132 | |
| 133 | /** @copydoc GpuParams::create(const SPtr<GpuPipelineParamInfo>&, GpuDeviceFlags) */ |
| 134 | SPtr<GpuParams> createGpuParams(const SPtr<GpuPipelineParamInfo>& paramInfo, |
| 135 | GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 136 | protected: |
| 137 | friend class bs::IndexBuffer; |
| 138 | friend class IndexBuffer; |
| 139 | friend class bs::VertexBuffer; |
| 140 | friend class VertexBuffer; |
| 141 | friend class bs::VertexDeclaration; |
| 142 | friend class bs::GpuParamBlockBuffer; |
| 143 | friend class bs::GpuBuffer; |
| 144 | friend class GpuBuffer; |
| 145 | |
| 146 | /** Key for use in the vertex declaration map. */ |
| 147 | struct VertexDeclarationKey |
| 148 | { |
| 149 | VertexDeclarationKey(const Vector<VertexElement>& elements); |
| 150 | |
| 151 | class HashFunction |
| 152 | { |
| 153 | public: |
| 154 | size_t operator()(const VertexDeclarationKey& key) const; |
| 155 | }; |
| 156 | |
| 157 | class EqualFunction |
| 158 | { |
| 159 | public: |
| 160 | bool operator()(const VertexDeclarationKey& lhs, const VertexDeclarationKey& rhs) const; |
| 161 | }; |
| 162 | |
| 163 | Vector<VertexElement> elements; |
| 164 | }; |
| 165 | |
| 166 | /** @copydoc createVertexBuffer */ |
| 167 | virtual SPtr<VertexBuffer> createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, |
| 168 | GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 169 | |
| 170 | /** @copydoc createIndexBuffer */ |
| 171 | virtual SPtr<IndexBuffer> createIndexBufferInternal(const INDEX_BUFFER_DESC& desc, |
| 172 | GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 173 | |
| 174 | /** @copydoc createGpuParamBlockBuffer */ |
| 175 | virtual SPtr<GpuParamBlockBuffer> createGpuParamBlockBufferInternal(UINT32 size, |
| 176 | GpuBufferUsage usage = GBU_DYNAMIC, GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 177 | |
| 178 | /** @copydoc createGpuBuffer(const GPU_BUFFER_DESC&, GpuDeviceFlags) */ |
| 179 | virtual SPtr<GpuBuffer> createGpuBufferInternal(const GPU_BUFFER_DESC& desc, |
| 180 | GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0; |
| 181 | |
| 182 | /** @copydoc createGpuBuffer(const GPU_BUFFER_DESC&, SPtr<HardwareBuffer>) */ |
| 183 | virtual SPtr<GpuBuffer> createGpuBufferInternal(const GPU_BUFFER_DESC& desc, |
| 184 | SPtr<HardwareBuffer> underlyingBuffer) = 0; |
| 185 | |
| 186 | /** @copydoc createVertexDeclaration(const Vector<VertexElement>&, GpuDeviceFlags) */ |
| 187 | virtual SPtr<VertexDeclaration> createVertexDeclarationInternal(const Vector<VertexElement>& elements, |
| 188 | GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 189 | |
| 190 | /** @copydoc createGpuParams */ |
| 191 | virtual SPtr<GpuParams> createGpuParamsInternal(const SPtr<GpuPipelineParamInfo>& paramInfo, |
| 192 | GpuDeviceFlags deviceMask = GDF_DEFAULT); |
| 193 | |
| 194 | typedef UnorderedMap<VertexDeclarationKey, SPtr<VertexDeclaration>, |
| 195 | VertexDeclarationKey::HashFunction, VertexDeclarationKey::EqualFunction> DeclarationMap; |
| 196 | |
| 197 | DeclarationMap mCachedDeclarations; |
| 198 | }; |
| 199 | } |
| 200 | |
| 201 | /** @} */ |
| 202 | } |