Ver código fonte

Adding blocks to Material

Panagiotis Christopoulos Charitos 13 anos atrás
pai
commit
d7fda101f7

+ 1 - 1
CMakeLists.txt

@@ -138,7 +138,7 @@ ADD_DEFINITIONS("-Dthread_local=__thread")
 #
 # Compiler flags
 #
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors -pedantic -ansi -Wall -W -Wextra -Wwrite-strings -Wno-unused -Wundef -Wunused-variable -Wstrict-aliasing=1 -Wstrict-overflow=5 -Werror -msse4 -std=c++11")
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors -pedantic -ansi -Wall -W -Wextra -Wwrite-strings -Wno-unused -Wundef -Wunused-variable -Werror -msse4 -std=c++11")
 
 IF(CMAKE_BUILD_TYPE STREQUAL Debug)
 	# Removed because they do not work with boost::regexpr and who knows what

+ 14 - 5
include/anki/resource/Material.h

@@ -18,6 +18,7 @@ class ShaderProgram;
 class ShaderProgramUniformVariable;
 class XmlElement;
 class MaterialShaderProgramCreator;
+class ShaderProgramUniformBlock;
 
 // A few consts
 const U32 MATERIAL_MAX_PASSES = 4;
@@ -47,9 +48,9 @@ public:
 	/// @{
 	MaterialVariable(
 		const char* shaderProgVarName,
-		PassLevelToShaderProgramHashMap& sProgs)
+		PassLevelToShaderProgramHashMap& progs)
 	{
-		init(shaderProgVarName, sProgs);
+		init(shaderProgVarName, progs);
 	}
 
 	virtual ~MaterialVariable();
@@ -112,8 +113,8 @@ public:
 	/// @{
 	MaterialVariableTemplate(
 		const char* shaderProgVarName,
-		PassLevelToShaderProgramHashMap& sProgs)
-		: MaterialVariable(shaderProgVarName, sProgs)
+		PassLevelToShaderProgramHashMap& progs)
+		: MaterialVariable(shaderProgVarName, progs)
 	{
 		setupVisitable(&data);
 	}
@@ -314,6 +315,11 @@ public:
 	{
 		return vars;
 	}
+
+	const ShaderProgramUniformBlock* getCommonUniformBlock() const
+	{
+		return commonUniformBlock;
+	}
 	/// @}
 
 	const ShaderProgram& findShaderProgram(const PassLevelKey& key) const
@@ -354,11 +360,14 @@ private:
 	/// The most important aspect of materials. These are all the shader
 	/// programs per level and per pass. Their number are NP * NL where
 	/// NP is the number of passes and NL the number of levels of detail
-	ShaderPrograms sProgs;
+	ShaderPrograms progs;
 
 	/// For searching
 	PassLevelToShaderProgramHashMap eSProgs;
 
+	/// One uniform block
+	const ShaderProgramUniformBlock* commonUniformBlock;
+
 	/// Parse what is within the @code <material></material> @endcode
 	void parseMaterialTag(const XmlElement& el);
 

+ 15 - 6
src/resource/Material.cpp

@@ -84,13 +84,13 @@ const std::string& MaterialVariable::getName() const
 
 //==============================================================================
 void MaterialVariable::init(const char* shaderProgVarName,
-	PassLevelToShaderProgramHashMap& sProgs)
+	PassLevelToShaderProgramHashMap& progs)
 {
 	oneSProgVar = NULL;
 
 	// For all programs
-	PassLevelToShaderProgramHashMap::iterator it = sProgs.begin();
-	for(; it != sProgs.end(); ++it)
+	PassLevelToShaderProgramHashMap::iterator it = progs.begin();
+	for(; it != progs.end(); ++it)
 	{
 		const ShaderProgram& sProg = *(it->second);
 		const PassLevelKey& key = it->first;
@@ -143,7 +143,6 @@ Material::~Material()
 //==============================================================================
 void Material::load(const char* filename)
 {
-	ANKI_LOGI(filename);
 	fname = filename;
 	try
 	{
@@ -261,7 +260,7 @@ void Material::parseMaterialTag(const XmlElement& materialEl)
 
 			ShaderProgram* sprog = pptr->get();
 
-			sProgs.push_back(pptr);
+			progs.push_back(pptr);
 
 			eSProgs[PassLevelKey(pid, level)] = sprog;
 		}
@@ -304,15 +303,25 @@ std::string Material::createShaderProgSourceToCache(const std::string& source)
 //==============================================================================
 void Material::populateVariables(const MaterialShaderProgramCreator& mspc)
 {
+	const char* blockName = "commonBlock";
+
+	// Get default block
+	commonUniformBlock = (*progs[0])->tryFindUniformBlock(blockName);
+
 	// Get all names of all the uniforms. Dont duplicate
 	//
 	std::map<std::string, GLenum> allVarNames;
 
-	for(const ShaderProgramResourcePointer* sProg : sProgs)
+	for(const ShaderProgramResourcePointer* sProg : progs)
 	{
 		for(const ShaderProgramUniformVariable& v :
 			(*sProg)->getUniformVariables())
 		{
+			const ShaderProgramUniformBlock* bl = v.getUniformBlock();
+			(void)bl; // Make compiler happy
+			ANKI_ASSERT(bl == nullptr || v.getGlDataType() == GL_SAMPLER_2D);
+			ANKI_ASSERT(bl == nullptr || bl->getName() == blockName);
+
 			allVarNames[v.getName()] = v.getGlDataType();
 		}
 	}

+ 3 - 3
src/resource/MaterialShaderProgramCreator.cpp

@@ -34,7 +34,7 @@ void MaterialShaderProgramCreator::parseShaderProgramTag(
 
 	// Create block
 	StringList block;
-	block.push_back("/*layout(std140, row_major, binding = 0) "
+	block.push_back("layout(std140, row_major, binding = 0) "
 		"uniform commonBlock\n{");
 	for(Input* in : inputs)
 	{
@@ -46,7 +46,7 @@ void MaterialShaderProgramCreator::parseShaderProgramTag(
 
 		block.push_back("\tuniform " + in->type + " " + in->name + "_;");
 	}
-	block.push_back("};*/\n");
+	block.push_back("};\n");
 
 	if(block.size() > 2)
 	{
@@ -153,7 +153,7 @@ void MaterialShaderProgramCreator::parseInputTag(
 
 	if(inpvar->const_ == false)
 	{
-		line = "uniform " + inpvar->type + " " + inpvar->name + ";";
+		//line = "uniform " + inpvar->type + " " + inpvar->name + ";";
 	}
 	else
 	{