method.input-output-patch.access.hlsl 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Run: %dxc -T hs_6_0 -E SubDToBezierHS
  2. #define MAX_POINTS 16
  3. // Input control point
  4. struct VS_CONTROL_POINT_OUTPUT
  5. {
  6. float3 vPosition : WORLDPOS;
  7. float2 vUV : TEXCOORD0;
  8. float3 vTangent : TANGENT;
  9. };
  10. // Output control point
  11. struct BEZIER_CONTROL_POINT
  12. {
  13. float3 vPosition : BEZIERPOS;
  14. uint pointID : ControlPointID;
  15. };
  16. // Output patch constant data.
  17. struct HS_CONSTANT_DATA_OUTPUT
  18. {
  19. float Edges[4] : SV_TessFactor;
  20. float Inside[2] : SV_InsideTessFactor;
  21. float3 vTangent[4] : TANGENT;
  22. float2 vUV[4] : TEXCOORD;
  23. float3 vTanUCorner[4] : TANUCORNER;
  24. float3 vTanVCorner[4] : TANVCORNER;
  25. float4 vCWts : TANWEIGHTS;
  26. };
  27. HS_CONSTANT_DATA_OUTPUT PCF(OutputPatch<BEZIER_CONTROL_POINT, MAX_POINTS> op) {
  28. HS_CONSTANT_DATA_OUTPUT Output;
  29. // Must initialize Edges and Inside; otherwise HLSL validation will fail.
  30. Output.Edges[0] = 1.0;
  31. Output.Edges[1] = 2.0;
  32. Output.Edges[2] = 3.0;
  33. Output.Edges[3] = 4.0;
  34. Output.Inside[0] = 5.0;
  35. Output.Inside[1] = 6.0;
  36. uint x = 5;
  37. // CHECK: [[op_1_loc:%\d+]] = OpAccessChain %_ptr_Function_v3float %op %uint_1 %int_0
  38. // CHECK-NEXT: {{%\d+}} = OpLoad %v3float [[op_1_loc]]
  39. float3 out1pos = op[1].vPosition;
  40. // CHECK: [[x:%\d+]] = OpLoad %uint %x
  41. // CHECK-NEXT: [[op_x_loc:%\d+]] = OpAccessChain %_ptr_Function_uint %op [[x]] %int_1
  42. // CHECK-NEXT: {{%\d+}} = OpLoad %uint [[op_x_loc]]
  43. uint out5id = op[x].pointID;
  44. return Output;
  45. }
  46. [domain("quad")]
  47. [partitioning("fractional_odd")]
  48. [outputtopology("line")]
  49. [outputcontrolpoints(16)]
  50. [patchconstantfunc("PCF")]
  51. BEZIER_CONTROL_POINT SubDToBezierHS(InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip, uint i : SV_OutputControlPointID, uint PatchID : SV_PrimitiveID) {
  52. BEZIER_CONTROL_POINT result;
  53. uint y = 5;
  54. // CHECK: [[ip_1_loc:%\d+]] = OpAccessChain %_ptr_Function_v3float %ip %uint_1 %int_0
  55. // CHECK-NEXT: {{%\d+}} = OpLoad %v3float [[ip_1_loc]]
  56. result.vPosition = ip[1].vPosition;
  57. // CHECK: [[y:%\d+]] = OpLoad %uint %y
  58. // CHECK-NEXT: [[ip_y_loc:%\d+]] = OpAccessChain %_ptr_Function_v3float %ip [[y]] %int_2
  59. // CHECK-NEXT: {{%\d+}} = OpLoad %v3float [[ip_y_loc]]
  60. result.vPosition = ip[y].vTangent;
  61. return result;
  62. }