Bladeren bron

Neater VertexBuffer creation

BearishSun 9 jaren geleden
bovenliggende
commit
ba7860bb93

+ 2 - 8
Source/BansheeCore/Include/BsGpuBuffer.h

@@ -12,13 +12,7 @@ namespace BansheeEngine
 	 *  @{
 	 */
 
-	/** 
-	 * Descriptor structure used for initialization of GpuBuffer. 
-	 * 
-	 * @note	
-	 * Be aware that due to some render API restrictions some of these settings cannot be used together, and if so you 
-	 * will receive an assert in debug mode.
-	 */
+	/** Descriptor structure used for initialization of a GpuBuffer. */
 	struct GPU_BUFFER_DESC
 	{
 		/** Number of elements in the buffer. */
@@ -37,7 +31,7 @@ namespace BansheeEngine
 		GpuBufferFormat format;
 
 		/** Usage that tells the hardware how will be buffer be used. */
-		GpuBufferUsage usage;
+		GpuBufferUsage usage = GBU_STATIC;
 
 		/** When true allows the GPU to write to the resource. Must be enabled if buffer type is GBT_APPENDCONSUME. */
 		bool randomGpuWrite = false;

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

@@ -32,13 +32,9 @@ namespace BansheeEngine
 		 * Creates a new vertex buffer used for holding number of vertices and other per-vertex data. Buffer can be bound 
 		 * to the pipeline and its data can be passed to the active vertex GPU program.
 		 *
-		 * @param[in]	vertexSize	Size of a single vertex in the buffer, in bytes.
-		 * @param[in]	numVerts	Number of vertices the buffer can hold.
-		 * @param[in]	usage		Usage that tells the hardware how will be buffer be used. 
-		 * @param[in]	streamOut	If true the buffer will be usable for streaming out data from the GPU.
+		 * @param[in]	desc	Description of the buffer to create.
 		 */
-		SPtr<VertexBuffer> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
-			bool streamOut = false);
+		SPtr<VertexBuffer> createVertexBuffer(const VERTEX_BUFFER_DESC& desc);
 
 		/**
 		 * Creates a new index buffer that holds indices referencing vertices in a vertex buffer. Indices are interpreted 
@@ -86,8 +82,7 @@ namespace BansheeEngine
 		virtual ~HardwareBufferCoreManager() { }
 
 		/** @copydoc HardwareBufferManager::createVertexBuffer */
-		SPtr<VertexBufferCore> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
-			bool streamOut = false);
+		SPtr<VertexBufferCore> createVertexBuffer(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
 		/** @copydoc HardwareBufferManager::createIndexBuffer */
 		SPtr<IndexBufferCore> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
@@ -119,8 +114,8 @@ namespace BansheeEngine
 		friend class GpuBufferCore;
 
 		/** @copydoc createVertexBuffer */
-		virtual SPtr<VertexBufferCore> createVertexBufferInternal(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
-			bool streamOut = false) = 0;
+		virtual SPtr<VertexBufferCore> createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, 
+			GpuDeviceFlags deviceMask = GDF_DEFAULT) = 0;
 
 		/** @copydoc createIndexBuffer */
 		virtual SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, 

+ 14 - 7
Source/BansheeCore/Include/BsVertexBuffer.h

