Browse Source

Add Basic Triangle Half Test (#656)

This test is mainly to test that half types in function signature works as expected. Not enabled by default yet.
Young Kim 8 years ago
parent
commit
5368b6eea8

+ 52 - 2
tools/clang/test/HLSL/ShaderOpArith.xml

@@ -436,6 +436,58 @@
     </Shader>
     </Shader>
   </ShaderOp>
   </ShaderOp>
 
 
+  <ShaderOp Name="TriangleHalf" PS="PS" VS="VS">
+    <RootSignature>RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT)</RootSignature>
+    <Resource Name="VBuffer" Dimension="BUFFER" Width="1024" Flags="ALLOW_UNORDERED_ACCESS" InitialResourceState="COPY_DEST" Init="FromBytes">
+      { {   0.0h,  0.25h , 0.0h, 1.0h }, { 1.0h, 1.0h, 1.0h, 1.0h } },
+      { {  0.25h, -0.25h , 0.0h, 1.0h }, { 1.0h, 1.0h, 1.0h, 1.0h } },
+      { { -0.25h, -0.25h , 0.0h, 1.0h }, { 1.0h, 1.0h, 1.0h, 1.0h } }
+    </Resource>
+    <Resource Name="RTarget" Dimension="TEXTURE2D" Width="320" Height="200" Format="R8G8B8A8_UNORM" Flags="ALLOW_RENDER_TARGET" InitialResourceState="COPY_DEST" ReadBack="true" />
+
+    <DescriptorHeap Name="RtvHeap" NumDescriptors="1" Type="RTV">
+      <Descriptor Name="RTarget" Kind="RTV"/>
+    </DescriptorHeap>
+    <InputElements>
+      <InputElement SemanticName="POSITION" Format="R16G16B16A16_FLOAT" AlignedByteOffset="0" />
+      <InputElement SemanticName="COLOR" Format="R16G16B16A16_FLOAT" AlignedByteOffset="8" />
+    </InputElements>
+    <RenderTargets>
+      <RenderTarget Name="RTarget" />
+    </RenderTargets>
+
+    <Shader Name="VS" Target="vs_6_2" Arguments="/no-min-precision">
+    <!--<Shader Name="VS" Target="vs_6_0"> -->
+    <![CDATA[
+    struct PSInput {
+      half4 position : SV_POSITION;
+      half4 color : COLOR;
+    };
+    PSInput main(half4 position : POSITION, half4 color : COLOR) {
+      PSInput result;
+      float ratio = 320.0 / 200.0;
+      result.position = position;
+      result.position.y *= ratio;
+      result.color = color;
+      return result;
+    }
+    ]]>
+    </Shader>
+
+    <Shader Name="PS" Target="ps_6_2" Arguments="/no-min-precision">
+    <!--<Shader Name="PS" Target="ps_6_0">-->
+    <![CDATA[
+    struct PSInput {
+      half4 position : SV_POSITION;
+      half4 color : COLOR;
+    };
+    half4 main(PSInput input) : SV_TARGET {
+      return input.color;
+    }
+    ]]>
+    </Shader>
+  </ShaderOp>
+
   <ShaderOp Name="CBufferTestHalf" PS="PS" VS="VS" TopologyType="TRIANGLE">
   <ShaderOp Name="CBufferTestHalf" PS="PS" VS="VS" TopologyType="TRIANGLE">
     <RootSignature>RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT), CBV(b0), DescriptorTable(SRV(t0,numDescriptors=2))</RootSignature>
     <RootSignature>RootFlags(ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT), CBV(b0), DescriptorTable(SRV(t0,numDescriptors=2))</RootSignature>
     <Resource Name="CB0" Dimension="BUFFER" InitialResourceState="COPY_DEST" Init="ByName" TransitionTo="VERTEX_AND_CONSTANT_BUFFER">
     <Resource Name="CB0" Dimension="BUFFER" InitialResourceState="COPY_DEST" Init="ByName" TransitionTo="VERTEX_AND_CONSTANT_BUFFER">
@@ -481,8 +533,6 @@
       ]]>
       ]]>
     </Shader>
     </Shader>
   </ShaderOp>
   </ShaderOp>
-
-
   <!--
   <!--
   TODO: Dynamically index into tables
   TODO: Dynamically index into tables
   -->
   -->

+ 19 - 3
tools/clang/unittests/HLSL/ExecutionTest.cpp

@@ -519,6 +519,11 @@ public:
   TEST_METHOD(BasicComputeTest);
   TEST_METHOD(BasicComputeTest);
   TEST_METHOD(BasicTriangleTest);
   TEST_METHOD(BasicTriangleTest);
   TEST_METHOD(BasicTriangleOpTest);
   TEST_METHOD(BasicTriangleOpTest);
+
+  BEGIN_TEST_METHOD(BasicTriangleOpTestHalf)
+    TEST_METHOD_PROPERTY(L"Priority", L"2") // Remove this line once warp supports this feature in Shader Model 6.2
+  END_TEST_METHOD()
+
   TEST_METHOD(OutOfBoundsTest);
   TEST_METHOD(OutOfBoundsTest);
   TEST_METHOD(SaturateTest);
   TEST_METHOD(SaturateTest);
   TEST_METHOD(SignTest);
   TEST_METHOD(SignTest);
