11#ifndef _WORKGROUP_DATA_ACCESSORS_HLSL_
22#define _WORKGROUP_DATA_ACCESSORS_HLSL_
33
4+ #include "nbl/builtin/hlsl/bda/legacy_bda_accessor.hlsl"
5+
46namespace nbl
57{
68namespace hlsl
@@ -35,25 +37,25 @@ template<uint16_t VirtualWorkgroupSize, uint16_t ItemsPerInvocation>
3537struct DataProxy
3638{
3739 using dtype_t = vector <uint32_t, ItemsPerInvocation>;
40+ // function template AccessType should be the same as dtype_t
3841
3942 static DataProxy<VirtualWorkgroupSize, ItemsPerInvocation> create (const uint64_t inputBuf, const uint64_t outputBuf)
4043 {
4144 DataProxy<VirtualWorkgroupSize, ItemsPerInvocation> retval;
42- retval.workgroupOffset = glsl::gl_WorkGroupID ().x * VirtualWorkgroupSize;
43- retval.inputBufAddr = inputBuf;
44- retval.outputBufAddr = outputBuf;
45+ const uint32_t workgroupOffset = glsl::gl_WorkGroupID ().x * VirtualWorkgroupSize * sizeof (dtype_t);
46+ retval.accessor = DoubleLegacyBdaAccessor<dtype_t>::create (inputBuf + workgroupOffset, outputBuf + workgroupOffset);
4547 return retval;
4648 }
4749
4850 template<typename AccessType, typename IndexType>
4951 void get (const IndexType ix, NBL_REF_ARG (AccessType) value)
5052 {
51- value = vk::RawBufferLoad<AccessType>(inputBufAddr + (workgroupOffset + ix) * sizeof (AccessType) );
53+ accessor. get (ix, value );
5254 }
5355 template<typename AccessType, typename IndexType>
5456 void set (const IndexType ix, const AccessType value)
5557 {
56- vk::RawBufferStore<AccessType>(outputBufAddr + (workgroupOffset + ix) * sizeof (AccessType) , value, sizeof (uint32_t) );
58+ accessor. set (ix , value);
5759 }
5860
5961 void workgroupExecutionAndMemoryBarrier ()
@@ -62,9 +64,7 @@ struct DataProxy
6264 //glsl::memoryBarrierShared(); implied by the above
6365 }
6466
65- uint32_t workgroupOffset;
66- uint64_t inputBufAddr;
67- uint64_t outputBufAddr;
67+ DoubleLegacyBdaAccessor<dtype_t> accessor;
6868};
6969
7070template<uint16_t WorkgroupSizeLog2, uint16_t VirtualWorkgroupSize, uint16_t ItemsPerInvocation>
0 commit comments