From e52205395417fac69b2eb17c39b4d71f7009122d Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 8 Oct 2021 11:52:58 +0200 Subject: [PATCH] tests: Test more advanced RT geometry and shaders. Add basic test for intersection + anyhit + AABB primitives. Signed-off-by: Hans-Kristian Arntzen --- tests/d3d12_raytracing.c | 619 ++++++++++++++++++++++++++++----------- 1 file changed, 451 insertions(+), 168 deletions(-) diff --git a/tests/d3d12_raytracing.c b/tests/d3d12_raytracing.c index 2dcccf13..94e3d2e5 100644 --- a/tests/d3d12_raytracing.c +++ b/tests/d3d12_raytracing.c @@ -315,18 +315,43 @@ static D3D12_SHADER_BYTECODE get_default_rt_lib(void) float local_value1; }; + struct AABBAttribs { float dummy; }; + [shader("miss")] void RayMiss(inout RayPayload payload) { - payload.color.x = local_value0; - payload.color.y = local_value1; + payload.color.x += local_value0; + payload.color.y += local_value1; } [shader("closesthit")] void RayClosest(inout RayPayload payload, BuiltInTriangleIntersectionAttributes attribs) { - payload.color.x = local_value0; - payload.color.y = local_value1; + payload.color.x += local_value0; + payload.color.y += local_value1; + } + + [shader("anyhit")] + void RayAnyTriangle(inout RayPayload payload, BuiltInTriangleIntersectionAttributes attribs) + { + payload.color.x += 1.0; + IgnoreHit(); + } + + [shader("anyhit")] + void RayAnyAABB(inout RayPayload payload, AABBAttribs attribs) + { + payload.color.y += attribs.dummy; + IgnoreHit(); + } + + [shader("intersection")] + void RayIntersect() + { + AABBAttribs dummy; + dummy.dummy = 1.0; + float thit = 1.0; // Hardcode an intersection at origin of the AABB. + ReportHit(thit, 0, dummy); } [shader("raygeneration")] @@ -353,45 +378,67 @@ static D3D12_SHADER_BYTECODE get_default_rt_lib(void) Buf[index] = payload.color; } #endif - 0x44, 0x58, 0x42, 0x43, 0x65, 0xc2, 0x0c, 0xbe, 0xc8, 0x0e, 0x31, 0x4f, 0x2a, 0x6b, 0xc2, 0x17, 0x84, 0x95, 0x44, 0x43, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x94, 0x02, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x44, 0x41, 0x54, - 0x50, 0x02, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x2c, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0xc8, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x73, 0x32, 0x00, 0x41, 0x53, 0x00, 0x52, 0x61, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x42, 0x75, 0x66, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x4d, 0x69, 0x73, - 0x73, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x40, 0x5a, 0x00, 0x52, 0x61, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x00, 0x01, 0x3f, - 0x52, 0x61, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x55, 0x42, 0x75, 0x69, - 0x6c, 0x74, 0x49, 0x6e, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x73, 0x40, 0x40, 0x40, 0x5a, 0x00, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x47, 0x65, 0x6e, 0x40, 0x40, 0x59, 0x41, 0x58, 0x58, - 0x5a, 0x00, 0x52, 0x61, 0x79, 0x47, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x8c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x60, 0x00, 0x0b, 0x00, 0x5a, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x60, 0x00, 0x0a, 0x00, 0xae, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x44, 0x58, 0x42, 0x43, 0x10, 0x0d, 0xe6, 0xb0, 0x48, 0x73, 0x4d, 0x09, 0x5e, 0xef, 0x99, 0x53, 0x6b, 0x2b, 0xef, 0x94, 0x01, 0x00, 0x00, 0x00, 0x88, 0x16, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xd4, 0x03, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x53, 0x46, 0x49, 0x30, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x52, 0x44, 0x41, 0x54, 0x8c, 0x03, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xa0, 0x01, 0x00, 0x00, 0x50, 0x02, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x00, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x32, 0x00, 0x41, 0x53, 0x00, 0x52, 0x61, 0x79, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x42, 0x75, 0x66, 0x00, 0x01, 0x3f, 0x52, 0x61, + 0x79, 0x4d, 0x69, 0x73, 0x73, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x40, 0x5a, 0x00, 0x52, 0x61, 0x79, 0x4d, 0x69, 0x73, + 0x73, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, + 0x55, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x40, 0x40, 0x40, 0x5a, 0x00, 0x52, 0x61, 0x79, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x73, 0x74, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x41, 0x6e, 0x79, 0x54, 0x72, + 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x55, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x49, 0x6e, + 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x40, 0x40, + 0x40, 0x5a, 0x00, 0x52, 0x61, 0x79, 0x41, 0x6e, 0x79, 0x54, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x41, 0x6e, 0x79, 0x41, 0x41, 0x42, 0x42, 0x40, 0x40, + 0x59, 0x41, 0x58, 0x55, 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x55, 0x41, 0x41, 0x42, 0x42, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x73, 0x40, 0x40, 0x40, 0x5a, + 0x00, 0x52, 0x61, 0x79, 0x41, 0x6e, 0x79, 0x41, 0x41, 0x42, 0x42, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x40, 0x40, 0x59, 0x41, 0x58, 0x58, + 0x5a, 0x00, 0x52, 0x61, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x00, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x47, 0x65, 0x6e, 0x40, 0x40, 0x59, 0x41, 0x58, 0x58, 0x5a, 0x00, 0x52, + 0x61, 0x79, 0x47, 0x65, 0x6e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x60, 0x00, 0x0b, 0x00, 0x5a, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x60, 0x00, 0x0a, 0x00, + 0xae, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x63, 0x00, 0x09, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x39, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x63, 0x00, 0x09, 0x00, 0x44, 0x01, 0x00, 0x00, 0x5a, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x63, 0x00, 0x08, 0x00, 0x67, 0x01, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x63, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x6c, 0x0d, 0x00, 0x00, 0x63, 0x00, 0x06, 0x00, - 0x5b, 0x03, 0x00, 0x00, 0x44, 0x58, 0x49, 0x4c, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x54, 0x0d, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x52, 0x03, 0x00, 0x00, - 0x0b, 0x82, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, - 0x1e, 0x04, 0x8b, 0x62, 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, - 0x00, 0x19, 0x32, 0x42, 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0x5d, 0x00, 0x00, 0x00, - 0x1b, 0x8c, 0x20, 0x00, 0x12, 0x60, 0xd9, 0x00, 0x1e, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x44, 0x90, 0x43, 0x3a, 0xcc, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0x43, 0x1b, 0xd0, 0x43, 0x38, - 0xa4, 0x03, 0x3b, 0xb4, 0xc1, 0x38, 0x84, 0x03, 0x3b, 0xb0, 0xc3, 0x3c, 0x00, 0xe6, 0x10, 0x0e, 0xec, 0x30, 0x0f, 0xe5, 0x00, 0x10, 0xec, 0x50, 0x0e, 0xf3, 0x30, 0x0f, 0x6d, 0x00, 0x0f, 0xf2, - 0x50, 0x0e, 0xe3, 0x90, 0x0e, 0xf3, 0x50, 0x0e, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x0e, 0xe1, 0x40, 0x0e, 0x80, 0x39, 0x84, 0x03, 0x3b, 0xcc, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, - 0x83, 0x3c, 0x84, 0x43, 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xe6, 0x10, 0x0e, 0xec, 0x30, - 0x0f, 0xe5, 0x00, 0x10, 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0x98, 0x43, 0x38, 0xb0, 0xc3, - 0x3c, 0x94, 0x03, 0x40, 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b, 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x60, 0x0e, 0xe1, 0xc0, 0x0e, - 0xf3, 0x50, 0x0e, 0xc0, 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xf2, 0x50, 0x0e, 0xe1, 0xc0, 0x0e, 0xe9, 0x70, 0x0e, 0xee, 0xd0, 0x06, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0x00, 0x10, 0xf3, 0x40, - 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0xd0, 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, 0x6d, - 0x30, 0x0f, 0xe9, 0xa0, 0x0f, 0xe5, 0x00, 0xc0, 0x01, 0x40, 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, - 0xe6, 0x10, 0x0e, 0xec, 0x30, 0x0f, 0xe5, 0x00, 0x10, 0xf5, 0x30, 0x0f, 0xe5, 0xd0, 0x06, 0xf3, 0xf0, 0x0e, 0xe6, 0x40, 0x0f, 0x6d, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x80, 0x39, - 0x84, 0x03, 0x3b, 0xcc, 0x43, 0x39, 0x00, 0x1b, 0x8c, 0x41, 0x00, 0x16, 0x80, 0xda, 0x60, 0x10, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x12, 0x50, 0x6d, 0x30, 0x8a, 0xff, 0xff, 0xff, 0xff, 0x1f, - 0x00, 0x09, 0xa0, 0x36, 0x10, 0xc6, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0xb4, 0x81, 0x38, 0x20, 0xe0, 0x0c, 0x00, 0x00, 0x49, 0x18, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x98, - 0x30, 0x04, 0x83, 0x30, 0x21, 0x10, 0x26, 0x04, 0xc4, 0x84, 0xa0, 0x98, 0x10, 0x18, 0x13, 0x82, 0x03, 0x00, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, - 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xd8, 0xc1, 0x1c, 0x01, 0x18, 0x9c, 0x19, + 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x48, 0x41, 0x53, 0x48, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9f, 0x28, 0xf7, 0xda, 0xdf, 0xfa, 0xa4, 0x44, 0x9f, 0xa0, 0x7e, 0x63, 0xce, 0x9d, 0x26, 0x31, 0x44, 0x58, 0x49, 0x4c, 0x90, 0x12, 0x00, 0x00, 0x63, 0x00, 0x06, 0x00, 0xa4, 0x04, 0x00, 0x00, + 0x44, 0x58, 0x49, 0x4c, 0x03, 0x01, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x78, 0x12, 0x00, 0x00, 0x42, 0x43, 0xc0, 0xde, 0x21, 0x0c, 0x00, 0x00, 0x9b, 0x04, 0x00, 0x00, 0x0b, 0x82, 0x20, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x81, 0x23, 0x91, 0x41, 0xc8, 0x04, 0x49, 0x06, 0x10, 0x32, 0x39, 0x92, 0x01, 0x84, 0x0c, 0x25, 0x05, 0x08, 0x19, 0x1e, 0x04, 0x8b, 0x62, + 0x80, 0x18, 0x45, 0x02, 0x42, 0x92, 0x0b, 0x42, 0xc4, 0x10, 0x32, 0x14, 0x38, 0x08, 0x18, 0x4b, 0x0a, 0x32, 0x62, 0x88, 0x48, 0x90, 0x14, 0x20, 0x43, 0x46, 0x88, 0xa5, 0x00, 0x19, 0x32, 0x42, + 0xe4, 0x48, 0x0e, 0x90, 0x11, 0x23, 0xc4, 0x50, 0x41, 0x51, 0x81, 0x8c, 0xe1, 0x83, 0xe5, 0x8a, 0x04, 0x31, 0x46, 0x06, 0x51, 0x18, 0x00, 0x00, 0xb3, 0x00, 0x00, 0x00, 0x1b, 0x8c, 0x20, 0x00, + 0x12, 0x60, 0xd9, 0x00, 0x1e, 0xc2, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x44, 0x90, 0x43, 0x3a, 0xcc, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0x43, 0x1b, 0xd0, 0x43, 0x38, 0xa4, 0x03, 0x3b, 0xb4, + 0xc1, 0x38, 0x84, 0x03, 0x3b, 0xb0, 0xc3, 0x3c, 0x00, 0xe6, 0x10, 0x0e, 0xec, 0x30, 0x0f, 0xe5, 0x00, 0x10, 0xec, 0x50, 0x0e, 0xf3, 0x30, 0x0f, 0x6d, 0x00, 0x0f, 0xf2, 0x50, 0x0e, 0xe3, 0x90, + 0x0e, 0xf3, 0x50, 0x0e, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x0e, 0xe1, 0x40, 0x0e, 0x80, 0x39, 0x84, 0x03, 0x3b, 0xcc, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0x98, 0x83, 0x3c, 0x84, 0x43, + 0x3b, 0x94, 0x43, 0x1b, 0xc0, 0xc3, 0x3b, 0xa4, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xc8, 0x43, 0x1b, 0x94, 0x03, 0x3b, 0xa4, 0x43, 0x3b, 0x00, 0xe6, 0x10, 0x0e, 0xec, 0x30, 0x0f, 0xe5, 0x00, 0x10, + 0xee, 0xf0, 0x0e, 0x6d, 0x90, 0x0e, 0xee, 0x60, 0x0e, 0xf3, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0x6d, 0xd0, 0x0e, 0xe1, 0x40, 0x0f, 0xe8, 0x00, 0x98, 0x43, 0x38, 0xb0, 0xc3, 0x3c, 0x94, 0x03, 0x40, + 0xb8, 0xc3, 0x3b, 0xb4, 0x81, 0x3b, 0x84, 0x83, 0x3b, 0xcc, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, 0x03, 0x3d, 0xa0, 0x03, 0x60, 0x0e, 0xe1, 0xc0, 0x0e, 0xf3, 0x50, 0x0e, 0xc0, + 0xe0, 0x0e, 0xef, 0xd0, 0x06, 0xf2, 0x50, 0x0e, 0xe1, 0xc0, 0x0e, 0xe9, 0x70, 0x0e, 0xee, 0xd0, 0x06, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, 0xeb, 0x00, 0x10, 0xf3, 0x40, 0x0f, 0xe1, 0x30, 0x0e, + 0xeb, 0xd0, 0x06, 0xf0, 0x20, 0x0f, 0xef, 0x40, 0x0f, 0xe5, 0x30, 0x0e, 0xf4, 0xf0, 0x0e, 0xf2, 0xd0, 0x06, 0xe2, 0x50, 0x0f, 0xe6, 0x60, 0x0e, 0xe5, 0x20, 0x0f, 0x6d, 0x30, 0x0f, 0xe9, 0xa0, + 0x0f, 0xe5, 0x00, 0xc0, 0x01, 0x40, 0xd4, 0x83, 0x3b, 0xcc, 0x43, 0x38, 0x98, 0x43, 0x39, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, 0xe6, 0x10, 0x0e, 0xec, + 0x30, 0x0f, 0xe5, 0x00, 0x10, 0xf5, 0x30, 0x0f, 0xe5, 0xd0, 0x06, 0xf3, 0xf0, 0x0e, 0xe6, 0x40, 0x0f, 0x6d, 0x60, 0x0e, 0xec, 0xf0, 0x0e, 0xe1, 0x40, 0x0f, 0x80, 0x39, 0x84, 0x03, 0x3b, 0xcc, + 0x43, 0x39, 0x00, 0x1b, 0x8c, 0x41, 0x00, 0x16, 0x80, 0xda, 0x20, 0x1e, 0xc4, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x40, 0x04, 0x48, 0x04, 0x39, 0xa4, 0xc3, 0x3c, 0x84, 0x83, 0x38, 0xb0, 0x43, 0x39, + 0xb4, 0x01, 0x3d, 0x84, 0x43, 0x3a, 0xb0, 0x43, 0x1b, 0x8c, 0x43, 0x38, 0xb0, 0x03, 0x3b, 0xcc, 0x03, 0x60, 0x0e, 0xe1, 0xc0, 0x0e, 0xf3, 0x50, 0x0e, 0x00, 0xc1, 0x0e, 0xe5, 0x30, 0x0f, 0xf3, + 0xd0, 0x06, 0xf0, 0x20, 0x0f, 0xe5, 0x30, 0x0e, 0xe9, 0x30, 0x0f, 0xe5, 0xd0, 0x06, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xe4, 0x00, 0x98, 0x43, 0x38, 0xb0, 0xc3, 0x3c, 0x94, 0x03, 0x40, 0xb8, + 0xc3, 0x3b, 0xb4, 0x81, 0x39, 0xc8, 0x43, 0x38, 0xb4, 0x43, 0x39, 0xb4, 0x01, 0x3c, 0xbc, 0x43, 0x3a, 0xb8, 0x03, 0x3d, 0x94, 0x83, 0x3c, 0xb4, 0x41, 0x39, 0xb0, 0x43, 0x3a, 0xb4, 0x03, 0x60, + 0x0e, 0xe1, 0xc0, 0x0e, 0xf3, 0x50, 0x0e, 0x00, 0xe1, 0x0e, 0xef, 0xd0, 0x06, 0xe9, 0xe0, 0x0e, 0xe6, 0x30, 0x0f, 0x6d, 0x60, 0x0e, 0xf0, 0xd0, 0x06, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x80, + 0x39, 0x84, 0x03, 0x3b, 0xcc, 0x43, 0x39, 0x00, 0x84, 0x3b, 0xbc, 0x43, 0x1b, 0xb8, 0x43, 0x38, 0xb8, 0xc3, 0x3c, 0xb4, 0x81, 0x39, 0xc0, 0x43, 0x1b, 0xb4, 0x43, 0x38, 0xd0, 0x03, 0x3a, 0x00, + 0xe6, 0x10, 0x0e, 0xec, 0x30, 0x0f, 0xe5, 0x00, 0x0c, 0xee, 0xf0, 0x0e, 0x6d, 0x20, 0x0f, 0xe5, 0x10, 0x0e, 0xec, 0x90, 0x0e, 0xe7, 0xe0, 0x0e, 0x6d, 0x30, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, + 0x0e, 0x00, 0x31, 0x0f, 0xf4, 0x10, 0x0e, 0xe3, 0xb0, 0x0e, 0x6d, 0x00, 0x0f, 0xf2, 0xf0, 0x0e, 0xf4, 0x50, 0x0e, 0xe3, 0x40, 0x0f, 0xef, 0x20, 0x0f, 0x6d, 0x20, 0x0e, 0xf5, 0x60, 0x0e, 0xe6, + 0x50, 0x0e, 0xf2, 0xd0, 0x06, 0xf3, 0x90, 0x0e, 0xfa, 0x50, 0x0e, 0x00, 0x1c, 0x00, 0x44, 0x3d, 0xb8, 0xc3, 0x3c, 0x84, 0x83, 0x39, 0x94, 0x43, 0x1b, 0x98, 0x03, 0x3c, 0xb4, 0x41, 0x3b, 0x84, + 0x03, 0x3d, 0xa0, 0x03, 0x60, 0x0e, 0xe1, 0xc0, 0x0e, 0xf3, 0x50, 0x0e, 0x00, 0x51, 0x0f, 0xf3, 0x50, 0x0e, 0x6d, 0x30, 0x0f, 0xef, 0x60, 0x0e, 0xf4, 0xd0, 0x06, 0xe6, 0xc0, 0x0e, 0xef, 0x10, + 0x0e, 0xf4, 0x00, 0x98, 0x43, 0x38, 0xb0, 0xc3, 0x3c, 0x94, 0x03, 0xb0, 0xc1, 0x28, 0x04, 0x60, 0x01, 0xaa, 0x0d, 0x86, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x03, 0x10, 0x01, 0xd2, 0x06, 0xe2, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0x01, 0x90, 0x36, 0x18, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x04, 0x50, 0x1b, 0x8c, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x07, 0x40, 0x02, 0xaa, 0x0d, 0x84, 0x42, 0x00, + 0x67, 0xb0, 0x81, 0x58, 0x20, 0xe0, 0x0c, 0x00, 0x49, 0x18, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x84, 0x40, 0x98, 0x30, 0x04, 0x83, 0x30, 0x61, 0x08, 0x06, 0x62, 0xc2, 0x10, 0x14, 0xc4, + 0x84, 0x40, 0x98, 0x10, 0x18, 0x13, 0x82, 0x63, 0x42, 0x80, 0x4c, 0x08, 0x92, 0x09, 0x81, 0x32, 0x21, 0x58, 0x00, 0x00, 0x89, 0x20, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x32, 0x22, 0x88, 0x09, + 0x20, 0x64, 0x85, 0x04, 0x13, 0x23, 0xa4, 0x84, 0x04, 0x13, 0x23, 0xe3, 0x84, 0xa1, 0x90, 0x14, 0x12, 0x4c, 0x8c, 0x8c, 0x0b, 0x84, 0xc4, 0x4c, 0x10, 0xf8, 0xc1, 0x1c, 0x01, 0x18, 0x9c, 0x19, 0x48, 0x53, 0x44, 0x09, 0x93, 0xbf, 0x02, 0xd8, 0x14, 0x01, 0x02, 0xd2, 0x18, 0x9a, 0x20, 0x10, 0x0b, 0x11, 0x01, 0x13, 0xe2, 0x34, 0xec, 0x14, 0x51, 0xc2, 0x44, 0x45, 0x04, 0x0a, 0x00, 0x0a, 0x66, 0x00, 0x86, 0x11, 0x84, 0x61, 0xa6, 0x34, 0x18, 0x07, 0x76, 0x08, 0x87, 0x79, 0x98, 0x07, 0x37, 0x98, 0x05, 0x7a, 0x90, 0x87, 0x7a, 0x18, 0x07, 0x7a, 0xa8, 0x07, 0x79, 0x28, 0x07, 0x72, 0x10, 0x85, 0x7a, 0x30, 0x07, 0x73, 0x28, 0x07, 0x79, 0xe0, 0x03, 0x7b, 0x28, 0x87, 0x71, 0xa0, 0x87, 0x77, 0x90, 0x07, 0x3e, 0x30, 0x07, 0x76, 0x78, 0x87, 0x70, 0xa0, 0x07, 0x36, 0x00, 0x03, @@ -400,88 +447,118 @@ static D3D12_SHADER_BYTECODE get_default_rt_lib(void) 0x10, 0x0e, 0xf4, 0xc0, 0x06, 0x60, 0x20, 0x07, 0x7e, 0x00, 0x06, 0x7e, 0x80, 0x02, 0x82, 0x8e, 0x73, 0x4a, 0x47, 0x00, 0x16, 0xce, 0x69, 0xa4, 0x09, 0x68, 0x26, 0x09, 0x05, 0x03, 0x25, 0xf7, 0x94, 0x8e, 0x00, 0x2c, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x92, 0x8d, 0x82, 0x81, 0x96, 0x11, 0x80, 0x8b, 0xa4, 0x29, 0xa2, 0x84, 0xc9, 0x5f, 0x01, 0x2c, 0x05, 0xb0, 0xc5, 0x01, 0x06, 0x14, 0x10, 0xe4, 0x14, 0xa1, 0x79, 0x08, 0x3a, 0x36, 0x90, 0xa6, 0x88, 0x12, 0x26, 0x7f, 0xa3, 0x90, 0x65, 0x12, 0x9b, 0x36, 0x42, 0x80, 0xc6, 0x58, 0x08, 0xb1, 0x99, 0x88, 0x48, 0x22, 0x84, 0x09, - 0x71, 0x1a, 0x6d, 0x9a, 0x22, 0x24, 0xa0, 0x26, 0x42, 0x42, 0x01, 0x41, 0x52, 0x19, 0x9a, 0x67, 0x22, 0xaa, 0x04, 0x0d, 0x59, 0x47, 0x0d, 0x97, 0x3f, 0x61, 0x0f, 0x21, 0xf9, 0xdc, 0x46, 0x15, - 0x2b, 0x31, 0xf9, 0xc5, 0x6d, 0x23, 0x62, 0x18, 0x86, 0x61, 0x8e, 0x00, 0xa1, 0xec, 0x9e, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x3f, 0x04, 0x9a, 0x61, 0x21, 0x50, 0xa0, 0x15, 0x02, 0x03, 0x36, - 0x80, 0xb8, 0x32, 0x00, 0x40, 0x46, 0x5e, 0x59, 0x1a, 0x60, 0x03, 0x80, 0x61, 0x18, 0x86, 0x0c, 0x20, 0xf0, 0xa6, 0xe1, 0xf2, 0x27, 0xec, 0x21, 0x24, 0x7f, 0x25, 0xa4, 0x95, 0x98, 0xfc, 0xe2, - 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x00, 0x94, 0x43, 0x04, 0x36, 0x00, 0xc8, 0x00, 0x1a, 0x4b, 0xd4, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x30, 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0xf0, 0x50, 0x59, 0x86, 0x0d, - 0x48, 0xe8, 0x2c, 0xc3, 0x06, 0x2c, 0x94, 0x96, 0x61, 0x03, 0x0a, 0x5a, 0xcb, 0xb0, 0x01, 0x01, 0xb5, 0x65, 0xd8, 0x80, 0x83, 0xde, 0x81, 0x80, 0x39, 0x82, 0x60, 0x8e, 0x00, 0x14, 0x68, 0x20, - 0x02, 0x00, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, + 0x71, 0x1a, 0x6d, 0x9a, 0x22, 0x24, 0xa0, 0x26, 0x42, 0x42, 0x01, 0x41, 0x52, 0x19, 0x9a, 0x67, 0x22, 0xea, 0x24, 0x69, 0x8a, 0x28, 0x61, 0xf2, 0x35, 0x6d, 0xdb, 0xb4, 0x69, 0x8a, 0x90, 0x40, + 0x42, 0xc1, 0x40, 0x56, 0x19, 0x9a, 0xe7, 0x22, 0xac, 0x04, 0x0d, 0x69, 0x45, 0x68, 0x00, 0xe2, 0xe6, 0x08, 0x82, 0x52, 0x78, 0xc0, 0x00, 0x5c, 0xf4, 0xcd, 0x11, 0x20, 0x65, 0x00, 0x80, 0x90, + 0x44, 0x0a, 0xef, 0x19, 0x2e, 0x7f, 0xc2, 0x1e, 0x42, 0xf2, 0x43, 0xa0, 0x19, 0x16, 0x02, 0x05, 0x64, 0x59, 0x1a, 0xa0, 0x04, 0x80, 0x61, 0x18, 0x86, 0x10, 0x20, 0xf3, 0xa6, 0xe1, 0xf2, 0x27, + 0xec, 0x21, 0x24, 0x7f, 0x25, 0xa4, 0x95, 0x98, 0xfc, 0xe2, 0xb6, 0x51, 0x31, 0x0c, 0xc3, 0x00, 0x94, 0x03, 0x05, 0x4a, 0x00, 0x08, 0x01, 0x4a, 0x4b, 0xd4, 0x00, 0x25, 0x00, 0x00, 0x00, 0x30, + 0x0c, 0xc3, 0x30, 0x0c, 0xc3, 0xf0, 0xd0, 0x7a, 0xd4, 0x70, 0xf9, 0x13, 0xf6, 0x10, 0x92, 0xcf, 0x6d, 0x54, 0xb1, 0x12, 0x93, 0x5f, 0xdc, 0x36, 0x22, 0x86, 0x61, 0x18, 0x0a, 0xd1, 0x02, 0x25, + 0x40, 0x6e, 0x19, 0x4a, 0x20, 0x21, 0xb8, 0x0c, 0x25, 0xb0, 0x90, 0x5c, 0x86, 0x12, 0x28, 0x88, 0x2e, 0x43, 0x09, 0x04, 0x64, 0x97, 0xa1, 0x04, 0x0e, 0xc2, 0x07, 0x02, 0xe6, 0x08, 0x40, 0x81, + 0x08, 0x1a, 0x00, 0x00, 0x13, 0x14, 0x72, 0xc0, 0x87, 0x74, 0x60, 0x87, 0x36, 0x68, 0x87, 0x79, 0x68, 0x03, 0x72, 0xc0, 0x87, 0x0d, 0xaf, 0x50, 0x0e, 0x6d, 0xd0, 0x0e, 0x7a, 0x50, 0x0e, 0x6d, 0x00, 0x0f, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x78, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe9, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x90, 0x0e, 0x76, 0x40, 0x07, 0x7a, 0x60, 0x07, 0x74, 0xd0, 0x06, 0xe6, 0x10, 0x07, 0x76, 0xa0, 0x07, 0x73, 0x20, 0x07, 0x6d, 0x60, 0x0e, 0x73, 0x20, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xd0, 0x06, 0xe6, 0x60, 0x07, 0x74, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x6d, 0xe0, 0x0e, 0x78, 0xa0, 0x07, 0x71, 0x60, 0x07, 0x7a, 0x30, 0x07, 0x72, 0xa0, 0x07, 0x76, 0x40, 0x07, 0x3a, 0x0f, 0x84, 0x90, 0x21, 0x23, 0x45, 0x44, 0x00, 0xc6, 0x00, 0x80, 0x59, 0x03, 0x00, 0xe6, 0x0d, 0x00, 0x98, 0x39, 0x00, 0x00, 0xee, 0x00, 0x00, 0x86, 0x3c, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0x28, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0xf2, 0x58, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0xe1, 0x80, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0xe3, 0x01, 0x01, - 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x07, 0x0c, 0x80, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0x33, 0x06, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x29, 0x03, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xf2, 0x9c, 0x01, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0c, 0x79, 0xd2, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x6b, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x9e, 0x36, 0x00, - 0x02, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0xcf, 0x1b, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x16, 0x08, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x4a, 0xa0, 0x0c, 0x0a, 0xa1, 0x18, 0x46, 0x00, 0x0a, 0xa4, 0x30, 0x0a, 0xa2, 0x08, 0x8a, 0xa2, - 0x1c, 0x4a, 0xa1, 0x2c, 0x48, 0x1e, 0x01, 0xa0, 0xb9, 0x40, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0xc4, - 0x88, 0x0c, 0x6f, 0xec, 0xed, 0x4d, 0x0c, 0x44, 0x06, 0x26, 0x26, 0xc7, 0x05, 0xa6, 0xc6, 0x05, 0x06, 0x66, 0x43, 0x10, 0x4c, 0x10, 0x00, 0x69, 0x82, 0x00, 0x4c, 0x1b, 0x84, 0x81, 0x98, 0x20, - 0x00, 0xd4, 0x06, 0x61, 0x30, 0x38, 0xb0, 0xa5, 0x89, 0x4d, 0x10, 0x80, 0x6a, 0xc3, 0x80, 0x24, 0xc4, 0x04, 0x01, 0xb0, 0x26, 0x08, 0x02, 0x40, 0x21, 0x68, 0x6a, 0x82, 0x00, 0x5c, 0x1b, 0x84, - 0xc5, 0xd8, 0x90, 0x2c, 0x4c, 0xb3, 0x2c, 0x83, 0xb3, 0x3c, 0x13, 0x04, 0x23, 0x20, 0x23, 0x15, 0x96, 0x07, 0xf5, 0x36, 0x97, 0x46, 0x97, 0xf6, 0xe6, 0x36, 0x37, 0x41, 0x00, 0xb0, 0x09, 0x02, - 0x90, 0x6d, 0x10, 0x06, 0x6a, 0x43, 0x32, 0x44, 0xd2, 0x32, 0x0c, 0xd3, 0x52, 0x6d, 0x10, 0x20, 0x6b, 0x82, 0x80, 0x08, 0x1c, 0x84, 0xea, 0xcc, 0x26, 0x08, 0x72, 0xf0, 0x6d, 0x58, 0x16, 0x2c, - 0x5b, 0x96, 0x61, 0xd2, 0x34, 0xad, 0xda, 0x10, 0x6c, 0x13, 0x04, 0x65, 0xa0, 0xc3, 0xf4, 0x36, 0x16, 0xc6, 0x36, 0xf4, 0xe6, 0x36, 0x47, 0x17, 0xe6, 0x46, 0x37, 0xb7, 0x01, 0x59, 0x3a, 0x6f, - 0x58, 0x06, 0x03, 0x98, 0x20, 0x30, 0x04, 0x1f, 0xa6, 0xb7, 0xb1, 0x30, 0xb6, 0xa1, 0x37, 0xb7, 0x39, 0xba, 0x30, 0x37, 0xba, 0x39, 0x99, 0x0d, 0xc8, 0x00, 0x06, 0x61, 0x30, 0x0c, 0x83, 0x01, - 0x6c, 0x10, 0x3e, 0x31, 0xd8, 0x40, 0x5c, 0xdc, 0x18, 0x00, 0x13, 0x84, 0xa8, 0xd8, 0x00, 0x6c, 0x18, 0x06, 0x33, 0x30, 0x83, 0x09, 0x02, 0xa0, 0x6d, 0x18, 0xd0, 0xc0, 0x0c, 0xcc, 0x60, 0x83, - 0x70, 0x06, 0x69, 0x30, 0x41, 0xa8, 0x8c, 0x0d, 0xc3, 0x62, 0x06, 0x66, 0xb0, 0x61, 0x38, 0x83, 0x34, 0x60, 0x83, 0x09, 0xc2, 0x75, 0x6c, 0x08, 0xce, 0x60, 0xc3, 0x31, 0x94, 0x81, 0x1a, 0xac, - 0x41, 0x1b, 0xb8, 0xc1, 0x1b, 0x10, 0x98, 0x20, 0xcc, 0x01, 0x18, 0x6c, 0x10, 0x16, 0x39, 0xd8, 0x50, 0x00, 0x71, 0x00, 0x90, 0xc1, 0x1c, 0x10, 0x15, 0x02, 0x7e, 0xa4, 0xc2, 0xf2, 0x86, 0xd8, - 0xde, 0xe6, 0xca, 0xe6, 0xe8, 0x80, 0x80, 0xb2, 0x82, 0xb0, 0xaa, 0xa4, 0xc2, 0xf2, 0xa0, 0xc2, 0xf2, 0xd8, 0xde, 0xc2, 0xc8, 0x80, 0x80, 0xaa, 0x84, 0xea, 0xd2, 0xd8, 0xe8, 0x92, 0xdc, 0xa8, - 0xe4, 0xd2, 0xc2, 0xdc, 0xce, 0xd8, 0xca, 0x92, 0xdc, 0xe8, 0xca, 0xe4, 0xe6, 0xca, 0xc6, 0xe8, 0xd2, 0xde, 0xdc, 0x82, 0xe8, 0xe8, 0xe4, 0xd2, 0xc4, 0xea, 0xe8, 0xca, 0xe6, 0x80, 0x80, 0x80, - 0xb4, 0x26, 0x08, 0xc0, 0x36, 0x41, 0x00, 0xb8, 0x09, 0x02, 0xd0, 0x6d, 0x08, 0x96, 0x0d, 0x08, 0x65, 0x07, 0x09, 0x75, 0x07, 0x14, 0x1e, 0xe4, 0xc1, 0x86, 0x62, 0x0d, 0xea, 0x00, 0x00, 0xf4, - 0x80, 0x4f, 0xc0, 0x8f, 0x54, 0x58, 0xde, 0x51, 0x99, 0x1b, 0x10, 0x50, 0x56, 0x10, 0x16, 0x96, 0xd6, 0x06, 0x82, 0xba, 0x03, 0x3c, 0xc8, 0x83, 0x0d, 0x85, 0x1b, 0xf0, 0x01, 0x00, 0xf4, 0x01, - 0xbb, 0x80, 0x1f, 0xa9, 0xb0, 0xbc, 0xa6, 0xb4, 0xb9, 0x39, 0x20, 0xa0, 0xac, 0x20, 0xac, 0x2a, 0xa9, 0xb0, 0x3c, 0xa8, 0xb0, 0x3c, 0xb6, 0xb7, 0x30, 0x32, 0x20, 0x20, 0x20, 0xad, 0x09, 0x02, - 0xe0, 0x6d, 0x30, 0x28, 0x50, 0x48, 0x28, 0x3c, 0xc8, 0x83, 0x0d, 0x45, 0x19, 0xfc, 0x01, 0x00, 0x84, 0x42, 0x15, 0x36, 0x36, 0xbb, 0x36, 0x97, 0x34, 0xb2, 0x32, 0x37, 0xba, 0x29, 0x41, 0x50, - 0x85, 0x0c, 0xcf, 0xc5, 0xae, 0x4c, 0x6e, 0x2e, 0xed, 0xcd, 0x6d, 0x4a, 0x40, 0x34, 0x21, 0xc3, 0x73, 0xb1, 0x0b, 0x63, 0xb3, 0x2b, 0x93, 0x9b, 0x12, 0x18, 0x75, 0xc8, 0xf0, 0x5c, 0xe6, 0xd0, - 0xc2, 0xc8, 0xca, 0xe4, 0x9a, 0xde, 0xc8, 0xca, 0xd8, 0xa6, 0x04, 0x49, 0x19, 0x32, 0x3c, 0x17, 0xb9, 0xb2, 0xb9, 0xb7, 0x3a, 0xb9, 0xb1, 0xb2, 0xb9, 0x29, 0xc1, 0x18, 0x54, 0x22, 0xc3, 0x73, - 0xa1, 0xcb, 0x83, 0x2b, 0x0b, 0x72, 0x73, 0x7b, 0xa3, 0x0b, 0xa3, 0x4b, 0x7b, 0x73, 0x9b, 0x9b, 0x12, 0xbc, 0x41, 0x1d, 0x32, 0x3c, 0x97, 0x32, 0x37, 0x3a, 0xb9, 0x3c, 0xa8, 0xb7, 0x34, 0x37, - 0xba, 0xb9, 0x29, 0xc4, 0x1c, 0xe8, 0x41, 0x1f, 0x84, 0x02, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, - 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, - 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, - 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, - 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, - 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, - 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, - 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, - 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xcc, 0x21, 0x07, 0x7c, 0x70, - 0x03, 0x74, 0x60, 0x07, 0x37, 0x90, 0x87, 0x72, 0x98, 0x87, 0x77, 0xa8, 0x07, 0x79, 0x18, 0x87, 0x72, 0x70, 0x83, 0x70, 0xa0, 0x07, 0x7a, 0x90, 0x87, 0x74, 0x10, 0x87, 0x7a, 0xa0, 0x87, 0x72, - 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x05, 0xa0, 0x06, 0x81, 0x5f, 0x70, 0x0a, 0x04, 0xce, 0xaa, 0xd2, 0x70, 0x9e, 0x2e, 0x0f, 0x8f, 0xd3, 0xee, 0x73, 0x70, - 0x3c, 0x2e, 0xb3, 0xcb, 0xf2, 0x30, 0x3d, 0xfd, 0x76, 0x4f, 0xe9, 0xf2, 0xfa, 0x98, 0x5e, 0x97, 0x97, 0x81, 0xc0, 0x60, 0x09, 0xc4, 0x41, 0xe0, 0x27, 0xac, 0x9b, 0x81, 0xc0, 0x99, 0xf5, 0x47, - 0x92, 0x5e, 0xa7, 0x74, 0x79, 0x7d, 0x4c, 0xaf, 0xcb, 0xcb, 0x64, 0x61, 0xdd, 0x6c, 0x2e, 0xcb, 0x81, 0xd6, 0x1f, 0xc9, 0x5e, 0x1e, 0xd3, 0xdf, 0x72, 0x60, 0x93, 0x04, 0x8b, 0x01, 0x81, 0x40, - 0x60, 0xb0, 0x0c, 0x50, 0x21, 0xf0, 0x93, 0x86, 0xf3, 0x43, 0xf6, 0x7b, 0x5e, 0x9e, 0xd3, 0x81, 0xc0, 0x6c, 0x10, 0x5b, 0x95, 0x86, 0xf3, 0xd0, 0x70, 0x9e, 0xfd, 0x0e, 0x93, 0x81, 0xc0, 0xaa, - 0xb0, 0x9e, 0x66, 0xd3, 0x93, 0x6e, 0xaa, 0x3c, 0x1d, 0x76, 0x9f, 0xd9, 0xe5, 0xa4, 0x9b, 0x5e, 0x96, 0xcf, 0xcb, 0x63, 0x7a, 0xfa, 0xed, 0x0e, 0xd2, 0xe9, 0xf2, 0xb4, 0xb8, 0x4e, 0x2f, 0xcf, - 0x81, 0x40, 0xa0, 0xb6, 0x0e, 0x9e, 0xc0, 0x4f, 0x1a, 0xce, 0x1f, 0xcb, 0x6e, 0x20, 0x30, 0x1b, 0xc4, 0x62, 0xb5, 0x55, 0xd0, 0x05, 0x7e, 0xd2, 0x70, 0xbe, 0x99, 0x9e, 0xcf, 0x81, 0xc0, 0x6c, - 0x10, 0x5b, 0x95, 0x86, 0xf3, 0xd0, 0x70, 0x9e, 0xfd, 0x0e, 0x93, 0x81, 0x40, 0xa0, 0xb6, 0x02, 0xf0, 0x20, 0xf0, 0x93, 0x86, 0xf3, 0xd0, 0xf7, 0x3c, 0x4d, 0x4f, 0xbf, 0xdd, 0x73, 0x20, 0x70, - 0x66, 0xfd, 0x91, 0xa6, 0x74, 0x79, 0x7d, 0x4c, 0xaf, 0xcb, 0xcb, 0x64, 0x61, 0xdd, 0x6c, 0x2e, 0xcb, 0x81, 0xd6, 0x1f, 0xc9, 0x5e, 0x1e, 0xd3, 0xdf, 0x72, 0x60, 0x93, 0x04, 0x8b, 0x01, 0x81, - 0x40, 0x60, 0xd0, 0x06, 0x9c, 0xd2, 0x11, 0x80, 0x85, 0x73, 0x1a, 0x69, 0x02, 0x9a, 0x49, 0x32, 0x82, 0xa7, 0x74, 0x04, 0x60, 0xe1, 0x9c, 0x46, 0x9a, 0x80, 0x66, 0x92, 0x6c, 0x43, 0xd8, 0x86, - 0xcb, 0x77, 0x1e, 0x5f, 0x08, 0xa8, 0xa2, 0x20, 0xa2, 0xd2, 0x01, 0x86, 0x92, 0x30, 0x00, 0x01, 0xf3, 0x8b, 0xdb, 0xb6, 0x86, 0x33, 0x18, 0x2e, 0xdf, 0x79, 0x7c, 0x21, 0x22, 0x80, 0x89, 0x08, - 0x81, 0x66, 0x58, 0x88, 0xcf, 0x89, 0x4a, 0x24, 0xf0, 0x4b, 0x47, 0x00, 0x16, 0xce, 0x69, 0xa4, 0x09, 0x68, 0x26, 0xc9, 0x1c, 0xd0, 0x60, 0xb8, 0x7c, 0xe7, 0xf1, 0x85, 0x88, 0x00, 0x26, 0x22, - 0x04, 0x9a, 0x61, 0x21, 0x3e, 0x27, 0x2a, 0x91, 0xc0, 0x2f, 0x1d, 0x01, 0x58, 0x38, 0xa7, 0x91, 0x26, 0xa0, 0x99, 0x24, 0xbb, 0x22, 0x48, 0x81, 0x8c, 0x77, 0xbd, 0xe1, 0xae, 0xb1, 0xbc, 0x1c, - 0xa6, 0x97, 0x91, 0x61, 0x37, 0x99, 0x5d, 0x36, 0xbe, 0xe5, 0xcc, 0xb4, 0xd8, 0x35, 0x66, 0x87, 0xe7, 0x73, 0x97, 0xf4, 0x3a, 0xa5, 0xcb, 0xeb, 0x63, 0x7a, 0x5d, 0x5e, 0x26, 0x0b, 0xeb, 0x66, - 0x73, 0x59, 0xce, 0xb3, 0x97, 0xc7, 0xf4, 0xb7, 0x9c, 0x67, 0x66, 0xbf, 0xc3, 0x74, 0x16, 0x48, 0xe6, 0x03, 0xf9, 0xea, 0x41, 0x14, 0xc8, 0x78, 0xd7, 0x1b, 0xee, 0x1a, 0xcb, 0xcb, 0x61, 0x7a, - 0x19, 0x19, 0x76, 0x93, 0xd9, 0x65, 0xe3, 0x5b, 0xce, 0x4c, 0x8b, 0x5d, 0x63, 0x76, 0x78, 0x3e, 0x77, 0x4d, 0xe9, 0xf2, 0xfa, 0x98, 0x5e, 0x97, 0x97, 0xc9, 0xc2, 0xba, 0xd9, 0x5c, 0x96, 0xf3, - 0xec, 0xe5, 0x31, 0xfd, 0x2d, 0xe7, 0x99, 0xd9, 0xef, 0x30, 0x9d, 0x05, 0x92, 0xf9, 0x40, 0x3e, 0x83, 0xf8, 0x83, 0xe1, 0xf2, 0x9d, 0xc7, 0x17, 0x22, 0x02, 0x98, 0x88, 0x10, 0x68, 0x86, 0x85, - 0xf8, 0x9c, 0xa8, 0x44, 0x02, 0x5f, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x15, 0xc0, 0xa6, 0x08, 0x10, 0x90, 0xc6, 0xd0, 0x04, 0x81, 0x58, 0x88, 0x08, 0x98, 0x10, 0xa7, 0x61, 0xa7, 0x88, 0x12, 0x26, - 0x2a, 0x22, 0x2c, 0x61, 0x1b, 0x2e, 0xdf, 0x79, 0xfc, 0x01, 0x91, 0x1e, 0x60, 0x12, 0x8e, 0x15, 0xc0, 0x24, 0xb1, 0x19, 0x88, 0xcb, 0x47, 0x6e, 0xdb, 0x16, 0xae, 0xe1, 0xf2, 0x9d, 0xc7, 0x8f, - 0x00, 0x6b, 0xa3, 0x8a, 0x82, 0x88, 0x4a, 0x07, 0x18, 0xfc, 0xe2, 0xb6, 0x4d, 0x01, 0x1b, 0x2e, 0xdf, 0x79, 0xfc, 0x08, 0xb0, 0x36, 0xaa, 0x28, 0x88, 0x88, 0x9d, 0x9c, 0x88, 0xf0, 0x8b, 0xdb, - 0x36, 0x06, 0x30, 0x18, 0x2e, 0xdf, 0x79, 0xfc, 0x29, 0x02, 0x04, 0x62, 0x05, 0x30, 0x5f, 0x9a, 0x22, 0x4a, 0x98, 0xfc, 0x15, 0xc0, 0x52, 0x00, 0x5b, 0x1c, 0x60, 0x00, 0x61, 0x20, 0x00, 0x00, - 0x1e, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x14, 0xb0, 0x40, 0xd9, 0x01, 0x00, 0x00, 0x04, 0x06, 0xcb, 0x20, 0x31, 0x48, 0xc6, 0x88, - 0x81, 0x01, 0x80, 0x20, 0x18, 0xa4, 0x01, 0x46, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x70, 0x06, 0x5a, 0x21, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0x07, 0x06, 0x45, 0x20, 0x8d, 0x26, - 0x04, 0xc0, 0x72, 0x88, 0x84, 0xa2, 0xa8, 0x61, 0x03, 0x22, 0x10, 0x06, 0x60, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0xb8, 0x31, 0x40, 0x8a, 0x6a, 0x34, 0x21, 0x00, 0x96, 0x43, 0x30, 0xd7, 0xb5, - 0x0d, 0x1b, 0x10, 0x81, 0x30, 0x00, 0x18, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x72, 0x3c, 0x00, 0xb6, 0x38, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x14, 0xb0, 0x40, 0xd9, 0x01, 0x00, 0x00, 0x14, 0x06, 0xcb, 0xa0, 0x31, 0x48, 0xc6, 0x88, - 0x81, 0x01, 0x80, 0x20, 0x18, 0xa4, 0x41, 0x46, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x70, 0x06, 0x5b, 0x21, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x01, 0x17, 0x06, 0x45, 0x30, 0x8d, 0x26, - 0x04, 0xc0, 0x72, 0x08, 0xa5, 0xaa, 0xaa, 0x61, 0x03, 0x22, 0x10, 0x06, 0x60, 0xc4, 0xe0, 0x00, 0x40, 0x10, 0x0c, 0x38, 0x32, 0x40, 0x0a, 0x6b, 0x34, 0x21, 0x00, 0x96, 0x43, 0x34, 0x18, 0xc6, - 0x0d, 0x1b, 0x10, 0x81, 0x30, 0x00, 0x18, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x26, 0x72, 0x00, 0xd3, 0x14, 0x21, 0x81, 0x64, 0x21, 0xc7, 0x03, 0x60, 0x8b, 0x03, 0x0c, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x14, 0xb0, 0x40, 0x89, 0x0a, 0x94, 0xa5, - 0x40, 0xe9, 0x0a, 0x14, 0xa6, 0x00, 0xcd, 0x25, 0x30, 0x02, 0x40, 0xd9, 0x08, 0x40, 0x19, 0xd0, 0x30, 0x46, 0x00, 0x82, 0x20, 0x28, 0x83, 0x01, 0x11, 0x23, 0x00, 0x34, 0x8c, 0x11, 0x80, 0x20, - 0x08, 0xe2, 0xbf, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x33, 0x00, 0x23, 0x00, 0x00, 0x00, 0x33, 0x11, 0x0e, 0x20, 0x91, 0x02, 0xc1, 0x41, 0x31, 0x48, 0x0e, 0x82, 0x41, 0x71, 0x70, 0x8c, - 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0xf0, 0xd6, 0x40, 0x62, 0x46, 0x0c, 0x0c, 0x00, 0x04, 0xc1, 0x60, 0x0d, 0xcc, 0x80, 0x22, 0x46, 0x0c, 0x14, 0x00, 0x04, 0xc1, 0x60, 0x0c, 0xd6, 0x60, 0x0a, - 0x04, 0x30, 0x68, 0xc4, 0x60, 0x34, 0x21, 0x00, 0x46, 0x13, 0x84, 0x60, 0x3b, 0x43, 0x32, 0x06, 0x63, 0x30, 0x6c, 0x40, 0x04, 0x0f, 0x01, 0x8c, 0x18, 0x18, 0x00, 0x08, 0x82, 0x41, 0x1b, 0xa8, - 0x41, 0x86, 0x8c, 0x18, 0x50, 0x07, 0x08, 0x82, 0x41, 0x19, 0xbc, 0xc1, 0x15, 0x94, 0x41, 0x1a, 0x94, 0x41, 0x1a, 0x94, 0x01, 0x31, 0x38, 0x0c, 0xc3, 0x3c, 0xd1, 0x42, 0x02, 0x41, 0x46, 0x0c, - 0x0c, 0x00, 0x04, 0xc1, 0xe0, 0x0d, 0xd6, 0x60, 0x4b, 0xc6, 0x10, 0x04, 0x6b, 0x0c, 0x61, 0xc0, 0x46, 0x0c, 0x1c, 0x00, 0x04, 0xc1, 0x00, 0x0c, 0xea, 0x40, 0x1b, 0x96, 0x34, 0x10, 0x82, 0x28, - 0xb2, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x18, 0xf2, 0x50, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0xc1, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0xa3, 0x01, 0x00, + 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x47, 0x03, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x0f, 0x07, 0x04, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x9e, 0x0f, 0x08, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x3c, 0x62, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1e, + 0x33, 0x00, 0x02, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x21, 0x4f, 0x1a, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x90, 0x67, 0x0d, 0x80, 0x00, 0x38, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc8, 0xe3, 0x06, 0x40, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xe4, 0x81, 0x03, 0x20, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x18, 0xf2, 0xc8, 0x01, 0x10, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x79, 0xe8, 0x00, 0x08, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, + 0x3c, 0x76, 0x00, 0x04, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1e, 0x3c, 0x00, 0x02, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2c, 0x10, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, 0x32, 0x1e, 0x98, 0x18, 0x19, 0x11, 0x4c, 0x90, 0x8c, 0x09, 0x26, 0x47, 0xc6, 0x04, 0x43, 0x02, 0x4a, 0xa0, 0x0c, 0x8a, 0x61, 0x04, 0xa0, 0x40, 0x0a, 0xa1, 0x30, 0x0a, + 0xa2, 0x08, 0x4a, 0xa2, 0x1c, 0x4a, 0xa1, 0x28, 0xca, 0x82, 0xbc, 0x11, 0x00, 0xda, 0x0b, 0x14, 0x10, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, + 0x1a, 0x03, 0x4c, 0x90, 0x46, 0x02, 0x13, 0x44, 0x35, 0x18, 0x63, 0x0b, 0x73, 0x3b, 0x03, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x03, 0x99, 0x71, 0xb9, 0x01, 0x41, 0xa1, 0x0b, 0x3b, 0x9b, + 0x7b, 0x91, 0x2a, 0x62, 0x2a, 0x0a, 0x9a, 0x2a, 0xfa, 0x9a, 0xb9, 0x81, 0x79, 0x31, 0x4b, 0x73, 0x0b, 0x63, 0x4b, 0xd9, 0x10, 0x04, 0x13, 0x04, 0xe0, 0x9a, 0x20, 0x00, 0xd8, 0x06, 0x61, 0x20, + 0x26, 0x08, 0x40, 0xb6, 0x41, 0x18, 0x0c, 0x0e, 0x6c, 0x69, 0x62, 0x1b, 0x06, 0xc4, 0x20, 0x26, 0x08, 0x80, 0x36, 0x41, 0x10, 0x00, 0x0a, 0x41, 0x53, 0x13, 0x04, 0x60, 0x9b, 0x20, 0x00, 0xdc, + 0x06, 0x41, 0x71, 0x36, 0x24, 0xca, 0xc2, 0x28, 0xca, 0xd0, 0x28, 0xcf, 0x04, 0xc1, 0x08, 0xc8, 0x48, 0x85, 0xe5, 0x41, 0xbd, 0xcd, 0xa5, 0xd1, 0xa5, 0xbd, 0xb9, 0xcd, 0x4d, 0x10, 0x80, 0x6e, + 0x82, 0x00, 0x78, 0x1b, 0x84, 0x81, 0xda, 0x90, 0x0c, 0x91, 0xa4, 0x0c, 0xc3, 0xa4, 0x54, 0x1b, 0x04, 0xc8, 0x9a, 0x20, 0x20, 0x02, 0x07, 0xa1, 0x3a, 0xb3, 0x09, 0x82, 0x57, 0x06, 0x1b, 0x16, + 0x05, 0xcb, 0x14, 0x65, 0x98, 0x34, 0x4d, 0xab, 0x36, 0x04, 0xdb, 0x04, 0x41, 0x19, 0xe8, 0x30, 0xbd, 0x8d, 0x85, 0xb1, 0x0d, 0xbd, 0xb9, 0xcd, 0xd1, 0x85, 0xb9, 0xd1, 0xcd, 0x6d, 0x40, 0x94, + 0xce, 0x1b, 0x94, 0xc1, 0x01, 0x26, 0x08, 0x0c, 0xc1, 0x87, 0xe9, 0x6d, 0x2c, 0x8c, 0x6d, 0xe8, 0xcd, 0x6d, 0x8e, 0x2e, 0xcc, 0x8d, 0x6e, 0x4e, 0x66, 0x03, 0x32, 0x80, 0x41, 0x18, 0x0c, 0xc3, + 0xe0, 0x00, 0x1b, 0x84, 0x4f, 0x0c, 0x36, 0x10, 0x17, 0x37, 0x06, 0xc0, 0x04, 0x21, 0x2a, 0x36, 0x00, 0x1b, 0x86, 0xc1, 0x0c, 0xcc, 0x60, 0x82, 0x00, 0x7c, 0x1b, 0x06, 0x34, 0x30, 0x03, 0x33, + 0xd8, 0x20, 0x9c, 0x41, 0x1a, 0x4c, 0x10, 0x2a, 0x63, 0xc3, 0xa0, 0x98, 0x81, 0x19, 0x6c, 0x18, 0xce, 0x20, 0x0d, 0xd8, 0x60, 0x82, 0x50, 0x1d, 0x13, 0x84, 0x0c, 0x99, 0x20, 0x6c, 0xc9, 0x86, + 0xe0, 0x0c, 0x26, 0x08, 0x9b, 0xb2, 0xa1, 0x19, 0xca, 0x40, 0x0d, 0xd6, 0xa0, 0x0d, 0xdc, 0xa0, 0x0d, 0xde, 0xa0, 0x0d, 0xe0, 0x20, 0x0e, 0xe4, 0x20, 0x0e, 0x08, 0x4c, 0x10, 0xf6, 0xc0, 0x0c, + 0x36, 0x08, 0x4a, 0x1d, 0x6c, 0x28, 0x00, 0x3a, 0x00, 0xc8, 0xc0, 0x0e, 0xe8, 0x06, 0x01, 0x3f, 0x52, 0x61, 0x79, 0x41, 0x6e, 0x79, 0x41, 0x41, 0x42, 0x42, 0x40, 0x40, 0x59, 0x41, 0x58, 0x55, + 0x52, 0x61, 0x79, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x40, 0x40, 0x55, 0x41, 0x41, 0x42, 0x42, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x73, 0x40, 0x40, 0x40, 0x5a, 0x13, 0x04, 0x00, 0x0c, + 0x26, 0x08, 0x40, 0x18, 0x4c, 0x10, 0x00, 0x31, 0xd8, 0x10, 0x28, 0x1b, 0x10, 0x2a, 0x0f, 0x0c, 0x4a, 0x0f, 0x9c, 0x3d, 0xe0, 0x83, 0x0d, 0xc5, 0x1b, 0xe0, 0x01, 0x00, 0xf4, 0x01, 0x59, 0x21, + 0xe0, 0x47, 0x2a, 0x2c, 0x2f, 0xc8, 0x2d, 0x8f, 0x4a, 0x2e, 0x2d, 0xcc, 0xed, 0x8c, 0xad, 0x0c, 0x08, 0x28, 0x2b, 0x08, 0xab, 0x4a, 0x2a, 0x2c, 0x0f, 0x2a, 0x2c, 0x8f, 0xed, 0x2d, 0x8c, 0x0c, + 0x08, 0xa8, 0x4a, 0xa8, 0x2e, 0x8d, 0x8d, 0x2e, 0xc9, 0x8d, 0x4a, 0x2e, 0x2d, 0xcc, 0xed, 0x8c, 0xad, 0x2c, 0xc9, 0x8d, 0xae, 0x4c, 0x6e, 0xae, 0x6c, 0x8c, 0x2e, 0xed, 0xcd, 0x2d, 0x88, 0x8e, + 0x4e, 0x2e, 0x4d, 0xac, 0x8e, 0xae, 0x6c, 0x0e, 0x08, 0x08, 0x48, 0x6b, 0x03, 0x42, 0xe5, 0x81, 0x41, 0xe9, 0x01, 0xb5, 0x07, 0x7c, 0xb0, 0xa1, 0x70, 0x83, 0x3f, 0x00, 0x00, 0x50, 0x20, 0x2a, + 0x04, 0xfc, 0x48, 0x85, 0xe5, 0x0d, 0xb1, 0xbd, 0xcd, 0x95, 0xcd, 0xd1, 0x01, 0x01, 0x65, 0x05, 0x61, 0x55, 0x49, 0x85, 0xe5, 0x41, 0x85, 0xe5, 0xb1, 0xbd, 0x85, 0x91, 0x01, 0x01, 0x55, 0x09, + 0xd5, 0xa5, 0xb1, 0xd1, 0x25, 0xb9, 0x51, 0xc9, 0xa5, 0x85, 0xb9, 0x9d, 0xb1, 0x95, 0x25, 0xb9, 0xd1, 0x95, 0xc9, 0xcd, 0x95, 0x8d, 0xd1, 0xa5, 0xbd, 0xb9, 0x05, 0xd1, 0xd1, 0xc9, 0xa5, 0x89, + 0xd5, 0xd1, 0x95, 0xcd, 0x01, 0x01, 0x01, 0x69, 0x4d, 0x10, 0x80, 0x31, 0xd8, 0x80, 0x50, 0xa3, 0x60, 0x50, 0x7a, 0x40, 0xed, 0x01, 0x1f, 0x6c, 0x28, 0xd6, 0x40, 0x14, 0x00, 0x80, 0x14, 0xf8, + 0x04, 0xfc, 0x48, 0x85, 0xe5, 0x1d, 0x95, 0xb9, 0x01, 0x01, 0x65, 0x05, 0x61, 0x61, 0x69, 0x6d, 0x20, 0x28, 0x3d, 0xd8, 0x03, 0x3e, 0xd8, 0x50, 0xc8, 0x81, 0x29, 0x00, 0xc0, 0x29, 0xb0, 0x0a, + 0xf8, 0x91, 0x0a, 0xcb, 0x4b, 0x72, 0xa3, 0x2b, 0x93, 0x9b, 0x2b, 0x1b, 0xa3, 0x03, 0x02, 0xca, 0x0a, 0xc2, 0xc2, 0xd2, 0xda, 0x40, 0x50, 0xd4, 0x1e, 0xf0, 0xc1, 0x86, 0x02, 0x0e, 0x52, 0x01, + 0x00, 0x54, 0x81, 0x5d, 0xc0, 0x8f, 0x54, 0x58, 0x5e, 0x53, 0xda, 0xdc, 0x1c, 0x10, 0x50, 0x56, 0x10, 0x56, 0x95, 0x54, 0x58, 0x1e, 0x54, 0x58, 0x1e, 0xdb, 0x5b, 0x18, 0x19, 0x10, 0x10, 0x90, + 0xd6, 0x04, 0x01, 0x20, 0x83, 0x0d, 0x06, 0xd5, 0x0a, 0x06, 0xb5, 0x07, 0x7c, 0xb0, 0xa1, 0x28, 0x03, 0x56, 0x00, 0x00, 0x57, 0x60, 0x61, 0xc6, 0xf6, 0x16, 0x46, 0xc7, 0xe7, 0xad, 0xcd, 0x2d, + 0x0d, 0xee, 0x8d, 0xae, 0xcc, 0x8d, 0x0e, 0x64, 0x0c, 0x2d, 0x4c, 0x8e, 0xd1, 0x54, 0x5a, 0x1b, 0x1c, 0x5b, 0x19, 0xc8, 0xd0, 0xcb, 0xd0, 0xca, 0x0a, 0x08, 0x95, 0x50, 0x50, 0xd0, 0x86, 0x40, + 0x16, 0x26, 0x08, 0x7b, 0x70, 0x06, 0x1b, 0x86, 0x58, 0x98, 0x05, 0x5a, 0xd8, 0x30, 0xc0, 0x42, 0x2d, 0xd0, 0xc2, 0x86, 0xc1, 0x16, 0x6c, 0x81, 0x16, 0x36, 0x0c, 0xb5, 0x50, 0x0b, 0xb4, 0x50, + 0x85, 0x8d, 0xcd, 0xae, 0xcd, 0x25, 0x8d, 0xac, 0xcc, 0x8d, 0x6e, 0x4a, 0x10, 0x54, 0x21, 0xc3, 0x73, 0xb1, 0x2b, 0x93, 0x9b, 0x4b, 0x7b, 0x73, 0x9b, 0x12, 0x10, 0x4d, 0xc8, 0xf0, 0x5c, 0xec, + 0xc2, 0xd8, 0xec, 0xca, 0xe4, 0xa6, 0x04, 0x46, 0x1d, 0x32, 0x3c, 0x97, 0x39, 0xb4, 0x30, 0xb2, 0x32, 0xb9, 0xa6, 0x37, 0xb2, 0x32, 0xb6, 0x29, 0x01, 0x52, 0x86, 0x0c, 0xcf, 0x45, 0xae, 0x6c, + 0xee, 0xad, 0x4e, 0x6e, 0xac, 0x6c, 0x6e, 0x4a, 0x30, 0x06, 0x95, 0xc8, 0xf0, 0x5c, 0xe8, 0xf2, 0xe0, 0xca, 0x82, 0xdc, 0xdc, 0xde, 0xe8, 0xc2, 0xe8, 0xd2, 0xde, 0xdc, 0xe6, 0xa6, 0x04, 0x72, + 0x50, 0x87, 0x0c, 0xcf, 0xa5, 0xcc, 0x8d, 0x4e, 0x2e, 0x0f, 0xea, 0x2d, 0xcd, 0x8d, 0x6e, 0x6e, 0xca, 0x61, 0x07, 0x7d, 0x00, 0x0a, 0xa4, 0x70, 0x0a, 0xaa, 0xe0, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x79, 0x18, 0x00, 0x00, 0x49, 0x00, 0x00, 0x00, 0x33, 0x08, 0x80, 0x1c, 0xc4, 0xe1, 0x1c, 0x66, 0x14, 0x01, 0x3d, 0x88, 0x43, 0x38, 0x84, 0xc3, 0x8c, 0x42, 0x80, 0x07, 0x79, 0x78, 0x07, 0x73, + 0x98, 0x71, 0x0c, 0xe6, 0x00, 0x0f, 0xed, 0x10, 0x0e, 0xf4, 0x80, 0x0e, 0x33, 0x0c, 0x42, 0x1e, 0xc2, 0xc1, 0x1d, 0xce, 0xa1, 0x1c, 0x66, 0x30, 0x05, 0x3d, 0x88, 0x43, 0x38, 0x84, 0x83, 0x1b, + 0xcc, 0x03, 0x3d, 0xc8, 0x43, 0x3d, 0x8c, 0x03, 0x3d, 0xcc, 0x78, 0x8c, 0x74, 0x70, 0x07, 0x7b, 0x08, 0x07, 0x79, 0x48, 0x87, 0x70, 0x70, 0x07, 0x7a, 0x70, 0x03, 0x76, 0x78, 0x87, 0x70, 0x20, + 0x87, 0x19, 0xcc, 0x11, 0x0e, 0xec, 0x90, 0x0e, 0xe1, 0x30, 0x0f, 0x6e, 0x30, 0x0f, 0xe3, 0xf0, 0x0e, 0xf0, 0x50, 0x0e, 0x33, 0x10, 0xc4, 0x1d, 0xde, 0x21, 0x1c, 0xd8, 0x21, 0x1d, 0xc2, 0x61, + 0x1e, 0x66, 0x30, 0x89, 0x3b, 0xbc, 0x83, 0x3b, 0xd0, 0x43, 0x39, 0xb4, 0x03, 0x3c, 0xbc, 0x83, 0x3c, 0x84, 0x03, 0x3b, 0xcc, 0xf0, 0x14, 0x76, 0x60, 0x07, 0x7b, 0x68, 0x07, 0x37, 0x68, 0x87, + 0x72, 0x68, 0x07, 0x37, 0x80, 0x87, 0x70, 0x90, 0x87, 0x70, 0x60, 0x07, 0x76, 0x28, 0x07, 0x76, 0xf8, 0x05, 0x76, 0x78, 0x87, 0x77, 0x80, 0x87, 0x5f, 0x08, 0x87, 0x71, 0x18, 0x87, 0x72, 0x98, + 0x87, 0x79, 0x98, 0x81, 0x2c, 0xee, 0xf0, 0x0e, 0xee, 0xe0, 0x0e, 0xf5, 0xc0, 0x0e, 0xec, 0x30, 0x03, 0x62, 0xc8, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xcc, 0xa1, 0x1c, 0xe4, 0xa1, 0x1c, 0xdc, 0x61, + 0x1c, 0xca, 0x21, 0x1c, 0xc4, 0x81, 0x1d, 0xca, 0x61, 0x06, 0xd6, 0x90, 0x43, 0x39, 0xc8, 0x43, 0x39, 0x98, 0x43, 0x39, 0xc8, 0x43, 0x39, 0xb8, 0xc3, 0x38, 0x94, 0x43, 0x38, 0x88, 0x03, 0x3b, + 0x94, 0xc3, 0x2f, 0xbc, 0x83, 0x3c, 0xfc, 0x82, 0x3b, 0xd4, 0x03, 0x3b, 0xb0, 0xc3, 0x8c, 0xc8, 0x21, 0x07, 0x7c, 0x70, 0x03, 0x72, 0x10, 0x87, 0x73, 0x70, 0x03, 0x7b, 0x08, 0x07, 0x79, 0x60, + 0x87, 0x70, 0xc8, 0x87, 0x77, 0xa8, 0x07, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x71, 0x20, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x05, 0xa0, 0x06, 0x81, 0x5f, 0x70, 0x0a, 0x04, 0xce, 0xaa, 0xd2, 0x70, + 0x9e, 0x2e, 0x0f, 0x8f, 0xd3, 0xee, 0x73, 0x70, 0x3c, 0x2e, 0xb3, 0xcb, 0xf2, 0x30, 0x3d, 0xfd, 0x76, 0x4f, 0xe9, 0xf2, 0xfa, 0x98, 0x5e, 0x97, 0x97, 0x81, 0xc0, 0x60, 0x09, 0xc4, 0x41, 0xe0, + 0x27, 0xac, 0x9b, 0x81, 0xc0, 0x99, 0xf5, 0x47, 0x92, 0x5e, 0xa7, 0x74, 0x79, 0x7d, 0x4c, 0xaf, 0xcb, 0xcb, 0x64, 0x61, 0xdd, 0x6c, 0x2e, 0xcb, 0x81, 0xd6, 0x1f, 0xc9, 0x5e, 0x1e, 0xd3, 0xdf, + 0x72, 0x60, 0x93, 0x04, 0x8b, 0x01, 0x81, 0x40, 0x60, 0xb0, 0x10, 0xdc, 0x20, 0xf0, 0x93, 0x86, 0xf3, 0x41, 0x77, 0x3e, 0x18, 0x14, 0x0a, 0x81, 0xc0, 0x6c, 0x10, 0x5b, 0x95, 0x86, 0xf3, 0xd0, + 0x70, 0x9e, 0xfd, 0x0e, 0x93, 0x81, 0xc0, 0x6a, 0x30, 0x28, 0x14, 0x06, 0xe9, 0x74, 0x79, 0x5a, 0x3c, 0x07, 0x02, 0x81, 0xda, 0x3a, 0x60, 0x85, 0xc0, 0x4f, 0x1a, 0xce, 0x07, 0xdd, 0x79, 0xaa, + 0x3c, 0x1d, 0x76, 0x9f, 0xd9, 0x65, 0x20, 0x30, 0x1b, 0xc4, 0x56, 0xa5, 0xe1, 0x3c, 0x34, 0x9c, 0x67, 0xbf, 0xc3, 0x64, 0x20, 0xb0, 0x2a, 0xac, 0xa7, 0xd9, 0xf4, 0xa4, 0x9b, 0x2a, 0x4f, 0x87, + 0xdd, 0x67, 0x76, 0x39, 0xe9, 0xa6, 0x97, 0xe5, 0xf3, 0xf2, 0x98, 0x9e, 0x7e, 0xbb, 0x83, 0x74, 0xba, 0x3c, 0x2d, 0xae, 0xd3, 0xcb, 0x73, 0x20, 0x10, 0xa8, 0x2d, 0x03, 0x54, 0x08, 0xfc, 0xa4, + 0xe1, 0xfc, 0x90, 0xfd, 0x9e, 0x97, 0xe7, 0x74, 0x20, 0x30, 0x1b, 0xc4, 0x56, 0xa5, 0xe1, 0x3c, 0x34, 0x9c, 0x67, 0xbf, 0xc3, 0x64, 0x20, 0xb0, 0x2a, 0xac, 0xa7, 0xd9, 0xf4, 0xa4, 0x9b, 0x2a, + 0x4f, 0x87, 0xdd, 0x67, 0x76, 0x39, 0xe9, 0xa6, 0x97, 0xe5, 0xf3, 0xf2, 0x98, 0x9e, 0x7e, 0xbb, 0x83, 0x74, 0xba, 0x3c, 0x2d, 0xae, 0xd3, 0xcb, 0x73, 0x20, 0x10, 0xa8, 0x2d, 0x85, 0x27, 0xf0, + 0x93, 0x86, 0xf3, 0xc7, 0xb2, 0x1b, 0x08, 0xcc, 0x06, 0xb1, 0x58, 0x6d, 0x25, 0x54, 0x81, 0x9f, 0x34, 0x9c, 0x4f, 0xba, 0xe9, 0x65, 0xf9, 0xbc, 0x3c, 0xa6, 0x03, 0x81, 0xd9, 0x20, 0x16, 0xab, + 0xad, 0x82, 0x2e, 0xf0, 0x93, 0x86, 0xf3, 0xcd, 0xf4, 0x7c, 0x0e, 0x04, 0x66, 0x83, 0xd8, 0xaa, 0x34, 0x9c, 0x87, 0x86, 0xf3, 0xec, 0x77, 0x98, 0x0c, 0x04, 0x02, 0xb5, 0x15, 0x80, 0x07, 0x81, + 0x9f, 0x34, 0x9c, 0x87, 0xbe, 0xe7, 0x69, 0x7a, 0xfa, 0xed, 0x9e, 0x03, 0x81, 0x33, 0xeb, 0x8f, 0x34, 0xa5, 0xcb, 0xeb, 0x63, 0x7a, 0x5d, 0x5e, 0x26, 0x0b, 0xeb, 0x66, 0x73, 0x59, 0x0e, 0xb4, + 0xfe, 0x48, 0xf6, 0xf2, 0x98, 0xfe, 0x96, 0x03, 0x9b, 0x24, 0x58, 0x0c, 0x08, 0x04, 0x02, 0x83, 0x36, 0xe0, 0x94, 0x8e, 0x00, 0x2c, 0x9c, 0xd3, 0x48, 0x13, 0xd0, 0x4c, 0x92, 0x11, 0x3c, 0xa5, + 0x23, 0x00, 0x0b, 0xe7, 0x34, 0xd2, 0x04, 0x34, 0x93, 0x64, 0x5b, 0xc4, 0x36, 0x5c, 0xbe, 0xf3, 0xf8, 0x42, 0x40, 0x15, 0x05, 0x11, 0x95, 0x0e, 0x30, 0x94, 0x84, 0x01, 0x08, 0x98, 0x5f, 0xdc, + 0xb6, 0x49, 0x9c, 0xc1, 0x70, 0xf9, 0xce, 0xe3, 0x0b, 0x11, 0x01, 0x4c, 0x44, 0x08, 0x34, 0xc3, 0x42, 0x7c, 0x4e, 0x54, 0x22, 0x81, 0x5f, 0x3a, 0x02, 0xb0, 0x70, 0x4e, 0x23, 0x4d, 0x40, 0x33, + 0x49, 0x36, 0x81, 0x06, 0xc3, 0xe5, 0x3b, 0x8f, 0x2f, 0x44, 0x04, 0x30, 0x11, 0x21, 0xd0, 0x0c, 0x0b, 0xf1, 0x39, 0x51, 0x89, 0x04, 0x7e, 0xe9, 0x08, 0xc0, 0xc2, 0x39, 0x8d, 0x34, 0x01, 0xcd, + 0x24, 0xd9, 0x65, 0x41, 0x0a, 0x64, 0xbc, 0xeb, 0x0d, 0x77, 0x8d, 0xe5, 0xe5, 0x30, 0xbd, 0x8c, 0x0c, 0xbb, 0xc9, 0xec, 0xb2, 0xf1, 0x2d, 0x67, 0xa6, 0xc5, 0xae, 0x31, 0x3b, 0x3c, 0x9f, 0xbb, + 0xa4, 0xd7, 0x29, 0x5d, 0x5e, 0x1f, 0xd3, 0xeb, 0xf2, 0x32, 0x59, 0x58, 0x37, 0x9b, 0xcb, 0x72, 0x9e, 0xbd, 0x3c, 0xa6, 0xbf, 0xe5, 0x3c, 0x33, 0xfb, 0x1d, 0xa6, 0xb3, 0x40, 0x32, 0x1f, 0xc8, + 0x57, 0x14, 0xa2, 0x40, 0xc6, 0xbb, 0xde, 0x70, 0xd7, 0x58, 0x5e, 0x0e, 0xd3, 0xcb, 0xc8, 0xb0, 0x9b, 0xcc, 0x2e, 0x1b, 0xdf, 0x72, 0x66, 0x5a, 0xec, 0x1a, 0xb3, 0xc3, 0xf3, 0xb9, 0x6b, 0x4a, + 0x97, 0xd7, 0xc7, 0xf4, 0xba, 0xbc, 0x4c, 0x16, 0xd6, 0xcd, 0xe6, 0xb2, 0x9c, 0x67, 0x2f, 0x8f, 0xe9, 0x6f, 0x39, 0xcf, 0xcc, 0x7e, 0x87, 0xe9, 0x2c, 0x90, 0xcc, 0x07, 0xf2, 0x59, 0xc5, 0x1f, + 0x0c, 0x97, 0xef, 0x3c, 0xbe, 0x10, 0x11, 0xc0, 0x44, 0x84, 0x40, 0x33, 0x2c, 0xc4, 0xe7, 0x44, 0x25, 0x12, 0xf8, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xaf, 0x00, 0x36, 0x45, 0x80, 0x80, 0x34, 0x86, + 0x26, 0x08, 0xc4, 0x42, 0x44, 0xc0, 0x84, 0x38, 0x0d, 0x3b, 0x45, 0x94, 0x30, 0x51, 0x11, 0x61, 0x0d, 0xdb, 0x70, 0xf9, 0xce, 0xe3, 0x0f, 0x88, 0xf4, 0x00, 0x93, 0x70, 0xac, 0x00, 0x26, 0x89, + 0xcd, 0x40, 0x5c, 0x3e, 0x72, 0xdb, 0xb6, 0xf0, 0x0c, 0x97, 0xef, 0x3c, 0x3e, 0x62, 0x34, 0x4e, 0x44, 0x84, 0xc8, 0x64, 0x0f, 0xd7, 0x70, 0xf9, 0xce, 0xe3, 0x47, 0x80, 0xb5, 0x51, 0x45, 0x41, + 0x44, 0xa5, 0x03, 0x0c, 0x7e, 0x71, 0xdb, 0xe6, 0x80, 0x0d, 0x97, 0xef, 0x3c, 0x7e, 0x04, 0x58, 0x1b, 0x55, 0x14, 0x44, 0xc4, 0x4e, 0x4e, 0x44, 0xf8, 0xc5, 0x6d, 0x1b, 0x83, 0x18, 0x0c, 0x97, + 0xef, 0x3c, 0x7e, 0x44, 0x3c, 0x4e, 0x34, 0x85, 0xc8, 0xe4, 0x4b, 0x53, 0x44, 0x09, 0x93, 0xaf, 0x69, 0xdb, 0xa6, 0x4d, 0x53, 0x84, 0x04, 0x92, 0x41, 0x80, 0xc1, 0x70, 0xf9, 0xce, 0xe3, 0x4f, + 0x11, 0x20, 0x10, 0x2b, 0x80, 0xf9, 0xd2, 0x14, 0x51, 0xc2, 0xe4, 0xaf, 0x00, 0x96, 0x02, 0xd8, 0xe2, 0x00, 0x03, 0x00, 0x61, 0x20, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, + 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x14, 0xb0, 0x40, 0xd9, 0x01, 0x00, 0x00, 0x74, 0x06, 0xcb, 0xa0, 0x34, 0x48, 0xc6, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0xc8, 0x81, 0x46, + 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x00, 0x07, 0x5c, 0x21, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x81, 0x1b, 0x78, 0x45, 0x50, 0x8d, 0x26, 0x04, 0xc0, 0x76, 0x86, 0xe4, 0xba, 0x28, 0x20, + 0xc6, 0x18, 0x42, 0x90, 0x59, 0x40, 0xc0, 0x67, 0x3b, 0x44, 0xb3, 0x6d, 0xdb, 0xb0, 0x01, 0x11, 0x08, 0x03, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x6e, 0x50, 0x06, 0x4c, 0xc2, 0x8d, 0x26, + 0x04, 0x00, 0x1d, 0xc4, 0x18, 0x43, 0x08, 0xc4, 0xc0, 0x82, 0x01, 0x3e, 0xdb, 0x21, 0xa6, 0x30, 0x08, 0x03, 0x32, 0x18, 0x36, 0x20, 0x02, 0x61, 0x00, 0x30, 0x1c, 0x08, 0x02, 0x00, 0x00, 0x00, + 0x86, 0x72, 0x3c, 0x00, 0xb6, 0x38, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x14, 0xb0, 0x40, 0xd9, 0x01, 0x00, 0x00, 0x84, 0x06, 0xcb, 0x20, 0x35, 0x48, 0xc6, 0x88, 0x81, 0x01, 0x80, 0x20, 0x18, 0xc8, 0xc1, 0x46, 0x08, 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x00, + 0x07, 0x5d, 0x21, 0x8c, 0x18, 0x1c, 0x00, 0x08, 0x82, 0x81, 0x1b, 0x7c, 0x45, 0x60, 0x8d, 0x26, 0x04, 0xc0, 0x76, 0x06, 0x05, 0xc3, 0x28, 0x20, 0xc6, 0x18, 0x42, 0xa0, 0x59, 0x40, 0xc0, 0x67, + 0x3b, 0x84, 0xc3, 0x71, 0xdc, 0xb0, 0x01, 0x11, 0x08, 0x03, 0x30, 0x62, 0x70, 0x00, 0x20, 0x08, 0x06, 0x6e, 0x60, 0x06, 0x4c, 0xd2, 0x8d, 0x26, 0x04, 0x00, 0x1d, 0xc4, 0x18, 0x43, 0x08, 0xc6, + 0xc0, 0x82, 0x01, 0x3e, 0xdb, 0x21, 0x28, 0x31, 0x10, 0x83, 0x32, 0x18, 0x36, 0x20, 0x02, 0x61, 0x00, 0x30, 0x1c, 0x08, 0x04, 0x00, 0x00, 0x00, 0x96, 0x72, 0x00, 0xd3, 0x14, 0x21, 0x81, 0x64, + 0x28, 0xc7, 0x03, 0x60, 0x8b, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x94, 0xad, 0x00, 0x0d, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x07, 0xdb, 0x19, 0x08, 0x49, 0xa2, 0x80, 0x18, 0x63, 0x08, 0x01, 0x65, 0x01, 0x01, 0x9f, 0xed, 0x10, 0x88, 0x65, 0x59, 0xc3, + 0x06, 0x44, 0x20, 0x0c, 0xc0, 0x88, 0x41, 0x01, 0x80, 0x20, 0x18, 0x70, 0x66, 0x70, 0x68, 0x38, 0x10, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x96, 0x72, 0x00, 0xd3, 0x14, 0x21, 0x81, 0x64, + 0x28, 0xc7, 0x03, 0x60, 0x8b, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x94, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x1a, 0x84, 0x28, 0xa2, 0x60, 0x18, 0xdb, 0x19, 0x8a, 0x69, 0xa2, 0x80, 0x18, 0x63, 0x08, 0x01, 0x66, 0x01, 0x01, 0x9f, 0xed, 0x10, 0xc9, + 0x75, 0x69, 0xc3, 0x06, 0x44, 0x20, 0x0c, 0xc0, 0x88, 0x41, 0x01, 0x80, 0x20, 0x18, 0x70, 0x67, 0x80, 0x68, 0x38, 0x10, 0x04, 0x00, 0x00, 0x00, 0x96, 0x72, 0x00, 0xd3, 0x14, 0x21, 0x81, 0x64, + 0x28, 0xc7, 0x03, 0x60, 0x8b, 0x03, 0x0c, 0x00, 0x01, 0x31, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x20, 0xb0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, + 0x12, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x14, 0xaf, 0x00, 0x0d, 0x63, 0x04, 0x20, 0x08, 0x82, 0xf8, 0x07, 0x33, 0x11, 0x16, 0x70, + 0x8d, 0xc2, 0xb6, 0x86, 0x20, 0x8a, 0x86, 0x0d, 0x88, 0x60, 0x18, 0x80, 0x11, 0x03, 0x44, 0x01, 0x41, 0x30, 0xf8, 0xc0, 0x80, 0x18, 0x24, 0x01, 0x03, 0x62, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x5b, 0x06, 0x21, 0xb0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x20, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x13, 0x04, 0x41, 0x2c, 0x10, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x04, 0x14, 0xb0, 0x40, 0x89, 0x0a, 0x94, 0xa5, 0x40, 0xe9, 0x0a, 0x14, 0xa6, 0x00, 0xed, 0x25, 0x40, 0xe1, 0x08, 0x40, 0x19, 0xd0, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0xff, 0xc2, 0x18, 0x01, + 0x08, 0x82, 0xa0, 0x0c, 0x06, 0x44, 0x8c, 0x00, 0xd0, 0x30, 0x46, 0x00, 0x82, 0x20, 0x88, 0x7f, 0x33, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x07, 0xc5, 0xa0, 0x3b, 0x08, 0x06, 0xd9, + 0xc1, 0x31, 0x66, 0x22, 0x1c, 0xe0, 0x1a, 0x85, 0xed, 0x0c, 0x01, 0x18, 0x80, 0xc1, 0xb0, 0x01, 0x11, 0x24, 0x03, 0x30, 0x62, 0x60, 0x00, 0x20, 0x08, 0x06, 0x62, 0xe0, 0x06, 0x52, 0x33, 0x62, + 0x60, 0x00, 0x20, 0x08, 0x06, 0x74, 0x80, 0x06, 0x94, 0x31, 0x62, 0xa0, 0x00, 0x20, 0x08, 0x06, 0x69, 0xe0, 0x06, 0x53, 0x20, 0x8c, 0x81, 0x13, 0x06, 0xa3, 0x09, 0x01, 0x30, 0x9a, 0x20, 0x04, + 0x23, 0x06, 0x06, 0x00, 0x82, 0x60, 0x60, 0x07, 0x6b, 0x80, 0x25, 0x23, 0x06, 0xd4, 0x02, 0x82, 0x60, 0xb0, 0x06, 0x71, 0x60, 0x05, 0x67, 0xa0, 0x06, 0x67, 0xa0, 0x06, 0x67, 0x30, 0x08, 0x0e, + 0xc3, 0x30, 0x11, 0x84, 0xd0, 0x41, 0x8c, 0x11, 0x03, 0x03, 0x00, 0x41, 0x30, 0xc0, 0x03, 0x36, 0xd0, 0x94, 0x31, 0x04, 0x81, 0x1b, 0x43, 0x18, 0xae, 0x11, 0x03, 0x07, 0x00, 0x41, 0x30, 0x30, + 0x83, 0x3b, 0xc8, 0x06, 0x65, 0x0d, 0x84, 0x20, 0x8a, 0xac, 0x34, 0xc0, 0x80, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x5b, 0x86, 0x22, 0xb8, 0x85, 0x2d, 0x43, 0x13, 0xdc, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; D3D12_SHADER_BYTECODE code; @@ -573,6 +650,44 @@ static ID3D12Resource *create_transform_buffer(ID3D12Device *device, unsigned in return transform_buffer; } +static ID3D12Resource *create_aabb_buffer(ID3D12Device *device, + unsigned int geom_count, unsigned int aabb_per_geom, float x_stride) +{ + D3D12_RAYTRACING_AABB *aabbs = calloc(geom_count * aabb_per_geom, sizeof(*aabbs)); + ID3D12Resource *aabb_buffer; + D3D12_RAYTRACING_AABB *tmp; + unsigned int geom, aabb; + + for (geom = 0; geom < geom_count; geom++) + { + for (aabb = 0; aabb < aabb_per_geom; aabb++) + { + /* Only the last AABB in a geom series is considered "active", as this is to test AABBStride parameter. + * The other ones are placed at a large, degenerate Z offset as to be ignored. */ + tmp = &aabbs[geom * aabb_per_geom + aabb]; + tmp->MinX = -0.5f + (float)geom * x_stride; + tmp->MaxX = +0.5f + (float)geom * x_stride; + tmp->MinY = -0.5f; + tmp->MaxY = +0.5f; + + if (aabb + 1 == aabb_per_geom) + { + tmp->MinZ = -0.5f; + tmp->MaxZ = +0.5f; + } + else + { + tmp->MinZ = -10000.0f; + tmp->MaxZ = -9000.0f; + } + } + } + + aabb_buffer = create_upload_buffer(device, geom_count * aabb_per_geom * sizeof(*aabbs), aabbs); + free(aabbs); + return aabb_buffer; +} + struct rt_acceleration_structure { ID3D12Resource *scratch; @@ -702,11 +817,14 @@ static void destroy_acceleration_structure(struct rt_acceleration_structure *rta struct test_rt_geometry { - ID3D12Resource *bottom_acceleration_structures[3]; + ID3D12Resource *bottom_acceleration_structures_tri[3]; + ID3D12Resource *bottom_acceleration_structures_aabb[3]; ID3D12Resource *top_acceleration_structures[3]; - struct rt_acceleration_structure bottom_rtas; + struct rt_acceleration_structure bottom_rtas_tri; + struct rt_acceleration_structure bottom_rtas_aabb; struct rt_acceleration_structure top_rtas; ID3D12Resource *transform_buffer; + ID3D12Resource *aabb_buffer; ID3D12Resource *instance_buffer; }; @@ -714,16 +832,25 @@ static void destroy_rt_geometry(struct test_rt_geometry *rt_geom) { unsigned int i; - for (i = 0; i < ARRAY_SIZE(rt_geom->bottom_acceleration_structures); i++) - ID3D12Resource_Release(rt_geom->bottom_acceleration_structures[i]); + for (i = 0; i < ARRAY_SIZE(rt_geom->bottom_acceleration_structures_tri); i++) + ID3D12Resource_Release(rt_geom->bottom_acceleration_structures_tri[i]); + for (i = 0; i < ARRAY_SIZE(rt_geom->bottom_acceleration_structures_aabb); i++) + ID3D12Resource_Release(rt_geom->bottom_acceleration_structures_aabb[i]); for (i = 0; i < ARRAY_SIZE(rt_geom->top_acceleration_structures); i++) ID3D12Resource_Release(rt_geom->top_acceleration_structures[i]); ID3D12Resource_Release(rt_geom->transform_buffer); + ID3D12Resource_Release(rt_geom->aabb_buffer); ID3D12Resource_Release(rt_geom->instance_buffer); - destroy_acceleration_structure(&rt_geom->bottom_rtas); + destroy_acceleration_structure(&rt_geom->bottom_rtas_tri); + destroy_acceleration_structure(&rt_geom->bottom_rtas_aabb); destroy_acceleration_structure(&rt_geom->top_rtas); } +static bool instance_index_is_aabb(unsigned int index) +{ + return !!(index & 2); +} + static void init_rt_geometry(struct raytracing_test_context *context, struct test_rt_geometry *rt_geom, struct test_geometry *geom, unsigned int num_geom_desc, float geom_offset_x, @@ -731,6 +858,7 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes D3D12_GPU_VIRTUAL_ADDRESS postbuild_va) { #define NUM_GEOM_TEMPLATES 6 +#define NUM_AABB_PER_GEOM 2 D3D12_RAYTRACING_GEOMETRY_DESC geom_desc_template[NUM_GEOM_TEMPLATES]; D3D12_BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS inputs; D3D12_RAYTRACING_INSTANCE_DESC *instance_desc; @@ -744,6 +872,7 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes * Size and placement of the quads are controlled by parameters. */ rt_geom->transform_buffer = create_transform_buffer(context->context.device, num_geom_desc, geom_offset_x); + rt_geom->aabb_buffer = create_aabb_buffer(context->context.device, num_geom_desc, NUM_AABB_PER_GEOM, geom_offset_x); memset(geom_desc_template, 0, sizeof(geom_desc_template)); /* Setup a template for different geom descs which all effectively do the same thing, a simple quad. */ @@ -789,6 +918,14 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes ID3D12Resource_GetGPUVirtualAddress(geom->vbo) + offsetof(struct initial_vbo, f16); geom_desc_template[5].Triangles.VertexFormat = DXGI_FORMAT_R16G16_FLOAT; + /* Every other geometry desc is considered opaque. + * Lets us test any-hit invocation rules. */ + for (i = 0; i < ARRAY_SIZE(geom_desc_template); i++) + { + geom_desc_template[i].Flags = (i & 1) ? D3D12_RAYTRACING_GEOMETRY_FLAG_OPAQUE : D3D12_RAYTRACING_GEOMETRY_FLAG_NONE; + geom_desc_template[i].Flags |= D3D12_RAYTRACING_GEOMETRY_FLAG_NO_DUPLICATE_ANYHIT_INVOCATION; + } + /* Create bottom AS. One quad is centered around origin, but other triangles are translated. */ memset(&inputs, 0, sizeof(inputs)); inputs.DescsLayout = D3D12_ELEMENTS_LAYOUT_ARRAY; @@ -810,23 +947,44 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes ID3D12Resource_GetGPUVirtualAddress(rt_geom->transform_buffer) + i * 4 * 3 * sizeof(float); } - create_acceleration_structure(context, &inputs, &rt_geom->bottom_rtas, postbuild_va); + create_acceleration_structure(context, &inputs, &rt_geom->bottom_rtas_tri, postbuild_va); + /* Update, and now use correct VBO. */ geom_desc_template[1].Triangles.VertexBuffer.StartAddress = ID3D12Resource_GetGPUVirtualAddress(geom->vbo) + offsetof(struct initial_vbo, f32); for (i = 1; i < num_geom_desc; i += ARRAY_SIZE(geom_desc_template)) geom_desc[i].Triangles.VertexBuffer = geom_desc_template[1].Triangles.VertexBuffer; - update_acceleration_structure(context, &inputs, &rt_geom->bottom_rtas); + update_acceleration_structure(context, &inputs, &rt_geom->bottom_rtas_tri); + + for (i = 0; i < num_geom_desc; i++) + { + geom_desc[i].Type = D3D12_RAYTRACING_GEOMETRY_TYPE_PROCEDURAL_PRIMITIVE_AABBS; + geom_desc[i].AABBs.AABBCount = NUM_AABB_PER_GEOM; + geom_desc[i].AABBs.AABBs.StartAddress = ID3D12Resource_GetGPUVirtualAddress(rt_geom->aabb_buffer) + + i * geom_desc[i].AABBs.AABBCount * sizeof(D3D12_RAYTRACING_AABB); + geom_desc[i].AABBs.AABBs.StrideInBytes = sizeof(D3D12_RAYTRACING_AABB); + } + + create_acceleration_structure(context, &inputs, &rt_geom->bottom_rtas_aabb, 0); /* Tests CLONE and COMPACTING copies. COMPACTING can never increase size, so it's safe to allocate up front. * We test the compacted size later. */ - rt_geom->bottom_acceleration_structures[0] = rt_geom->bottom_rtas.rtas; - ID3D12Resource_AddRef(rt_geom->bottom_rtas.rtas); - rt_geom->bottom_acceleration_structures[1] = duplicate_acceleration_structure(context, - rt_geom->bottom_acceleration_structures[0], + rt_geom->bottom_acceleration_structures_tri[0] = rt_geom->bottom_rtas_tri.rtas; + ID3D12Resource_AddRef(rt_geom->bottom_rtas_tri.rtas); + rt_geom->bottom_acceleration_structures_tri[1] = duplicate_acceleration_structure(context, + rt_geom->bottom_acceleration_structures_tri[0], D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_COMPACT); - rt_geom->bottom_acceleration_structures[2] = duplicate_acceleration_structure(context, - rt_geom->bottom_acceleration_structures[1], + rt_geom->bottom_acceleration_structures_tri[2] = duplicate_acceleration_structure(context, + rt_geom->bottom_acceleration_structures_tri[1], + D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_CLONE); + + rt_geom->bottom_acceleration_structures_aabb[0] = rt_geom->bottom_rtas_aabb.rtas; + ID3D12Resource_AddRef(rt_geom->bottom_rtas_aabb.rtas); + rt_geom->bottom_acceleration_structures_aabb[1] = duplicate_acceleration_structure(context, + rt_geom->bottom_acceleration_structures_aabb[0], + D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_COMPACT); + rt_geom->bottom_acceleration_structures_aabb[2] = duplicate_acceleration_structure(context, + rt_geom->bottom_acceleration_structures_aabb[1], D3D12_RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE_CLONE); /* Create instance buffer. One for every top-level entry into the AS. */ @@ -840,8 +998,21 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes instance_desc[i].Transform[1][3] = instance_offset_y * (float)i; instance_desc[i].InstanceMask = 0xff; instance_desc[i].InstanceContributionToHitGroupIndex = num_geom_desc * i; - instance_desc[i].AccelerationStructure = - ID3D12Resource_GetGPUVirtualAddress(rt_geom->bottom_acceleration_structures[i & 1]); + if (i == 0 || i == 2) + instance_desc[i].Flags = D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_OPAQUE; + else if (i == 1 || i == 3) + instance_desc[i].Flags = D3D12_RAYTRACING_INSTANCE_FLAG_FORCE_NON_OPAQUE; + + if (instance_index_is_aabb(i)) + { + instance_desc[i].AccelerationStructure = + ID3D12Resource_GetGPUVirtualAddress(rt_geom->bottom_acceleration_structures_aabb[i & 1]); + } + else + { + instance_desc[i].AccelerationStructure = + ID3D12Resource_GetGPUVirtualAddress(rt_geom->bottom_acceleration_structures_tri[i & 1]); + } } instance_desc[num_unmasked_instances_y].Transform[0][0] = instance_geom_scale; @@ -851,7 +1022,7 @@ static void init_rt_geometry(struct raytracing_test_context *context, struct tes instance_desc[num_unmasked_instances_y].InstanceMask = 0xfe; /* This instance will be masked out since shader uses mask of 0x01. */ instance_desc[num_unmasked_instances_y].InstanceContributionToHitGroupIndex = 0; instance_desc[num_unmasked_instances_y].AccelerationStructure = - ID3D12Resource_GetGPUVirtualAddress(rt_geom->bottom_acceleration_structures[2]); + ID3D12Resource_GetGPUVirtualAddress(rt_geom->bottom_acceleration_structures_tri[2]); rt_geom->instance_buffer = create_upload_buffer(context->context.device, (num_unmasked_instances_y + 1) * sizeof(*instance_desc), instance_desc); @@ -1104,7 +1275,7 @@ static ID3D12StateObject *create_rt_collection(struct raytracing_test_context *c void test_raytracing(void) { #define NUM_GEOM_DESC 6 -#define NUM_UNMASKED_INSTANCES 4 +#define NUM_UNMASKED_INSTANCES 8 #define INSTANCE_OFFSET_Y (100.0f) #define GEOM_OFFSET_X (10.0f) #define INSTANCE_GEOM_SCALE (0.5f) @@ -1114,13 +1285,14 @@ void test_raytracing(void) D3D12_ROOT_SIGNATURE_DESC root_signature_desc; D3D12_DESCRIPTOR_RANGE descriptor_ranges[2]; ID3D12GraphicsCommandList4 *command_list4; + ID3D12StateObject *rt_object_library_aabb; + ID3D12StateObject *rt_object_library_tri; D3D12_ROOT_PARAMETER root_parameters[2]; ID3D12GraphicsCommandList *command_list; D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle; D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle; struct raytracing_test_context context; ID3D12DescriptorHeap *descriptor_heap; - ID3D12StateObject *rt_object_library; ID3D12RootSignature *local_rs_table; struct test_rt_geometry test_rtases; D3D12_DESCRIPTOR_RANGE table_range; @@ -1133,6 +1305,7 @@ void test_raytracing(void) ID3D12RootSignature *local_rs; ID3D12Resource *ray_positions; struct resource_readback rb; + unsigned int instance, geom; ID3D12Resource *ray_colors; ID3D12CommandQueue *queue; ID3D12StateObject *rt_pso; @@ -1227,25 +1400,48 @@ void test_raytracing(void) ok(SUCCEEDED(hr), "Failed to create root signature, hr #%x.\n", hr); } - /* Create RT collection. */ + /* Create RT collection (triangles). */ { - D3D12_EXPORT_DESC dxil_exports[1] = { + D3D12_EXPORT_DESC dxil_exports[] = { { u"XRayClosest", u"RayClosest", 0 }, + { u"XRayAnyTriangle", u"RayAnyTriangle", 0 }, }; D3D12_HIT_GROUP_DESC hit_group; memset(&hit_group, 0, sizeof(hit_group)); hit_group.Type = D3D12_HIT_GROUP_TYPE_TRIANGLES; hit_group.ClosestHitShaderImport = u"XRayClosest"; - hit_group.HitGroupExport = u"XRayHit"; + hit_group.AnyHitShaderImport = u"XRayAnyTriangle"; + hit_group.HitGroupExport = u"XRayHitTriangle"; - rt_object_library = create_rt_collection(&context, + rt_object_library_tri = create_rt_collection(&context, + ARRAY_SIZE(dxil_exports), dxil_exports, + &hit_group, global_rs, local_rs); + } + + /* Create RT collection (AABB). */ + { + D3D12_EXPORT_DESC dxil_exports[] = { + { u"XRayClosestAABB", u"RayClosest", 0 }, + { u"XRayAnyAABB", u"RayAnyAABB", 0 }, + { u"XRayIntersect", u"RayIntersect", 0 }, + }; + D3D12_HIT_GROUP_DESC hit_group; + + memset(&hit_group, 0, sizeof(hit_group)); + hit_group.Type = D3D12_HIT_GROUP_TYPE_PROCEDURAL_PRIMITIVE; + hit_group.ClosestHitShaderImport = u"XRayClosestAABB"; + hit_group.AnyHitShaderImport = u"XRayAnyAABB"; + hit_group.IntersectionShaderImport = u"XRayIntersect"; + hit_group.HitGroupExport = u"XRayHitAABB"; + + rt_object_library_aabb = create_rt_collection(&context, ARRAY_SIZE(dxil_exports), dxil_exports, &hit_group, global_rs, local_rs); } /* Create RT PSO. */ - if (rt_object_library) + if (rt_object_library_tri && rt_object_library_aabb) { const WCHAR *table_export[] = { u"XRayMiss" }; D3D12_EXPORT_DESC dxil_exports[2] = { @@ -1274,7 +1470,8 @@ void test_raytracing(void) rt_pso_factory_add_subobject_to_exports_association(&factory, local_rs_index, 0, NULL); - rt_pso_factory_add_existing_collection(&factory, rt_object_library, 0, NULL); + rt_pso_factory_add_existing_collection(&factory, rt_object_library_tri, 0, NULL); + rt_pso_factory_add_existing_collection(&factory, rt_object_library_aabb, 0, NULL); memset(&hit_group, 0, sizeof(hit_group)); hit_group.Type = D3D12_HIT_GROUP_TYPE_TRIANGLES; @@ -1285,9 +1482,12 @@ void test_raytracing(void) rt_pso = rt_pso_factory_compile(&context, &factory, D3D12_STATE_OBJECT_TYPE_RAYTRACING_PIPELINE); /* Docs say there should be ref-count of the collection, but apparently, that refcount is private. */ - ref_count = ID3D12StateObject_AddRef(rt_object_library); + ref_count = ID3D12StateObject_AddRef(rt_object_library_tri); ok(ref_count == 2, "Collection ref count is %u.\n", ref_count); - ID3D12StateObject_Release(rt_object_library); + ID3D12StateObject_Release(rt_object_library_tri); + ref_count = ID3D12StateObject_AddRef(rt_object_library_aabb); + ok(ref_count == 2, "Collection ref count is %u.\n", ref_count); + ID3D12StateObject_Release(rt_object_library_aabb); } else rt_pso = NULL; @@ -1313,7 +1513,9 @@ void test_raytracing(void) { ID3D12StateObjectProperties *props; - for (i = 0; i < ARRAY_SIZE(sbt_colors); i++) + sbt_colors[0][0] = 1000.0f; + sbt_colors[0][1] = 2000.0f; + for (i = 1; i < ARRAY_SIZE(sbt_colors); i++) { sbt_colors[i][0] = 2 * i + 1; sbt_colors[i][1] = 2 * i + 2; @@ -1329,17 +1531,23 @@ void test_raytracing(void) /* Why this is a separate interface, we will never know ... */ if (SUCCEEDED(ID3D12StateObject_QueryInterface(rt_pso, &IID_ID3D12StateObjectProperties, (void **)&props))) { - static const WCHAR ray_closest[] = u"XRayHit::closesthit"; - static const WCHAR ray_anyhit[] = u"XRayHit::anyhit"; - static const WCHAR ray_broken3[] = u"XRayHit::X"; - static const WCHAR ray_broken2[] = u"XRayHit::"; - static const WCHAR ray_broken1[] = u"XRayHit:"; - static const WCHAR ray_broken0[] = u"XRayHit"; + static const WCHAR ray_tri_intersect[] = u"XRayHitTriangle::intersection"; + static const WCHAR ray_aabb_intersect[] = u"XRayHitAABB::intersection"; + static const WCHAR ray_tri_closest[] = u"XRayHitTriangle::closesthit"; + static const WCHAR ray_aabb_closest[] = u"XRayHitAABB::closesthit"; + static const WCHAR ray_tri_anyhit[] = u"XRayHitTriangle::anyhit"; + static const WCHAR ray_aabb_anyhit[] = u"XRayHitAABB::anyhit"; + static const WCHAR ray_broken3[] = u"XRayHitTriangle::X"; + static const WCHAR ray_broken2[] = u"XRayHitTriangle::"; + static const WCHAR ray_broken1[] = u"XRayHitTriangle:"; + static const WCHAR ray_broken0[] = u"XRayHitTriangle"; + static const WCHAR ray_hit_tri[] = u"XRayHitTriangle"; + static const WCHAR ray_hit_aabb[] = u"XRayHitAABB"; static const WCHAR ray_miss[] = u"XRayMiss"; static const WCHAR ray_hit2[] = u"XRayHit2"; static const WCHAR ray_gen[] = u"XRayGen"; - static const WCHAR ray_hit[] = u"XRayHit"; ID3D12StateObject *tmp_rt_pso; + const void *ray_hit_aabb_sbt; unsigned int min_stack_size; const void *ray_miss_sbt; const void *ray_gen_sbt; @@ -1377,7 +1585,17 @@ void test_raytracing(void) ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_miss); ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); - stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_closest); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_tri_closest); + ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_tri_anyhit); + ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_tri_intersect); + ok(stack_size == ~0u, "Stack size %u != UINT_MAX.\n", stack_size); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_aabb_closest); + ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_aabb_anyhit); + ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); + stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_aabb_intersect); ok(stack_size <= 8, "Stack size %u > 8.\n", stack_size); stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_broken0); ok(stack_size == ~0u, "Stack size %u != UINT_MAX.\n", stack_size); @@ -1387,8 +1605,6 @@ void test_raytracing(void) ok(stack_size == ~0u, "Stack size %u != UINT_MAX.\n", stack_size); stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_broken3); ok(stack_size == ~0u, "Stack size %u != UINT_MAX.\n", stack_size); - stack_size = ID3D12StateObjectProperties_GetShaderStackSize(props, ray_anyhit); - ok(stack_size == ~0u, "Stack size %u != UINT_MAX.\n", stack_size); stack_size = ID3D12StateObjectProperties_GetPipelineStackSize(props); ok(stack_size <= 8, "Stack size %u < 8.\n", stack_size); @@ -1401,17 +1617,38 @@ void test_raytracing(void) ok(stack_size <= min_stack_size || stack_size == 256, "Stack size %u > %u && %u != 256.\n", stack_size, min_stack_size, stack_size); ray_gen_sbt = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_gen); - ray_hit_sbt = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_hit); + ray_hit_sbt = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_hit_tri); ray_hit_sbt2 = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_hit2); ray_miss_sbt = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_miss); + ray_hit_aabb_sbt = ID3D12StateObjectProperties_GetShaderIdentifier(props, ray_hit_aabb); ok(!!ray_gen_sbt, "Failed to get SBT.\n"); ok(!!ray_hit_sbt, "Failed to get SBT.\n"); ok(!!ray_hit_sbt2, "Failed to get SBT.\n"); ok(!!ray_miss_sbt, "Failed to get SBT.\n"); + ok(!!ray_hit_aabb_sbt, "Failed to get SBT.\n"); memcpy(sbt_data, ray_miss_sbt, D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES); - for (i = 0; i < NUM_GEOM_DESC * NUM_UNMASKED_INSTANCES; i++) - memcpy(sbt_data + (i + 1) * 64, (i & 1 ? ray_hit_sbt : ray_hit_sbt2), D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES); + { + bool use_aabb, use_anyhit_shader; + const void *active_sbt; + + for (instance = 0; instance < NUM_UNMASKED_INSTANCES; instance++) + { + for (geom = 0; geom < NUM_GEOM_DESC; geom++) + { + i = instance * NUM_GEOM_DESC + geom; + use_aabb = instance_index_is_aabb(instance); + use_anyhit_shader = !!(i & 3); + + if (use_aabb) + active_sbt = ray_hit_aabb_sbt; + else + active_sbt = use_anyhit_shader ? ray_hit_sbt : ray_hit_sbt2; + + memcpy(sbt_data + (i + 1) * 64, active_sbt, D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES); + } + } + } memcpy(sbt_data + (NUM_GEOM_DESC * NUM_UNMASKED_INSTANCES + 1) * 64, ray_gen_sbt, D3D12_SHADER_IDENTIFIER_SIZE_IN_BYTES); /* Local root signature data is placed after the shader identifier at offset 32 bytes. */ @@ -1472,7 +1709,7 @@ void test_raytracing(void) ID3D12Device_CreateShaderResourceView(device, NULL, &as_desc, cpu_handle); cpu_handle.ptr += descriptor_size; - rtases[0] = ID3D12Resource_GetGPUVirtualAddress(test_rtases.bottom_acceleration_structures[0]); + rtases[0] = ID3D12Resource_GetGPUVirtualAddress(test_rtases.bottom_acceleration_structures_tri[0]); rtases[1] = ID3D12Resource_GetGPUVirtualAddress(test_rtases.top_acceleration_structures[0]); /* Emitting this is not COPY_DEST, but UNORDERED_ACCESS for some bizarre reason. */ @@ -1554,14 +1791,57 @@ void test_raytracing(void) transition_resource_state(command_list, ray_colors, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_COPY_SOURCE); get_buffer_readback_with_command_list(ray_colors, DXGI_FORMAT_UNKNOWN, &rb, queue, command_list); - for (i = 0; i < NUM_GEOM_DESC * NUM_UNMASKED_INSTANCES + 1; i++) { + float expected_x, expected_y; + bool expect_hit, use_aabb; float x, y; - x = get_readback_float(&rb, 2 * i, 0); - y = get_readback_float(&rb, 2 * i + 1, 0); - ok(x == sbt_colors[i][0], "Ray color [%u].x mismatch (%f != %f).\n", i, sbt_colors[i][0], x); - ok(y == sbt_colors[i][1], "Ray color [%u].y mismatch (%f != %f).\n", i, sbt_colors[i][1], y); + + for (instance = 0; instance < NUM_UNMASKED_INSTANCES; instance++) + { + for (geom = 0; geom < NUM_GEOM_DESC; geom++) + { + use_aabb = instance_index_is_aabb(instance); + i = NUM_GEOM_DESC * instance + geom; + x = get_readback_float(&rb, 2 * (i + 1), 0); + y = get_readback_float(&rb, 2 * (i + 1) + 1, 0); + + if (instance == 0 || instance == 2) + expect_hit = true; /* Force opaque on instance desc. */ + else if (instance == 1 || instance == 3) + expect_hit = false; /* Force non-opaque on instance desc, any hit -> miss will trigger. */ + else + expect_hit = !!(geom & 1); /* Geom desc has either NONE or OPAQUE. */ + + if (!use_aabb && (i & 3) == 0) + expect_hit = true; /* Use an SBT without any-hit shader, so opaque flags don't matter. */ + + if (expect_hit) + { + expected_x = sbt_colors[i + 1][0]; + expected_y = sbt_colors[i + 1][1]; + } + else + { + expected_x = sbt_colors[0][0]; /* Miss shader is run. */ + expected_y = sbt_colors[0][1]; + if (use_aabb) + expected_y += 1.0f; /* Any-hit shader accumulates .y by 1.0f here. */ + else + expected_x += 1.0f; /* Any-hit shader accumulates .x by 1.0f here. */ + } + ok(x == expected_x, "Ray color [%u].x mismatch (%f != %f).\n", i, x, expected_x); + ok(y == expected_y, "Ray color [%u].y mismatch (%f != %f).\n", i, y, expected_y); + } + } + + x = get_readback_float(&rb, 0, 0); + y = get_readback_float(&rb, 1, 0); + expected_x = sbt_colors[0][0]; /* Only miss shader is run. */ + expected_y = sbt_colors[0][1]; + ok(x == expected_x, "Miss ray color.x mismatch (%f != %f).\n", x, expected_x); + ok(y == expected_y, "Miss ray color.y mismatch (%f != %f).\n", y, expected_y); } + release_resource_readback(&rb); { @@ -1607,7 +1887,8 @@ void test_raytracing(void) ok(bottom[0].serialize.SerializedSizeInBytes > 0, "Serialized size for bottom acceleration structure is %u.\n", (unsigned int)bottom[0].serialize.SerializedSizeInBytes); ok(bottom[0].serialize.NumBottomLevelAccelerationStructurePointers == 0, "NumBottomLevel pointers is %u.\n", (unsigned int)bottom[0].serialize.NumBottomLevelAccelerationStructurePointers); ok(top[0].serialize.SerializedSizeInBytes > 0, "Serialized size for top acceleration structure is %u.\n", (unsigned int)top[0].serialize.SerializedSizeInBytes); - todo ok(top[0].serialize.NumBottomLevelAccelerationStructurePointers == 5, "NumBottomLevel pointers is %u.\n", (unsigned int)top[0].serialize.NumBottomLevelAccelerationStructurePointers); + todo ok(top[0].serialize.NumBottomLevelAccelerationStructurePointers == NUM_UNMASKED_INSTANCES + 1, + "NumBottomLevel pointers is %u.\n", (unsigned int)top[0].serialize.NumBottomLevelAccelerationStructurePointers); ID3D12Resource_Unmap(postbuild_readback, 0, NULL); } @@ -1623,8 +1904,10 @@ void test_raytracing(void) if (rt_pso) ID3D12StateObject_Release(rt_pso); - if (rt_object_library) - ID3D12StateObject_Release(rt_object_library); + if (rt_object_library_tri) + ID3D12StateObject_Release(rt_object_library_tri); + if (rt_object_library_aabb) + ID3D12StateObject_Release(rt_object_library_aabb); ID3D12Resource_Release(ray_colors); ID3D12Resource_Release(ray_positions); ID3D12DescriptorHeap_Release(descriptor_heap);