@@ -12,6 +12,15 @@ namespace BansheeEngine
 	 *  @{
 	 */
 
+	/** Descriptor structure used for initialization of a VertexBuffer. */
+	struct VERTEX_BUFFER_DESC
+	{
+		UINT32 vertexSize; /**< Size of a single vertex in the buffer, in bytes. */
+		UINT32 numVerts; /**< Number of vertices the buffer can hold. */
+		GpuBufferUsage usage = GBU_STATIC; /**< Usage that tells the hardware how will be buffer be used. */
+		bool streamOut = false; /**< If true the buffer will be usable for streaming out data from the GPU. */
+	};
+
 	/** Contains information about a vertex buffer buffer. */
 	class BS_CORE_EXPORT VertexBufferProperties
 	{
@@ -46,14 +55,13 @@ namespace BansheeEngine
 		SPtr<VertexBufferCore> getCore() const;
 
 		/** @copydoc HardwareBufferManager::createVertexBuffer */
-		static SPtr<VertexBuffer> create(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage = GBU_STATIC, 
-			bool streamOut = false);
+		static SPtr<VertexBuffer> create(const VERTEX_BUFFER_DESC& desc);
 
 		static const int MAX_SEMANTIC_IDX = 8;
 	protected:
 		friend class HardwareBufferManager;
 
-		VertexBuffer(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut = false);
+		VertexBuffer(const VERTEX_BUFFER_DESC& desc);
 
 		/** @copydoc CoreObject::createCore */
 		virtual SPtr<CoreObjectCore> createCore() const;
@@ -74,15 +82,14 @@ namespace BansheeEngine
 	class BS_CORE_EXPORT VertexBufferCore : public CoreObjectCore, public HardwareBuffer
 	{
 	public:
-		VertexBufferCore(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut);
+		VertexBufferCore(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 		virtual ~VertexBufferCore() { }
 
 		/**	Returns information about the vertex buffer. */
 		const VertexBufferProperties& getProperties() const { return mProperties; }
 
-		/** @copydoc HardwareBufferManager::createVertexBuffer */
-		static SPtr<VertexBufferCore> create(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage = GBU_STATIC,
-			bool streamOut = false);
+		/** @copydoc HardwareBufferCoreManager::createVertexBuffer */
+		static SPtr<VertexBufferCore> create(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask = GDF_DEFAULT);
 
 	protected:
 		VertexBufferProperties mProperties;

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

@@ -29,11 +29,9 @@ namespace BansheeEngine
 		return declPtr;
     }
 
-	SPtr<VertexBuffer> HardwareBufferManager::createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBuffer> HardwareBufferManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc)
 	{
-		assert (numVerts > 0);
-
-		SPtr<VertexBuffer> vbuf = bs_core_ptr<VertexBuffer>(new (bs_alloc<VertexBuffer>()) VertexBuffer(vertexSize, numVerts, usage, streamOut));
+		SPtr<VertexBuffer> vbuf = bs_core_ptr<VertexBuffer>(new (bs_alloc<VertexBuffer>()) VertexBuffer(desc));
 		vbuf->_setThisPtr(vbuf);
 		vbuf->initialize();
 		return vbuf;
@@ -41,8 +39,6 @@ namespace BansheeEngine
 
 	SPtr<IndexBuffer> HardwareBufferManager::createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage)
 	{
-		assert (numIndices > 0);
-
 		SPtr<IndexBuffer> ibuf = bs_core_ptr<IndexBuffer>(new (bs_alloc<IndexBuffer>()) IndexBuffer(itype, numIndices, usage));
 		ibuf->_setThisPtr(ibuf);
 		ibuf->initialize();
@@ -79,19 +75,16 @@ namespace BansheeEngine
 
 	SPtr<IndexBufferCore> HardwareBufferCoreManager::createIndexBuffer(IndexType itype, UINT32 numIndexes, GpuBufferUsage usage)
 	{
-		assert(numIndexes > 0);
-
 		SPtr<IndexBufferCore> ibuf = createIndexBufferInternal(itype, numIndexes, usage);
 		ibuf->initialize();
 		return ibuf;
 
 	}
 
-	SPtr<VertexBufferCore> HardwareBufferCoreManager::createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBufferCore> HardwareBufferCoreManager::createVertexBuffer(const VERTEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
 	{
-		assert(numVerts > 0);
-
-		SPtr<VertexBufferCore> vbuf = createVertexBufferInternal(vertexSize, numVerts, usage, streamOut);
+		SPtr<VertexBufferCore> vbuf = createVertexBufferInternal(desc, deviceMask);
 		vbuf->initialize();
 		return vbuf;
 	}

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

@@ -52,11 +52,12 @@ namespace BansheeEngine
 			if (!mVertexDesc->hasStream(i))
 				continue;
 
-			SPtr<VertexBufferCore> vertexBuffer = HardwareBufferCoreManager::instance().createVertexBuffer(
-				mVertexData->vertexDeclaration->getProperties().getVertexSize(i),
-				mVertexData->vertexCount,
-				isDynamic ? GBU_DYNAMIC : GBU_STATIC);
+			VERTEX_BUFFER_DESC desc;
+			desc.vertexSize = mVertexData->vertexDeclaration->getProperties().getVertexSize(i);
+			desc.numVerts = mVertexData->vertexCount;
+			desc.usage = isDynamic ? GBU_DYNAMIC : GBU_STATIC;
 
+			SPtr<VertexBufferCore> vertexBuffer = VertexBufferCore::create(desc);
 			mVertexData->setBuffer(i, vertexBuffer);
 		}
 

+ 6 - 2
Source/BansheeCore/Source/BsMeshHeap.cpp

@@ -304,9 +304,13 @@ namespace BansheeEngine
 				continue;
 
 			UINT32 vertSize = mVertexData->vertexDeclaration->getProperties().getVertexSize(i);
-			SPtr<VertexBufferCore> vertexBuffer = HardwareBufferCoreManager::instance().createVertexBuffer(
-				vertSize, mVertexData->vertexCount, GBU_DYNAMIC);
 
+			VERTEX_BUFFER_DESC desc;
+			desc.vertexSize = vertSize;
+			desc.numVerts = mVertexData->vertexCount;
+			desc.usage = GBU_DYNAMIC;
+
+			SPtr<VertexBufferCore> vertexBuffer = HardwareBufferCoreManager::instance().createVertexBuffer(desc);
 			mVertexData->setBuffer(i, vertexBuffer);
 
 			// Copy all data to the new buffer

+ 15 - 10
Source/BansheeCore/Source/BsVertexBuffer.cpp

@@ -11,27 +11,32 @@ namespace BansheeEngine
 
 	}
 
-	VertexBufferCore::VertexBufferCore(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut)
-		:HardwareBuffer(usage, false), mProperties(numVertices, vertexSize)
+	VertexBufferCore::VertexBufferCore(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
+		:HardwareBuffer(desc.usage, false), mProperties(desc.numVerts, desc.vertexSize)
 	{
 		mSizeInBytes = mProperties.mVertexSize * mProperties.mNumVertices;
 	}
 
-	SPtr<VertexBufferCore> VertexBufferCore::create(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBufferCore> VertexBufferCore::create(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
 	{
-		return HardwareBufferCoreManager::instance().createVertexBuffer(vertexSize, numVerts, usage, streamOut);
+		return HardwareBufferCoreManager::instance().createVertexBuffer(desc, deviceMask);
 	}
 
-	VertexBuffer::VertexBuffer(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut)
-		: mProperties(numVertices, vertexSize), mUsage(usage), mStreamOut(streamOut)
+	VertexBuffer::VertexBuffer(const VERTEX_BUFFER_DESC& desc)
+		: mProperties(desc.numVerts, desc.vertexSize), mUsage(desc.usage), mStreamOut(desc.streamOut)
     {
 
     }
 
 	SPtr<CoreObjectCore> VertexBuffer::createCore() const
 	{
-		return HardwareBufferCoreManager::instance().createVertexBufferInternal(mProperties.mVertexSize, 
-			mProperties.mNumVertices, mUsage, mStreamOut);
+		VERTEX_BUFFER_DESC desc;
+		desc.vertexSize = mProperties.mVertexSize;
+		desc.numVerts = mProperties.mNumVertices;
+		desc.usage = mUsage;
+		desc.streamOut = mStreamOut;
+
+		return HardwareBufferCoreManager::instance().createVertexBufferInternal(desc);
 	}
 
 	SPtr<VertexBufferCore> VertexBuffer::getCore() const
@@ -39,8 +44,8 @@ namespace BansheeEngine
 		return std::static_pointer_cast<VertexBufferCore>(mCoreSpecific);
 	}
 
-	SPtr<VertexBuffer> VertexBuffer::create(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBuffer> VertexBuffer::create(const VERTEX_BUFFER_DESC& desc)
 	{
-		return HardwareBufferManager::instance().createVertexBuffer(vertexSize, numVerts, usage, streamOut);
+		return HardwareBufferManager::instance().createVertexBuffer(desc);
 	}
 }

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

@@ -19,8 +19,8 @@ namespace BansheeEngine
 
 	protected:     
 		/** @copydoc HardwareBufferCoreManager::createVertexBufferInternal */
-		SPtr<VertexBufferCore> createVertexBufferInternal(UINT32 vertexSize, UINT32 numVerts, 
-			GpuBufferUsage usage, bool streamOut = false) override;
+		SPtr<VertexBufferCore> createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, 
+			GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createIndexBufferInternal */
 		SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, 

+ 5 - 4
Source/BansheeD3D11RenderAPI/Include/BsD3D11VertexBuffer.h

@@ -16,8 +16,7 @@ namespace BansheeEngine
 	class BS_D3D11_EXPORT D3D11VertexBufferCore : public VertexBufferCore
 	{
 	public:
-		D3D11VertexBufferCore(D3D11Device& device, UINT32 vertexSize, UINT32 numVertices, 
-			GpuBufferUsage usage, bool streamOut);
+		D3D11VertexBufferCore(D3D11Device& device, const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 
 		~D3D11VertexBufferCore();
 
@@ -25,10 +24,12 @@ namespace BansheeEngine
 		void readData(UINT32 offset, UINT32 length, void* dest) override;
 
 		/** @copydoc VertexBufferCore::writeData */
-		void writeData(UINT32 offset, UINT32 length, const void* source, BufferWriteType writeFlags = BufferWriteType::Normal) override;
+		void writeData(UINT32 offset, UINT32 length, const void* source, 
+			BufferWriteType writeFlags = BufferWriteType::Normal) override;
 
 		/** @copydoc VertexBufferCore::copyData */
-		void copyData(HardwareBuffer& srcBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length, bool discardWholeBuffer = false) override;
+		void copyData(HardwareBuffer& srcBuffer, UINT32 srcOffset, UINT32 dstOffset, UINT32 length, 
+			bool discardWholeBuffer = false) override;
 
 		/**	Get the D3D-specific index buffer */
 		ID3D11Buffer* getD3DVertexBuffer() const { return mBuffer->getD3DBuffer(); }		

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

@@ -13,10 +13,10 @@ namespace BansheeEngine
 		: mDevice(device)
 	{ }
 
-	SPtr<VertexBufferCore> D3D11HardwareBufferCoreManager::createVertexBufferInternal(UINT32 vertexSize,
-		UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBufferCore> D3D11HardwareBufferCoreManager::createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
 	{
-		SPtr<D3D11VertexBufferCore> ret = bs_shared_ptr_new<D3D11VertexBufferCore>(mDevice, vertexSize, numVerts, usage, streamOut);
+		SPtr<D3D11VertexBufferCore> ret = bs_shared_ptr_new<D3D11VertexBufferCore>(mDevice, desc, deviceMask);
 		ret->_setThisPtr(ret);
 
 		return ret;

+ 6 - 3
Source/BansheeD3D11RenderAPI/Source/BsD3D11VertexBuffer.cpp

@@ -6,9 +6,12 @@
 
 namespace BansheeEngine
 {
-	D3D11VertexBufferCore::D3D11VertexBufferCore(D3D11Device& device, UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut)
-		:VertexBufferCore(vertexSize, numVertices, usage, streamOut), mDevice(device), mStreamOut(streamOut), mBuffer(nullptr)
-	{ }
+	D3D11VertexBufferCore::D3D11VertexBufferCore(D3D11Device& device, const VERTEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
+		:VertexBufferCore(desc, deviceMask), mDevice(device), mStreamOut(desc.streamOut), mBuffer(nullptr)
+	{
+		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on DirectX 11.");
+	}
 
 	D3D11VertexBufferCore::~D3D11VertexBufferCore()
 	{

+ 6 - 1
Source/BansheeEngine/Source/BsRenderable.cpp

@@ -240,7 +240,12 @@ namespace BansheeEngine
 			UINT32 vertexSize = sizeof(Vector3) + sizeof(UINT32);
 			UINT32 numVertices = morphShapes->getNumVertices();
 
-			SPtr<VertexBufferCore> vertexBuffer = VertexBufferCore::create(vertexSize, numVertices, GBU_DYNAMIC);
+			VERTEX_BUFFER_DESC desc;
+			desc.vertexSize = vertexSize;
+			desc.numVerts = numVertices;
+			desc.usage = GBU_DYNAMIC;
+
+			SPtr<VertexBufferCore> vertexBuffer = VertexBufferCore::create(desc);
 
 			UINT32 totalSize = vertexSize * numVertices;
 			UINT8* dest = (UINT8*)vertexBuffer->lock(0, totalSize, GBL_WRITE_ONLY_DISCARD);

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

@@ -23,8 +23,8 @@ namespace BansheeEngine
 
 	protected:
 		/** @copydoc HardwareBufferCoreManager::createVertexBufferInternal */
-        SPtr<VertexBufferCore> createVertexBufferInternal(UINT32 vertexSize, 
-			UINT32 numVerts, GpuBufferUsage usage, bool streamOut = false) override;
+        SPtr<VertexBufferCore> createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, 
+        	GpuDeviceFlags deviceMask = GDF_DEFAULT) override;
 
 		/** @copydoc HardwareBufferCoreManager::createIndexBufferInternal */
 		SPtr<IndexBufferCore> createIndexBufferInternal(IndexType itype, UINT32 numIndices, GpuBufferUsage usage) override;

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

@@ -17,7 +17,7 @@ namespace BansheeEngine
     class BS_RSGL_EXPORT GLVertexBufferCore : public VertexBufferCore
     {
     public:
-		GLVertexBufferCore(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut);
+		GLVertexBufferCore(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask);
 		~GLVertexBufferCore();
 
 		/** @copydoc VertexBufferCore::readData */

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

@@ -11,9 +11,10 @@
 
 namespace BansheeEngine 
 {
-	SPtr<VertexBufferCore> GLHardwareBufferCoreManager::createVertexBufferInternal(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, bool streamOut)
+	SPtr<VertexBufferCore> GLHardwareBufferCoreManager::createVertexBufferInternal(const VERTEX_BUFFER_DESC& desc, 
+		GpuDeviceFlags deviceMask)
 	{
-		SPtr<GLVertexBufferCore> ret = bs_shared_ptr_new<GLVertexBufferCore>(vertexSize, numVerts, usage, streamOut);
+		SPtr<GLVertexBufferCore> ret = bs_shared_ptr_new<GLVertexBufferCore>(desc, deviceMask);
 		ret->_setThisPtr(ret);
 
 		return ret;

+ 3 - 3
Source/BansheeGLRenderAPI/Source/BsGLVertexBuffer.cpp

@@ -8,10 +8,10 @@
 
 namespace BansheeEngine 
 {
-	GLVertexBufferCore::GLVertexBufferCore(UINT32 vertexSize, UINT32 numVertices, GpuBufferUsage usage, bool streamOut)
-		:VertexBufferCore(vertexSize, numVertices, usage, streamOut)
+	GLVertexBufferCore::GLVertexBufferCore(const VERTEX_BUFFER_DESC& desc, GpuDeviceFlags deviceMask)
+		:VertexBufferCore(desc, deviceMask)
     {
-
+		assert((deviceMask == GDF_DEFAULT || deviceMask == GDF_PRIMARY) && "Multiple GPUs not supported natively on OpenGL.");
     }
 
 	GLVertexBufferCore::~GLVertexBufferCore()