Panagiotis Christopoulos Charitos 5 år sedan
förälder
incheckning
3dccf1c931
2 ändrade filer med 153 tillägg och 14 borttagningar
  1. 92 6
      src/anki/shader_compiler/ShaderProgramParser.cpp
  2. 61 8
      tests/gr/Gr.cpp

+ 92 - 6
src/anki/shader_compiler/ShaderProgramParser.cpp

@@ -43,8 +43,16 @@ static const char* SHADER_HEADER = R"(#version 460 core
 #extension GL_EXT_nonuniform_qualifier : enable
 
 #extension GL_EXT_buffer_reference : enable
-#extension GL_ARB_gpu_shader_int64 : enable
+#extension GL_EXT_buffer_reference2 : enable
+
+#extension GL_EXT_shader_explicit_arithmetic_types : enable
 #extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int16 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_float32 : enable
+#extension GL_EXT_shader_explicit_arithmetic_types_float64 : enable
 
 #extension GL_EXT_nonuniform_qualifier : enable
 #extension GL_EXT_scalar_block_layout : enable
@@ -65,32 +73,110 @@ static const char* SHADER_HEADER = R"(#version 460 core
 	layout(set = set_, binding = 1) uniform readonly image2D u_bindlessImages2dF32[ANKI_MAX_BINDLESS_IMAGES];
 
 #define F32 float
+#define _ANKI_SIZEOF_float 4
 #define Vec2 vec2
+#define _ANKI_SIZEOF_vec2 8
 #define Vec3 vec3
+#define _ANKI_SIZEOF_vec3 12
 #define Vec4 vec4
+#define _ANKI_SIZEOF_vec4 16
+
+#define F16 float16_t
+#define _ANKI_SIZEOF_float16_t 2
+#define HVec2 f16vec2
+#define _ANKI_SIZEOF_f16vec2 4
+#define HVec3 f16vec3
+#define _ANKI_SIZEOF_f16vec3 6
+#define HVec4 f16vec4
+#define _ANKI_SIZEOF_f16vec4 8
+
+#define U8 uint8_t
+#define _ANKI_SIZEOF_uint8_t 1
+#define U8Vec2 u8vec2
+#define _ANKI_SIZEOF_u8vec2 2
+#define U8Vec3 u8vec3
+#define _ANKI_SIZEOF_u8vec3 3
+#define U8Vec4 u8vec4
+#define _ANKI_SIZEOF_u8vec4 4
+
+#define I8 int8_t
+#define _ANKI_SIZEOF_int8_t 1
+#define I8Vec2 i8vec2
+#define _ANKI_SIZEOF_i8vec2 2
+#define I8Vec3 i8vec3
+#define _ANKI_SIZEOF_i8vec3 3
+#define I8Vec4 i8vec4
+#define _ANKI_SIZEOF_i8vec4 4
+
+#define U16 uint16_t
+#define _ANKI_SIZEOF_uint16_t 2
+#define U16Vec2 u16vec2
+#define _ANKI_SIZEOF_u16vec2 4
+#define U16Vec3 u16vec3
+#define _ANKI_SIZEOF_u16vec3 6
+#define U16Vec4 u16vec4
+#define _ANKI_SIZEOF_u16vec4 8
+
+#define I16 int16_t
+#define _ANKI_SIZEOF_int16_t 2
+#define I16Vec2 i16vec2
+#define _ANKI_SIZEOF_i16vec2 4
+#define I16Vec3 i16vec3
+#define _ANKI_SIZEOF_i16vec3 6
+#define i16Vec4 i16vec4
+#define _ANKI_SIZEOF_i16vec4 8
 
 #define U32 uint
+#define _ANKI_SIZEOF_uint 4
 #define UVec2 uvec2
+#define _ANKI_SIZEOF_uvec2 8
 #define UVec3 uvec3
+#define _ANKI_SIZEOF_uvec3 12
 #define UVec4 uvec4
+#define _ANKI_SIZEOF_uvec4 16
 
 #define I32 int
+#define _ANKI_SIZEOF_int 4
 #define IVec2 ivec2
+#define _ANKI_SIZEOF_ivec2 8
 #define IVec3 ivec3
+#define _ANKI_SIZEOF_ivec3 12
 #define IVec4 ivec4
+#define _ANKI_SIZEOF_ivec4 16
+
+#define U64 uint64_t
+#define _ANKI_SIZEOF_uint64_t 8
+#define U64Vec2 u64vec2
+#define _ANKI_SIZEOF_u64vec2 16
+#define U64Vec3 u64vec3
+#define _ANKI_SIZEOF_u64vec3 24
+#define U64Vec4 u64vec4
+#define _ANKI_SIZEOF_u64vec4 32
+
+#define I64 int64_t
+#define _ANKI_SIZEOF_int64_t 8
+#define I64Vec2 i64vec2
+#define _ANKI_SIZEOF_i64vec2 16
+#define I64Vec3 i64vec3
+#define _ANKI_SIZEOF_i64vec3 24
+#define I64Vec4 i64vec4
+#define _ANKI_SIZEOF_i64vec4 32
 
 #define Mat3 mat3
