// RUN: %dxc -E main -T hs_6_0 %s | FileCheck %s // CHECK: InputPatch should not be out/inout parameter // CHECK: OutputPatch should not be out/inout parameter //-------------------------------------------------------------------------------------- // SimpleTessellation.hlsl // // Advanced Technology Group (ATG) // Copyright (C) Microsoft Corporation. All rights reserved. //-------------------------------------------------------------------------------------- struct PSSceneIn { float4 pos : SV_Position; float2 tex : TEXCOORD0; float3 norm : NORMAL; uint RTIndex : SV_RenderTargetArrayIndex; }; ////////////////////////////////////////////////////////////////////////////////////////// // Simple forwarding Tessellation shaders struct HSPerVertexData { // This is just the original vertex verbatim. In many real life cases this would be a // control point instead PSSceneIn v; }; struct HSPerPatchData { // We at least have to specify tess factors per patch // As we're tesselating triangles, there will be 4 tess factors // In real life case this might contain face normal, for example float edges[ 3 ] : SV_TessFactor; float inside : SV_InsideTessFactor; }; float4 HSPerPatchFunc() { return 1.8; } HSPerPatchData HSPerPatchFunc( const out InputPatch< PSSceneIn, 3 > points, out OutputPatch outp) { HSPerPatchData d; d.edges[ 0 ] = 1; d.edges[ 1 ] = 1; d.edges[ 2 ] = 1; d.inside = 1; return d; } // hull per-control point shader [domain("tri")] [partitioning("fractional_odd")] [outputtopology("triangle_cw")] [patchconstantfunc("HSPerPatchFunc")] [outputcontrolpoints(3)] HSPerVertexData main( const uint id : SV_OutputControlPointID, const InputPatch< PSSceneIn, 3 > points, const InputPatch< PSSceneIn, 3 > points2 ) { HSPerVertexData v; // Just forward the vertex v.v = points[ id ]; return v; }