Browse Source

GpuParams now uses a factory class for creation, so that RenderAPI implementations can create their own GpuParams implementations

BearishSun 9 years ago
parent
commit
18a41f669d

+ 3 - 0
Source/BansheeCore/Include/BsGpuParams.h

@@ -267,6 +267,7 @@ namespace BansheeEngine
 
 	protected:
 		friend class GpuParams;
+		friend class HardwareBufferCoreManager;
 
 		/** @copydoc GpuParams::create */
 		GpuParamsCore(const GPU_PARAMS_DESC& desc);
@@ -320,6 +321,8 @@ namespace BansheeEngine
 
 		/** @} */
 	protected:
+		friend class HardwareBufferManager;
+
 		/** @copydoc GpuParams::create */
 		GpuParams(const GPU_PARAMS_DESC& desc);
 

+ 21 - 11
Source/BansheeCore/Include/BsHardwareBufferManager.h

@@ -7,6 +7,7 @@
 #include "BsVertexBuffer.h"
 #include "BsIndexBuffer.h"
 #include "BsVertexDeclaration.h"
+#include "BsGpuParams.h"
 
 namespace BansheeEngine 
 {
@@ -34,7 +35,7 @@ namespace BansheeEngine
 		 * @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.
 		 */
-		virtual SPtr<VertexBuffer> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
+		SPtr<VertexBuffer> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
 			bool streamOut = false);
 
 		/**
@@ -45,7 +46,7 @@ namespace BansheeEngine
 		 * @param[in]	numIndices	Number of indexes can buffer can hold.
 		 * @param[in]	usage		Usage that tells the hardware how will be buffer be used. 
 		 */
-		virtual SPtr<IndexBuffer> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
+		SPtr<IndexBuffer> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
 
 		/**
 		 * Creates an GPU parameter block that you can use for setting parameters for GPU programs. Parameter blocks may be
@@ -55,7 +56,7 @@ namespace BansheeEngine
 		 * @param[in]	size	Size of the parameter buffer in bytes.
 		 * @param[in]	usage	Usage that tells the hardware how will be buffer be used. 
 		 */
-		virtual SPtr<GpuParamBlockBuffer> createGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage = GPBU_DYNAMIC);
+		SPtr<GpuParamBlockBuffer> createGpuParamBlockBuffer(UINT32 size, GpuParamBlockUsage usage = GPBU_DYNAMIC);
 
 		/**
 		 * Creates a generic buffer that can be passed as a parameter to a GPU program. This type of buffer can hold various 
@@ -75,11 +76,14 @@ namespace BansheeEngine
 		 * 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.
 		 */
-		virtual SPtr<GpuBuffer> createGpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, 
+		SPtr<GpuBuffer> createGpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, 
 			GpuBufferFormat format, GpuBufferUsage usage, bool randomGpuWrite = false, bool useCounter = false);
 
 		/** Creates a new vertex declaration from a list of vertex elements. */
-		virtual SPtr<VertexDeclaration> createVertexDeclaration(const SPtr<VertexDataDesc>& desc);
+		SPtr<VertexDeclaration> createVertexDeclaration(const SPtr<VertexDataDesc>& desc);
+
+		/** Creates a new GpuParams object from the provided set of GPU parameter descriptors. */
+		SPtr<GpuParams> createGpuParams(const GPU_PARAMS_DESC& desc);
 	};
 
 	/**
@@ -93,26 +97,29 @@ namespace BansheeEngine
 		virtual ~HardwareBufferCoreManager() { }
 
 		/** @copydoc HardwareBufferManager::createVertexBuffer */
-		virtual SPtr<VertexBufferCore> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
+		SPtr<VertexBufferCore> createVertexBuffer(UINT32 vertexSize, UINT32 numVerts, GpuBufferUsage usage, 
 			bool streamOut = false);
 
 		/** @copydoc HardwareBufferManager::createIndexBuffer */
-		virtual SPtr<IndexBufferCore> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
+		SPtr<IndexBufferCore> createIndexBuffer(IndexType itype, UINT32 numIndices, GpuBufferUsage usage);
 
 		/** @copydoc HardwareBufferManager::createVertexDeclaration */
-		virtual SPtr<VertexDeclarationCore> createVertexDeclaration(const SPtr<VertexDataDesc>& desc);
+		SPtr<VertexDeclarationCore> createVertexDeclaration(const SPtr<VertexDataDesc>& desc);
 
 		/** @copydoc HardwareBufferManager::createVertexDeclaration */
-		virtual SPtr<VertexDeclarationCore> createVertexDeclaration(const List<VertexElement>& elements);
+		SPtr<VertexDeclarationCore> createVertexDeclaration(const List<VertexElement>& elements);
 
 		/** @copydoc HardwareBufferManager::createGpuParamBlockBuffer */
