Browse Source

Write the new ModelResource

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
4d42842ef3

+ 5 - 0
AnKi/Resource/MaterialResource.cpp

@@ -697,6 +697,11 @@ const MaterialVariant& MaterialResource::getOrCreateVariant(const RenderingKey&
 
 	variant.m_prog = progVariant->getProgram();
 
+	if(!!(RenderingTechniqueBit(1 << key.getRenderingTechnique()) & RenderingTechniqueBit::ANY_RT))
+	{
+		variant.m_rtShaderGroupHandleIndex = progVariant->getShaderGroupHandleIndex();
+	}
+
 	return variant;
 }
 

+ 12 - 0
AnKi/Resource/MaterialResource.h

@@ -160,8 +160,15 @@ public:
 		return m_prog;
 	}
 
+	U32 getRtShaderGroupHandleIndex() const
+	{
+		ANKI_ASSERT(m_rtShaderGroupHandleIndex != MAX_U32);
+		return m_rtShaderGroupHandleIndex;
+	}
+
 private:
 	ShaderProgramPtr m_prog;
+	U32 m_rtShaderGroupHandleIndex = MAX_U32;
 };
 
 /// Material resource.
@@ -211,6 +218,11 @@ public:
 		return m_supportsSkinning;
 	}
 
+	RenderingTechniqueBit getRenderingTechniques() const
+	{
+		return m_techniquesMask;
+	}
+
 	/// Get all GPU resources of this material. Will be used for GPU refcounting.
 	ConstWeakArray<TexturePtr> getAllTextures() const
 	{

+ 25 - 50
AnKi/Resource/ModelResource.cpp

@@ -11,9 +11,9 @@
 
 namespace anki {
 
-static Bool attributeIsRequired(VertexAttributeId loc, Pass pass, Bool hasSkin)
+static Bool attributeIsRequired(VertexAttributeId loc, RenderingTechnique technique, Bool hasSkin)
 {
-	if(pass == Pass::GB || pass == Pass::FS)
+	if(technique == RenderingTechnique::GBUFFER || technique == RenderingTechnique::FORWARD)
 	{
 		return true;
 	}
@@ -30,7 +30,7 @@ static Bool attributeIsRequired(VertexAttributeId loc, Pass pass, Bool hasSkin)
 
 void ModelPatch::getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& inf) const
 {
-	ANKI_ASSERT(!(!m_model->supportsSkinning() && key.isSkinned()));
+	ANKI_ASSERT(!(!supportsSkinning() && key.getSkinned()));
 	const U32 meshLod = min<U32>(key.getLod(), m_meshLodCount - 1);
 
 	// Vertex attributes & bindings
@@ -43,7 +43,8 @@ void ModelPatch::getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& i
 
 		for(VertexAttributeId loc : EnumIterable<VertexAttributeId>())
 		{
-			if(!m_presentVertexAttributes.get(loc) || !attributeIsRequired(loc, key.getPass(), key.isSkinned()))
+			if(!m_presentVertexAttributes.get(loc)
+			   || !attributeIsRequired(loc, key.getRenderingTechnique(), key.getSkinned()))
 			{
 				continue;
 			}
@@ -88,59 +89,24 @@ void ModelPatch::getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& i
 	inf.m_indexType = m_indexType;
 
 	// Get program
-	{
-		RenderingKey mtlKey = key;
-		mtlKey.setLod(min(key.getLod(), m_mtl->getLodCount() - 1));
-
-		const MaterialVariant& variant = m_mtl->getOrCreateVariant(mtlKey);
-
-		inf.m_program = variant.getShaderProgram();
-
-		if(m_mtl->supportsSkinning())
-		{
-			inf.m_boneTransformsBinding = m_mtl->getBoneTransformsStorageBlockBinding();
-			inf.m_prevFrameBoneTransformsBinding = m_mtl->getPrevFrameBoneTransformsStorageBlockBinding();
-		}
-		else
-		{
-			inf.m_boneTransformsBinding = inf.m_prevFrameBoneTransformsBinding = MAX_U32;
-		}
-	}
+	const MaterialVariant& variant = m_mtl->getOrCreateVariant(key);
+	inf.m_program = variant.getShaderProgram();
 }
 
-void ModelPatch::getRayTracingInfo(U32 lod, ModelRayTracingInfo& info) const
+void ModelPatch::getRayTracingInfo(const RenderingKey& key, ModelRayTracingInfo& info) const
 {
-	ANKI_ASSERT(m_mtl->getSupportedRayTracingTypes() != RayTypeBit::NONE);
-
-	info.m_grObjectReferenceCount = 0;
-	memset(&info.m_descriptor, 0, sizeof(info.m_descriptor));
+	ANKI_ASSERT(!!(m_mtl->getRenderingTechniques() & RenderingTechniqueBit(1 << key.getRenderingTechnique())));
 
 	// Mesh
-	const MeshResourcePtr& mesh = m_meshes[min(U32(m_meshLodCount - 1), lod)];
+	const MeshResourcePtr& mesh = m_meshes[min(U32(m_meshLodCount - 1), key.getLod())];
 	info.m_bottomLevelAccelerationStructure = mesh->getBottomLevelAccelerationStructure();
-	info.m_descriptor.m_mesh = mesh->getMeshGpuDescriptor();
-	info.m_grObjectReferences[info.m_grObjectReferenceCount++] = mesh->getIndexBuffer();
-	info.m_grObjectReferences[info.m_grObjectReferenceCount++] = mesh->getVertexBuffer();
 
 	// Material
-	info.m_descriptor.m_material = m_mtl->getMaterialGpuDescriptor();
-	for(RayType rayType : EnumIterable<RayType>())
-	{
-		if(!!(m_mtl->getSupportedRayTracingTypes() & RayTypeBit(1 << rayType)))
-		{
-			info.m_shaderGroupHandleIndices[rayType] = m_mtl->getShaderGroupHandleIndex(rayType);
-		}
-		else
-		{
-			info.m_shaderGroupHandleIndices[rayType] = MAX_U32;
-		}
-	}
+	const MaterialVariant& variant = m_mtl->getOrCreateVariant(key);
+	info.m_shaderGroupHandleIndex = variant.getRtShaderGroupHandleIndex();
 
-	ConstWeakArray<TextureViewPtr> textureViews = m_mtl->getAllTextureViews();
-	for(U32 i = 0; i < textureViews.getSize(); ++i)
-	{
-		info.m_grObjectReferences[info.m_grObjectReferenceCount++] = textureViews[i];
-	}
+	// Misc
+	info.m_grObjectReferences = m_grObjectRefs;
 }
 
 Error ModelPatch::init(ModelResource* model, ConstWeakArray<CString> meshFNames, const CString& mtlFName,
@@ -154,6 +120,17 @@ Error ModelPatch::init(ModelResource* model, ConstWeakArray<CString> meshFNames,
 	// Load material
 	ANKI_CHECK(manager->loadResource(mtlFName, m_mtl, async));
 
+	// Gather the material refs
+	if(m_mtl->getAllTextures().getSize())
+	{
+		m_grObjectRefs.resizeStorage(model->getAllocator(), m_mtl->getAllTextures().getSize());
+
+		for(U32 i = 0; i < m_mtl->getAllTextures().getSize(); ++i)
+		{
+			m_grObjectRefs.emplaceBack(model->getAllocator(), m_mtl->getAllTextures()[i]);
+		}
+	}
+
 	// Load meshes
 	m_meshLodCount = 0;
 	for(U32 lod = 0; lod < meshFNames.getSize(); lod++)
@@ -361,8 +338,6 @@ Error ModelResource::load(const ResourceFilename& filename, Bool async)
 			return Error::USER_DATA;
 		}
 
-		m_skinning = m_modelPatches[count].supportsSkinning();
-
 		// Move to next
 		ANKI_CHECK(modelPatchEl.getNextSiblingElement("modelPatch", modelPatchEl));
 		++count;

+ 5 - 20
AnKi/Resource/ModelResource.h

@@ -74,9 +74,6 @@ public:
 	IndexType m_indexType;
 	U32 m_firstIndex;
 	U32 m_indexCount;
-
-	U32 m_boneTransformsBinding;
-	U32 m_prevFrameBoneTransformsBinding;
 };
 
 /// Part of the information required to create a TLAS and a SBT.
@@ -84,13 +81,11 @@ public:
 class ModelRayTracingInfo
 {
 public:
-	ModelGpuDescriptor m_descriptor;
 	AccelerationStructurePtr m_bottomLevelAccelerationStructure;
-	Array<U32, U(RayType::COUNT)> m_shaderGroupHandleIndices;
+	U32 m_shaderGroupHandleIndex;
 
-	/// Get some pointers that the m_descriptor is pointing to. Use these pointers for life tracking.
-	Array<GrObjectPtr, U(TextureChannelId::COUNT) + 2> m_grObjectReferences;
-	U32 m_grObjectReferenceCount;
+	/// Get some pointers to pass to the command buffer for refcounting.
+	ConstWeakArray<GrObjectPtr> m_grObjectReferences;
 };
 
 /// Model patch class. Its very important class and it binds a material with a few mesh (one for each LOD).
@@ -118,12 +113,7 @@ public:
 	void getRenderingInfo(const RenderingKey& key, ModelRenderingInfo& inf) const;
 
 	/// Get the ray tracing info.
-	void getRayTracingInfo(U32 lod, ModelRayTracingInfo& info) const;
-
-	RayTypeBit getSupportedRayTracingTypes() const
-	{
-		return m_mtl->getSupportedRayTracingTypes();
-	}
+	void getRayTracingInfo(const RenderingKey& key, ModelRayTracingInfo& info) const;
 
 private:
 #if ANKI_ENABLE_ASSERTIONS
@@ -131,6 +121,7 @@ private:
 #endif
 	MaterialResourcePtr m_mtl;
 	Array<MeshResourcePtr, MAX_LOD_COUNT> m_meshes; ///< Just keep the references.
+	DynamicArray<GrObjectPtr> m_grObjectRefs;
 
 	// Begin cached data
 	class VertexAttributeInfo
@@ -217,17 +208,11 @@ public:
 		return m_boundingVolume;
 	}
 
-	Bool supportsSkinning() const
-	{
-		return m_skinning;
-	}
-
 	ANKI_USE_RESULT Error load(const ResourceFilename& filename, Bool async);
 
 private:
 	DynamicArray<ModelPatch> m_modelPatches;
 	Aabb m_boundingVolume;
-	Bool m_skinning = false;
 };
 /// @}
 

+ 3 - 1
AnKi/Resource/RenderingKey.h

@@ -31,7 +31,9 @@ enum class RenderingTechniqueBit : U8
 	GBUFFER_EARLY_Z = 1 << 1,
 	SHADOW = 1 << 2,
 	FORWARD = 1 << 3,
-	RT_SHADOW = 1 << 4
+	RT_SHADOW = 1 << 4,
+
+	ANY_RT = RT_SHADOW
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(RenderingTechniqueBit)