BooleanMathOps.hlsl 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // RUN: %dxc -E main -T ps_6_0 -enable-templates %s | FileCheck %s
  2. // RUN: %dxc -E main -T ps_6_0 -enable-templates %s -DCHECK_DIAGNOSTICS | FileCheck %s -check-prefix=DIAG
  3. template<typename T>
  4. T ternary_and(T t0, T t1) {
  5. return t0 && t1 ? t0 : t1;
  6. }
  7. template<typename T>
  8. T ternary_or(T t0, T t1) {
  9. return t0 || t1 ? t0 : t1;
  10. }
  11. typedef struct {
  12. int4 a, b;
  13. } S;
  14. void main() : SV_Target {
  15. bool ba, bb;
  16. bool3 b3a, b3b;
  17. bool4x4 b4x4a, b4x4b;
  18. int ia, ib;
  19. int3 i3a, i3b;
  20. uint ua, ub;
  21. uint2 u2a, u2b;
  22. uint4 u4a, u4b;
  23. float fa, fb;
  24. float4 f4a, f4b;
  25. int iarra[8], iarrb[8];
  26. S sa, sb;
  27. #ifdef CHECK_DIAGNOSTICS
  28. // DIAG-NOT: define void @main
  29. // DIAG: deduced conflicting types for parameter
  30. ternary_or(bb, sa);
  31. // DIAG: function cannot return array type
  32. ternary_or(iarra, iarra);
  33. // DIAG: error: scalar, vector, or matrix expected
  34. ternary_and(sa, sb);
  35. // DIAG: error: scalar, vector, or matrix expected
  36. ternary_or(sa, sb);
  37. #else
  38. // CHECK: define void @main
  39. ternary_and(ba, bb);
  40. ternary_and(b3a, b3b);
  41. ternary_and(b4x4a, b4x4b);
  42. ternary_and(ia, ib);
  43. ternary_and(i3a, i3b);
  44. ternary_and(ua, ub);
  45. ternary_and(u4a, u4b);
  46. ternary_and(fa, fb);
  47. ternary_and(int(fa), ib);
  48. ternary_or(iarra[2], iarra[4]);
  49. ternary_and(sa.a, sb.b);
  50. #endif
  51. }