-		virtual SPtr<GpuParamBlockBufferCore> createGpuParamBlockBuffer(UINT32 size, 
+		SPtr<GpuParamBlockBufferCore> createGpuParamBlockBuffer(UINT32 size, 
 			GpuParamBlockUsage usage = GPBU_DYNAMIC);
 
 		/** @copydoc HardwareBufferManager::createGpuBuffer */
-		virtual SPtr<GpuBufferCore> createGpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, 
+		SPtr<GpuBufferCore> createGpuBuffer(UINT32 elementCount, UINT32 elementSize, GpuBufferType type, 
 			GpuBufferFormat format, GpuBufferUsage usage, bool randomGpuWrite = false, bool useCounter = false);
 
+		/** @copydoc HardwareBufferManager::createGpuParams */
+		SPtr<GpuParamsCore> createGpuParams(const GPU_PARAMS_DESC& desc);
+
 	protected:
 		friend class IndexBuffer;
 		friend class IndexBufferCore;
@@ -141,6 +148,9 @@ namespace BansheeEngine
 
 		/** @copydoc createVertexDeclaration */
 		virtual SPtr<VertexDeclarationCore> createVertexDeclarationInternal(const List<VertexElement>& elements);
+
+		/** @copydoc createGpuParams */
+		virtual SPtr<GpuParamsCore> createGpuParamsInternal(const GPU_PARAMS_DESC& desc);
 	};
 
 	/** @} */

+ 3 - 11
Source/BansheeCore/Source/BsGpuParams.cpp

@@ -12,6 +12,7 @@
 #include "BsException.h"
 #include "BsVectorNI.h"
 #include "BsMatrixNxM.h"
+#include "BsHardwareBufferManager.h"
 
 namespace BansheeEngine
 {
@@ -763,11 +764,7 @@ UINT32 GpuParamsBase::getDataParamSize(GpuProgramType type, const String& name)
 
 	SPtr<GpuParamsCore> GpuParamsCore::create(const GPU_PARAMS_DESC& desc)
 	{
-		GpuParamsCore* params = new (bs_alloc<GpuParamsCore>()) GpuParamsCore(desc);
-		SPtr<GpuParamsCore> paramsPtr = bs_shared_ptr<GpuParamsCore>(params);
-		paramsPtr->_setThisPtr(paramsPtr);
-
-		return paramsPtr;
+		return HardwareBufferCoreManager::instance().createGpuParams(desc);
 	}
 
 	const GpuDataParamInfos GpuParams::PARAM_SIZES;
@@ -818,12 +815,7 @@ UINT32 GpuParamsBase::getDataParamSize(GpuProgramType type, const String& name)
 
 	SPtr<GpuParams> GpuParams::create(const GPU_PARAMS_DESC& desc)
 	{
-		GpuParams* params = new (bs_alloc<GpuParams>()) GpuParams(desc);
-		SPtr<GpuParams> paramsPtr = bs_core_ptr<GpuParams>(params);
-		paramsPtr->_setThisPtr(paramsPtr);
-		paramsPtr->initialize();
-		
-		return paramsPtr;
+		return HardwareBufferManager::instance().createGpuParams(desc);
 	}
 
 	CoreSyncData GpuParams::syncToCore(FrameAlloc* allocator)

+ 27 - 0
Source/BansheeCore/Source/BsHardwareBufferManager.cpp

@@ -68,6 +68,16 @@ namespace BansheeEngine
 		return gbuf;
 	}
 
+	SPtr<GpuParams> HardwareBufferManager::createGpuParams(const GPU_PARAMS_DESC& desc)
+    {
+		GpuParams* params = new (bs_alloc<GpuParams>()) GpuParams(desc);
+		SPtr<GpuParams> paramsPtr = bs_core_ptr<GpuParams>(params);
+		paramsPtr->_setThisPtr(paramsPtr);
+		paramsPtr->initialize();
+
+		return paramsPtr;
+    }
+
 	SPtr<IndexBufferCore> HardwareBufferCoreManager::createIndexBuffer(IndexType itype, UINT32 numIndexes, GpuBufferUsage usage)
 	{
 		assert(numIndexes > 0);
@@ -95,6 +105,14 @@ namespace BansheeEngine
 		return declPtr;
 	}
 
+	SPtr<GpuParamsCore> HardwareBufferCoreManager::createGpuParams(const GPU_PARAMS_DESC& desc)
+    {
+		SPtr<GpuParamsCore> params = createGpuParamsInternal(desc);
+		params->initialize();
+
+		return params;
+    }
+
 	SPtr<VertexDeclarationCore> HardwareBufferCoreManager::createVertexDeclaration(const List<VertexElement>& elements)
 	{
 		SPtr<VertexDeclarationCore> declPtr = createVertexDeclarationInternal(elements);
@@ -130,4 +148,13 @@ namespace BansheeEngine
 
 		return ret;
 	}
+
+	SPtr<GpuParamsCore> HardwareBufferCoreManager::createGpuParamsInternal(const GPU_PARAMS_DESC& desc)
+    {
+		GpuParamsCore* params = new (bs_alloc<GpuParamsCore>()) GpuParamsCore(desc);
+		SPtr<GpuParamsCore> paramsPtr = bs_shared_ptr<GpuParamsCore>(params);
+		paramsPtr->_setThisPtr(paramsPtr);
+
+		return paramsPtr;
+    }
 }