瀏覽代碼

Fixing some bugs in automatic instancing

Panagiotis Christopoulos Charitos 10 年之前
父節點
當前提交
fd70c6e1d7

+ 2 - 2
include/anki/resource/MaterialLoader.h

@@ -141,7 +141,7 @@ public:
 		return m_blockSize;
 	}
 
-	Bool getInstancingEnabled() const
+	Bool isInstanced() const
 	{
 		return m_instanced;
 	}
@@ -173,7 +173,7 @@ private:
 	ShaderTypeBit m_instanceIdMask = ShaderTypeBit::NONE;
 	Bool8 m_tessellation = false;
 	U8 m_lodCount = 0;
-	Bool8 m_shadow = false;
+	Bool8 m_shadow = true;
 	Bool8 m_forwardShading = false;
 	U32 m_nextIndex = 0;
 

+ 1 - 1
shaders/FsCommonFrag.glsl

@@ -9,7 +9,7 @@
 #pragma anki include "shaders/LinearDepth.glsl"
 
 // Global resources
-layout(TEX_BINDING(1, 0)) uniform sampler2D anki_u_msDepthRt;
+layout(TEX_BINDING(1, 0)) uniform sampler2D anki_msDepthRt;
 #define LIGHT_SET 1
 #define LIGHT_SS_BINDING 0
 #define LIGHT_TEX_BINDING 1

+ 24 - 24
shaders/MsCommonVert.glsl

@@ -8,15 +8,15 @@
 //
 // Attributes
 //
-layout(location = POSITION_LOCATION) in highp vec3 inPosition;
-layout(location = TEXTURE_COORDINATE_LOCATION) in mediump vec2 inTexCoord;
+layout(location = POSITION_LOCATION) in highp vec3 in_position;
+layout(location = TEXTURE_COORDINATE_LOCATION) in mediump vec2 in_uv;
 
 #if PASS == COLOR || TESSELLATION
-layout(location = NORMAL_LOCATION) in mediump vec4 inNormal;
+layout(location = NORMAL_LOCATION) in mediump vec4 in_normal;
 #endif
 
 #if PASS == COLOR
-layout(location = TANGENT_LOCATION) in mediump vec4 inTangent;
+layout(location = TANGENT_LOCATION) in mediump vec4 in_tangent;
 #endif
 
 //
@@ -27,71 +27,71 @@ out gl_PerVertex
 	vec4 gl_Position;
 };
 
-layout(location = 0) out mediump vec2 outTexCoords;
+layout(location = 0) out mediump vec2 out_uv;
 
 #if PASS == COLOR || TESSELLATION
-layout(location = 1) out mediump vec3 outNormal;
+layout(location = 1) out mediump vec3 out_normal;
 #endif
 
 #if PASS == COLOR
-layout(location = 2) out mediump vec4 outTangent;
+layout(location = 2) out mediump vec4 out_tangent;
 
 // For env mapping. AKA view vector
-layout(location = 3) out mediump vec3 outVertPosViewSpace;
+layout(location = 3) out mediump vec3 out_vertPosViewSpace;
 #endif
 
 #if INSTANCE_ID_FRAGMENT_SHADER
-layout(location = 4) flat out uint outInstanceId;
+layout(location = 4) flat out uint out_instanceId;
 #endif
 
 //==============================================================================
-#define writePositionTexCoord_DEFINED
-void writePositionTexCoord(in mat4 mvp)
+#define writePositionAndUv_DEFINED
+void writePositionAndUv(in mat4 mvp)
 {
 #if PASS == DEPTH && LOD > 0
 	// No tex coords for you
 #else
-	outTexCoords = inTexCoord;
+	out_uv = in_uv;
 #endif
 
 #if TESSELLATION
-	gl_Position = vec4(inPosition, 1.0);
+	gl_Position = vec4(in_position, 1.0);
 #else
-	gl_Position = mvp * vec4(inPosition, 1.0);
+	gl_Position = mvp * vec4(in_position, 1.0);
 #endif
 }
 
 //==============================================================================
-#define writePositionNormalTangentTexCoord_DEFINED
-void writePositionNormalTangentTexCoord(in mat4 mvp, in mat3 normalMat)
+#if PASS == COLOR
+#define writeNormalAndTangent_DEFINED
+void writeNormalAndTangent(in mat3 normalMat)
 {
 
 #if TESSELLATION
 
 	// Passthrough
-	outNormal = inNormal.xyz;
+	out_normal = in_normal.xyz;
 #	if PASS == COLOR
-	outTangent = inTangent;
+	out_tangent = in_tangent;
 #	endif
 
 #else
 
 #	if PASS == COLOR
-	outNormal = normalMat * inNormal.xyz;
-	outTangent.xyz = normalMat * inTangent.xyz;
-	outTangent.w = inTangent.w;
+	out_normal = normalMat * in_normal.xyz;
+	out_tangent.xyz = normalMat * in_tangent.xyz;
+	out_tangent.w = in_tangent.w;
 #	endif
 
 #endif
-
-	writePositionTexCoord(mvp);
 }
