ソースを参照

Neater IndexBuffer creation

BearishSun 9 年 前
コミット
a9cc8f15fb

+ 17 - 10
Source/BansheeCore/Include/BsHardwareBufferManager.h

@@ -40,11 +40,9 @@ namespace BansheeEngine
 		 * Creates a new index buffer that holds indices referencing vertices in a vertex buffer. Indices are interpreted 
 		 * by the pipeline and vertices are drawn in the order specified in the index buffer.
 		 *
-		 * @param[in]	itype		Index type, determines size of an index.
-		 * @param[in]	numIndices	Number of indexes can buffer can hold.
-		 * @param[in]	usage		Usage that tells the hardware how will be buffer be used. 
+		 * @param[in]	desc	Description of the buffer to create.
 		 */
-		SPtr<IndexBuffer> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
+		SPtr<IndexBuffer> createIndexBuffer(const INDEX_BUFFER_DESC& desc);
 
 		/**
 		 * Creates an GPU parameter block that you can use for setting parameters for GPU programs. Parameter blocks may be
@@ -81,11 +79,17 @@ namespace BansheeEngine
     public:
 		virtual ~HardwareBufferCoreManager() { }
 
-		/** @copydoc HardwareBufferManager::createVertexBuffer */
+		/** 
+		 * @copydoc HardwareBufferManager::createVertexBuffer 
+		 * @param[in]	deviceMask		Mask that determines on which GPU devices should the buffer be created on.
+		 */
 		SPtr<VertexBufferCore> createVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
