瀏覽代碼

Fixing issues with GLSL parsing for Vulkan

BearishSun 9 年之前
父節點
當前提交
31962e5dfc

+ 12 - 0
Source/BansheeCore/Include/BsGpuPipelineState.h

@@ -227,9 +227,15 @@ namespace bs
 		GraphicsPipelineStateCore(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask);
 		virtual ~GraphicsPipelineStateCore() { }
 
+		/** @copydoc CoreObjectCore::initialize() */
+		void initialize() override;
+
 		/** @copydoc RenderStateCoreManager::createGraphicsPipelineState */
 		static SPtr<GraphicsPipelineStateCore> create(const PIPELINE_STATE_CORE_DESC& desc, 
 			GpuDeviceFlags deviceMask = GDF_DEFAULT);
+
+	protected:
+		GpuDeviceFlags mDeviceMask;
 	};
 
 	/** Core thread version of a ComputePipelineState. */
@@ -239,9 +245,15 @@ namespace bs
 		ComputePipelineStateCore(const SPtr<GpuProgramCore>& program, GpuDeviceFlags deviceMask);
 		virtual ~ComputePipelineStateCore() { }
 
+		/** @copydoc CoreObjectCore::initialize() */
+		void initialize() override;
+
 		/** @copydoc RenderStateCoreManager::createComputePipelineState */
 		static SPtr<ComputePipelineStateCore> create(const SPtr<GpuProgramCore>& program,
 			GpuDeviceFlags deviceMask = GDF_DEFAULT);
+
+	protected:
+		GpuDeviceFlags mDeviceMask;
 	};
 
 	/** @} */

+ 25 - 15
Source/BansheeCore/Source/BsGpuPipelineState.cpp

@@ -37,25 +37,30 @@ namespace bs
 	template class TGraphicsPipelineState < true >;
 
 	GraphicsPipelineStateCore::GraphicsPipelineStateCore(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask)
-		:TGraphicsPipelineState(desc)
+		:TGraphicsPipelineState(desc), mDeviceMask(deviceMask)
+	{ }
+
+	void GraphicsPipelineStateCore::initialize()
 	{
 		GPU_PIPELINE_PARAMS_DESC paramsDesc;
-		if (desc.vertexProgram != nullptr)
-			paramsDesc.vertexParams = desc.vertexProgram->getParamDesc();
+		if (mData.vertexProgram != nullptr)
+			paramsDesc.vertexParams = mData.vertexProgram->getParamDesc();
 
-		if (desc.fragmentProgram != nullptr)
-			paramsDesc.fragmentParams = desc.fragmentProgram->getParamDesc();
+		if (mData.fragmentProgram != nullptr)
+			paramsDesc.fragmentParams = mData.fragmentProgram->getParamDesc();
 
-		if (desc.geometryProgram != nullptr)
-			paramsDesc.geometryParams = desc.geometryProgram->getParamDesc();
+		if (mData.geometryProgram != nullptr)
+			paramsDesc.geometryParams = mData.geometryProgram->getParamDesc();
 
-		if (desc.hullProgram != nullptr)
-			paramsDesc.hullParams = desc.hullProgram->getParamDesc();
+		if (mData.hullProgram != nullptr)
+			paramsDesc.hullParams = mData.hullProgram->getParamDesc();
 
-		if (desc.domainProgram != nullptr)
-			paramsDesc.domainParams = desc.domainProgram->getParamDesc();
+		if (mData.domainProgram != nullptr)
+			paramsDesc.domainParams = mData.domainProgram->getParamDesc();
 
-		mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, deviceMask);
+		mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, mDeviceMask);
+
+		CoreObjectCore::initialize();
 	}
 
 	SPtr<GraphicsPipelineStateCore> GraphicsPipelineStateCore::create(const PIPELINE_STATE_CORE_DESC& desc, GpuDeviceFlags deviceMask)
@@ -131,12 +136,17 @@ namespace bs
 	template class TComputePipelineState < true >;
 
 	ComputePipelineStateCore::ComputePipelineStateCore(const SPtr<GpuProgramCore>& program, GpuDeviceFlags deviceMask)