+#endif
 
 //==============================================================================
 #if PASS == COLOR
 #define writeVertPosViewSpace_DEFINED
 void writeVertPosViewSpace(in mat4 modelViewMat)
 {
-	outVertPosViewSpace = vec3(modelViewMat * vec4(inPosition, 1.0));
+	out_vertPosViewSpace = vec3(modelViewMat * vec4(in_position, 1.0));
 }
 #endif

+ 1 - 1
src/gr/gl/CommandBuffer.cpp

@@ -332,7 +332,7 @@ public:
 void CommandBuffer::updateDynamicUniformsInternal(U32 originalSize, void*& data)
 {
 	ANKI_ASSERT(originalSize > 0);
-	ANKI_ASSERT(originalSize <= 1024 * 4 && "Too high?");
+	ANKI_ASSERT(originalSize <= 1024 * 8 && "Too high?");
 
 	// Will be used in a thread safe way
 	GlState& state =

+ 13 - 11
src/renderer/Drawer.cpp

@@ -317,6 +317,13 @@ Error RenderableDrawer::renderSingle(RenderContext& ctx)
 	// Get components
 	const RenderComponent& renderable =
 		ctx.m_visibleNode->m_node->getComponent<RenderComponent>();
+	const Material& mtl = renderable.getMaterial();
+
+	if((ctx.m_stage == RenderingStage::BLEND && !mtl.getForwardShading())
+		|| (ctx.m_stage == RenderingStage::MATERIAL && mtl.getForwardShading()))
+	{
+		return ErrorCode::NONE;
+	}
 
 	// Check if it can merge drawcalls
 	if(ctx.m_nextVisibleNode)
@@ -339,14 +346,6 @@ Error RenderableDrawer::renderSingle(RenderContext& ctx)
 		}
 	}
 
-	const Material& mtl = renderable.getMaterial();
-
-	if((ctx.m_stage == RenderingStage::BLEND && !mtl.getForwardShading())
-		|| (ctx.m_stage == RenderingStage::MATERIAL && mtl.getForwardShading()))
-	{
-		ANKI_ASSERT(0);
-	}
-
 	// Stash the transform
 	{
 		Bool hasTransform;
@@ -360,12 +359,11 @@ Error RenderableDrawer::renderSingle(RenderContext& ctx)
 	}
 
 	// Calculate the key
-	RenderingKey key;
-
 	Vec4 camPos = ctx.m_frc->getFrustumOrigin();
 	F32 dist = (ctx.m_visibleNode->m_node->getComponent<SpatialComponent>().
 		getSpatialOrigin() - camPos).getLength();
 	F32 flod = m_r->calculateLod(dist);
+	flod = min<F32>(flod, MAX_LODS - 1);
 	ctx.m_flod = flod;
 
 	RenderingBuildInfo build;
@@ -384,7 +382,7 @@ Error RenderableDrawer::renderSingle(RenderContext& ctx)
 	}
 
 	// Enqueue uniform state updates
-	setupUniforms(ctx, renderable, key);
+	setupUniforms(ctx, renderable, build.m_key);
 
 	// Enqueue vertex, program and drawcall
 	build.m_subMeshIndicesArray = &ctx.m_visibleNode->m_spatialIndices[0];
@@ -394,6 +392,10 @@ Error RenderableDrawer::renderSingle(RenderContext& ctx)
 	ANKI_CHECK(renderable.buildRendering(build));
 
 	// Rendered something, reset the cached transforms
+	if(ctx.m_cachedTrfCount > 1)
+	{
+		ANKI_COUNTER_INC(RENDERER_MERGED_DRAWCALLS, ctx.m_cachedTrfCount - 1);
+	}
 	ctx.m_cachedTrfCount = 0;
 
 	return ErrorCode::NONE;

+ 10 - 1
src/resource/Material.cpp