-		/** @copydoc HardwareBufferManager::createIndexBuffer */
-		SPtr<IndexBufferCore> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
+		/** 
+		 * @copydoc HardwareBufferManager::createIndexBuffer 
+		 * @param[in]	deviceMask		Mask that determines on which GPU devices should the buffer be created on.
+		 */
+		SPtr<IndexBufferCore> createIndexBuffer(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
 		/** @copydoc HardwareBufferManager::createVertexDeclaration */
 		SPtr<VertexDeclarationCore> createVertexDeclaration(const SPtr<VertexDataDesc>& desc);
@@ -97,7 +101,10 @@ namespace BansheeEngine
 		SPtr<GpuParamBlockBufferCore> createGpuParamBlockBuffer(UINT32 size, 
 			GpuParamBlockUsage usage = GPBU_DYNAMIC);
 
-		/** @copydoc HardwareBufferManager::createGpuBuffer */
+		/** 
+		 * @copydoc HardwareBufferManager::createGpuBuffer
+		 * @param[in]	deviceMask		Mask that determines on which GPU devices should the buffer be created on.
+		 */
 		SPtr<GpuBufferCore> createGpuBuffer(const GPU_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
 		/** @copydoc HardwareBufferManager::createGpuParams */
@@ -118,8 +125,8 @@ namespace BansheeEngine
 			GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0;
 
 		/** @copydoc createIndexBuffer */
-		virtual SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, 
-			GpuBufferUsage usage) = 0;
+		virtual SPtr<IndexBufferCore> createIndexBufferInternal(const INDEX_BUFFER_DESC& desc, 
+			GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0;
 
 		/** @copydoc createGpuParamBlockBuffer */
 		virtual SPtr<GpuParamBlockBufferCore> createGpuParamBlockBufferInternal(UINT32 size, 

+ 12 - 4
Source/BansheeCore/Include/BsIndexBuffer.h

@@ -19,6 +19,14 @@ namespace BansheeEngine
 		IT_32BIT /**< 32-bit indices. */
 	};
 
+	/** Descriptor structure used for initialization of an IndexBuffer. */
+	struct INDEX_BUFFER_DESC
+	{
+		IndexType indexType; /**< Index type, determines the size of a single index. */
+		UINT32 numIndices; /**< Number of indices can buffer can hold. */
+		GpuBufferUsage usage = GBU_STATIC; /**< Usage that tells the hardware how will be buffer be used. */
+	};
+
 	/**	Contains information about an index buffer. */
 	class BS_CORE_EXPORT IndexBufferProperties
 	{
@@ -60,12 +68,12 @@ namespace BansheeEngine
 		SPtr<IndexBufferCore> getCore() const;
 
 		/** @copydoc HardwareBufferManager::createIndexBuffer */
-		static SPtr<IndexBuffer> create(IndexType itype, UINT32 numIndices, GpuBufferUsage usage = GBU_STATIC);
+		static SPtr<IndexBuffer> create(const INDEX_BUFFER_DESC& desc);
 
 	protected:
 		friend class HardwareBufferManager;
 
-		IndexBuffer(IndexType idxType, UINT32 numIndexes, GpuBufferUsage usage);
+		IndexBuffer(const INDEX_BUFFER_DESC& desc);
 
 		/** @copydoc CoreObject::createCore */
 		virtual SPtr<CoreObjectCore> createCore() const;
@@ -84,14 +92,14 @@ namespace BansheeEngine
 	class BS_CORE_EXPORT IndexBufferCore : public CoreObjectCore, public HardwareBuffer
 	{
 	public:
-		IndexBufferCore(IndexType idxType, UINT32 numIndices, GpuBufferUsage usage);
+		IndexBufferCore(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 		virtual ~IndexBufferCore() { }
 
 		/**	Returns information about the index buffer. */
 		const IndexBufferProperties& getProperties() const { return mProperties; }
 
 		/** @copydoc HardwareBufferManager::createIndexBuffer */
-		static SPtr<IndexBufferCore> create(IndexType itype, UINT32 numIndices, GpuBufferUsage usage = GBU_STATIC);
+		static SPtr<IndexBufferCore> create(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
 	protected:
 		IndexBufferProperties mProperties;

+ 5 - 4
Source/BansheeCore/Source/BsHardwareBufferManager.cpp

@@ -37,9 +37,9 @@ namespace BansheeEngine
 		return vbuf;
 	}
 
-	SPtr<IndexBuffer> HardwareBufferManager::createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage)
+	SPtr<IndexBuffer> HardwareBufferManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc)
 	{
-		SPtr<IndexBuffer> ibuf = bs_core_ptr<IndexBuffer>(new (bs_alloc<IndexBuffer>()) IndexBuffer(itype, numIndices, usage));
+		SPtr<IndexBuffer> ibuf = bs_core_ptr<IndexBuffer>(new (bs_alloc<IndexBuffer>()) IndexBuffer(desc));
 		ibuf->_setThisPtr(ibuf);
 		ibuf->initialize();
 		return ibuf;
@@ -73,9 +73,10 @@ namespace BansheeEngine
 		return paramsPtr;
     }
 
-	SPtr<IndexBufferCore> HardwareBufferCoreManager::createIndexBuffer(IndexType itype, UINT32 numIndexes, GpuBufferUsage usage)
+	SPtr<IndexBufferCore> HardwareBufferCoreManager::createIndexBuffer(const INDEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
 	{
-		SPtr<IndexBufferCore> ibuf = createIndexBufferInternal(itype, numIndexes, usage);
+		SPtr<IndexBufferCore> ibuf = createIndexBufferInternal(desc, deviceMask);
 		ibuf->initialize();
 		return ibuf;
 

+ 14 - 10
Source/BansheeCore/Source/BsIndexBuffer.cpp

@@ -20,19 +20,19 @@ namespace BansheeEngine
 		}
 	}
 
-	IndexBufferCore::IndexBufferCore(IndexType idxType, UINT32 numIndices, GpuBufferUsage usage)
-		:HardwareBuffer(usage, false), mProperties(idxType, numIndices)
+	IndexBufferCore::IndexBufferCore(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
+		:HardwareBuffer(desc.usage, false), mProperties(desc.indexType, desc.numIndices)
 	{ 
 		mSizeInBytes = mProperties.mIndexSize * mProperties.mNumIndices;
 	}
 
-	SPtr<IndexBufferCore> IndexBufferCore::create(IndexType itype, UINT32 numIndexes, GpuBufferUsage usage)
+	SPtr<IndexBufferCore> IndexBufferCore::create(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
 	{
-		return HardwareBufferCoreManager::instance().createIndexBuffer(itype, numIndexes, usage);
+		return HardwareBufferCoreManager::instance().createIndexBuffer(desc, deviceMask);
 	}
 
-    IndexBuffer::IndexBuffer(IndexType idxType, UINT32 numIndexes, GpuBufferUsage usage) 
-		:mProperties(idxType, numIndexes), mUsage(usage)
+    IndexBuffer::IndexBuffer(const INDEX_BUFFER_DESC& desc)
+		:mProperties(desc.indexType, desc.numIndices), mUsage(desc.usage)
     {
 
 	}
@@ -44,12 +44,16 @@ namespace BansheeEngine
 
 	SPtr<CoreObjectCore> IndexBuffer::createCore() const
 	{
-		return HardwareBufferCoreManager::instance().createIndexBufferInternal(mProperties.mIndexType, 
-			mProperties.mNumIndices, mUsage);
+		INDEX_BUFFER_DESC desc;
+		desc.indexType = mProperties.mIndexType;
+		desc.numIndices = mProperties.mNumIndices;
+		desc.usage = mUsage;
+
+		return HardwareBufferCoreManager::instance().createIndexBufferInternal(desc);
 	}
 
-	SPtr<IndexBuffer> IndexBuffer::create(IndexType itype, UINT32 numIndices, GpuBufferUsage usage)
+	SPtr<IndexBuffer> IndexBuffer::create(const INDEX_BUFFER_DESC& desc)
 	{
-		return HardwareBufferManager::instance().createIndexBuffer(itype, numIndices, usage);
+		return HardwareBufferManager::instance().createIndexBuffer(desc);
 	}
 }

+ 11 - 7
Source/BansheeCore/Source/BsMesh.cpp

@@ -39,8 +39,12 @@ namespace BansheeEngine
 
 		bool isDynamic = (mUsage & MU_DYNAMIC) != 0;
 
-		mIndexBuffer = HardwareBufferCoreManager::instance().createIndexBuffer(mIndexType,
-			mProperties.mNumIndices, isDynamic ? GBU_DYNAMIC : GBU_STATIC);
+		INDEX_BUFFER_DESC ibDesc;
+		ibDesc.indexType = mIndexType;
+		ibDesc.numIndices = mProperties.mNumIndices;
+		ibDesc.usage = isDynamic ? GBU_DYNAMIC : GBU_STATIC;
+
+		mIndexBuffer = IndexBufferCore::create(ibDesc);
 
 		mVertexData = SPtr<VertexData>(bs_new<VertexData>());
 
@@ -52,12 +56,12 @@ namespace BansheeEngine
 			if (!mVertexDesc->hasStream(i))
 				continue;
 
-			VERTEX_BUFFER_DESC desc;
-			desc.vertexSize = mVertexData->vertexDeclaration->getProperties().getVertexSize(i);
-			desc.numVerts = mVertexData->vertexCount;
-			desc.usage = isDynamic ? GBU_DYNAMIC : GBU_STATIC;
+			VERTEX_BUFFER_DESC vbDesc;
+			vbDesc.vertexSize = mVertexData->vertexDeclaration->getProperties().getVertexSize(i);
+			vbDesc.numVerts = mVertexData->vertexCount;
+			vbDesc.usage = isDynamic ? GBU_DYNAMIC : GBU_STATIC;
 
-			SPtr<VertexBufferCore> vertexBuffer = VertexBufferCore::create(desc);
+			SPtr<VertexBufferCore> vertexBuffer = VertexBufferCore::create(vbDesc);
 			mVertexData->setBuffer(i, vertexBuffer);
 		}
 

+ 7 - 1
Source/BansheeCore/Source/BsMeshHeap.cpp

@@ -380,7 +380,13 @@ namespace BansheeEngine
 	{
 		mNumIndices = numIndices;
 
-		mIndexBuffer = HardwareBufferCoreManager::instance().createIndexBuffer(mIndexType, mNumIndices, GBU_DYNAMIC);
+		INDEX_BUFFER_DESC ibDesc;
+		ibDesc.indexType = mIndexType;
+		ibDesc.numIndices = mNumIndices;
+		ibDesc.usage = GBU_DYNAMIC;
+
+		mIndexBuffer = IndexBufferCore::create(ibDesc);
+
 		const IndexBufferProperties& ibProps = mIndexBuffer->getProperties();
 
 		// Copy all data to the new buffer

+ 2 - 2
Source/BansheeD3D11RenderAPI/Include/BsD3D11HardwareBufferManager.h

@@ -23,8 +23,8 @@ namespace BansheeEngine
 			GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createIndexBufferInternal */
-		SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, 
-			GpuBufferUsage usage) override;
+		SPtr<IndexBufferCore> createIndexBufferInternal(const INDEX_BUFFER_DESC& desc, 
+			GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createGpuParamBlockBufferInternal  */
 		SPtr<GpuParamBlockBufferCore> createGpuParamBlockBufferInternal(UINT32 size, 

+ 1 - 1
Source/BansheeD3D11RenderAPI/Include/BsD3D11IndexBuffer.h

@@ -16,7 +16,7 @@ namespace BansheeEngine
 	class BS_D3D11_EXPORT D3D11IndexBufferCore : public IndexBufferCore
 	{
 	public:
-		D3D11IndexBufferCore(D3D11Device& device, IndexType idxType, UINT32 numIndices, GpuBufferUsage usage);
+		D3D11IndexBufferCore(D3D11Device& device, const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 
 		~D3D11IndexBufferCore();
 

+ 3 - 3
Source/BansheeD3D11RenderAPI/Source/BsD3D11HardwareBufferManager.cpp

@@ -22,10 +22,10 @@ namespace BansheeEngine
 		return ret;
 	}
 
-	SPtr<IndexBufferCore> D3D11HardwareBufferCoreManager::createIndexBufferInternal(IndexType itype,
-		UINT32 numIndices, GpuBufferUsage usage)
+	SPtr<IndexBufferCore> D3D11HardwareBufferCoreManager::createIndexBufferInternal(const INDEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
 	{
-		SPtr<D3D11IndexBufferCore> ret = bs_shared_ptr_new<D3D11IndexBufferCore>(mDevice, itype, numIndices, usage);
+		SPtr<D3D11IndexBufferCore> ret = bs_shared_ptr_new<D3D11IndexBufferCore>(mDevice, desc, deviceMask);
 		ret->_setThisPtr(ret);
 
 		return ret;

+ 4 - 3
Source/BansheeD3D11RenderAPI/Source/BsD3D11IndexBuffer.cpp

@@ -6,10 +6,11 @@
 
 namespace BansheeEngine
 {
-	D3D11IndexBufferCore::D3D11IndexBufferCore(D3D11Device& device, IndexType idxType, UINT32 numIndices, GpuBufferUsage usage)
-		:IndexBufferCore(idxType, numIndices, usage), mDevice(device), mBuffer(nullptr)
+	D3D11IndexBufferCore::D3D11IndexBufferCore(D3D11Device& device, const INDEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
+		:IndexBufferCore(desc, deviceMask), mDevice(device), mBuffer(nullptr)
 	{
-
+		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on DirectX.");
 	}
 
 	D3D11IndexBufferCore::~D3D11IndexBufferCore()

+ 2 - 1
Source/BansheeGLRenderAPI/Include/BsGLHardwareBufferManager.h

@@ -27,7 +27,8 @@ namespace BansheeEngine
         	GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createIndexBufferInternal */
-		SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, GpuBufferUsage usage) override;
+		SPtr<IndexBufferCore> createIndexBufferInternal(const INDEX_BUFFER_DESC& desc, 
+			GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createGpuParamBlockBufferInternal */
 		SPtr<GpuParamBlockBufferCore> createGpuParamBlockBufferInternal(UINT32 size, 

+ 1 - 1
Source/BansheeGLRenderAPI/Include/BsGLIndexBuffer.h

@@ -16,7 +16,7 @@ namespace BansheeEngine
     class BS_RSGL_EXPORT GLIndexBufferCore : public IndexBufferCore
     {
     public:
-		GLIndexBufferCore(IndexType idxType, UINT32 numIndices, GpuBufferUsage usage);
+		GLIndexBufferCore(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		~GLIndexBufferCore();
 
 		/** @copydoc IndexBufferCore::readData */

+ 3 - 2
Source/BansheeGLRenderAPI/Source/BsGLHardwareBufferManager.cpp

@@ -20,9 +20,10 @@ namespace BansheeEngine
 		return ret;
 	}
 
-	SPtr<IndexBufferCore> GLHardwareBufferCoreManager::createIndexBufferInternal(IndexType itype, UINT32 numIndices, GpuBufferUsage usage)
+	SPtr<IndexBufferCore> GLHardwareBufferCoreManager::createIndexBufferInternal(const INDEX_BUFFER_DESC& desc,
+		GpuDeviceFlags deviceMask)
 	{
-		SPtr<GLIndexBufferCore> ret = bs_shared_ptr_new<GLIndexBufferCore>(itype, numIndices, usage);
+		SPtr<GLIndexBufferCore> ret = bs_shared_ptr_new<GLIndexBufferCore>(desc, deviceMask);
 		ret->_setThisPtr(ret);
 
 		return ret;

+ 5 - 3
Source/BansheeGLRenderAPI/Source/BsGLIndexBuffer.cpp

@@ -7,9 +7,11 @@
 
 namespace BansheeEngine 
 {
-	GLIndexBufferCore::GLIndexBufferCore(IndexType idxType, UINT32 numIndices, GpuBufferUsage usage)
-		:IndexBufferCore(idxType, numIndices, usage)
-	{  }
+	GLIndexBufferCore::GLIndexBufferCore(const INDEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
+		:IndexBufferCore(desc, deviceMask)
+	{
+		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on OpenGL.");
+	}
 
 	GLIndexBufferCore::~GLIndexBufferCore()
 	{