|
@@ -199,6 +199,9 @@ enum ArBasicKind {
|
|
AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
|
|
|
|
|
|
+ // RayQuery
|
|
|
|
+ AR_OBJECT_RAY_QUERY,
|
|
|
|
+
|
|
AR_BASIC_MAXIMUM_COUNT
|
|
AR_BASIC_MAXIMUM_COUNT
|
|
};
|
|
};
|
|
|
|
|
|
@@ -476,6 +479,8 @@ const UINT g_uBasicKindProps[] =
|
|
0, //AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
0, //AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
0, //AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
0, //AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
|
|
|
|
|
|
+ 0, //AR_OBJECT_RAY_QUERY,
|
|
|
|
+
|
|
// AR_BASIC_MAXIMUM_COUNT
|
|
// AR_BASIC_MAXIMUM_COUNT
|
|
};
|
|
};
|
|
|
|
|
|
@@ -1286,7 +1291,9 @@ const ArBasicKind g_ArBasicKindsAsTypes[] =
|
|
AR_OBJECT_RAYTRACING_SHADER_CONFIG,
|
|
AR_OBJECT_RAYTRACING_SHADER_CONFIG,
|
|
AR_OBJECT_RAYTRACING_PIPELINE_CONFIG,
|
|
AR_OBJECT_RAYTRACING_PIPELINE_CONFIG,
|
|
AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
- AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP
|
|
|
|
|
|
+ AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
|
|
+
|
|
|
|
+ AR_OBJECT_RAY_QUERY
|
|
};
|
|
};
|
|
|
|
|
|
// Count of template arguments for basic kind of objects that look like templates (one or more type arguments).
|
|
// Count of template arguments for basic kind of objects that look like templates (one or more type arguments).
|
|
@@ -1366,6 +1373,8 @@ const uint8_t g_ArBasicKindsTemplateCount[] =
|
|
0, // AR_OBJECT_RAYTRACING_PIPELINE_CONFIG,
|
|
0, // AR_OBJECT_RAYTRACING_PIPELINE_CONFIG,
|
|
0, // AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
0, // AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
0, // AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
0, // AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
|
|
+
|
|
|
|
+ 1, // AR_OBJECT_RAY_QUERY,
|
|
};
|
|
};
|
|
|
|
|
|
C_ASSERT(_countof(g_ArBasicKindsAsTypes) == _countof(g_ArBasicKindsTemplateCount));
|
|
C_ASSERT(_countof(g_ArBasicKindsAsTypes) == _countof(g_ArBasicKindsTemplateCount));
|
|
@@ -1456,6 +1465,7 @@ const SubscriptOperatorRecord g_ArBasicKindsSubscripts[] =
|
|
{ 0, MipsFalse, SampleFalse }, // AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
{ 0, MipsFalse, SampleFalse }, // AR_OBJECT_TRIANGLE_HIT_GROUP,
|
|
{ 0, MipsFalse, SampleFalse }, // AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
{ 0, MipsFalse, SampleFalse }, // AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
|
|
|
|
|
|
|
|
+ { 0, MipsFalse, SampleFalse }, // AR_OBJECT_RAY_QUERY,
|
|
};
|
|
};
|
|
|
|
|
|
C_ASSERT(_countof(g_ArBasicKindsAsTypes) == _countof(g_ArBasicKindsSubscripts));
|
|
C_ASSERT(_countof(g_ArBasicKindsAsTypes) == _countof(g_ArBasicKindsSubscripts));
|
|
@@ -1568,7 +1578,9 @@ const char* g_ArBasicTypeNames[] =
|
|
"RaytracingShaderConfig",
|
|
"RaytracingShaderConfig",
|
|
"RaytracingPipelineConfig",
|
|
"RaytracingPipelineConfig",
|
|
"TriangleHitGroup",
|
|
"TriangleHitGroup",
|
|
- "ProceduralPrimitiveHitGroup"
|
|
|
|
|
|
+ "ProceduralPrimitiveHitGroup",
|
|
|
|
+
|
|
|
|
+ "RayQuery"
|
|
};
|
|
};
|
|
|
|
|
|
C_ASSERT(_countof(g_ArBasicTypeNames) == AR_BASIC_MAXIMUM_COUNT);
|
|
C_ASSERT(_countof(g_ArBasicTypeNames) == AR_BASIC_MAXIMUM_COUNT);
|
|
@@ -2120,7 +2132,11 @@ void GetIntrinsicMethods(ArBasicKind kind, _Outptr_result_buffer_(*intrinsicCoun
|
|
*intrinsics = g_ConsumeStructuredBufferMethods;
|
|
*intrinsics = g_ConsumeStructuredBufferMethods;
|
|
*intrinsicCount = _countof(g_ConsumeStructuredBufferMethods);
|
|
*intrinsicCount = _countof(g_ConsumeStructuredBufferMethods);
|
|
break;
|
|
break;
|
|
- // SPIRV change starts
|
|
|
|
|
|
+ case AR_OBJECT_RAY_QUERY:
|
|
|
|
+ *intrinsics = g_RayQueryMethods;
|
|
|
|
+ *intrinsicCount = _countof(g_RayQueryMethods);
|
|
|
|
+ break;
|
|
|
|
+ // SPIRV change starts
|
|
#ifdef ENABLE_SPIRV_CODEGEN
|
|
#ifdef ENABLE_SPIRV_CODEGEN
|
|
case AR_OBJECT_VK_SUBPASS_INPUT:
|
|
case AR_OBJECT_VK_SUBPASS_INPUT:
|
|
*intrinsics = g_VkSubpassInputMethods;
|
|
*intrinsics = g_VkSubpassInputMethods;
|
|
@@ -3219,6 +3235,12 @@ private:
|
|
recordDecl = CreateSubobjectProceduralPrimitiveHitGroup(*m_context);
|
|
recordDecl = CreateSubobjectProceduralPrimitiveHitGroup(*m_context);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ } else if (kind == AR_OBJECT_RAY_QUERY) {
|
|
|
|
+ ClassTemplateDecl* typeDecl = nullptr;
|
|
|
|
+ AddRayQueryTemplate(*m_context, &typeDecl, &recordDecl);
|
|
|
|
+ DXASSERT(typeDecl != nullptr, "AddRayQueryTemplate failed to return the object declaration");
|
|
|
|
+ typeDecl->setImplicit(true);
|
|
|
|
+ recordDecl->setImplicit(true);
|
|
}
|
|
}
|
|
else if (templateArgCount == 0)
|
|
else if (templateArgCount == 0)
|
|
{
|
|
{
|
|
@@ -3419,6 +3441,13 @@ public:
|
|
return IsSubobjectBasicKind(GetTypeElementKind(type));
|
|
return IsSubobjectBasicKind(GetTypeElementKind(type));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ bool IsRayQueryBasicKind(ArBasicKind kind) {
|
|
|
|
+ return kind == AR_OBJECT_RAY_QUERY;
|
|
|
|
+ }
|
|
|
|
+ bool IsRayQueryType(QualType type) {
|
|
|
|
+ return IsRayQueryBasicKind(GetTypeElementKind(type));
|
|
|
|
+ }
|
|
|
|
+
|
|
void WarnMinPrecision(HLSLScalarType type, SourceLocation loc) {
|
|
void WarnMinPrecision(HLSLScalarType type, SourceLocation loc) {
|
|
// TODO: enalbe this once we introduce precise master option
|
|
// TODO: enalbe this once we introduce precise master option
|
|
bool UseMinPrecision = m_context->getLangOpts().UseMinPrecision;
|
|
bool UseMinPrecision = m_context->getLangOpts().UseMinPrecision;
|
|
@@ -4882,7 +4911,8 @@ QualType GetFirstElementTypeFromDecl(const Decl* decl)
|
|
if (specialization) {
|
|
if (specialization) {
|
|
const TemplateArgumentList& list = specialization->getTemplateArgs();
|
|
const TemplateArgumentList& list = specialization->getTemplateArgs();
|
|
if (list.size()) {
|
|
if (list.size()) {
|
|
- return list[0].getAsType();
|
|
|
|
|
|
+ if (list[0].getKind() == TemplateArgument::ArgKind::Type)
|
|
|
|
+ return list[0].getAsType();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -6744,6 +6774,14 @@ void HLSLExternalSource::InitializeInitSequenceForHLSL(
|
|
|
|
|
|
// In HLSL there are no default initializers, eg float4x4 m();
|
|
// In HLSL there are no default initializers, eg float4x4 m();
|
|
if (Kind.getKind() == InitializationKind::IK_Default) {
|
|
if (Kind.getKind() == InitializationKind::IK_Default) {
|
|
|
|
+ // Except for RayQuery.
|
|
|
|
+ if (GetTypeElementKind(Entity.getType()) == AR_OBJECT_RAY_QUERY) {
|
|
|
|
+ // RayQuery handle initialization
|
|
|
|
+ // TODO: Try generating an intrinsic method call for AllocateRayQuery
|
|
|
|
+ // - pass the flags from the intrinsic argument.
|
|
|
|
+ // Lower to intrinsic that takes flags and returns i32 value,
|
|
|
|
+ // which is then stored in the RayQuery alloca as the handle.
|
|
|
|
+ }
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|