@@ -148,6 +148,9 @@ Error MaterialVariant::init(const RenderingKey& key2, Material& mtl,
 {
 	RenderingKey key = key2;
 
+	m_varActive.create(mtl.getAllocator(), mtl.m_vars.getSize());
+	m_blockInfo.create(mtl.getAllocator(), mtl.m_vars.getSize());
+
 	// Disable tessellation under some keys
 	if(key.m_tessellation)
 	{
@@ -246,6 +249,10 @@ Material::~Material()
 {
 	auto alloc = getAllocator();
 
+	for(MaterialVariant& var : m_variants)
+	{
+		var.destroy(alloc);
+	}
 	m_variants.destroy(alloc);
 
 	for(MaterialVariable* var : m_vars)
@@ -269,6 +276,7 @@ Error Material::load(const ResourceFilename& filename)
 	m_shadow = loader.getShadowEnabled();
 	m_forwardShading = loader.isForwardShading();
 	m_tessellation = loader.getTessellationEnabled();
+	m_instanced = loader.isInstanced();
 
 	// Start initializing
 	ANKI_CHECK(createVars(loader));
@@ -447,7 +455,8 @@ void Material::fillResourceGroupInitializer(ResourceGroupInitializer& rcinit)
 //==============================================================================
 const MaterialVariant& Material::getVariant(const RenderingKey& key) const
 {
-	U16 idx = m_variantMatrix[U(key.m_pass)][key.m_lod][key.m_tessellation][
+	U lod = min<U>(m_lodCount - 1, key.m_lod);
+	U16 idx = m_variantMatrix[U(key.m_pass)][lod][key.m_tessellation][
 		getInstanceGroupIdx(key.m_instanceCount)];
 
 	ANKI_ASSERT(idx != MAX_U16);

+ 8 - 2
src/resource/MaterialLoader.cpp

@@ -580,6 +580,12 @@ Error MaterialLoader::parseInputsTag(const XmlElement& programEl)
 		{
 			ANKI_CHECK(el.getText(cstr));
 
+			if(!cstr)
+			{
+				ANKI_LOGE("Value tag is empty for: %s", &in.m_name[0]);
+				return ErrorCode::USER_DATA;
+			}
+
 			if(in.m_flags.m_builtin)
 			{
 				ANKI_LOGE("Builtins cannot have value: %s", &in.m_name[0]);
@@ -702,8 +708,8 @@ void MaterialLoader::processInputs()
 					in.m_binding = m_texBinding++;
 
 					in.m_line.sprintf(
-						m_alloc, "layout(TEX_BINDING(0, %u)) uniform tex%u",
-						in.m_binding, in.m_binding);
+						m_alloc, "layout(TEX_BINDING(0, %u)) uniform %s tex%u;",
+						in.m_binding, &in.typeStr()[0], in.m_binding);
 				}
 			}
 			else if(in.m_flags.m_inBlock)

+ 4 - 1
src/scene/RenderComponent.cpp

@@ -31,7 +31,10 @@ struct CreateNewRenderComponentVariableVisitor
 		RenderComponentVariableTemplate<Type>* rvar =
 			m_alloc.newInstance<RenderComponentVariableTemplate<Type>>(m_mvar);
 
-		rvar->setValue(mvart.getValue());
+		if(mvart.getBuiltin() == BuiltinMaterialVariableId::NONE)
+		{
+			rvar->setValue(mvart.getValue());
+		}
 
 		(*m_vars)[m_count++] = rvar;
 		return ErrorCode::NONE;

+ 1 - 1
testapp/Main.cpp

@@ -43,7 +43,7 @@ App* app;
 ModelNode* horse;
 PerspectiveCamera* cam;
 
-#define PLAYER 1
+#define PLAYER 0
 #define MOUSE 1
 
 Bool profile = false;

+ 6 - 2
tools/scene/Exporter.cpp

@@ -823,8 +823,9 @@ void Exporter::visitNode(const aiNode* ainode)
 		}
 
 		// Find if there is another node with the same mesh-material-group pair
-		std::vector<Node>::iterator it;
-		for(it = m_nodes.begin(); it != m_nodes.end(); ++it)
+		std::vector<Node>::iterator it = m_nodes.begin();
+#if 0
+		for(; it != m_nodes.end(); ++it)
 		{
 			const Node& node = *it;
 			const Model& model = m_models[node.m_modelIndex];
@@ -837,6 +838,9 @@ void Exporter::visitNode(const aiNode* ainode)
 				break;
 			}
 		}
+#else
+	it = m_nodes.end();
+#endif
 
 		if(it != m_nodes.end())
 		{

+ 10 - 4
tools/scene/templates/simpleVert.h

@@ -5,16 +5,22 @@ R"(		<program>
 			</includes>
 
 			<inputs>
-				<input><type>mat4</type><name>uMvp</name><value></value><instanced>%instanced%</instanced><arraySize>%arraySize%</arraySize></input>
-				<input><type>mat3</type><name>uN</name><value></value><instanced>%instanced%</instanced><arraySize>%arraySize%</arraySize></input>
+				<input><type>mat4</type><name>anki_mvp</name></input>
+				<input><type>mat3</type><name>anki_n</name><inShadow>0</inShadow></input>
 			</inputs>
 
 			<operations>
+				<operation>
+					<id>0</id>
+					<returnType>void</returnType>
+					<function>writePositionAndUv</function>
+					<arguments><argument>anki_mvp</argument></arguments>
+				</operation>
 				<operation>
 					<id>1</id>
 					<returnType>void</returnType>
-					<function>writePositionNormalTangentTexCoord</function>
-					<arguments><argument>uMvp</argument><argument>uN</argument></arguments>
+					<function>writeNormalAndTangent</function>
+					<arguments><argument>anki_n</argument></arguments>
 				</operation>
 			</operations>
 		</program>)"