BindlessPrototypeSrg.azsli 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. // NOTE: Nest this array, so Azslc will output a size of the bindingslot to 1
  10. struct FloatBuffer
  11. {
  12. float buffer;
  13. };
  14. // Listed on update frequency
  15. ShaderResourceGroupSemantic FrequencyPerScene
  16. {
  17. FrequencyId = 0;
  18. };
  19. ShaderResourceGroupSemantic FloatBufferSemanticId
  20. {
  21. FrequencyId = 1;
  22. };
  23. ShaderResourceGroupSemantic IndirectionBufferSemanticId
  24. {
  25. FrequencyId = 2;
  26. };
  27. ShaderResourceGroupSemantic NonBindlessTextureSemanticId
  28. {
  29. FrequencyId = 3;
  30. };
  31. ShaderResourceGroup FloatBufferSrg : FloatBufferSemanticId
  32. {
  33. StructuredBuffer<FloatBuffer> m_floatBuffer;
  34. };
  35. ShaderResourceGroup IndirectionBufferSrg : IndirectionBufferSemanticId
  36. {
  37. ByteAddressBuffer m_indirectionBuffer;
  38. };
  39. ShaderResourceGroup SamplerSrg : FrequencyPerScene
  40. {
  41. Sampler m_sampler
  42. {
  43. MaxAnisotropy = 16;
  44. AddressU = Wrap;
  45. AddressV = Wrap;
  46. AddressW = Wrap;
  47. };
  48. };
  49. ShaderResourceGroup ImageSrg : NonBindlessTextureSemanticId
  50. {
  51. // Array of textures
  52. Texture2D m_textureArray[UNBOUNDED_SIZE];
  53. };
  54. // Helper functions to read data from the FloatBuffer. The FloatBuffer is accessed with an offset and an index.
  55. // The offset holds the initial offset within the FloatBuffer, and the index is a sub-index, which increments with each property that is being read.
  56. // The data needs to be read in the same order as it is allocated on the host.
  57. // read floats
  58. void ReadFromFloatBuffer(out float outFloat, in uint offset, inout uint index)
  59. {
  60. outFloat = FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer;
  61. index += 1;
  62. }
  63. void ReadFromFloatBuffer(out float2 outFloat, in uint offset, inout uint index)
  64. {
  65. outFloat.x = FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer;
  66. outFloat.y = FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer;
  67. index += 2;
  68. }
  69. void ReadFromFloatBuffer(out float3 outFloat, in uint offset, inout uint index)
  70. {
  71. outFloat.x = FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer;
  72. outFloat.y = FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer;
  73. outFloat.z = FloatBufferSrg::m_floatBuffer[offset + index + 2].buffer;
  74. index += 3;
  75. }
  76. void ReadFromFloatBuffer(out float4 outFloat, in uint offset, inout uint index)
  77. {
  78. outFloat.x = FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer;
  79. outFloat.y = FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer;
  80. outFloat.z = FloatBufferSrg::m_floatBuffer[offset + index + 2].buffer;
  81. outFloat.w = FloatBufferSrg::m_floatBuffer[offset + index + 3].buffer;
  82. index += 4;
  83. }
  84. // Read to matrix
  85. void ReadFromFloatBuffer(out float4x4 outFloat, in uint offset, inout uint index)
  86. {
  87. [unroll(4)]
  88. for(uint i = 0; i < 4; i++)
  89. {
  90. ReadFromFloatBuffer(outFloat[i], offset, index);
  91. }
  92. }
  93. // read uint
  94. void ReadFromFloatBuffer(out uint outUInt, in uint offset, inout uint index)
  95. {
  96. outUInt = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer);
  97. index += 1;
  98. }
  99. void ReadFromFloatBuffer(out uint2 outUInt, in uint offset, inout uint index)
  100. {
  101. outUInt.x = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer);
  102. outUInt.y = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer);
  103. index += 2;
  104. }
  105. void ReadFromFloatBuffer(out uint3 outUInt, in uint offset, inout uint index)
  106. {
  107. outUInt.x = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer);
  108. outUInt.y = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer);
  109. outUInt.z = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 2].buffer);
  110. index += 3;
  111. }
  112. void ReadFromFloatBuffer(out uint4 outUInt, in uint offset, inout uint index)
  113. {
  114. outUInt.x = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 0].buffer);
  115. outUInt.y = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 1].buffer);
  116. outUInt.z = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 2].buffer);
  117. outUInt.w = asuint(FloatBufferSrg::m_floatBuffer[offset + index + 3].buffer);
  118. index += 4;
  119. }
  120. // Read double
  121. void ReadFromFloatBuffer(out double outDouble, in uint offset, inout uint index)
  122. {
  123. uint lowBits;
  124. uint highBits;
  125. ReadFromFloatBuffer(highBits, offset, index);
  126. ReadFromFloatBuffer(lowBits, offset, index);
  127. outDouble = asdouble(lowBits, highBits);
  128. }