-		:TComputePipelineState(program)
+		:TComputePipelineState(program), mDeviceMask(deviceMask)
+	{ }
+
+	void ComputePipelineStateCore::initialize()
 	{
 		GPU_PIPELINE_PARAMS_DESC paramsDesc;
-		paramsDesc.computeParams = program->getParamDesc();
+		paramsDesc.computeParams = mProgram->getParamDesc();
+
+		mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, mDeviceMask);
 
-		mParamInfo = GpuPipelineParamInfoCore::create(paramsDesc, deviceMask);
+		CoreObjectCore::initialize();
 	}
 
 	SPtr<ComputePipelineStateCore> ComputePipelineStateCore::create(const SPtr<GpuProgramCore>& program, 

+ 9 - 2
Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuPipelineState.cpp

@@ -101,6 +101,8 @@ namespace bs
 	{
 		Lock(mMutex);
 
+		GraphicsPipelineStateCore::initialize();
+
 		std::pair<VkShaderStageFlagBits, GpuProgramCore*> stages[] =
 			{ 
 				{ VK_SHADER_STAGE_VERTEX_BIT, mData.vertexProgram.get() },
@@ -320,7 +322,6 @@ namespace bs
 		}
 
 		BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_PipelineState);
-		GraphicsPipelineStateCore::initialize();
 	}
 
 	VulkanPipeline* VulkanGraphicsPipelineStateCore::getPipeline(
@@ -515,6 +516,13 @@ namespace bs
 
 	void VulkanComputePipelineStateCore::initialize()
 	{
+		ComputePipelineStateCore::initialize();
+
+		// This might happen fairly often if shaders with unsupported languages are loaded, in which case the pipeline
+		// will never get used, and its fine not to initialize it.
+		if (!mProgram->isCompiled())
+			return;
+
 		VulkanGpuProgramCore* vkProgram = static_cast<VulkanGpuProgramCore*>(mProgram.get());
 
 		VkPipelineShaderStageCreateInfo stageCI;
@@ -582,7 +590,6 @@ namespace bs
 		}
 
 		BS_INC_RENDER_STAT_CAT(ResCreated, RenderStatObject_PipelineState);
-		ComputePipelineStateCore::initialize();
 	}
 
 	VulkanPipeline* VulkanComputePipelineStateCore::getPipeline(UINT32 deviceIdx) const

+ 11 - 2
Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuProgram.cpp

@@ -13,6 +13,7 @@
 #include "BsFileSystem.h"
 #include "BsDataStream.h"
 
+#define AMD_EXTENSIONS
 #include "glslang/Public/ShaderLang.h"
 #include "glslang/Include/Types.h"
 #include "SPIRV/GlslangToSpv.h"
@@ -194,6 +195,14 @@ namespace bs
 				case 4:		return GPDT_INT4;
 				default:	return GPDT_UNKNOWN;
 				}
+			case glslang::EbtUint:
+				switch (vectorSize)
+				{
+				case 2:		return GPDT_INT2;
+				case 3:		return GPDT_INT3;
+				case 4:		return GPDT_INT4;
+				default:	return GPDT_UNKNOWN;
+				}
 			default:        
 				return GPDT_UNKNOWN;
 			}
@@ -242,6 +251,7 @@ namespace bs
 			{
 			case glslang::EbtFloat:     return GPDT_FLOAT1;
 			case glslang::EbtInt:       return GPDT_INT1;
+			case glslang::EbtUint:      return GPDT_INT1;
 			case glslang::EbtBool:      return GPDT_BOOL;
 			default:					return GPDT_UNKNOWN;
 			}
@@ -368,7 +378,6 @@ namespace bs
 
 			const char* name = program->getUniformBlockName(i);
 			int size = program->getUniformBlockSize(i); 
-			int index = program->getUniformBlockIndex(i);
 
 			GpuParamBlockDesc param;
 			param.name = name;
@@ -381,7 +390,7 @@ namespace bs
 				param.set = 0;
 
 			desc.paramBlocks[name] = param;
-			uniformBlockMap[index] = name;
+			uniformBlockMap[i] = name;
 		}
 
 		// Parse individual uniforms