Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions tools/clang/include/clang/Basic/Attr.td
Original file line number Diff line number Diff line change
Expand Up @@ -1157,6 +1157,13 @@ def HLSLRayQueryObject : InheritableAttr {
let Documentation = [Undocumented];
}

def HLSLSubObject : InheritableAttr {
let Spellings = []; // No spellings!
let Subjects = SubjectList<[CXXRecord]>;
let Documentation = [Undocumented];
let Args = [UnsignedArgument<"SubObjKindUint">];
}

// HLSL HitObject Attribute

def HLSLHitObject : InheritableAttr {
Expand Down
202 changes: 202 additions & 0 deletions tools/clang/include/clang/Sema/SemaHLSL.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,208 @@
#include "clang/Sema/Template.h"
#include "clang/Sema/TemplateDeduction.h"

enum ArBasicKind {
AR_BASIC_BOOL,
AR_BASIC_LITERAL_FLOAT,
AR_BASIC_FLOAT16,
AR_BASIC_FLOAT32_PARTIAL_PRECISION,
AR_BASIC_FLOAT32,
AR_BASIC_FLOAT64,
AR_BASIC_LITERAL_INT,
AR_BASIC_INT8,
AR_BASIC_UINT8,
AR_BASIC_INT16,
AR_BASIC_UINT16,
AR_BASIC_INT32,
AR_BASIC_UINT32,
AR_BASIC_INT64,
AR_BASIC_UINT64,

AR_BASIC_MIN10FLOAT,
AR_BASIC_MIN16FLOAT,
AR_BASIC_MIN12INT,
AR_BASIC_MIN16INT,
AR_BASIC_MIN16UINT,
AR_BASIC_INT8_4PACKED,
AR_BASIC_UINT8_4PACKED,
AR_BASIC_ENUM,

AR_BASIC_COUNT,

//
// Pseudo-entries for intrinsic tables and such.
//

AR_BASIC_NONE,
AR_BASIC_UNKNOWN,
AR_BASIC_NOCAST,
AR_BASIC_DEPENDENT,
//
// The following pseudo-entries represent higher-level
// object types that are treated as units.
//

AR_BASIC_POINTER,
AR_BASIC_ENUM_CLASS,

AR_OBJECT_NULL,
AR_OBJECT_STRING_LITERAL,
AR_OBJECT_STRING,

// AR_OBJECT_TEXTURE,
AR_OBJECT_TEXTURE1D,
AR_OBJECT_TEXTURE1D_ARRAY,
AR_OBJECT_TEXTURE2D,
AR_OBJECT_TEXTURE2D_ARRAY,
AR_OBJECT_TEXTURE3D,
AR_OBJECT_TEXTURECUBE,
AR_OBJECT_TEXTURECUBE_ARRAY,
AR_OBJECT_TEXTURE2DMS,
AR_OBJECT_TEXTURE2DMS_ARRAY,

AR_OBJECT_SAMPLER,
AR_OBJECT_SAMPLER1D,
AR_OBJECT_SAMPLER2D,
AR_OBJECT_SAMPLER3D,
AR_OBJECT_SAMPLERCUBE,
AR_OBJECT_SAMPLERCOMPARISON,

AR_OBJECT_BUFFER,

//
// View objects are only used as variable/types within the Effects
// framework, for example in calls to OMSetRenderTargets.
//

AR_OBJECT_RENDERTARGETVIEW,
AR_OBJECT_DEPTHSTENCILVIEW,

//
// Shader objects are only used as variable/types within the Effects
// framework, for example as a result of CompileShader().
//

AR_OBJECT_COMPUTESHADER,
AR_OBJECT_DOMAINSHADER,
AR_OBJECT_GEOMETRYSHADER,
AR_OBJECT_HULLSHADER,
AR_OBJECT_PIXELSHADER,
AR_OBJECT_VERTEXSHADER,
AR_OBJECT_PIXELFRAGMENT,
AR_OBJECT_VERTEXFRAGMENT,

AR_OBJECT_STATEBLOCK,

AR_OBJECT_RASTERIZER,
AR_OBJECT_DEPTHSTENCIL,
AR_OBJECT_BLEND,

AR_OBJECT_POINTSTREAM,
AR_OBJECT_LINESTREAM,
AR_OBJECT_TRIANGLESTREAM,

AR_OBJECT_INPUTPATCH,
AR_OBJECT_OUTPUTPATCH,

AR_OBJECT_RWTEXTURE1D,
AR_OBJECT_RWTEXTURE1D_ARRAY,
AR_OBJECT_RWTEXTURE2D,
AR_OBJECT_RWTEXTURE2D_ARRAY,
AR_OBJECT_RWTEXTURE3D,
AR_OBJECT_RWBUFFER,

AR_OBJECT_BYTEADDRESS_BUFFER,
AR_OBJECT_RWBYTEADDRESS_BUFFER,
AR_OBJECT_STRUCTURED_BUFFER,
AR_OBJECT_RWSTRUCTURED_BUFFER,
AR_OBJECT_RWSTRUCTURED_BUFFER_ALLOC,
AR_OBJECT_RWSTRUCTURED_BUFFER_CONSUME,
AR_OBJECT_APPEND_STRUCTURED_BUFFER,
AR_OBJECT_CONSUME_STRUCTURED_BUFFER,

AR_OBJECT_CONSTANT_BUFFER,
AR_OBJECT_TEXTURE_BUFFER,

AR_OBJECT_ROVBUFFER,
AR_OBJECT_ROVBYTEADDRESS_BUFFER,
AR_OBJECT_ROVSTRUCTURED_BUFFER,
AR_OBJECT_ROVTEXTURE1D,
AR_OBJECT_ROVTEXTURE1D_ARRAY,
AR_OBJECT_ROVTEXTURE2D,
AR_OBJECT_ROVTEXTURE2D_ARRAY,
AR_OBJECT_ROVTEXTURE3D,

AR_OBJECT_FEEDBACKTEXTURE2D,
AR_OBJECT_FEEDBACKTEXTURE2D_ARRAY,

// SPIRV change starts
#ifdef ENABLE_SPIRV_CODEGEN
AR_OBJECT_VK_SUBPASS_INPUT,
AR_OBJECT_VK_SUBPASS_INPUT_MS,
AR_OBJECT_VK_SPIRV_TYPE,
AR_OBJECT_VK_SPIRV_OPAQUE_TYPE,
AR_OBJECT_VK_INTEGRAL_CONSTANT,
AR_OBJECT_VK_LITERAL,
AR_OBJECT_VK_SPV_INTRINSIC_TYPE,
AR_OBJECT_VK_SPV_INTRINSIC_RESULT_ID,
#endif // ENABLE_SPIRV_CODEGEN
// SPIRV change ends

AR_OBJECT_INNER, // Used for internal type object

AR_OBJECT_LEGACY_EFFECT,

AR_OBJECT_WAVE,

AR_OBJECT_RAY_DESC,
AR_OBJECT_ACCELERATION_STRUCT,
AR_OBJECT_USER_DEFINED_TYPE,
AR_OBJECT_TRIANGLE_INTERSECTION_ATTRIBUTES,

// subobjects
AR_OBJECT_STATE_OBJECT_CONFIG,
AR_OBJECT_GLOBAL_ROOT_SIGNATURE,
AR_OBJECT_LOCAL_ROOT_SIGNATURE,
AR_OBJECT_SUBOBJECT_TO_EXPORTS_ASSOC,
AR_OBJECT_RAYTRACING_SHADER_CONFIG,
AR_OBJECT_RAYTRACING_PIPELINE_CONFIG,
AR_OBJECT_TRIANGLE_HIT_GROUP,
AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP,
AR_OBJECT_RAYTRACING_PIPELINE_CONFIG1,

// RayQuery
AR_OBJECT_RAY_QUERY,

// Heap Resource
AR_OBJECT_HEAP_RESOURCE,
AR_OBJECT_HEAP_SAMPLER,

AR_OBJECT_RWTEXTURE2DMS,
AR_OBJECT_RWTEXTURE2DMS_ARRAY,

// Work Graphs
AR_OBJECT_EMPTY_NODE_INPUT,
AR_OBJECT_DISPATCH_NODE_INPUT_RECORD,
AR_OBJECT_RWDISPATCH_NODE_INPUT_RECORD,
AR_OBJECT_GROUP_NODE_INPUT_RECORDS,
AR_OBJECT_RWGROUP_NODE_INPUT_RECORDS,
AR_OBJECT_THREAD_NODE_INPUT_RECORD,
AR_OBJECT_RWTHREAD_NODE_INPUT_RECORD,

AR_OBJECT_NODE_OUTPUT,
AR_OBJECT_EMPTY_NODE_OUTPUT,
AR_OBJECT_NODE_OUTPUT_ARRAY,
AR_OBJECT_EMPTY_NODE_OUTPUT_ARRAY,

AR_OBJECT_THREAD_NODE_OUTPUT_RECORDS,
AR_OBJECT_GROUP_NODE_OUTPUT_RECORDS,

// Shader Execution Reordering
AR_OBJECT_HIT_OBJECT,

AR_BASIC_MAXIMUM_COUNT
};

// Forward declarations.
struct IDxcIntrinsicTable;
namespace clang {
Expand Down
90 changes: 37 additions & 53 deletions tools/clang/lib/AST/HlslTypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Type.h"
#include "clang/Sema/AttributeList.h" // conceptually ParsedAttributes
#include "clang/Sema/SemaHLSL.h" // ArBasicObject kind enums
#include "llvm/ADT/StringSwitch.h"

using namespace clang;
Expand Down Expand Up @@ -687,61 +688,44 @@ bool GetHLSLSubobjectKind(clang::QualType type,
hgType = (DXIL::HitGroupType)(-1);
type = type.getCanonicalType();
if (const RecordType *RT = type->getAs<RecordType>()) {
StringRef name = RT->getDecl()->getName();
switch (name.size()) {
case 17:
return name == "StateObjectConfig"
? (subobjectKind = DXIL::SubobjectKind::StateObjectConfig,
true)
: false;
case 18:
return name == "LocalRootSignature"
? (subobjectKind = DXIL::SubobjectKind::LocalRootSignature,
true)
: false;
case 19:
return name == "GlobalRootSignature"
? (subobjectKind = DXIL::SubobjectKind::GlobalRootSignature,
true)
: false;
case 29:
return name == "SubobjectToExportsAssociation"
? (subobjectKind =
DXIL::SubobjectKind::SubobjectToExportsAssociation,
true)
: false;
case 22:
return name == "RaytracingShaderConfig"
? (subobjectKind = DXIL::SubobjectKind::RaytracingShaderConfig,
true)
: false;
case 24:
return name == "RaytracingPipelineConfig"
? (subobjectKind =
DXIL::SubobjectKind::RaytracingPipelineConfig,
true)
: false;
case 25:
return name == "RaytracingPipelineConfig1"
? (subobjectKind =
DXIL::SubobjectKind::RaytracingPipelineConfig1,
true)
: false;
case 16:
if (name == "TriangleHitGroup") {
subobjectKind = DXIL::SubobjectKind::HitGroup;
hgType = DXIL::HitGroupType::Triangle;
return true;
}
return false;
case 27:
if (name == "ProceduralPrimitiveHitGroup") {
subobjectKind = DXIL::SubobjectKind::HitGroup;
hgType = DXIL::HitGroupType::ProceduralPrimitive;
return true;
}
RecordDecl *RD = RT->getDecl();
if (!RD->hasAttr<HLSLSubObjectAttr>()) {
return false;
}
Copy link
Copy Markdown
Collaborator

@pow2clk pow2clk Mar 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that you've added the attribute now, it would be pretty easy to avoid the string compares by adding a parameter to it containing an integer representation of the Subobjectkind similar to how HLSLResourceAttr does. The callers of CreateSubobjectStateObjectConfig and friends that call StartSubObjectDecl have the AR_OBJECT enums, which indicate which DXIL:SubobjectKind they need. It would be pretty easy to plumb it down and apply it to the attr.


HLSLSubObjectAttr *Attr = RD->getAttr<HLSLSubObjectAttr>();

switch (Attr->getSubObjKindUint()) {
Copy link
Copy Markdown
Collaborator

@pow2clk pow2clk Mar 26, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just to make sure of clarity here. I expected the argument to be the DXIL::SubobjectKind enum rather than the AR_OBJECTs which wouldn't require any conversion here apart from casting it back to the enum type.

case ArBasicKind::AR_OBJECT_STATE_OBJECT_CONFIG:
subobjectKind = DXIL::SubobjectKind::StateObjectConfig;
return true;
case ArBasicKind::AR_OBJECT_LOCAL_ROOT_SIGNATURE:
subobjectKind = DXIL::SubobjectKind::LocalRootSignature;
return true;
case ArBasicKind::AR_OBJECT_GLOBAL_ROOT_SIGNATURE:
subobjectKind = DXIL::SubobjectKind::GlobalRootSignature;
return true;
case ArBasicKind::AR_OBJECT_SUBOBJECT_TO_EXPORTS_ASSOC:
subobjectKind = DXIL::SubobjectKind::SubobjectToExportsAssociation;
return true;
case ArBasicKind::AR_OBJECT_RAYTRACING_SHADER_CONFIG:
subobjectKind = DXIL::SubobjectKind::RaytracingShaderConfig;
return true;
case ArBasicKind::AR_OBJECT_RAYTRACING_PIPELINE_CONFIG:
subobjectKind = DXIL::SubobjectKind::RaytracingPipelineConfig;
return true;
case ArBasicKind::AR_OBJECT_RAYTRACING_PIPELINE_CONFIG1:
subobjectKind = DXIL::SubobjectKind::RaytracingPipelineConfig1;
return true;
case ArBasicKind::AR_OBJECT_TRIANGLE_HIT_GROUP:
subobjectKind = DXIL::SubobjectKind::HitGroup;
hgType = DXIL::HitGroupType::Triangle;
return true;
case ArBasicKind::AR_OBJECT_PROCEDURAL_PRIMITIVE_HIT_GROUP:
subobjectKind = DXIL::SubobjectKind::HitGroup;
hgType = DXIL::HitGroupType::ProceduralPrimitive;
return true;
}
}
return false;
}
Expand Down
Loading
Loading