+
 #define Mat4 mat4
+#define _ANKI_SIZEOF_mat4 64
+
 #define Mat3x4 mat3x4
+#define _ANKI_SIZEOF_mat3x4 48
 
 #define Bool bool
 
-#define U64 uint64_t
-#define U8 uint8_t
-
 #define _ANKI_CONCATENATE(a, b) a##b
 #define ANKI_CONCATENATE(a, b) _ANKI_CONCATENATE(a, b)
 
+#define ANKI_SIZEOF(basicType) _ANKI_CONCATENATE(_ANKI_SIZEOF_, basicType)
+
 #define _ANKI_SCONST_X(type, n, id, defltVal) \
 	layout(constant_id = id) const type n = defltVal; \
 	const U32 ANKI_CONCATENATE(n, _CONST_ID) = id
@@ -141,8 +227,8 @@ static const char* SHADER_HEADER = R"(#version 460 core
 #define ANKI_SPECIALIZATION_CONSTANT_VEC3(n, id, defltVal) _ANKI_SCONST_X3(Vec3, F32, n, id, defltVal,)
 #define ANKI_SPECIALIZATION_CONSTANT_VEC4(n, id, defltVal) _ANKI_SCONST_X4(Vec4, F32, n, id, defltVal,)
 
-#define ANKI_REF(type) \
-	layout(buffer_reference, std430) buffer type##Ref \
+#define ANKI_REF(type, alignment) \
+	layout(buffer_reference, scalar, buffer_reference_align = (alignment)) buffer type##Ref \
 	{ \
 		type m_value; \
 	}

+ 61 - 8
tests/gr/Gr.cpp

@@ -2756,8 +2756,10 @@ ANKI_TEST(Gr, RayGen)
 
 struct PayLoad
 {
-	Vec3 m_color;
+	Vec3 m_emissiveColor;
 	F32 m_hitT;
+	Vec3 m_diffuseColor;
+	Vec3 m_normal;
 };
 
 struct ShadowPayLoad
@@ -2772,7 +2774,7 @@ layout(set = 0, binding = 0, scalar) buffer b_00
 
 layout(set = 0, binding = 1, scalar) buffer b_01
 {
-	layout(align = 16) Light u_lights[];
+	Light u_lights[];
 };
 
 #define PAYLOAD_LOCATION 0
@@ -2782,9 +2784,27 @@ layout(set = 0, binding = 1, scalar) buffer b_01
 		const CString chit0Src = R"(
 layout(location = PAYLOAD_LOCATION) rayPayloadInEXT PayLoad s_payLoad;
 
+hitAttributeEXT vec2 g_attribs;
+
+ANKI_REF(U16Vec3, ANKI_SIZEOF(U16));
+ANKI_REF(Vec3, ANKI_SIZEOF(F32));
+
 void main()
 {
-	s_payLoad.m_color = u_models[gl_InstanceID].m_mtl.m_diffuseColor;
+	const Model model = u_models[nonuniformEXT(gl_InstanceID)];
+
+	const U32 offset = gl_PrimitiveID * 6;
+	const U16Vec3 indices = U16Vec3Ref(nonuniformEXT(model.m_mesh.m_indexBufferPtr + offset)).m_value;
+
+	const Vec3 pos0 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[0] * ANKI_SIZEOF(Vec3))).m_value;
+	const Vec3 pos1 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[1] * ANKI_SIZEOF(Vec3))).m_value;
+	const Vec3 pos2 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[2] * ANKI_SIZEOF(Vec3))).m_value;
+
+	const Vec3 normal = normalize(cross(pos1 - pos0, pos2 - pos0));
+
+	s_payLoad.m_diffuseColor = model.m_mtl.m_diffuseColor;
+	s_payLoad.m_emissiveColor = model.m_mtl.m_emissiveColor;
+	s_payLoad.m_normal = normal;
 	s_payLoad.m_hitT = gl_HitTEXT;
 }
 )";
@@ -2801,6 +2821,9 @@ void main()
 		const CString chit1Src = R"(
 layout(location = PAYLOAD_LOCATION) rayPayloadInEXT PayLoad s_payLoad;
 
+ANKI_REF(U16Vec3, ANKI_SIZEOF(U16));
+ANKI_REF(Vec3, ANKI_SIZEOF(F32));
+
 void main()
 {
 	Vec3 col;
@@ -2819,7 +2842,20 @@ void main()
 		col = Vec3(0.73f);
 	}
 
