Skip to content

Commit f57fbc7

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 aa889e9 commit f57fbc7

File tree

8 files changed

+148
-511
lines changed

8 files changed

+148
-511
lines changed

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 LinAlgMatrixAccumulateToDescriptor accumulates a matrix to a RWByteAddressBuffer
30963068
2147483676 LinAlgMatrixAccumulateToMemory accumulates a matrix to groupshared memory
30973069
2147483677 LinAlgMatrixOuterProduct Outer products an M sized vector and a N sized vector producing an MxN 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
@@ -523,11 +523,6 @@ namespace ExperimentalOps {
523523
static const OpCodeTableID TableID = OpCodeTableID::ExperimentalOps;
524524
// Enumeration for ExperimentalOps DXIL operations
525525
enum class OpCode : unsigned {
526-
//
527-
Reserved_0x8000001E = 30, // reserved
528-
Reserved_0x8000001F = 31, // reserved
529-
Reserved_0x80000020 = 32, // reserved
530-
531526
// Debugging
532527
DebugBreak = 33, // triggers a breakpoint if a debugger is attached
533528
IsDebuggerPresent = 34, // returns true if a debugger is attached
@@ -603,6 +598,9 @@ enum class OpCode : unsigned {
603598
HitObject_TriangleObjectPosition =
604599
10, // returns triangle vertices in object space as <9 x float>
605600

601+
// Reserved values:
602+
// 30, 31, 32
603+
606604
NumOpCodes = 35, // exclusive last value of enumeration
607605
};
608606
} // namespace ExperimentalOps
@@ -618,36 +616,6 @@ static const unsigned NumOpCodeTables = 2;
618616
// OPCODE-ENUM:BEGIN
619617
// Enumeration for CoreOps DXIL operations
620618
enum class OpCode : unsigned {
621-
//
622-
Reserved_0x000000E2 = 226, // reserved
623-
Reserved_0x000000E3 = 227, // reserved
624-
Reserved_0x000000E4 = 228, // reserved
625-
Reserved_0x000000E5 = 229, // reserved
626-
Reserved_0x000000E6 = 230, // reserved
627-
Reserved_0x000000E7 = 231, // reserved
628-
Reserved_0x000000E8 = 232, // reserved
629-
Reserved_0x000000E9 = 233, // reserved
630-
Reserved_0x000000EA = 234, // reserved
631-
Reserved_0x000000EB = 235, // reserved
632-
Reserved_0x000000EC = 236, // reserved
633-
Reserved_0x000000ED = 237, // reserved
634-
Reserved_0x00000103 = 259, // reserved
635-
Reserved_0x00000104 = 260, // reserved
636-
Reserved_0x00000105 = 261, // reserved
637-
Reserved_0x00000122 = 290, // reserved
638-
Reserved_0x00000123 = 291, // reserved
639-
Reserved_0x00000124 = 292, // reserved
640-
Reserved_0x00000125 = 293, // reserved
641-
Reserved_0x00000126 = 294, // reserved
642-
Reserved_0x00000127 = 295, // reserved
643-
Reserved_0x00000128 = 296, // reserved
644-
Reserved_0x00000129 = 297, // reserved
645-
Reserved_0x0000012A = 298, // reserved
646-
Reserved_0x0000012B = 299, // reserved
647-
Reserved_0x0000012C = 300, // reserved
648-
Reserved_0x0000012D = 301, // reserved
649-
Reserved_0x0000012E = 302, // reserved
650-
651619
// Amplification shader instructions
652620
DispatchMesh = 173, // Amplification shader intrinsic DispatchMesh
653621

@@ -1201,6 +1169,10 @@ enum class OpCode : unsigned {
12011169
OutputComplete =
12021170
241, // indicates all outputs for a given records are complete
12031171

1172+
// Reserved values:
1173+
// 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 259, 260, 261,
1174+
// 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302
1175+
12041176
NumOpCodes_Dxil_1_0 = 137,
12051177
NumOpCodes_Dxil_1_1 = 139,
12061178
NumOpCodes_Dxil_1_2 = 141,
@@ -1351,12 +1323,6 @@ enum class OpCode : unsigned {
13511323
ExperimentalOps,
13521324
LinAlgMatrixOuterProduct), // Outer products an M sized vector and a N
13531325
// sized vector producing an MxN matrix
1354-
// Reserved_0x8000001E = 0x8000001E, 2147483678U, -2147483618
1355-
EXP_OPCODE(ExperimentalOps, Reserved_0x8000001E), // reserved
1356-
// Reserved_0x8000001F = 0x8000001F, 2147483679U, -2147483617
1357-
EXP_OPCODE(ExperimentalOps, Reserved_0x8000001F), // reserved
1358-
// Reserved_0x80000020 = 0x80000020, 2147483680U, -2147483616
1359-
EXP_OPCODE(ExperimentalOps, Reserved_0x80000020), // reserved
13601326
// DebugBreak = 0x80000021, 2147483681U, -2147483615
13611327
EXP_OPCODE(ExperimentalOps,
13621328
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
@@ -276,6 +276,7 @@ class OP {
276276
unsigned *OptTableIndex = nullptr);
277277
static bool IsValidOpCode(unsigned EncodedOpCode);
278278
static bool IsValidOpCode(OpCode EncodedOpCode);
279+
static bool IsReservedOpCode(unsigned EncodedOpCode);
279280

280281
private:
281282
// Static properties.

0 commit comments

Comments
 (0)