DebugFlowControl.hlsl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // RUN: %dxc -EFlowControlPS -Tps_6_0 %s | %opt -S -dxil-annotate-with-virtual-regs -hlsl-dxil-debug-instrumentation | %FileCheck %s
  2. // Check that flow control constructs don't break the instrumentation.
  3. // CHECK: %UAVIncResult2 = call i32 @dx.op.atomicBinOp.i32(i32 78, %dx.types.Handle %PIX_DebugUAV_Handle, i32 0, i32 0, i32 undef, i32 undef, i32 %IncrementForThisInvocation1)
  4. // CHECK: %MaskedForUAVLimit3 = and i32 %UAVIncResult2, 983039
  5. // CHECK: %MultipliedForInterest4 = mul i32 %MaskedForUAVLimit3, %OffsetMultiplicand
  6. // CHECK: %AddedForInterest5 = add i32 %MultipliedForInterest4, %OffsetAddend
  7. // CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle %PIX_DebugUAV_Handle, i32 %AddedForInterest5, i32 undef
  8. struct VS_OUTPUT_ENV {
  9. float4 Pos : SV_Position;
  10. float2 Tex : TEXCOORD0;
  11. };
  12. int i32;
  13. float f32;
  14. float4 Vectorize(float f) {
  15. float4 ret;
  16. if (f < 1024) // testbreakpoint0
  17. ret.x = f;
  18. else
  19. ret.x = f + 100;
  20. if (f < 512)
  21. ret.y = f;
  22. else
  23. ret.y = f + 10;
  24. if (f < 2048)
  25. ret.z = f;
  26. else
  27. ret.z = f + 1000;
  28. if (f < 4096)
  29. ret.w = f + f;
  30. else
  31. ret.w = f + 1;
  32. return ret;
  33. }
  34. float4 FlowControlPS(VS_OUTPUT_ENV input) : SV_Target {
  35. float4 ret = {0, 0, 0, 1}; // FirstExecutableLine
  36. switch (i32) {
  37. case 0:
  38. ret = float4(1, 0, 1, 1);
  39. break;
  40. case 32:
  41. ret = Vectorize(f32);
  42. break;
  43. }
  44. if (i32 > 10) {
  45. ret.r += 0.1f;
  46. } else {
  47. ret.g += 0.1f;
  48. }
  49. for (uint i = 0; i < 3; ++i) // testbreakpoint1
  50. {
  51. ret.b += f32 / 1024.f;
  52. }
  53. for (uint j = 0; j < i32 / 8; ++j) {
  54. ret.b += f32 / 1000.f;
  55. }
  56. return ret; // LastExecutableLine
  57. }