Make capabilities a bitfield in opcode/operand tables.
diff --git a/source/opcode.cpp b/source/opcode.cpp
index b3532cb..3344a98 100644
--- a/source/opcode.cpp
+++ b/source/opcode.cpp
@@ -45,20 +45,14 @@
spv_opcode_desc_t opcodeTableEntries[] = {
#define EmptyList {}
#define List(...) {__VA_ARGS__}
-#define Capability(X) Capability##X
-#define CapabilityNone -1
-// TODO(dneto): Some things can be enabled by one of two different capabilities.
-// The capabilities field in spv_operand_desc_t can't handle that yet.
-// Maybe have to make it a 64-bit mask. Currently there are 54 distinct
-// capabilities.
-// For now, just select the first one. This must be fixed for the validator
-// to work.
-#define Capability2(X,Y) Capability##X
+#define Capability(X) SPV_CAPABILITY_AS_MASK(Capability##X)
+#define Capability2(X,Y) Capability(X)|Capability(Y)
+#define CapabilityNone 0 // Needed so Capability(None) still expands to valid syntax.
#define Instruction(Name,HasResult,HasType,NumLogicalOperands,NumCapabilities,CapabilityRequired,IsVariable,LogicalArgsList) \
{ #Name, \
Op##Name, \
- ((CapabilityRequired != CapabilityNone ? SPV_OPCODE_FLAGS_CAPABILITIES : 0)), \
- uint32_t(CapabilityRequired), \
+ (NumCapabilities) ? SPV_OPCODE_FLAGS_CAPABILITIES : 0, \
+ (NumCapabilities) ? (CapabilityRequired) : 0, \
0, {}, /* Filled in later. Operand list, including result id and type id, if needed */ \
HasResult, \
HasType, \
@@ -67,6 +61,7 @@
#undef EmptyList
#undef List
#undef Capability
+#undef Capability2
#undef CapabilityNone
#undef Instruction
};