@@ -596,6 +601,8 @@ public:
   void WaveIntrinsicsActivePrefixTest(
   void WaveIntrinsicsActivePrefixTest(
     TableParameter *pParameterList, size_t numParameter, bool isPrefix);
     TableParameter *pParameterList, size_t numParameter, bool isPrefix);
 
 
+  void BasicTriangleTestSetup(LPCSTR OpName, LPCWSTR FileName);
+
   bool UseDxbc() {
   bool UseDxbc() {
     return GetTestParamBool(L"DXBC");
     return GetTestParamBool(L"DXBC");
   }
   }
@@ -2341,7 +2348,7 @@ TEST_F(ExecutionTest, SaturateTest) {
   }
   }
 }
 }
 
 
-TEST_F(ExecutionTest, BasicTriangleOpTest) {
+void ExecutionTest::BasicTriangleTestSetup(LPCSTR ShaderOpName, LPCWSTR FileName) {
   WEX::TestExecution::SetVerifyOutput verifySettings(WEX::TestExecution::VerifyOutputSettings::LogOnlyFailures);
   WEX::TestExecution::SetVerifyOutput verifySettings(WEX::TestExecution::VerifyOutputSettings::LogOnlyFailures);
   CComPtr<IStream> pStream;
   CComPtr<IStream> pStream;
   ReadHlslDataIntoNewStream(L"ShaderOpArith.xml", &pStream);
   ReadHlslDataIntoNewStream(L"ShaderOpArith.xml", &pStream);
@@ -2351,7 +2358,7 @@ TEST_F(ExecutionTest, BasicTriangleOpTest) {
   if (!CreateDevice(&pDevice))
   if (!CreateDevice(&pDevice))
     return;
     return;
 
 
-  std::shared_ptr<ShaderOpTestResult> test = RunShaderOpTest(pDevice, m_support, pStream, "Triangle", nullptr);
+  std::shared_ptr<ShaderOpTestResult> test = RunShaderOpTest(pDevice, m_support, pStream, ShaderOpName, nullptr);
   MappedData data;
   MappedData data;
   D3D12_RESOURCE_DESC &D = test->ShaderOp->GetResourceByName("RTarget")->Desc;
   D3D12_RESOURCE_DESC &D = test->ShaderOp->GetResourceByName("RTarget")->Desc;
   UINT width = (UINT64)D.Width;
   UINT width = (UINT64)D.Width;
@@ -2359,7 +2366,7 @@ TEST_F(ExecutionTest, BasicTriangleOpTest) {
   test->Test->GetReadBackData("RTarget", &data);
   test->Test->GetReadBackData("RTarget", &data);
   const uint32_t *pPixels = (uint32_t *)data.data();
   const uint32_t *pPixels = (uint32_t *)data.data();
   if (SaveImages()) {
   if (SaveImages()) {
-    SavePixelsToFile(pPixels, DXGI_FORMAT_R8G8B8A8_UNORM, 320, 200, L"basic.bmp");
+    SavePixelsToFile(pPixels, DXGI_FORMAT_R8G8B8A8_UNORM, 320, 200, FileName);
   }
   }
   uint32_t top = pPixels[width / 2]; // Top center.
   uint32_t top = pPixels[width / 2]; // Top center.
   uint32_t mid = pPixels[width / 2 + width * (height / 2)]; // Middle center.
   uint32_t mid = pPixels[width / 2 + width * (height / 2)]; // Middle center.
@@ -2371,6 +2378,15 @@ TEST_F(ExecutionTest, BasicTriangleOpTest) {
   data.reset();
   data.reset();
   test.reset();
   test.reset();
   ReportLiveObjects();
   ReportLiveObjects();
+
+}
+
+TEST_F(ExecutionTest, BasicTriangleOpTest) {
+  BasicTriangleTestSetup("Triangle", L"basic-triangle.bmp");
+}
+
+TEST_F(ExecutionTest, BasicTriangleOpTestHalf) {
+  BasicTriangleTestSetup("TriangleHalf", L"basic-triangle-half.bmp");
 }
 }
 
 
 // Rendering two right triangles forming a square and assigning a texture value
 // Rendering two right triangles forming a square and assigning a texture value

+ 1 - 1
tools/clang/unittests/HLSL/ShaderOpTest.cpp

@@ -1932,7 +1932,7 @@ void ParseDataFromText(LPCWSTR pText, LPCWSTR pEnd, DXIL::ComponentType compType
     if (compType == DXIL::ComponentType::F16) {
     if (compType == DXIL::ComponentType::F16) {
       uint16_t fp16Val = ConvertFloat32ToFloat16(fVal);
       uint16_t fp16Val = ConvertFloat32ToFloat16(fVal);
       pB = (BYTE *)&fp16Val;
       pB = (BYTE *)&fp16Val;
-      V.insert(V.end(), pB, pB + sizeof(float));
+      V.insert(V.end(), pB, pB + sizeof(uint16_t));
     }
     }
     else {
     else {
       pB = (BYTE *)&fVal;
       pB = (BYTE *)&fVal;