Skip to content

Commit bdf2365

Browse files
committed
Omit reserved DXIL ops from OpCode enum
This change excludes reserved ops from DXIL::OpCode enum, so they don't need a unique name. They should never be referenced, so this makes that using them basically impossible. The reserved values will be listed in a comment at the end of the enum, before NumOpCodes. Catch and reject reserved opcodes during validation. Since the OpCodeProperty table entries corresponding to their opcode must still be occupied due to the way ops are looked up by indexing the table, there's a new single ReservedOpCodeProps value, with opcode set to OpCode::Invalid, supplied for each reserved slot. This way the slot is occupied (reserved), but not valid for use. For instance, for a reserved opcode, now: - DecodeOpCode will return false (for invalid) - IsValidOpCode will return false - IsOverloadLegal will return false - getOpCode on instruction will return OpCode::Invalid - GetDxilOpFuncCallInst on instruction will return OpCode::Invalid - new IsReservedOpCode function will return true Added a validation test. Previously, it would have incorrectly accepted the reserved opcode as valid.
1 parent abc8dba commit bdf2365

8 files changed

Lines changed: 148 additions & 512 deletions

File tree

docs/DXIL.rst

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2342,18 +2342,6 @@ ID Name Description
23422342
223 TextureGatherRaw Gather raw elements from 4 texels with no type conversions (SRV type is constrained)
23432343
224 SampleCmpLevel samples a texture and compares a single component against the specified comparison value
23442344
225 TextureStoreSample stores texel data at specified sample index
2345-
226 Reserved_0x000000E2 reserved
2346-
227 Reserved_0x000000E3 reserved
2347-
228 Reserved_0x000000E4 reserved
2348-
229 Reserved_0x000000E5 reserved
2349-
230 Reserved_0x000000E6 reserved
2350-
231 Reserved_0x000000E7 reserved
2351-
232 Reserved_0x000000E8 reserved
2352-
233 Reserved_0x000000E9 reserved
2353-
234 Reserved_0x000000EA reserved
2354-
235 Reserved_0x000000EB reserved
2355-
236 Reserved_0x000000EC reserved
2356-
237 Reserved_0x000000ED reserved
23572345
238 AllocateNodeOutputRecords returns a handle for the output records
23582346
239 GetNodeRecordPtr retrieve node input/output record pointer in address space 6
23592347
240 IncrementOutputCount Select the next logical output count for an EmptyNodeOutput for the whole group or per thread.
@@ -2375,9 +2363,6 @@ ID Name Description
23752363
256 StartVertexLocation returns the BaseVertexLocation from DrawIndexedInstanced or StartVertexLocation from DrawInstanced
23762364
257 StartInstanceLocation returns the StartInstanceLocation from Draw*Instanced
23772365
258 AllocateRayQuery2 allocates space for RayQuery and return handle
2378-
259 Reserved_0x00000103 reserved
2379-
260 Reserved_0x00000104 reserved
2380-
261 Reserved_0x00000105 reserved
23812366
262 HitObject_TraceRay Analogous to TraceRay but without invoking CH/MS and returns the intermediate state as a HitObject
23822367
263 HitObject_FromRayQuery Creates a new HitObject representing a committed hit from a RayQuery
23832368
264 HitObject_FromRayQueryWithAttrs Creates a new HitObject representing a committed hit from a RayQuery and committed attributes
@@ -2406,19 +2391,6 @@ ID Name Description
24062391
287 HitObject_SetShaderTableIndex Returns a HitObject with updated shader table index
24072392
288 HitObject_LoadLocalRootTableConstant Returns the root table constant for this HitObject and offset
24082393
289 HitObject_Attributes Returns the attributes set for this HitObject
2409-
290 Reserved_0x00000122 reserved
2410-
291 Reserved_0x00000123 reserved
2411-
292 Reserved_0x00000124 reserved
2412-
293 Reserved_0x00000125 reserved
2413-
294 Reserved_0x00000126 reserved
2414-
295 Reserved_0x00000127 reserved
2415-
296 Reserved_0x00000128 reserved
2416-
297 Reserved_0x00000129 reserved
2417-
298 Reserved_0x0000012A reserved
2418-
299 Reserved_0x0000012B reserved
2419-
300 Reserved_0x0000012C reserved
2420-
301 Reserved_0x0000012D reserved
2421-
302 Reserved_0x0000012E reserved
24222394
303 RawBufferVectorLoad reads from a raw buffer and structured buffer
24232395
304 RawBufferVectorStore writes to a RWByteAddressBuffer or RWStructuredBuffer
24242396
305 MatVecMul Multiplies a MxK dimension matrix and a K sized input vector
@@ -3095,9 +3067,6 @@ ID Name Description
30953067
2147483675 MatrixAccumulateToDescriptor accumulates a matrix to a RWByteAddressBuffer
30963068
2147483676 MatrixAccumulateToMemory accumulates a matrix to groupshared memory
30973069
2147483677 MatrixOuterProduct Outer products an M sized vector and a K sized vector producing an MxK matrix
3098-
2147483678 Reserved_0x8000001E reserved
3099-
2147483679 Reserved_0x8000001F reserved
3100-
2147483680 Reserved_0x80000020 reserved
31013070
2147483681 DebugBreak triggers a breakpoint if a debugger is attached
31023071
2147483682 IsDebuggerPresent returns true if a debugger is attached
31033072
========== ======================================== ===================================================================================================================

