Browse Source

shaderc: Added SPIR-V uniform buffer size.

Branimir Karadžić 7 years ago
parent
commit
fc87e05199
2 changed files with 21 additions and 27 deletions
  1. 2 14
      src/renderer_vk.cpp
  2. 19 13
      tools/shaderc/shaderc_spirv.cpp

+ 2 - 14
src/renderer_vk.cpp

@@ -3569,20 +3569,6 @@ VK_DESTROY
 		m_attrMask[Attrib::Color0]   = UINT16_MAX;
 		m_attrMask[Attrib::Color0]   = UINT16_MAX;
 		iohash = 0;
 		iohash = 0;
 
 
-		if (BGFX_CHUNK_MAGIC_VSH == magic)
-		{
-			m_predefined[0].m_loc   = 0;
-			m_predefined[0].m_count = 4;
-			m_predefined[0].m_type  = uint8_t(PredefinedUniform::ModelViewProj);
-			m_numPredefined = 1;
-			m_size = 64;
-		}
-		else
-		{
-			m_size = 0;
-			m_numPredefined = 0;
-		}
-
 		uint8_t numAttrs = 0;
 		uint8_t numAttrs = 0;
 //		bx::read(&reader, numAttrs);
 //		bx::read(&reader, numAttrs);
 //
 //
@@ -3606,6 +3592,8 @@ VK_DESTROY
 		murmur.add(numAttrs);
 		murmur.add(numAttrs);
 		murmur.add(m_attrMask, numAttrs);
 		murmur.add(m_attrMask, numAttrs);
 		m_hash = murmur.end();
 		m_hash = murmur.end();
+
+		bx::read(&reader, m_size);
 	}
 	}
 
 
 	void ShaderVK::destroy()
 	void ShaderVK::destroy()

+ 19 - 13
tools/shaderc/shaderc_spirv.cpp

@@ -570,7 +570,6 @@ namespace bgfx { namespace spirv
 			);
 			);
 		bool linked = false;
 		bool linked = false;
 		bool validated = true;
 		bool validated = true;
-		bool optimized = true;
 
 
 		if (!compiled)
 		if (!compiled)
 		{
 		{
@@ -625,6 +624,8 @@ namespace bgfx { namespace spirv
 			}
 			}
 			else
 			else
 			{
 			{
+				uint16_t size = 0;
+
 				program->buildReflection();
 				program->buildReflection();
 				{
 				{
 					uint16_t count = (uint16_t)program->getNumLiveUniformVariables();
 					uint16_t count = (uint16_t)program->getNumLiveUniformVariables();
@@ -635,6 +636,11 @@ namespace bgfx { namespace spirv
 					{
 					{
 						Uniform un;
 						Uniform un;
 						un.name = program->getUniformName(ii);
 						un.name = program->getUniformName(ii);
+
+						un.num = uint8_t(program->getUniformArraySize(ii) );
+						un.regIndex = 0;
+						un.regCount = un.num;
+
 						switch (program->getUniformType(ii))
 						switch (program->getUniformType(ii))
 						{
 						{
 						case 0x1404: // GL_INT:
 						case 0x1404: // GL_INT:
@@ -645,17 +651,18 @@ namespace bgfx { namespace spirv
 							break;
 							break;
 						case 0x8B5B: // GL_FLOAT_MAT3:
 						case 0x8B5B: // GL_FLOAT_MAT3:
 							un.type = UniformType::Mat3;
 							un.type = UniformType::Mat3;
+							un.regCount *= 3;
 							break;
 							break;
 						case 0x8B5C: // GL_FLOAT_MAT4:
 						case 0x8B5C: // GL_FLOAT_MAT4:
 							un.type = UniformType::Mat4;
 							un.type = UniformType::Mat4;
+							un.regCount *= 4;
 							break;
 							break;
 						default:
 						default:
 							un.type = UniformType::End;
 							un.type = UniformType::End;
 							break;
 							break;
 						}
 						}
-						un.num = uint8_t(program->getUniformArraySize(ii) );
-						un.regIndex = 0;
-						un.regCount = un.num;
+
+						size += un.regCount*16;
 
 
 						uint8_t nameSize = (uint8_t)un.name.size();
 						uint8_t nameSize = (uint8_t)un.name.size();
 						bx::write(_writer, nameSize);
 						bx::write(_writer, nameSize);
@@ -694,14 +701,13 @@ namespace bgfx { namespace spirv
 				bx::MemoryReader reader(spirv.data(), uint32_t(spirv.size()*4) );
 				bx::MemoryReader reader(spirv.data(), uint32_t(spirv.size()*4) );
 				disassemble(writer, &reader, &err);
 				disassemble(writer, &reader, &err);
 
 
-				if (optimized)
-				{
-					uint32_t shaderSize = (uint32_t)spirv.size()*sizeof(uint32_t);
-					bx::write(_writer, shaderSize);
-					bx::write(_writer, spirv.data(), shaderSize);
-					uint8_t nul = 0;
-					bx::write(_writer, nul);
-				}
+				uint32_t shaderSize = (uint32_t)spirv.size()*sizeof(uint32_t);
+				bx::write(_writer, shaderSize);
+				bx::write(_writer, spirv.data(), shaderSize);
+				uint8_t nul = 0;
+				bx::write(_writer, nul);
+
+				bx::write(_writer, size);
 			}
 			}
 		}
 		}
 
 
@@ -710,7 +716,7 @@ namespace bgfx { namespace spirv
 
 
 		glslang::FinalizeProcess();
 		glslang::FinalizeProcess();
 
 
-		return compiled && linked && validated && optimized;
+		return compiled && linked && validated;
 	}
 	}
 
 
 } // namespace spirv
 } // namespace spirv