-	s_payLoad.m_color = col;
+	const Model model = u_models[nonuniformEXT(gl_InstanceID)];
+
+	const U32 offset = gl_PrimitiveID * 6;
+	const U16Vec3 indices = U16Vec3Ref(nonuniformEXT(model.m_mesh.m_indexBufferPtr + offset)).m_value;
+
+	const Vec3 pos0 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[0] * ANKI_SIZEOF(Vec3))).m_value;
+	const Vec3 pos1 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[1] * ANKI_SIZEOF(Vec3))).m_value;
+	const Vec3 pos2 = Vec3Ref(nonuniformEXT(model.m_mesh.m_positionBufferPtr + indices[2] * ANKI_SIZEOF(Vec3))).m_value;
+
+	const Vec3 normal = normalize(cross(pos1 - pos0, pos2 - pos0));
+
+	s_payLoad.m_diffuseColor = col;
+	s_payLoad.m_emissiveColor = Vec3(0.0);
+	s_payLoad.m_normal = normal;
 	s_payLoad.m_hitT = gl_HitTEXT;
 }
 )";
@@ -2829,7 +2865,10 @@ layout(location = PAYLOAD_LOCATION) rayPayloadInEXT PayLoad s_payLoad;
 
 void main()
 {
-	s_payLoad.m_color = Vec3(0.5);
+	s_payLoad.m_diffuseColor = Vec3(0.5);
+	s_payLoad.m_emissiveColor =
+		mix(Vec3(0.3, 0.5, 0.3), Vec3(0.1, 0.6, 0.1), F32(gl_LaunchIDEXT.y) / F32(gl_LaunchSizeEXT.y));
+	s_payLoad.m_normal = Vec3(1.0, 0.0, 1.0);
 	s_payLoad.m_hitT = -1.0;
 }
 )";
@@ -2928,10 +2967,11 @@ void main()
 					rayOrigin, tMin, rayDir, tMax, PAYLOAD_LOCATION);
 	}
 
+	const Vec3 diffuseColor = Vec3(s_payLoad.m_diffuseColor);
+	const Vec3 normal = s_payLoad.m_normal;
 	if(s_payLoad.m_hitT > 0.0)
 	{
 		const Vec3 rayOrigin = u_regs.m_cameraPos + normalize(p3 - u_regs.m_cameraPos) * s_payLoad.m_hitT;
-		const Vec3 diffuseColor = s_payLoad.m_color;
 
 		for(U32 i = 0; i < u_regs.m_lightCount; ++i)
 		{
@@ -2950,12 +2990,13 @@ void main()
 			traceRayEXT(u_tlas, flags, cullMask, sbtRecordOffset, sbtRecordStride, missIndex, rayOrigin,
 						tMin, rayDir, tMax, SHADOW_PAYLOAD_LOCATION);
 
-			outColor += diffuseColor * light.m_intensity * clamp(s_shadowPayLoad.m_shadow, 0.0, 1);
+			F32 shadow = clamp(s_shadowPayLoad.m_shadow, 0.0, 1.0);
+			outColor += normal * light.m_intensity * shadow;
 		}
 	}
 	else
 	{
-		outColor = s_payLoad.m_color;
+		outColor = diffuseColor;
 	}
 
 	imageStore(u_outImg, IVec2(gl_LaunchIDEXT.xy), Vec4(outColor, 0.0));
@@ -3170,8 +3211,20 @@ void main()
 		memset(&models[0], 0, inf.m_size);
 
 		models[0].m_mtl.m_diffuseColor = Vec3(0.75f);
+		models[0].m_mesh.m_positionBufferPtr = smallBoxVertBuffer->getGpuAddress();
+		models[0].m_mesh.m_indexBufferPtr = smallBoxIndexBuffer->getGpuAddress();
+
 		models[1].m_mtl.m_diffuseColor = Vec3(0.75f);
+		models[1].m_mesh.m_positionBufferPtr = bigBoxVertBuffer->getGpuAddress();
+		models[1].m_mesh.m_indexBufferPtr = bigBoxIndexBuffer->getGpuAddress();
+
 		models[2].m_mtl.m_diffuseColor = Vec3(1.0f);
+		models[2].m_mesh.m_positionBufferPtr = lightVertBuffer->getGpuAddress();
+		models[2].m_mesh.m_indexBufferPtr = lightIndexBuffer->getGpuAddress();
+
+		models[3].m_mtl.m_diffuseColor = Vec3(1.0f);
+		models[3].m_mesh.m_positionBufferPtr = roomVertBuffer->getGpuAddress();
+		models[3].m_mesh.m_indexBufferPtr = roomIndexBuffer->getGpuAddress();
 
 		modelBuffer->unmap();
 	}