@@ -23,6 +23,7 @@ SlangResult createD3D12BufferDescriptor(
23
23
BufferResourceImpl* buffer,
24
24
BufferResourceImpl* counterBuffer,
25
25
IResourceView::Desc const & desc,
26
+ uint32_t bufferStride,
26
27
DeviceImpl* device,
27
28
D3D12GeneralExpandingDescriptorHeap* descriptorHeap,
28
29
D3D12Descriptor* outDescriptor)
@@ -32,6 +33,9 @@ SlangResult createD3D12BufferDescriptor(
32
33
auto resourceDesc = *resourceImpl->getDesc ();
33
34
const auto counterResourceImpl = static_cast <BufferResourceImpl*>(counterBuffer);
34
35
36
+ uint64_t offset = desc.bufferRange .offset ;
37
+ uint64_t size = desc.bufferRange .size == 0 ? buffer->getDesc ()->sizeInBytes - offset : desc.bufferRange .size ;
38
+
35
39
switch (desc.type )
36
40
{
37
41
default :
@@ -42,39 +46,29 @@ SlangResult createD3D12BufferDescriptor(
42
46
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
43
47
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
44
48
uavDesc.Format = D3DUtil::getMapFormat (desc.format );
45
- uavDesc.Buffer .FirstElement = desc.bufferRange .firstElement ;
46
- uint64_t viewSize = 0 ;
47
- if (desc.bufferElementSize )
49
+ if (bufferStride)
48
50
{
49
- uavDesc.Buffer .StructureByteStride = (UINT)desc.bufferElementSize ;
50
- uavDesc.Buffer .NumElements =
51
- desc.bufferRange .elementCount == 0
52
- ? UINT (resourceDesc.sizeInBytes / desc.bufferElementSize )
53
- : (UINT)desc.bufferRange .elementCount ;
54
- viewSize = (uint64_t )desc.bufferElementSize * uavDesc.Buffer .NumElements ;
51
+ uavDesc.Buffer .FirstElement = offset / bufferStride;
52
+ uavDesc.Buffer .NumElements = UINT (size / bufferStride);
53
+ uavDesc.Buffer .StructureByteStride = bufferStride;
55
54
}
56
55
else if (desc.format == Format::Unknown)
57
56
{
58
57
uavDesc.Format = DXGI_FORMAT_R32_TYPELESS;
59
- uavDesc.Buffer .NumElements = desc.bufferRange .elementCount == 0
60
- ? UINT (resourceDesc.sizeInBytes / 4 )
61
- : UINT (desc.bufferRange .elementCount / 4 );
58
+ uavDesc.Buffer .FirstElement = offset / 4 ;
59
+ uavDesc.Buffer .NumElements = UINT (size / 4 );
62
60
uavDesc.Buffer .Flags |= D3D12_BUFFER_UAV_FLAG_RAW;
63
- viewSize = 4ull * uavDesc.Buffer .NumElements ;
64
61
}
65
62
else
66
63
{
67
64
FormatInfo sizeInfo;
68
65
gfxGetFormatInfo (desc.format , &sizeInfo);
69
66
assert (sizeInfo.pixelsPerBlock == 1 );
70
- uavDesc.Buffer .NumElements =
71
- desc.bufferRange .elementCount == 0
72
- ? UINT (resourceDesc.sizeInBytes / sizeInfo.blockSizeInBytes )
73
- : (UINT)desc.bufferRange .elementCount ;
74
- viewSize = (uint64_t )uavDesc.Buffer .NumElements * sizeInfo.blockSizeInBytes ;
67
+ uavDesc.Buffer .FirstElement = offset / sizeInfo.blockSizeInBytes ;
68
+ uavDesc.Buffer .NumElements = UINT (size / sizeInfo.blockSizeInBytes );
75
69
}
76
70
77
- if (viewSize >= (1ull << 32 ) - 8 )
71
+ if (size >= (1ull << 32 ) - 8 )
78
72
{
79
73
// D3D12 does not support view descriptors that has size near 4GB.
80
74
// We will not create actual SRV/UAVs for such large buffers.
@@ -99,40 +93,30 @@ SlangResult createD3D12BufferDescriptor(
99
93
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
100
94
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
101
95
srvDesc.Format = D3DUtil::getMapFormat (desc.format );
102
- srvDesc.Buffer .StructureByteStride = 0 ;
103
- srvDesc.Buffer .FirstElement = desc.bufferRange .firstElement ;
104
96
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
105
- uint64_t viewSize = 0 ;
106
- if (desc.bufferElementSize )
97
+ if (bufferStride)
107
98
{
108
- srvDesc.Buffer .StructureByteStride = (UINT)desc.bufferElementSize ;
109
- srvDesc.Buffer .NumElements =
110
- desc.bufferRange .elementCount == 0
111
- ? UINT (resourceDesc.sizeInBytes / desc.bufferElementSize )
112
- : (UINT)desc.bufferRange .elementCount ;
113
- viewSize = (uint64_t )desc.bufferElementSize * srvDesc.Buffer .NumElements ;
99
+ srvDesc.Buffer .FirstElement = offset / bufferStride;
100
+ srvDesc.Buffer .NumElements = UINT (size / bufferStride);
101
+ srvDesc.Buffer .StructureByteStride = bufferStride;
114
102
}
115
103
else if (desc.format == Format::Unknown)
116
104
{
117
105
srvDesc.Format = DXGI_FORMAT_R32_TYPELESS;
118
- srvDesc.Buffer .NumElements = desc.bufferRange .elementCount == 0
119
- ? UINT (resourceDesc.sizeInBytes / 4 )
120
- : UINT (desc.bufferRange .elementCount / 4 );
106
+ srvDesc.Buffer .FirstElement = offset / 4 ;
107
+ srvDesc.Buffer .NumElements = UINT (size / 4 );
121
108
srvDesc.Buffer .Flags |= D3D12_BUFFER_SRV_FLAG_RAW;
122
- viewSize = 4ull * srvDesc.Buffer .NumElements ;
123
109
}
124
110
else
125
111
{
126
112
FormatInfo sizeInfo;
127
113
gfxGetFormatInfo (desc.format , &sizeInfo);
128
114
assert (sizeInfo.pixelsPerBlock == 1 );
129
- srvDesc.Buffer .NumElements =
130
- desc.bufferRange .elementCount == 0
131
- ? UINT (resourceDesc.sizeInBytes / sizeInfo.blockSizeInBytes )
132
- : (UINT)desc.bufferRange .elementCount ;
133
- viewSize = (uint64_t )srvDesc.Buffer .NumElements * sizeInfo.blockSizeInBytes ;
115
+ srvDesc.Buffer .FirstElement = offset / sizeInfo.blockSizeInBytes ;
116
+ srvDesc.Buffer .NumElements = UINT (size / sizeInfo.blockSizeInBytes );
134
117
}
135
- if (viewSize >= (1ull << 32 ) - 8 )
118
+
119
+ if (size >= (1ull << 32 ) - 8 )
136
120
{
137
121
// D3D12 does not support view descriptors that has size near 4GB.
138
122
// We will not create actual SRV/UAVs for such large buffers.
@@ -158,14 +142,7 @@ SlangResult ResourceViewInternalImpl::getBufferDescriptorForBinding(
158
142
uint32_t bufferStride,
159
143
D3D12Descriptor& outDescriptor)
160
144
{
161
- // If stride is 0, just use the default descriptor.
162
- if (bufferStride == 0 )
163
- {
164
- outDescriptor = m_descriptor;
165
- return SLANG_OK;
166
- }
167
-
168
- // Otherwise, look for an existing descriptor from the cache if it exists.
145
+ // Look for an existing descriptor from the cache if it exists.
169
146
if (auto descriptor = m_mapBufferStrideToDescriptor.tryGetValue (bufferStride))
170
147
{
171
148
outDescriptor = *descriptor;
@@ -176,39 +153,11 @@ SlangResult ResourceViewInternalImpl::getBufferDescriptorForBinding(
176
153
// the given buffer stride.
177
154
auto bufferResImpl = static_cast <BufferResourceImpl*>(view->m_resource .get ());
178
155
auto desc = view->m_desc ;
179
- uint64_t bufferSize = 0 ;
180
- if (desc.bufferElementSize == 0 )
181
- {
182
- // If buffer element size is 0, we assume the buffer range from original desc is in bytes.
183
- bufferSize = desc.bufferRange .elementCount ;
184
- if (bufferSize == 0 )
185
- {
186
- bufferSize = bufferResImpl->getDesc ()->sizeInBytes - desc.bufferRange .firstElement ;
187
- }
188
- desc.bufferElementSize = bufferStride;
189
- desc.bufferRange .firstElement /= bufferStride;
190
- desc.bufferRange .elementCount = bufferSize / bufferStride;
191
- }
192
- else
193
- {
194
- // If buffer element size is not 0, we assume the buffer range from original desc is in elements
195
- // of original stride.
196
- if (desc.bufferRange .elementCount == 0 )
197
- {
198
- bufferSize = bufferResImpl->getDesc ()->sizeInBytes - desc.bufferRange .firstElement * desc.bufferElementSize ;
199
- }
200
- else
201
- {
202
- bufferSize = desc.bufferRange .elementCount * desc.bufferElementSize ;
203
- }
204
- desc.bufferElementSize = bufferStride;
205
- desc.bufferRange .firstElement = desc.bufferRange .firstElement * desc.bufferElementSize / bufferStride;
206
- desc.bufferRange .elementCount = bufferSize / bufferStride;
207
- }
208
156
SLANG_RETURN_ON_FAIL (createD3D12BufferDescriptor (
209
157
bufferResImpl,
210
158
static_cast <BufferResourceImpl*>(view->m_counterResource .get ()),
211
159
desc,
160
+ bufferStride,
212
161
device,
213
162
m_allocator,
214
163
&outDescriptor));
0 commit comments