Explorar o código

Refactor: Renderer materials now use GpuParams instead of GpuParamsSet

BearishSun %!s(int64=8) %!d(string=hai) anos
pai
achega
3b0950d42b

+ 10 - 10
Source/BansheeCore/Material/BsPass.h

@@ -99,8 +99,8 @@ namespace bs
 	 */
 	template<bool Core>
 	class BS_CORE_EXPORT TPass
-    {
-    public:
+	{
+	public:
 		typedef typename TPassTypes<Core>::BlendStateType BlendStateType;
 		typedef typename TPassTypes<Core>::RasterizerStateType RasterizerStateType;
 		typedef typename TPassTypes<Core>::DepthStencilStateType DepthStencilStateType;
@@ -111,7 +111,7 @@ namespace bs
 
 		virtual ~TPass() { }
 
-        bool hasVertexProgram() const { return mData.vertexProgram != nullptr; }
+		bool hasVertexProgram() const { return mData.vertexProgram != nullptr; }
 		bool hasFragmentProgram() const { return mData.fragmentProgram != nullptr; }
 		bool hasGeometryProgram() const { return mData.geometryProgram != nullptr; }
 		bool hasHullProgram() const { return mData.hullProgram != nullptr; }
@@ -147,7 +147,7 @@ namespace bs
 		PassDescType mData;
 		GraphicsPipelineStateType mGraphicsPipelineState;
 		ComputePipelineStateType mComputePipelineState;
-    };
+	};
 
 	/** @} */
 
@@ -161,8 +161,8 @@ namespace bs
 	 * @note	Sim thread.
 	 */
 	class BS_CORE_EXPORT Pass : public IReflectable, public CoreObject, public TPass<false>
-    {
-    public:
+	{
+	public:
 		virtual ~Pass() { }
 
 		/** Retrieves an implementation of a pass usable only from the core thread. */
@@ -199,7 +199,7 @@ namespace bs
 		friend class PassRTTI;
 		static RTTITypeBase* getRTTIStatic();
 		RTTITypeBase* getRTTI() const override;
-    };
+	};
 
 	/** @} */
 
@@ -215,8 +215,8 @@ namespace bs
 	 * @note	Core thread.
 	 */
 	class BS_CORE_EXPORT Pass : public CoreObject, public TPass<true>
-    {
-    public:
+	{
+	public:
 		virtual ~Pass() { }
 
 		/**	Creates a new empty pass. */
@@ -236,7 +236,7 @@ namespace bs
 
 		/** @copydoc CoreObject::syncToCore */
 		void syncToCore(const CoreSyncData& data) override;
-    };
+	};
 
 	/** @} */
 	}

+ 55 - 1
Source/BansheeCore/RenderAPI/BsGpuPipelineParamInfo.cpp

@@ -225,7 +225,7 @@ namespace bs
 		return mSetInfos[set].slotIndices[slot];
 	}
 
-	void GpuPipelineParamInfoBase::getSetSlot(ParamType type, UINT32 sequentialSlot, UINT32& set, UINT32& slot) const
+	void GpuPipelineParamInfoBase::getBinding(ParamType type, UINT32 sequentialSlot, UINT32& set, UINT32& slot) const
 	{
 #if BS_DEBUG_MODE
 		if(sequentialSlot >= mNumElementsPerType[(int)type])
@@ -243,6 +243,60 @@ namespace bs
 		slot = mResourceInfos[(int)type][sequentialSlot].slot;
 	}
 
+	void GpuPipelineParamInfoBase::getBindings(ParamType type, const String& name, GpuParamBinding (& bindings)[GPT_COUNT])
+	{
+		constexpr UINT32 numParamDescs = sizeof(mParamDescs) / sizeof(mParamDescs[0]);
+		static_assert(
+			numParamDescs == GPT_COUNT, 
+			"Number of param descriptor structures must match the number of GPU program stages."
+		);
+
+		auto findBinding = [](auto& paramMap, const String& name, GpuParamBinding& binding)
+		{
+			auto iterFind = paramMap.find(name);
+			if (iterFind != paramMap.end())
+			{
+				binding.set = iterFind->second.set;
+				binding.slot = iterFind->second.slot;
+			}
+			else
+				binding.set = binding.slot = (UINT32)-1;
+		};
+
+		for (UINT32 i = 0; i < numParamDescs; i++)
+		{
+			GpuParamBinding& binding = bindings[i];
+
+			const SPtr<GpuParamDesc>& paramDesc = mParamDescs[i];
+			if (paramDesc == nullptr)
+			{
+				binding.set = binding.slot = (UINT32)-1;
+				continue;
+			}
+
+			switch(type)
+			{
+			case ParamType::ParamBlock: 
+				findBinding(paramDesc->paramBlocks, name, binding);
+				break;
+			case ParamType::Texture: 
+				findBinding(paramDesc->textures, name, binding);
+				break;
+			case ParamType::LoadStoreTexture: 
+				findBinding(paramDesc->loadStoreTextures, name, binding);
+				break;
+			case ParamType::Buffer: 
+				findBinding(paramDesc->buffers, name, binding);
+				break;
+			case ParamType::SamplerState: 
+				findBinding(paramDesc->samplers, name, binding);
+				break;
+			default: 
+				break;
+			}
+		}
+	}
+
 	GpuPipelineParamInfo::GpuPipelineParamInfo(const GPU_PIPELINE_PARAMS_DESC& desc)
 		:GpuPipelineParamInfoBase(desc)
 	{ }

