Test operand-table capabilities.
authorDejan Mircevski <deki@google.com>
Fri, 2 Oct 2015 05:35:19 +0000 (01:35 -0400)
committerDavid Neto <dneto@google.com>
Mon, 26 Oct 2015 16:55:33 +0000 (12:55 -0400)
test/OpcodeRequiresCapabilities.cpp

index 97fe118..ee7c7ce 100644 (file)
@@ -125,6 +125,47 @@ INSTANTIATE_TEST_CASE_P(
         ExpectedOpCodeCapabilities{spv::OpFunction, 0},
         ExpectedOpCodeCapabilities{spv::OpConvertFToS, 0}));
 
-// TODO(deki): test operand-table capabilities.
+/// Utility to initialize the operand table and look up capabilities.
+class OperandCapabilitiesTest : public ::testing::Test {
+ protected:
+  OperandCapabilitiesTest() {
+    EXPECT_EQ(SPV_SUCCESS, spvOperandTableGet(&operandTable_));
+  }
+
+  /// Looks up an operand's capabilities in the operand table.
+  uint64_t Capabilities(spv_operand_type_t type, uint32_t value) {
+    spv_operand_desc entry;
+    EXPECT_EQ(SPV_SUCCESS,
+              spvOperandTableValueLookup(operandTable_, type, value, &entry));
+    return entry->capabilities;
+  }
+
+ private:
+  spv_operand_table operandTable_;
+};
+
+TEST_F(OperandCapabilitiesTest, SpotCheckSomeRows) {
+  EXPECT_EQ(mask(CapabilityGeometry, CapabilityTessellation),
+            Capabilities(SPV_OPERAND_TYPE_EXECUTION_MODE,
+                         ExecutionModeInputTriangles));
+  EXPECT_EQ(mask(CapabilityGeometry, CapabilityTessellation),
+            Capabilities(SPV_OPERAND_TYPE_EXECUTION_MODE,
+                         ExecutionModeOutputVertices));
+  EXPECT_EQ(mask(CapabilityGeometry, CapabilityTessellation),
+            Capabilities(SPV_OPERAND_TYPE_BUILT_IN, BuiltInPrimitiveId));
+  EXPECT_EQ(mask(CapabilityGeometry, CapabilityTessellation),
+            Capabilities(SPV_OPERAND_TYPE_BUILT_IN, BuiltInInvocationId));
+  EXPECT_EQ(0, Capabilities(SPV_OPERAND_TYPE_FUNCTION_CONTROL,
+                            FunctionControlPureMask));
+  EXPECT_EQ(0, Capabilities(SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
+                            KernelProfilingInfoMaskNone));
+  EXPECT_EQ(mask(CapabilityKernel),
+            Capabilities(SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO,
+                         KernelProfilingInfoCmdExecTimeMask));
+  EXPECT_EQ(mask(CapabilityShader),
+            Capabilities(SPV_OPERAND_TYPE_STORAGE_CLASS, StorageClassOutput));
+  EXPECT_EQ(0, Capabilities(SPV_OPERAND_TYPE_STORAGE_CLASS,
+                            StorageClassWorkgroupGlobal));
+}
 
 }  // anonymous namespace