include/dxc/DXIL/DxilConstants.h

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -511,11 +511,6 @@ namespace ExperimentalOps {
511511
static const OpCodeTableID TableID = OpCodeTableID::ExperimentalOps;
512512
// Enumeration for ExperimentalOps DXIL operations
513513
enum class OpCode : unsigned {
514-
//
515-
Reserved_0x8000001E = 30, // reserved
516-
Reserved_0x8000001F = 31, // reserved
517-
Reserved_0x80000020 = 32, // reserved
518-
519514
// Debugging
520515
DebugBreak = 33, // triggers a breakpoint if a debugger is attached
521516
IsDebuggerPresent = 34, // returns true if a debugger is attached
@@ -584,6 +579,9 @@ enum class OpCode : unsigned {
584579
HitObject_TriangleObjectPosition =
585580
10, // returns triangle vertices in object space as <9 x float>
586581

582+
// Reserved values:
583+
// 30, 31, 32
584+
587585
NumOpCodes = 35, // exclusive last value of enumeration
588586
};
589587
} // namespace ExperimentalOps
@@ -599,36 +597,6 @@ static const unsigned NumOpCodeTables = 2;
599597
// OPCODE-ENUM:BEGIN
600598
// Enumeration for CoreOps DXIL operations
601599
enum class OpCode : unsigned {
602-
//
603-
Reserved_0x000000E2 = 226, // reserved
604-
Reserved_0x000000E3 = 227, // reserved
605-
Reserved_0x000000E4 = 228, // reserved
606-
Reserved_0x000000E5 = 229, // reserved
607-
Reserved_0x000000E6 = 230, // reserved
608-
Reserved_0x000000E7 = 231, // reserved
609-
Reserved_0x000000E8 = 232, // reserved
610-
Reserved_0x000000E9 = 233, // reserved
611-
Reserved_0x000000EA = 234, // reserved
612-
Reserved_0x000000EB = 235, // reserved
613-
Reserved_0x000000EC = 236, // reserved
614-
Reserved_0x000000ED = 237, // reserved
615-
Reserved_0x00000103 = 259, // reserved
616-
Reserved_0x00000104 = 260, // reserved
617-
Reserved_0x00000105 = 261, // reserved
618-
Reserved_0x00000122 = 290, // reserved
619-
Reserved_0x00000123 = 291, // reserved
620-
Reserved_0x00000124 = 292, // reserved
621-
Reserved_0x00000125 = 293, // reserved
622-
Reserved_0x00000126 = 294, // reserved
623-
Reserved_0x00000127 = 295, // reserved
624-
Reserved_0x00000128 = 296, // reserved
625-
Reserved_0x00000129 = 297, // reserved
626-
Reserved_0x0000012A = 298, // reserved
627-
Reserved_0x0000012B = 299, // reserved
628-
Reserved_0x0000012C = 300, // reserved
629-
Reserved_0x0000012D = 301, // reserved
630-
Reserved_0x0000012E = 302, // reserved
631-
632600
// Amplification shader instructions
633601
DispatchMesh = 173, // Amplification shader intrinsic DispatchMesh
634602

@@ -1182,6 +1150,10 @@ enum class OpCode : unsigned {
11821150
OutputComplete =
11831151
241, // indicates all outputs for a given records are complete
11841152

1153+
// Reserved values:
1154+
// 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 259, 260, 261,
1155+
// 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302
1156+
11851157
NumOpCodes_Dxil_1_0 = 137,
11861158
NumOpCodes_Dxil_1_1 = 139,
11871159
NumOpCodes_Dxil_1_2 = 141,
@@ -1322,12 +1294,6 @@ enum class OpCode : unsigned {
13221294
EXP_OPCODE(ExperimentalOps,
13231295
MatrixOuterProduct), // Outer products an M sized vector and a K
13241296
// sized vector producing an MxK matrix
1325-
// Reserved_0x8000001E = 0x8000001E, 2147483678U, -2147483618
1326-
EXP_OPCODE(ExperimentalOps, Reserved_0x8000001E), // reserved
1327-
// Reserved_0x8000001F = 0x8000001F, 2147483679U, -2147483617
1328-
EXP_OPCODE(ExperimentalOps, Reserved_0x8000001F), // reserved
1329-
// Reserved_0x80000020 = 0x80000020, 2147483680U, -2147483616
1330-
EXP_OPCODE(ExperimentalOps, Reserved_0x80000020), // reserved
13311297
// DebugBreak = 0x80000021, 2147483681U, -2147483615
13321298
EXP_OPCODE(ExperimentalOps,
13331299
DebugBreak), // triggers a breakpoint if a debugger is attached

include/dxc/DXIL/DxilOperations.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ class OP {
275275
unsigned *OptTableIndex = nullptr);
276276
static bool IsValidOpCode(unsigned EncodedOpCode);
277277
static bool IsValidOpCode(OpCode EncodedOpCode);
278+
static bool IsReservedOpCode(unsigned EncodedOpCode);
278279

279280
private:
280281
// Static properties.

0 commit comments

Comments
 (0)