Browse Source

Some RT work on the resource interfaces

Panagiotis Christopoulos Charitos 5 years ago
parent
commit
a0eaaf0876

+ 56 - 5
anki/resource/MaterialResource.h

@@ -11,6 +11,7 @@
 #include <anki/resource/TextureResource.h>
 #include <anki/Math.h>
 #include <anki/util/Enum.h>
+#include <anki/shaders/include/GpuModel.h>
 
 namespace anki
 {
@@ -21,6 +22,18 @@ class XmlElement;
 /// @addtogroup resource
 /// @{
 
+enum class RayTracingMaterialType : U8
+{
+	SHADOWS,
+	GI,
+	REFLECTIONS,
+	PATH_TRACING,
+
+	COUNT,
+	FIRST = 0
+};
+ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(RayTracingMaterialType)
+
 /// The ID of a buildin material variable.
 enum class BuiltinMaterialVariableId : U8
 {
@@ -249,15 +262,40 @@ private:
 	U32 m_uniBlockSize = 0;
 };
 
+/// Ray tracing material variant.
+class RayTracingMaterialVariant
+{
+	friend class MaterialResource;
+	template<typename, PtrSize>
+	friend class Array;
+
+public:
+	RayTracingMaterialVariant(const RayTracingMaterialVariant&) = delete;
+	RayTracingMaterialVariant& operator=(const RayTracingMaterialVariant&) = delete;
+
+	ConstWeakArray<U8> getHitShaderGroupHandle() const
+	{
+		return m_shaderGroupHandle;
+	}
+
+	const GpuMaterial& getGpuMaterialDescriptor() const
+	{
+		return m_gpuMaterialDescr;
+	}
+
+private:
+	DynamicArray<U8> m_shaderGroupHandle;
+	GpuMaterial m_gpuMaterialDescr;
+
+	RayTracingMaterialVariant() = default;
+	~RayTracingMaterialVariant() = default;
+};
+
 /// Material resource.
 ///
 /// Material XML file format:
 /// @code
-/// <material
-///		[shadow="0 | 1"]
-///		[forwardShading="0 | 1"]
-///		<shaderProgram="path"/>
-///
+/// <material [shadow="0 | 1"] [forwardShading="0 | 1"] shaderProgram="path">
 ///		[<mutation>
 ///			<mutator name="str" value="value"/>
 ///		</mutation>]
@@ -266,7 +304,18 @@ private:
 ///			<input shaderVar="name to shaderProg var" value="values"/> (1)
 ///		</inputs>]
 /// </material>
+///
+/// [<rtMaterial shaderProgram="path" type="shadows|gi|reflections|pathTracing">
+///		[<mutation>
+///			<mutator name="str" value="value"/>
+///		</mutation>]
+///
+/// 	[<inputs>
+/// 		<input name="name" value="" />
+/// 	</inputs>]
+/// </rtMaterial>]
 /// @endcode
+///
 /// (1): Only for non-builtins.
 class MaterialResource : public ResourceObject
 {
@@ -361,6 +410,8 @@ private:
 
 	DynamicArray<SubMutation> m_nonBuiltinsMutation;
 
+	Array<RayTracingMaterialVariant, U(RayTracingMaterialType::COUNT)> m_rtVariantMatrix;
+
 	ANKI_USE_RESULT Error createVars();
 
 	static ANKI_USE_RESULT Error parseVariable(CString fullVarName, Bool& instanced, U32& idx, CString& name);

+ 11 - 22
anki/resource/ShaderProgramResource.cpp

@@ -363,18 +363,18 @@ void ShaderProgramResource::initVariant(const ShaderProgramResourceVariantInitIn
 		}
 	}
 
-	// Create the program name
-	StringAuto progName(getTempAllocator());
-	getFilepathFilename(getFilename(), progName);
-	char* cprogName = const_cast<char*>(progName.cstr());
-	if(progName.getLength() > MAX_GR_OBJECT_NAME_LENGTH)
-	{
-		cprogName[MAX_GR_OBJECT_NAME_LENGTH] = '\0';
-	}
-
 	// Time to init the shaders
 	if(!!(m_shaderStages & (ShaderTypeBit::ALL_GRAPHICS | ShaderTypeBit::COMPUTE)))
 	{
+		// Create the program name
+		StringAuto progName(getTempAllocator());
+		getFilepathFilename(getFilename(), progName);
+		char* cprogName = const_cast<char*>(progName.cstr());
+		if(progName.getLength() > MAX_GR_OBJECT_NAME_LENGTH)
+		{
+			cprogName[MAX_GR_OBJECT_NAME_LENGTH] = '\0';
+		}
+
 		ShaderProgramInitInfo progInf(cprogName);
 		for(ShaderType shaderType : EnumIterable<ShaderType>())
 		{
@@ -409,19 +409,8 @@ void ShaderProgramResource::initVariant(const ShaderProgramResourceVariantInitIn
 	}
 	else
 	{
-		for(ShaderType shaderType : EnumIterable<ShaderType>())
-		{
-			if(!(ShaderTypeBit(1 << shaderType) & m_shaderStages))
-			{
-				continue;
-			}
-
-			ShaderInitInfo inf(cprogName);
-			inf.m_shaderType = shaderType;
-			inf.m_binary = binary.m_codeBlocks[binaryVariant->m_codeBlockIndices[shaderType]].m_binary;
-			inf.m_constValues.setArray((constValueCount) ? constValues.getBegin() : nullptr, constValueCount);
-			ShaderPtr shader = getManager().getGrManager().newShader(inf);
-		}
+		ANKI_ASSERT(!!(m_shaderStages & ShaderTypeBit::ALL_RAY_TRACING));
+		ANKI_ASSERT(!"TODO");
 	}
 }
 

+ 9 - 0
anki/resource/ShaderProgramResource.h

@@ -64,6 +64,7 @@ public:
 
 	~ShaderProgramResourceVariant();
 
+	/// @note On ray tracing program resources it points to the actual ray tracing program that contains everything.
 	const ShaderProgramPtr& getProgram() const
 	{
 		return m_prog;
@@ -89,11 +90,19 @@ public:
 		return m_workgroupSizes;
 	}
 
+	/// Only for hit ray tracing programs.
+	ConstWeakArray<U8> getHitShaderGroupHandle() const
+	{
+		ANKI_ASSERT(m_hitShaderGroupHandle.getSize() > 0);
+		return m_hitShaderGroupHandle;
+	}
+
 private:
 	ShaderProgramPtr m_prog;
 	const ShaderProgramBinaryVariant* m_binaryVariant = nullptr;
 	BitSet<128, U64> m_activeConsts = {false};
 	Array<U32, 3> m_workgroupSizes;
+	DynamicArray<U8> m_hitShaderGroupHandle; ///< Hit shaders group handle.
 };
 
 /// The value of a constant.

+ 3 - 3
anki/shaders/RtShadowsHit.ankiprog

@@ -40,9 +40,9 @@ void main()
 	const U32 offset = gl_PrimitiveID * ANKI_SIZEOF(U16Vec3);
 	const U16Vec3 indices = U16Vec3Ref(nonuniformEXT(mesh.m_indexBufferPtr + offset)).m_value;
 
-	const GpuVertex vert0 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[0] * SIZEOF_GPU_VERTEX).m_value;
-	const GpuVertex vert1 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[1] * SIZEOF_GPU_VERTEX).m_value;
-	const GpuVertex vert2 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[2] * SIZEOF_GPU_VERTEX).m_value;
+	const GpuVertex vert0 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[0] * ANKI_SIZEOF(GpuVertex)).m_value;
+	const GpuVertex vert1 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[1] * ANKI_SIZEOF(GpuVertex)).m_value;
+	const GpuVertex vert2 = GpuVertexRef(mesh.m_vertexBufferPtr + indices[2] * ANKI_SIZEOF(GpuVertex)).m_value;
 
 	const Vec3 barycentrics = Vec3(1.0f - g_attribs.x - g_attribs.y, g_attribs.x, g_attribs.y);
 

+ 1 - 1
anki/shaders/include/GpuModel.h

@@ -19,7 +19,7 @@ struct GpuVertex
 	HVec2 m_uvs[UV_CHANNEL_COUNT];
 };
 
-const U32 SIZEOF_GPU_VERTEX = 4 * 3;
+const U32 _ANKI_SIZEOF_GpuVertex = 4 * 3;
 
 struct GpuMesh
 {