Skip to content

Commit 15d1c6c

Browse files
authored
Add COM API for querying metadata. (shader-slang#5168)
* Add COM API for querying metadata. * Fix tests. * fix test.
1 parent bc11579 commit 15d1c6c

17 files changed

+360
-37
lines changed

include/slang.h

+27
Original file line numberDiff line numberDiff line change
@@ -5280,6 +5280,22 @@ namespace slang
52805280

52815281
#define SLANG_UUID_ISession ISession::getTypeGuid()
52825282

5283+
struct IMetadata : public ISlangCastable
5284+
{
5285+
SLANG_COM_INTERFACE(0x8044a8a3, 0xddc0, 0x4b7f, { 0xaf, 0x8e, 0x2, 0x6e, 0x90, 0x5d, 0x73, 0x32 })
5286+
5287+
/*
5288+
Returns whether a resource parameter at the specifieid binding location is actually being used
5289+
in the compiled shader.
5290+
*/
5291+
virtual SlangResult isParameterLocationUsed(
5292+
SlangParameterCategory category, // is this a `t` register? `s` register?
5293+
SlangUInt spaceIndex, // `space` for D3D12, `set` for Vulkan
5294+
SlangUInt registerIndex, // `register` for D3D12, `binding` for Vulkan
5295+
bool& outUsed) = 0;
5296+
};
5297+
#define SLANG_UUID_IMetadata IMetadata::getTypeGuid()
5298+
52835299
/** A component type is a unit of shader code layout, reflection, and linking.
52845300
52855301
A component type is a unit of shader code that can be included into
@@ -5492,6 +5508,17 @@ namespace slang
54925508
SlangInt targetIndex,
54935509
IBlob** outCode,
54945510
IBlob** outDiagnostics = nullptr) = 0;
5511+
5512+
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
5513+
SlangInt targetIndex,
5514+
IMetadata** outMetadata,
5515+
IBlob** outDiagnostics = nullptr) = 0;
5516+
5517+
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
5518+
SlangInt entryPointIndex,
5519+
SlangInt targetIndex,
5520+
IMetadata** outMetadata,
5521+
IBlob** outDiagnostics = nullptr) = 0;
54955522
};
54965523
#define SLANG_UUID_IComponentType IComponentType::getTypeGuid()
54975524

source/compiler-core/slang-artifact-associated-impl.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -313,4 +313,24 @@ Slice<String> ArtifactPostEmitMetadata::getExportedFunctionMangledNames()
313313
return Slice<String>(m_exportedFunctionMangledNames.getBuffer(), m_exportedFunctionMangledNames.getCount());
314314
}
315315

316+
SlangResult ArtifactPostEmitMetadata::isParameterLocationUsed(
317+
SlangParameterCategory category,
318+
SlangUInt spaceIndex,
319+
SlangUInt registerIndex,
320+
bool& outUsed)
321+
{
322+
for (const auto& range : getUsedBindingRanges())
323+
{
324+
if (range.containsBinding((slang::ParameterCategory)category, spaceIndex, registerIndex))
325+
{
326+
outUsed = true;
327+
return SLANG_OK;
328+
}
329+
}
330+
331+
outUsed = false;
332+
return SLANG_OK;
333+
}
334+
335+
316336
} // namespace Slang

source/compiler-core/slang-artifact-associated-impl.h

+8
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ struct ShaderBindingRange
134134
case slang::ShaderResource:
135135
case slang::UnorderedAccess:
136136
case slang::SamplerState:
137+
case slang::DescriptorTableSlot:
137138
return true;
138139
default:
139140
return false;
@@ -157,6 +158,13 @@ class ArtifactPostEmitMetadata : public ComBaseObject, public IArtifactPostEmitM
157158
SLANG_NO_THROW virtual Slice<ShaderBindingRange> SLANG_MCALL getUsedBindingRanges() SLANG_OVERRIDE;
158159
SLANG_NO_THROW virtual Slice<String> SLANG_MCALL getExportedFunctionMangledNames() SLANG_OVERRIDE;
159160

161+
// IMetadata
162+
SLANG_NO_THROW virtual SlangResult SLANG_MCALL isParameterLocationUsed(
163+
SlangParameterCategory category, // is this a `t` register? `s` register?
164+
SlangUInt spaceIndex, // `space` for D3D12, `set` for Vulkan
165+
SlangUInt registerIndex, // `register` for D3D12, `binding` for Vulkan
166+
bool& outUsed) SLANG_OVERRIDE;
167+
160168
void* getInterface(const Guid& uuid);
161169
void* getObject(const Guid& uuid);
162170

source/compiler-core/slang-artifact-associated.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class IArtifactDiagnostics : public IClonable
117117

118118
struct ShaderBindingRange;
119119

120-
class IArtifactPostEmitMetadata : public ICastable
120+
class IArtifactPostEmitMetadata : public slang::IMetadata
121121
{
122122
public:
123123
SLANG_COM_INTERFACE(0x5d03bce9, 0xafb1, 0x4fc8, { 0xa4, 0x6f, 0x3c, 0xe0, 0x7b, 0x6, 0x1b, 0x1b });

source/slang-record-replay/record/slang-component-type.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,25 @@ namespace SlangRecord
127127
return res;
128128
}
129129

130+
SLANG_NO_THROW SlangResult SLANG_MCALL IComponentTypeRecorder::getEntryPointMetadata(
131+
SlangInt entryPointIndex,
132+
SlangInt targetIndex,
133+
slang::IMetadata** outMetadata,
134+
slang::IBlob** outDiagnostics)
135+
{
136+
// No need to record this call.
137+
return m_actualComponentType->getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
138+
}
139+
140+
SLANG_NO_THROW SlangResult SLANG_MCALL IComponentTypeRecorder::getTargetMetadata(
141+
SlangInt targetIndex,
142+
slang::IMetadata** outMetadata,
143+
slang::IBlob** outDiagnostics)
144+
{
145+
// No need to record this call.
146+
return m_actualComponentType->getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
147+
}
148+
130149
SLANG_NO_THROW SlangResult IComponentTypeRecorder::getResultAsFileSystem(
131150
SlangInt entryPointIndex,
132151
SlangInt targetIndex,

source/slang-record-replay/record/slang-component-type.h

+9
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ namespace SlangRecord
6161
SlangInt targetIndex,
6262
slang::IBlob** outCode,
6363
slang::IBlob** outDiagnostics = nullptr) override;
64+
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
65+
SlangInt entryPointIndex,
66+
SlangInt targetIndex,
67+
slang::IMetadata** outMetadata,
68+
slang::IBlob** outDiagnostics) override;
69+
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
70+
SlangInt targetIndex,
71+
slang::IMetadata** outMetadata,
72+
slang::IBlob** outDiagnostics = nullptr) override;
6473
protected:
6574
virtual ApiClassId getClassId() = 0;
6675
virtual SessionRecorder* getSessionRecorder() = 0;

source/slang-record-replay/record/slang-entrypoint.h

+17
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ namespace SlangRecord
6969
return Super::getTargetCode(targetIndex, outCode, outDiagnostics);
7070
}
7171

72+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
73+
SlangInt entryPointIndex,
74+
SlangInt targetIndex,
75+
slang::IMetadata** outMetadata,
76+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
77+
{
78+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
79+
}
80+
81+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
82+
SlangInt targetIndex,
83+
slang::IMetadata** outMetadata,
84+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
85+
{
86+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
87+
}
88+
7289
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
7390
SlangInt entryPointIndex,
7491
SlangInt targetIndex,

source/slang-record-replay/record/slang-module.h

+17
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,23 @@ namespace SlangRecord
8585
return Super::getTargetCode(targetIndex, outCode, outDiagnostics);
8686
}
8787

88+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
89+
SlangInt entryPointIndex,
90+
SlangInt targetIndex,
91+
slang::IMetadata** outMetadata,
92+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
93+
{
94+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
95+
}
96+
97+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
98+
SlangInt targetIndex,
99+
slang::IMetadata** outMetadata,
100+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
101+
{
102+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
103+
}
104+
88105
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
89106
SlangInt entryPointIndex,
90107
SlangInt targetIndex,

source/slang-record-replay/record/slang-type-conformance.h

+17
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,23 @@ namespace SlangRecord
6565
return Super::getTargetCode(targetIndex, outCode, outDiagnostics);
6666
}
6767

68+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
69+
SlangInt entryPointIndex,
70+
SlangInt targetIndex,
71+
slang::IMetadata** outMetadata,
72+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
73+
{
74+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
75+
}
76+
77+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
78+
SlangInt targetIndex,
79+
slang::IMetadata** outMetadata,
80+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
81+
{
82+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
83+
}
84+
6885
virtual SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
6986
SlangInt entryPointIndex,
7087
SlangInt targetIndex,

source/slang/slang-compiler.h

+65
Original file line numberDiff line numberDiff line change
@@ -317,10 +317,22 @@ namespace Slang
317317
SlangInt targetIndex,
318318
slang::IBlob** outCode,
319319
slang::IBlob** outDiagnostics) SLANG_OVERRIDE;
320+
321+
IArtifact* getTargetArtifact(SlangInt targetIndex, slang::IBlob** outDiagnostics);
322+
320323
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetCode(
321324
SlangInt targetIndex,
322325
slang::IBlob** outCode,
323326
slang::IBlob** outDiagnostics = nullptr) SLANG_OVERRIDE;
327+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
328+
SlangInt entryPointIndex,
329+
SlangInt targetIndex,
330+
slang::IMetadata** outMetadata,
331+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE;
332+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
333+
SlangInt targetIndex,
334+
slang::IMetadata** outMetadata,
335+
slang::IBlob** outDiagnostics = nullptr) SLANG_OVERRIDE;
324336

325337
SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
326338
SlangInt entryPointIndex,
@@ -580,6 +592,8 @@ namespace Slang
580592

581593
Scope* m_lookupScope = nullptr;
582594
std::unique_ptr<Dictionary<String, IntVal*>> m_mapMangledNameToIntVal;
595+
596+
Dictionary<Int, ComPtr<IArtifact>> m_targetArtifacts;
583597
};
584598

585599
/// A component type built up from other component types.
@@ -914,6 +928,23 @@ namespace Slang
914928
return Super::getTargetCode(targetIndex, outCode, outDiagnostics);
915929
}
916930

931+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
932+
SlangInt entryPointIndex,
933+
SlangInt targetIndex,
934+
slang::IMetadata** outMetadata,
935+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
936+
{
937+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
938+
}
939+
940+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
941+
SlangInt targetIndex,
942+
slang::IMetadata** outMetadata,
943+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
944+
{
945+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
946+
}
947+
917948
SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
918949
SlangInt entryPointIndex,
919950
SlangInt targetIndex,
@@ -1159,6 +1190,23 @@ namespace Slang
11591190
return Super::getTargetCode(targetIndex, outCode, outDiagnostics);
11601191
}
11611192

1193+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
1194+
SlangInt entryPointIndex,
1195+
SlangInt targetIndex,
1196+
slang::IMetadata** outMetadata,
1197+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
1198+
{
1199+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
1200+
}
1201+
1202+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
1203+
SlangInt targetIndex,
1204+
slang::IMetadata** outMetadata,
1205+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
1206+
{
1207+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
1208+
}
1209+
11621210
SLANG_NO_THROW SlangResult SLANG_MCALL getResultAsFileSystem(
11631211
SlangInt entryPointIndex,
11641212
SlangInt targetIndex,
@@ -1460,6 +1508,23 @@ namespace Slang
14601508
return Super::getEntryPointHash(entryPointIndex, targetIndex, outHash);
14611509
}
14621510

1511+
SLANG_NO_THROW SlangResult SLANG_MCALL getEntryPointMetadata(
1512+
SlangInt entryPointIndex,
1513+
SlangInt targetIndex,
1514+
slang::IMetadata** outMetadata,
1515+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
1516+
{
1517+
return Super::getEntryPointMetadata(entryPointIndex, targetIndex, outMetadata, outDiagnostics);
1518+
}
1519+
1520+
SLANG_NO_THROW SlangResult SLANG_MCALL getTargetMetadata(
1521+
SlangInt targetIndex,
1522+
slang::IMetadata** outMetadata,
1523+
slang::IBlob** outDiagnostics) SLANG_OVERRIDE
1524+
{
1525+
return Super::getTargetMetadata(targetIndex, outMetadata, outDiagnostics);
1526+
}
1527+
14631528
/// Get a serialized representation of the checked module.
14641529
virtual SLANG_NO_THROW SlangResult SLANG_MCALL serialize(ISlangBlob** outSerializedBlob) override;
14651530

source/slang/slang-parameter-binding.cpp

+6-5
Original file line numberDiff line numberDiff line change
@@ -1225,18 +1225,14 @@ static void addExplicitParameterBindings_GLSL(
12251225
}
12261226
}
12271227

1228-
// We use the HLSL binding directly (even though this notionally for GLSL/Vulkan)
1229-
// We'll do the shifting at later later point in _maybeApplyHLSLToVulkanShifts
1230-
info[kResInfo].resInfo = typeLayout->findOrAddResourceInfo(hlslInfo.kind);
1231-
12321228
if (warnedMissingVulkanLayoutModifier)
12331229
{
12341230
// If we warn due to invalid bindings and user did not set how to interpret 'hlsl style bindings', we should map
12351231
// `register` 1:1 with equivlent vulkan bindings.
12361232
if(!hlslToVulkanLayoutOptions
12371233
|| hlslToVulkanLayoutOptions->getKindShiftEnabledFlags() == HLSLToVulkanLayoutOptions::KindFlag::None)
12381234
{
1239-
info[kResInfo].resInfo->kind = LayoutResourceKind::DescriptorTableSlot;
1235+
info[kResInfo].resInfo = typeLayout->findOrAddResourceInfo(LayoutResourceKind::DescriptorTableSlot);
12401236
info[kResInfo].resInfo->count = 1;
12411237
}
12421238
else
@@ -1245,6 +1241,11 @@ static void addExplicitParameterBindings_GLSL(
12451241
}
12461242
}
12471243

1244+
// We use the HLSL binding directly (even though this notionally for GLSL/Vulkan)
1245+
// We'll do the shifting at later later point in _maybeApplyHLSLToVulkanShifts
1246+
if (!info[kResInfo].resInfo)
1247+
info[kResInfo].resInfo = typeLayout->findOrAddResourceInfo(hlslInfo.kind);
1248+
12481249
info[kResInfo].semanticInfo.kind = info[kResInfo].resInfo->kind;
12491250
info[kResInfo].semanticInfo.index = UInt(hlslInfo.index);
12501251
info[kResInfo].semanticInfo.space = UInt(hlslInfo.space);

0 commit comments

Comments
 (0)