+ 14 - 1
Source/BansheeCore/RenderAPI/BsGpuPipelineParamInfo.h

@@ -23,6 +23,13 @@ namespace bs
 		SPtr<GpuParamDesc> computeParams;
 	};
 
+	/** Binding location for a single GPU program parameter. */
+	struct GpuParamBinding
+	{
+		UINT32 set = (UINT32)-1;
+		UINT32 slot = (UINT32)-1;
+	};
+
 	/** Contains code common to both sim and core thread implementations of GpuPipelineParamInfo. */
 	class BS_CORE_EXPORT GpuPipelineParamInfoBase
 	{
@@ -56,7 +63,13 @@ namespace bs
 		UINT32 getSequentialSlot(ParamType type, UINT32 set, UINT32 slot) const;
 
 		/** Converts a sequential slot index into a set/slot combination. */
-		void getSetSlot(ParamType type, UINT32 sequentialSlot, UINT32& set, UINT32& slot) const;
+		void getBinding(ParamType type, UINT32 sequentialSlot, UINT32& set, UINT32& slot) const;
+
+		/**
+		 * Finds set/slot indices of a parameter with the specified name for every GPU program stage. Set/slot indices are
+		 * set to -1 if a stage doesn't have a block with the specified name.
+		 */
+		void getBindings(ParamType type, const String& name, GpuParamBinding(&bindings)[GPT_COUNT]);
 
 		/** Returns descriptions of individual parameters for the specified GPU program type. */
 		const SPtr<GpuParamDesc>& getParamDesc(GpuProgramType type) const { return mParamDescs[(int)type]; }

+ 5 - 5
Source/BansheeVulkanRenderAPI/BsVulkanGpuParams.cpp

@@ -571,7 +571,7 @@ namespace bs { namespace ct
 				perDeviceData.uniformBuffers[i] = vkBuffer;
 			
 				UINT32 set, slot;
-				mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::ParamBlock, i, set, slot);
+				mParamInfo->getBinding(GpuPipelineParamInfo::ParamType::ParamBlock, i, set, slot);
 
 				UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
 				perDeviceData.perSetData[set].writeInfos[bindingIdx].buffer.buffer = vkBuffer;
@@ -611,7 +611,7 @@ namespace bs { namespace ct
 				perDeviceData.buffers[i] = vkBuffer;
 
 				UINT32 set, slot;
-				mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::Buffer, i, set, slot);
+				mParamInfo->getBinding(GpuPipelineParamInfo::ParamType::Buffer, i, set, slot);
 
 				UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
 
@@ -656,7 +656,7 @@ namespace bs { namespace ct
 				perDeviceData.samplers[i] = vkSampler;
 
 				UINT32 set, slot;
-				mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::SamplerState, i, set, slot);
+				mParamInfo->getBinding(GpuPipelineParamInfo::ParamType::SamplerState, i, set, slot);
 
 				UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
 				perDeviceData.perSetData[set].writeInfos[bindingIdx].image.sampler = vkSampler;
@@ -692,7 +692,7 @@ namespace bs { namespace ct
 				perDeviceData.storageImages[i] = vkImage;
 
 				UINT32 set, slot;
-				mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::LoadStoreTexture, i, set, slot);
+				mParamInfo->getBinding(GpuPipelineParamInfo::ParamType::LoadStoreTexture, i, set, slot);
 
 				UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
 				perDeviceData.perSetData[set].writeInfos[bindingIdx].image.imageView = resource->getView(surface, false);;
@@ -733,7 +733,7 @@ namespace bs { namespace ct
 			assert(perDeviceData.sampledImages[i] != VK_NULL_HANDLE);
 
 			UINT32 set, slot;
-			mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::Texture, i, set, slot);
+			mParamInfo->getBinding(GpuPipelineParamInfo::ParamType::Texture, i, set, slot);
 
 			UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
 			VkDescriptorImageInfo& imgInfo = perDeviceData.perSetData[set].writeInfos[bindingIdx].image;

+ 1 - 1
Source/CMakeLists.txt

@@ -144,7 +144,7 @@ if(MSVC)
 	set(CMAKE_EXE_LINKER_FLAGS_RELEASE ${BS_LINKER_FLAGS_RELEASE})
 	
 	# Compiler
-	set(BS_COMPILER_FLAGS_COMMON "/GS- /W3 /GR- /WX- /MP /nologo /bigobj /wd\"4577\" /wd\"4530\"")
+	set(BS_COMPILER_FLAGS_COMMON "/GS- /W3 /GR- /WX- /MP /permissive- /nologo /bigobj /wd\"4577\" /wd\"4530\"")
 	set(CMAKE_CXX_FLAGS "/DWIN32 /D_WINDOWS")
 	
 	set(CMAKE_CXX_FLAGS_DEBUG "${BS_COMPILER_FLAGS_COMMON} /Od /RTC1 /MDd")

+ 3 - 3
Source/RenderBeast/BsImageBasedLighting.cpp

@@ -235,7 +235,7 @@ namespace bs { namespace ct
 			params->getLoadStoreTextureParam(GPT_COMPUTE_PROGRAM, "gOutput", mOutputTextureParam);
 
 		mParamBuffer = gTiledImageBasedLightingParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer, true);
+		params->setParamBlockBuffer("Params", mParamBuffer);
 
 		mImageBasedParams.populate(mParamsSet, GPT_COMPUTE_PROGRAM, false, false);
 
@@ -251,7 +251,7 @@ namespace bs { namespace ct
 		mImageBasedParams.ssrSampParam.set(samplerState);
 		mImageBasedParams.ambientOcclusionSampParam.set(samplerState);
 
-		mParamsSet->setParamBlockBuffer("ReflProbeParams", mReflProbeParamBuffer.buffer);
+		params->setParamBlockBuffer("ReflProbeParams", mReflProbeParamBuffer.buffer);
 	}
 
 	void TiledDeferredImageBasedLightingMat::_initVariations(ShaderVariations& variations)
@@ -296,7 +296,7 @@ namespace bs { namespace ct
 		mImageBasedParams.ambientOcclusionTexParam.set(inputs.ambientOcclusion);
 		mImageBasedParams.ssrTexParam.set(inputs.ssr);
 
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		mInColorTextureParam.set(inputs.lightAccumulation);
 		if (mSampleCount > 1)

+ 4 - 4
Source/RenderBeast/BsLightGrid.cpp

@@ -106,14 +106,14 @@ namespace bs { namespace ct
 		mProbesLLHeads->writeData(0, mProbesLLHeads->getSize(), headsClearData, BWT_DISCARD);
 		bs_stack_free(headsClearData);
 
-		mParamsSet->setParamBlockBuffer("GridParams", gridParams, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("GridParams", gridParams);
 		mLightBufferParam.set(lightsBuffer);
 		mProbesBufferParam.set(probesBuffer);
 	}
 
 	void LightGridLLCreationMat::execute(const RendererView& view)
 	{
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		UINT32 numGroupsX = (mGridSize[0] + THREADGROUP_SIZE - 1) / THREADGROUP_SIZE;
 		UINT32 numGroupsY = (mGridSize[1] + THREADGROUP_SIZE - 1) / THREADGROUP_SIZE;
@@ -212,7 +212,7 @@ namespace bs { namespace ct
 		UINT32 zeros[] = { 0, 0 };
 		mGridDataCounter->writeData(0, sizeof(UINT32) * 2, zeros, BWT_DISCARD);
 
-		mParamsSet->setParamBlockBuffer("GridParams", gridParams, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("GridParams", gridParams);
 
 		mLightsLLHeadsParam.set(lightsLLHeads);
 		mLightsLLParam.set(lightsLL);
@@ -223,7 +223,7 @@ namespace bs { namespace ct
 
 	void LightGridLLReductionMat::execute(const RendererView& view)
 	{
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		UINT32 numGroupsX = (mGridSize[0] + THREADGROUP_SIZE - 1) / THREADGROUP_SIZE;
 		UINT32 numGroupsY = (mGridSize[1] + THREADGROUP_SIZE - 1) / THREADGROUP_SIZE;

+ 4 - 4
Source/RenderBeast/BsLightProbes.cpp

@@ -49,7 +49,7 @@ namespace bs { namespace ct
 			params->setSamplerState(GPT_FRAGMENT_PROGRAM, "gDepthBufferTex", pointSampState);
 
 		mParamBuffer = gTetrahedraRenderParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer);
+		params->setParamBlockBuffer("Params", mParamBuffer);
 	}
 
 	void TetrahedraRenderMat::_initVariations(ShaderVariations& variations)
@@ -68,7 +68,7 @@ namespace bs { namespace ct
 		gTetrahedraRenderParamDef.gDepthTexSize.set(mParamBuffer, texSize);
 
 		mDepthBufferTex.set(sceneDepth);
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(output);
@@ -159,7 +159,7 @@ namespace bs { namespace ct
 		}
 
 		mParamBuffer = gIrradianceEvaluateParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer, true);
+		params->setParamBlockBuffer("Params", mParamBuffer);
 	}
 
 	void IrradianceEvaluateMat::_initVariations(ShaderVariations& variations)
@@ -206,7 +206,7 @@ namespace bs { namespace ct
 		gIrradianceEvaluateParamDef.gNumTetrahedra.set(mParamBuffer, lightProbesInfo.numTetrahedra);
 		mParamBuffer->flushToGPU();
 
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		// Render
 		RenderAPI& rapi = RenderAPI::instance();

+ 3 - 3
Source/RenderBeast/BsLightRendering.cpp

@@ -277,7 +277,7 @@ namespace bs { namespace ct
 			params->getTextureParam(GPT_COMPUTE_PROGRAM, "gMSAACoverage", mMSAACoverageTexParam);
 
 		mParamBuffer = gTiledLightingParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer, true);
+		params->setParamBlockBuffer("Params", mParamBuffer);
 	}
 
 	void TiledDeferredLightingMat::_initVariations(ShaderVariations& variations)
@@ -349,7 +349,7 @@ namespace bs { namespace ct
 		mParamBuffer->flushToGPU();
 
 		mGBufferParams.bind(gbuffer);
-		mParamsSet->setParamBlockBuffer("PerCamera", view.getPerViewBuffer(), true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", view.getPerViewBuffer());
 
 		if (mSampleCount > 1)
 		{
@@ -392,7 +392,7 @@ namespace bs { namespace ct
 		params->getBufferParam(GPT_FRAGMENT_PROGRAM, "gInput", mInputParam);
 
 		mParamBuffer = gTiledLightingParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer, true);
+		params->setParamBlockBuffer("Params", mParamBuffer);
 	}
 
 	void FlatFramebufferToTextureMat::_initVariations(ShaderVariations& variations)

+ 16 - 17
Source/RenderBeast/BsObjectRendering.cpp

@@ -26,9 +26,6 @@ namespace bs { namespace ct
 		SPtr<Shader> shader = element.material->getShader();
 		if (shader == nullptr)
 		{
-			element.perCameraBindingIdx = -1;
-			element.gridParamsBindingIdx = -1;
-
 			LOGWRN("Missing shader on material.");
 			return;
 		}
@@ -37,24 +34,26 @@ namespace bs { namespace ct
 
 		// Note: Perhaps perform buffer validation to ensure expected buffer has the same size and layout as the provided
 		// buffer, and show a warning otherwise. But this is perhaps better handled on a higher level.
-		if(shader->hasParamBlock("PerFrame"))
-			element.params->setParamBlockBuffer("PerFrame", mPerFrameParamBuffer, true);
-
-		if(shader->hasParamBlock("PerObject"))
-			element.params->setParamBlockBuffer("PerObject", owner.perObjectParamBuffer, true);
-
-		if(shader->hasParamBlock("PerCall"))
-			element.params->setParamBlockBuffer("PerCall", owner.perCallParamBuffer, true);
-
-		if(shader->hasParamBlock("PerCamera"))
-			element.perCameraBindingIdx = element.params->getParamBlockBufferIndex("PerCamera");
-
-		element.gridParamsBindingIdx = element.params->getParamBlockBufferIndex("GridParams");
+		gpuParams->setParamBlockBuffer("PerFrame", mPerFrameParamBuffer);
+		gpuParams->setParamBlockBuffer("PerObject", owner.perObjectParamBuffer);
+		gpuParams->setParamBlockBuffer("PerCall", owner.perCallParamBuffer);
+
+		gpuParams->getParamInfo()->getBindings(
+			GpuPipelineParamInfoBase::ParamType::ParamBlock, 
+			"PerCamera",
+			element.perCameraBindings
+		);
+
+		gpuParams->getParamInfo()->getBindings(
+			GpuPipelineParamInfoBase::ParamType::ParamBlock,
+			"GridParams",
+			element.gridParamsBindings
+		);
 
 		if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gLights"))
 			gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gLights", element.lightsBufferParam);
 
-		if(gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gGridLightOffsetsAndSize"))
+		if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gGridLightOffsetsAndSize"))
 			gpuParams->getBufferParam(GPT_FRAGMENT_PROGRAM, "gGridLightOffsetsAndSize", element.gridLightOffsetsAndSizeParam);
 
 		if (gpuParams->hasBuffer(GPT_FRAGMENT_PROGRAM, "gLightIndices"))

+ 34 - 32
Source/RenderBeast/BsPostProcessing.cpp

@@ -58,7 +58,7 @@ namespace bs { namespace ct
 
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
 		if(gpuParams->hasParamBlock(GPT_FRAGMENT_PROGRAM, "Input"))
-			mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
+			gpuParams->setParamBlockBuffer("Input", mParamBuffer);
 
 		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 	}
@@ -143,9 +143,9 @@ namespace bs { namespace ct
 	EyeAdaptHistogramMat::EyeAdaptHistogramMat()
 	{
 		mParamBuffer = gEyeAdaptHistogramParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
 
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Input", mParamBuffer);
 		params->getTextureParam(GPT_COMPUTE_PROGRAM, "gSceneColorTex", mSceneColor);
 		params->getLoadStoreTextureParam(GPT_COMPUTE_PROGRAM, "gOutputTex", mOutputTex);
 	}
@@ -223,9 +223,9 @@ namespace bs { namespace ct
 	EyeAdaptHistogramReduceMat::EyeAdaptHistogramReduceMat()
 	{
 		mParamBuffer = gEyeAdaptHistogramReduceParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
 
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Input", mParamBuffer);
 		params->getTextureParam(GPT_FRAGMENT_PROGRAM, "gHistogramTex", mHistogramTex);
 		params->getTextureParam(GPT_FRAGMENT_PROGRAM, "gEyeAdaptationTex", mEyeAdaptationTex);
 	}
@@ -277,8 +277,10 @@ namespace bs { namespace ct
 	EyeAdaptationMat::EyeAdaptationMat()
 	{
 		mParamBuffer = gEyeAdaptationParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gHistogramTex", mReducedHistogramTex);
+
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gHistogramTex", mReducedHistogramTex);
 	}
 
 	void EyeAdaptationMat::_initVariations(ShaderVariations& variations)
@@ -348,10 +350,9 @@ namespace bs { namespace ct
 		mParamBuffer = gCreateTonemapLUTParamDef.createBuffer();
 		mWhiteBalanceParamBuffer = gWhiteBalanceParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->setParamBlockBuffer("WhiteBalanceInput", mWhiteBalanceParamBuffer);
-
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Input", mParamBuffer);
+		params->setParamBlockBuffer("WhiteBalanceInput", mWhiteBalanceParamBuffer);
 		params->getLoadStoreTextureParam(GPT_COMPUTE_PROGRAM, "gOutputTex", mOutputTex);
 	}
 
@@ -473,9 +474,9 @@ namespace bs { namespace ct
 	TonemappingMat::TonemappingMat()
 	{
 		mParamBuffer = gTonemappingParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
 
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Input", mParamBuffer);
 		params->getTextureParam(GPT_VERTEX_PROGRAM, "gEyeAdaptationTex", mEyeAdaptationTex);
 		params->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTex);
 
@@ -567,8 +568,9 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gGaussianBlurParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 	}
 
 	void GaussianBlurMat::_initVariations(ShaderVariations& variations)
@@ -770,9 +772,8 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gGaussianDOFParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gColorTex", mColorTexture);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gDepthTex", mDepthTexture);
 
@@ -836,7 +837,7 @@ namespace bs { namespace ct
 		mDepthTexture.set(depth);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(rt);
@@ -900,9 +901,9 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gGaussianDOFParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gFocusedTex", mFocusedTexture);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gDepthTex", mDepthTexture);
 
@@ -940,7 +941,7 @@ namespace bs { namespace ct
 		mDepthTexture.set(depth);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(output);
@@ -996,8 +997,9 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gFXAAParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 	}
 
 	void FXAAMat::_initVariations(ShaderVariations& variations)
@@ -1061,9 +1063,9 @@ namespace bs { namespace ct
 
 		mParamBuffer = gSSAOParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+
 		if (isFinal)
 		{
 			gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gDepthTex", mDepthTexture);
@@ -1217,7 +1219,7 @@ namespace bs { namespace ct
 		mRandomTexture.set(textures.randomRotations);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(destination);
@@ -1264,9 +1266,9 @@ namespace bs { namespace ct
 	SSAODownsampleMat::SSAODownsampleMat()
 	{
 		mParamBuffer = gSSAODownsampleParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
 
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gDepthTex", mDepthTexture);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gNormalsTex", mNormalsTexture);
 
@@ -1313,7 +1315,7 @@ namespace bs { namespace ct
 		mNormalsTexture.set(normals);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(destination);
@@ -1336,9 +1338,9 @@ namespace bs { namespace ct
 	SSAOBlurMat::SSAOBlurMat()
 	{
 		mParamBuffer = gSSAOBlurParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
 
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mAOTexture);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gDepthTex", mDepthTexture);
 
@@ -1392,7 +1394,7 @@ namespace bs { namespace ct
 		mDepthTexture.set(depth);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(destination);
@@ -1429,7 +1431,7 @@ namespace bs { namespace ct
 		:mGBufferParams(mMaterial, mParamsSet)
 	{
 		mParamBuffer = gSSRStencilParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("Input", mParamBuffer);
 	}
 
 	void SSRStencilMat::_initVariations(ShaderVariations& variations)
@@ -1448,7 +1450,7 @@ namespace bs { namespace ct
 		gSSRStencilParamDef.gRoughnessScaleBias.set(mParamBuffer, roughnessScaleBias);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		const RendererViewProperties& viewProps = view.getProperties();
 		const Rect2I& viewRect = viewProps.viewRect;
@@ -1595,7 +1597,7 @@ namespace bs { namespace ct
 		gSSRTraceParamDef.gTemporalJitter.set(mParamBuffer, temporalJitter);
 
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		rapi.setRenderTarget(destination, FBT_DEPTH);
 
@@ -1812,7 +1814,7 @@ namespace bs { namespace ct
 		}
 		
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(destination);
@@ -1841,9 +1843,9 @@ namespace bs { namespace ct
 	EncodeDepthMat::EncodeDepthMat()
 	{
 		mParamBuffer = gEncodeDepthParamDef.createBuffer();
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer);
 
 		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Params", mParamBuffer);
 		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 
 		SAMPLER_STATE_DESC sampDesc;
@@ -1907,7 +1909,7 @@ namespace bs { namespace ct
 
 		const Rect2I& viewRect = view.getProperties().viewRect;
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
-		mParamsSet->setParamBlockBuffer("PerCamera", perView);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perView);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);

+ 9 - 10
Source/RenderBeast/BsRenderBeastIBLUtility.cpp

@@ -14,8 +14,9 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gReflectionCubeDownsampleParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 	}
 
 	void ReflectionCubeDownsampleMat::_initVariations(ShaderVariations& variations)
@@ -44,8 +45,9 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gReflectionCubeImportanceSampleParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Input", mParamBuffer);
-		mParamsSet->getGpuParams()->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Input", mParamBuffer);
+		gpuParams->getTextureParam(GPT_FRAGMENT_PROGRAM, "gInputTex", mInputTexture);
 	}
 
 	void ReflectionCubeImportanceSampleMat::_initVariations(ShaderVariations& variations)
@@ -108,9 +110,8 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gIrradianceComputeSHParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer);
-
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Params", mParamBuffer);
 		params->getTextureParam(GPT_COMPUTE_PROGRAM, "gInputTex", mInputTexture);
 		params->getBufferParam(GPT_COMPUTE_PROGRAM, "gOutput", mOutputBuffer);
 	}
@@ -193,9 +194,8 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gIrradianceReduceSHParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer);
-
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Params", mParamBuffer);
 		params->getBufferParam(GPT_COMPUTE_PROGRAM, "gInput", mInputBuffer);
 		params->getBufferParam(GPT_COMPUTE_PROGRAM, "gOutput", mOutputBuffer);
 	}
@@ -252,9 +252,8 @@ namespace bs { namespace ct
 	{
 		mParamBuffer = gIrradianceProjectSHParamDef.createBuffer();
 
-		mParamsSet->setParamBlockBuffer("Params", mParamBuffer);
-
 		SPtr<GpuParams> params = mParamsSet->getGpuParams();
+		params->setParamBlockBuffer("Params", mParamBuffer);
 		params->getBufferParam(GPT_FRAGMENT_PROGRAM, "gSHCoeffs", mInputBuffer);
 	}
 

+ 15 - 6
Source/RenderBeast/BsRenderCompositor.cpp

@@ -269,8 +269,13 @@ namespace bs { namespace ct
 
 			for (auto& element : inputs.scene.renderables[i]->elements)
 			{
-				if (element.perCameraBindingIdx != (UINT32)-1)
-					element.params->setParamBlockBuffer(element.perCameraBindingIdx, inputs.view.getPerViewBuffer(), true);
+				SPtr<GpuParams> gpuParams = element.params->getGpuParams();
+				for(UINT32 j = 0; j < GPT_COUNT; j++)
+				{
+					const GpuParamBinding& binding = element.perCameraBindings[j];
+					if(binding.slot != (UINT32)-1)
+						gpuParams->setParamBlockBuffer(binding.set, binding.slot, inputs.view.getPerViewBuffer());
+				}
 			}
 		}
 
@@ -961,10 +966,14 @@ namespace bs { namespace ct
 					continue;
 
 				// Note: It would be nice to be able to set this once and keep it, only updating if the buffers actually
-				// change (e.g. when growing). Although technically the internal systems should be smart enough to
-				// avoid updates unless objects actually changed.
-				if (element.gridParamsBindingIdx != (UINT32)-1)
-					element.params->setParamBlockBuffer(element.gridParamsBindingIdx, gridParams, true);
+				// change (e.g. when growing). 
+				SPtr<GpuParams> gpuParams = element.params->getGpuParams();
+				for(UINT32 j = 0; j < GPT_COUNT; j++)
+				{
+					const GpuParamBinding& binding = element.gridParamsBindings[j];
+					if (binding.slot != (UINT32)-1)
+						gpuParams->setParamBlockBuffer(binding.set, binding.slot, gridParams);
+				}
 
 				element.gridLightOffsetsAndSizeParam.set(gridLightOffsetsAndSize);
 				element.gridLightIndicesParam.set(gridLightIndices);

+ 5 - 4
Source/RenderBeast/BsRendererObject.h

@@ -7,6 +7,7 @@
 #include "Renderer/BsRenderable.h"
 #include "Renderer/BsParamBlocks.h"
 #include "Material/BsMaterialParam.h"
+#include "RenderAPI/BsGpuPipelineParamInfo.h"
 #include "BsImageBasedLighting.h"
 
 namespace bs { namespace ct
@@ -62,11 +63,11 @@ namespace bs { namespace ct
 		/** Index of the technique in the material to render the element with. */
 		UINT32 techniqueIdx;
 
-		/** Index to which should the per-camera param block buffer be bound to. */
-		UINT32 perCameraBindingIdx;
+		/** Binding indices representing where should the per-camera param block buffer be bound to. */
+		GpuParamBinding perCameraBindings[GPT_COUNT];
 
-		/** Index to which should the lights param block buffer be bound to. */
-		UINT32 gridParamsBindingIdx;
+		/** Binding indices representing where should lights param block buffer be bound to. */
+		GpuParamBinding gridParamsBindings[GPT_COUNT];
 
 		/** 
 		 * Parameter to which to bind a buffer containing light grid offsets and size, per grid cell. Used for forward

+ 2 - 2
Source/RenderBeast/BsRendererView.cpp

@@ -33,7 +33,7 @@ namespace bs { namespace ct
 		mParamBuffer = gSkyboxParamDef.createBuffer();
 
 		if(params->hasParamBlock(GPT_FRAGMENT_PROGRAM, "Params"))
-			mParamsSet->setParamBlockBuffer("Params", mParamBuffer, true);
+			params->setParamBlockBuffer("Params", mParamBuffer);
 	}
 
 	void SkyboxMat::_initVariations(ShaderVariations& variations)
@@ -44,7 +44,7 @@ namespace bs { namespace ct
 
 	void SkyboxMat::bind(const SPtr<GpuParamBlockBuffer>& perCamera)
 	{
-		mParamsSet->setParamBlockBuffer("PerCamera", perCamera, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perCamera);
 
 		gRendererUtility().setPass(mMaterial, 0);
 	}

+ 17 - 13
Source/RenderBeast/BsShadowRendering.cpp

@@ -25,14 +25,14 @@ namespace bs { namespace ct
 
 	void ShadowDepthNormalMat::bind(const SPtr<GpuParamBlockBuffer>& shadowParams)
 	{
-		mParamsSet->setParamBlockBuffer("ShadowParams", shadowParams);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("ShadowParams", shadowParams);
 
 		gRendererUtility().setPass(mMaterial);
 	}
 	
 	void ShadowDepthNormalMat::setPerObjectBuffer(const SPtr<GpuParamBlockBuffer>& perObjectParams)
 	{
-		mParamsSet->setParamBlockBuffer("PerObject", perObjectParams);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerObject", perObjectParams);
 		gRendererUtility().setPassParams(mParamsSet);
 	}
 
@@ -46,14 +46,14 @@ namespace bs { namespace ct
 
 	void ShadowDepthDirectionalMat::bind(const SPtr<GpuParamBlockBuffer>& shadowParams)
 	{
-		mParamsSet->setParamBlockBuffer("ShadowParams", shadowParams);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("ShadowParams", shadowParams);
 
 		gRendererUtility().setPass(mMaterial);
 	}
 	
 	void ShadowDepthDirectionalMat::setPerObjectBuffer(const SPtr<GpuParamBlockBuffer>& perObjectParams)
 	{
-		mParamsSet->setParamBlockBuffer("PerObject", perObjectParams);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerObject", perObjectParams);
 		gRendererUtility().setPassParams(mParamsSet);
 	}
 
@@ -71,8 +71,9 @@ namespace bs { namespace ct
 	void ShadowDepthCubeMat::bind(const SPtr<GpuParamBlockBuffer>& shadowParams, 
 		const SPtr<GpuParamBlockBuffer>& shadowCubeMatrices)
 	{
-		mParamsSet->setParamBlockBuffer("ShadowParams", shadowParams);
-		mParamsSet->setParamBlockBuffer("ShadowCubeMatrices", shadowCubeMatrices);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("ShadowParams", shadowParams);
+		gpuParams->setParamBlockBuffer("ShadowCubeMatrices", shadowCubeMatrices);
 
 		gRendererUtility().setPass(mMaterial);
 	}
@@ -80,8 +81,9 @@ namespace bs { namespace ct
 	void ShadowDepthCubeMat::setPerObjectBuffer(const SPtr<GpuParamBlockBuffer>& perObjectParams,
 		const SPtr<GpuParamBlockBuffer>& shadowCubeMasks)
 	{
-		mParamsSet->setParamBlockBuffer("PerObject", perObjectParams);
-		mParamsSet->setParamBlockBuffer("ShadowCubeMasks", shadowCubeMasks);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("PerObject", perObjectParams);
+		gpuParams->setParamBlockBuffer("ShadowCubeMasks", shadowCubeMasks);
 
 		gRendererUtility().setPassParams(mParamsSet);
 	}
@@ -129,7 +131,7 @@ namespace bs { namespace ct
 		Vector4 lightPosAndScale(0, 0, 0, 1);
 		gShadowProjectVertParamsDef.gPositionAndScale.set(mVertParams, lightPosAndScale);
 
-		mParamsSet->setParamBlockBuffer("PerCamera", perCamera);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perCamera);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
@@ -237,8 +239,9 @@ namespace bs { namespace ct
 		mShadowMapParam.set(params.shadowMap, surface);
 		mShadowSamplerParam.set(mSamplerState);
 
-		mParamsSet->setParamBlockBuffer("Params", params.shadowParams);
-		mParamsSet->setParamBlockBuffer("PerCamera", params.perCamera);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Params", params.shadowParams);
+		gpuParams->setParamBlockBuffer("PerCamera", params.perCamera);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
@@ -359,8 +362,9 @@ namespace bs { namespace ct
 		mShadowMapParam.set(params.shadowMap);
 		mShadowSamplerParam.set(mSamplerState);
 
-		mParamsSet->setParamBlockBuffer("Params", params.shadowParams);
-		mParamsSet->setParamBlockBuffer("PerCamera", params.perCamera);
+		SPtr<GpuParams> gpuParams = mParamsSet->getGpuParams();
+		gpuParams->setParamBlockBuffer("Params", params.shadowParams);
+		gpuParams->setParamBlockBuffer("PerCamera", params.perCamera);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);

+ 4 - 4
Source/RenderBeast/BsStandardDeferredLighting.cpp

@@ -45,12 +45,12 @@ namespace bs { namespace ct {
 
 		mGBufferParams.bind(gBufferInput);
 		mLightOcclusionTexParam.set(lightOcclusion);
-		mParamsSet->setParamBlockBuffer("PerCamera", perCamera, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perCamera);
 	}
 
 	void DirectionalLightMat::setPerLightParams(const SPtr<GpuParamBlockBuffer>& perLight)
 	{
-		mParamsSet->setParamBlockBuffer("PerLight", perLight, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerLight", perLight);
 		
 		gRendererUtility().setPassParams(mParamsSet);
 	}
@@ -125,12 +125,12 @@ namespace bs { namespace ct {
 
 		mGBufferParams.bind(gBufferInput);
 		mLightOcclusionTexParam.set(lightOcclusion);
-		mParamsSet->setParamBlockBuffer("PerCamera", perCamera, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerCamera", perCamera);
 	}
 
 	void PointLightMat::setPerLightParams(const SPtr<GpuParamBlockBuffer>& perLight)
 	{
-		mParamsSet->setParamBlockBuffer("PerLight", perLight, true);
+		mParamsSet->getGpuParams()->setParamBlockBuffer("PerLight", perLight);
 		
 		gRendererUtility().setPassParams(mParamsSet);
 	}