diff options
| author | skallweitNV <64953474+skallweitNV@users.noreply.github.com> | 2024-05-14 00:39:49 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-13 15:39:49 -0700 |
| commit | 9f23046138629f78995d54a7722ad6749bd84db9 (patch) | |
| tree | 25ac343566f896cae547046ac7e960441874ec00 | |
| parent | 04d3dd51125182767d90c318895a6232ec4ee750 (diff) | |
[gfx] specify resource view buffer range in bytes (#4149)
* refactor gfx buffer range to use byte range
* create buffer view with zero struct stride for ClearUnorderedAccessViewUint/Float
* create buffer descriptors on demand
* avoid copying gfx.dll
---------
Co-authored-by: Yong He <yonghe@outlook.com>
| -rw-r--r-- | .github/workflows/falcor-test.yml | 2 | ||||
| -rw-r--r-- | examples/autodiff-texture/main.cpp | 1 | ||||
| -rw-r--r-- | examples/ray-tracing-pipeline/main.cpp | 2 | ||||
| -rw-r--r-- | examples/ray-tracing/main.cpp | 2 | ||||
| -rw-r--r-- | slang-gfx.h | 7 | ||||
| -rw-r--r-- | tools/gfx-unit-test/buffer-barrier-test.cpp | 1 | ||||
| -rw-r--r-- | tools/gfx-unit-test/nested-parameter-block.cpp | 10 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-command-encoder.cpp | 9 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-device.cpp | 12 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-resource-views.cpp | 101 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-resource-views.h | 1 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-shader-object.cpp | 16 | ||||
| -rw-r--r-- | tools/gfx/gfx.slang | 7 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-command-encoder.cpp | 22 | ||||
| -rw-r--r-- | tools/gfx/vulkan/vk-device.cpp | 22 | ||||
| -rw-r--r-- | tools/render-test/render-test-main.cpp | 1 |
16 files changed, 64 insertions, 152 deletions
diff --git a/.github/workflows/falcor-test.yml b/.github/workflows/falcor-test.yml index 1e094f163..dd1c6fe57 100644 --- a/.github/workflows/falcor-test.yml +++ b/.github/workflows/falcor-test.yml @@ -51,7 +51,7 @@ jobs: MSBuild.exe slang.sln -v:m -m -property:Configuration=${{matrix.configuration}} -property:Platform=${{matrix.platform}} -property:WindowsTargetPlatformVersion=10.0.19041.0 -maxcpucount:12 - Copy-Item -Path '.\bin\windows-${{matrix.platform}}\${{matrix.configuration}}\*' -Destination '.\FalcorBin\build\windows-vs2022\bin\Release\' -Recurse -Exclude ("*.pdb") + Copy-Item -Path '.\bin\windows-${{matrix.platform}}\${{matrix.configuration}}\*' -Destination '.\FalcorBin\build\windows-vs2022\bin\Release\' -Recurse -Exclude ("*.pdb", "gfx.dll") - name: falcor-unit-test run: | $ErrorActionPreference = "SilentlyContinue" diff --git a/examples/autodiff-texture/main.cpp b/examples/autodiff-texture/main.cpp index 7d1f809ee..0578f9d47 100644 --- a/examples/autodiff-texture/main.cpp +++ b/examples/autodiff-texture/main.cpp @@ -246,7 +246,6 @@ struct AutoDiffTexture : public WindowedAppBase { IResourceView::Desc desc = {}; desc.type = IResourceView::Type::UnorderedAccess; - desc.bufferElementSize = 0; return gDevice->createBufferView(buffer, nullptr, desc); } ComPtr<gfx::IResourceView> createUAV(ITextureResource* texture, int level) diff --git a/examples/ray-tracing-pipeline/main.cpp b/examples/ray-tracing-pipeline/main.cpp index 9e00ccf67..cc5549a2e 100644 --- a/examples/ray-tracing-pipeline/main.cpp +++ b/examples/ray-tracing-pipeline/main.cpp @@ -318,6 +318,7 @@ Slang::Result initialize() IBufferResource::Desc primitiveBufferDesc; primitiveBufferDesc.type = IResource::Type::Buffer; primitiveBufferDesc.sizeInBytes = kPrimitiveCount * sizeof(Primitive); + primitiveBufferDesc.elementSize = sizeof(Primitive); primitiveBufferDesc.defaultState = ResourceState::ShaderResource; gPrimitiveBuffer = gDevice->createBufferResource(primitiveBufferDesc, &kPrimitiveData[0]); if (!gPrimitiveBuffer) @@ -326,7 +327,6 @@ Slang::Result initialize() IResourceView::Desc primitiveSRVDesc = {}; primitiveSRVDesc.format = Format::Unknown; primitiveSRVDesc.type = IResourceView::Type::ShaderResource; - primitiveSRVDesc.bufferElementSize = sizeof(Primitive); gPrimitiveBufferSRV = gDevice->createBufferView(gPrimitiveBuffer, nullptr, primitiveSRVDesc); IBufferResource::Desc transformBufferDesc; diff --git a/examples/ray-tracing/main.cpp b/examples/ray-tracing/main.cpp index a12da707d..5fee3d1ae 100644 --- a/examples/ray-tracing/main.cpp +++ b/examples/ray-tracing/main.cpp @@ -309,6 +309,7 @@ Slang::Result initialize() IBufferResource::Desc primitiveBufferDesc; primitiveBufferDesc.type = IResource::Type::Buffer; primitiveBufferDesc.sizeInBytes = kPrimitiveCount * sizeof(Primitive); + primitiveBufferDesc.elementSize = sizeof(Primitive); primitiveBufferDesc.defaultState = ResourceState::ShaderResource; gPrimitiveBuffer = gDevice->createBufferResource(primitiveBufferDesc, &kPrimitiveData[0]); if (!gPrimitiveBuffer) @@ -317,7 +318,6 @@ Slang::Result initialize() IResourceView::Desc primitiveSRVDesc = {}; primitiveSRVDesc.format = Format::Unknown; primitiveSRVDesc.type = IResourceView::Type::ShaderResource; - primitiveSRVDesc.bufferElementSize = sizeof(Primitive); gPrimitiveBufferSRV = gDevice->createBufferView(gPrimitiveBuffer, nullptr, primitiveSRVDesc); IBufferResource::Desc transformBufferDesc; diff --git a/slang-gfx.h b/slang-gfx.h index 9a9b2db27..cd2c1ed6e 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -655,9 +655,8 @@ struct ClearValue struct BufferRange { - // TODO: Change to Index and Count? - uint64_t firstElement; - uint64_t elementCount; + Offset offset; ///< Offset in bytes. + Size size; ///< Size in bytes. }; enum class TextureAspect : uint32_t @@ -872,8 +871,6 @@ public: SubresourceRange subresourceRange; // Specifies the range of a buffer resource for a ShaderResource/UnorderedAccess view. BufferRange bufferRange; - // Specifies the element size in bytes of a structured buffer. Pass 0 for a raw buffer view. - Size bufferElementSize; }; virtual SLANG_NO_THROW Desc* SLANG_MCALL getViewDesc() = 0; diff --git a/tools/gfx-unit-test/buffer-barrier-test.cpp b/tools/gfx-unit-test/buffer-barrier-test.cpp index b2692f6fd..007a0d180 100644 --- a/tools/gfx-unit-test/buffer-barrier-test.cpp +++ b/tools/gfx-unit-test/buffer-barrier-test.cpp @@ -47,7 +47,6 @@ namespace gfx_test IResourceView::Desc viewDesc = {}; viewDesc.type = unorderedAccess ? IResourceView::Type::UnorderedAccess : IResourceView::Type::ShaderResource; viewDesc.format = Format::Unknown; - viewDesc.bufferElementSize = sizeof(float); GFX_CHECK_CALL_ABORT(device->createBufferView( outBuffer.buffer, nullptr, viewDesc, outBuffer.view.writeRef())); } diff --git a/tools/gfx-unit-test/nested-parameter-block.cpp b/tools/gfx-unit-test/nested-parameter-block.cpp index 758fc42f5..98df615af 100644 --- a/tools/gfx-unit-test/nested-parameter-block.cpp +++ b/tools/gfx-unit-test/nested-parameter-block.cpp @@ -67,9 +67,8 @@ namespace gfx_test IResourceView::Desc srvDesc = {}; srvDesc.type = IResourceView::Type::ShaderResource; srvDesc.format = Format::Unknown; - srvDesc.bufferElementSize = sizeof(uint32_t) * 4; - srvDesc.bufferRange.elementCount = 1; - srvDesc.bufferRange.firstElement = 0; + srvDesc.bufferRange.offset = 0; + srvDesc.bufferRange.size = sizeof(uint32_t) * 4; srvs.add(device->createBufferView(srvBuffers[i], nullptr, srvDesc)); } Slang::ComPtr<IBufferResource> resultBuffer = @@ -77,9 +76,8 @@ namespace gfx_test IResourceView::Desc resultBufferViewDesc = {}; resultBufferViewDesc.type = IResourceView::Type::UnorderedAccess; resultBufferViewDesc.format = Format::Unknown; - resultBufferViewDesc.bufferElementSize = sizeof(uint32_t) * 4; - resultBufferViewDesc.bufferRange.elementCount = 1; - resultBufferViewDesc.bufferRange.firstElement = 0; + resultBufferViewDesc.bufferRange.offset = 0; + resultBufferViewDesc.bufferRange.size = sizeof(uint32_t) * 4; Slang::ComPtr<IResourceView> resultBufferView; SLANG_CHECK(SLANG_SUCCEEDED(device->createBufferView( resultBuffer, nullptr, resultBufferViewDesc, resultBufferView.writeRef()))); diff --git a/tools/gfx/d3d12/d3d12-command-encoder.cpp b/tools/gfx/d3d12/d3d12-command-encoder.cpp index b88bf3168..ff50dcc5f 100644 --- a/tools/gfx/d3d12/d3d12-command-encoder.cpp +++ b/tools/gfx/d3d12/d3d12-command-encoder.cpp @@ -384,11 +384,14 @@ void ResourceCommandEncoderImpl::clearResourceView( case IResourceView::Type::UnorderedAccess: { ID3D12Resource* d3dResource = nullptr; + D3D12Descriptor descriptor = viewImpl->m_descriptor; switch (viewImpl->m_resource->getType()) { case IResource::Type::Buffer: d3dResource = static_cast<BufferResourceImpl*>(viewImpl->m_resource.Ptr()) ->m_resource.getResource(); + // D3D12 requires a UAV descriptor with zero buffer stride for calling ClearUnorderedAccessViewUint/Float. + viewImpl->getBufferDescriptorForBinding(m_commandBuffer->m_renderer, viewImpl, 0, descriptor); break; default: d3dResource = static_cast<TextureResourceImpl*>(viewImpl->m_resource.Ptr()) @@ -407,7 +410,7 @@ void ResourceCommandEncoderImpl::clearResourceView( this->m_commandBuffer->m_renderer->m_device->CopyDescriptorsSimple( 1, m_commandBuffer->m_transientHeap->getCurrentViewHeap().getCpuHandle(gpuHandleIndex), - viewImpl->m_descriptor.cpuHandle, + descriptor.cpuHandle, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); if (flags & ClearResourceViewFlags::FloatClearValues) @@ -415,7 +418,7 @@ void ResourceCommandEncoderImpl::clearResourceView( m_commandBuffer->m_cmdList->ClearUnorderedAccessViewFloat( m_commandBuffer->m_transientHeap->getCurrentViewHeap().getGpuHandle( gpuHandleIndex), - viewImpl->m_descriptor.cpuHandle, + descriptor.cpuHandle, d3dResource, clearValue->color.floatValues, 0, @@ -426,7 +429,7 @@ void ResourceCommandEncoderImpl::clearResourceView( m_commandBuffer->m_cmdList->ClearUnorderedAccessViewUint( m_commandBuffer->m_transientHeap->getCurrentViewHeap().getGpuHandle( gpuHandleIndex), - viewImpl->m_descriptor.cpuHandle, + descriptor.cpuHandle, d3dResource, clearValue->color.uintValues, 0, diff --git a/tools/gfx/d3d12/d3d12-device.cpp b/tools/gfx/d3d12/d3d12-device.cpp index 03f9997f4..6be37b079 100644 --- a/tools/gfx/d3d12/d3d12-device.cpp +++ b/tools/gfx/d3d12/d3d12-device.cpp @@ -1674,15 +1674,9 @@ Result DeviceImpl::createBufferView( viewImpl->m_counterResource = counterResourceImpl; viewImpl->m_desc = desc; - SLANG_RETURN_ON_FAIL(createD3D12BufferDescriptor( - resourceImpl, - counterResourceImpl, - desc, - this, - m_cpuViewHeap.get(), - &viewImpl->m_descriptor)); - if (viewImpl->m_descriptor.cpuHandle.ptr != 0) - viewImpl->m_allocator = m_cpuViewHeap.get(); + // Buffer view descriptors are created on demand. + viewImpl->m_descriptor = {0}; + viewImpl->m_allocator = m_cpuViewHeap.get(); returnComPtr(outView, viewImpl); return SLANG_OK; diff --git a/tools/gfx/d3d12/d3d12-resource-views.cpp b/tools/gfx/d3d12/d3d12-resource-views.cpp index b0b441f87..b156f6ab6 100644 --- a/tools/gfx/d3d12/d3d12-resource-views.cpp +++ b/tools/gfx/d3d12/d3d12-resource-views.cpp @@ -23,6 +23,7 @@ SlangResult createD3D12BufferDescriptor( BufferResourceImpl* buffer, BufferResourceImpl* counterBuffer, IResourceView::Desc const& desc, + uint32_t bufferStride, DeviceImpl* device, D3D12GeneralExpandingDescriptorHeap* descriptorHeap, D3D12Descriptor* outDescriptor) @@ -32,6 +33,9 @@ SlangResult createD3D12BufferDescriptor( auto resourceDesc = *resourceImpl->getDesc(); const auto counterResourceImpl = static_cast<BufferResourceImpl*>(counterBuffer); + uint64_t offset = desc.bufferRange.offset; + uint64_t size = desc.bufferRange.size == 0 ? buffer->getDesc()->sizeInBytes - offset : desc.bufferRange.size; + switch (desc.type) { default: @@ -42,39 +46,29 @@ SlangResult createD3D12BufferDescriptor( D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; uavDesc.Format = D3DUtil::getMapFormat(desc.format); - uavDesc.Buffer.FirstElement = desc.bufferRange.firstElement; - uint64_t viewSize = 0; - if (desc.bufferElementSize) + if (bufferStride) { - uavDesc.Buffer.StructureByteStride = (UINT)desc.bufferElementSize; - uavDesc.Buffer.NumElements = - desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / desc.bufferElementSize) - : (UINT)desc.bufferRange.elementCount; - viewSize = (uint64_t)desc.bufferElementSize * uavDesc.Buffer.NumElements; + uavDesc.Buffer.FirstElement = offset / bufferStride; + uavDesc.Buffer.NumElements = UINT(size / bufferStride); + uavDesc.Buffer.StructureByteStride = bufferStride; } else if (desc.format == Format::Unknown) { uavDesc.Format = DXGI_FORMAT_R32_TYPELESS; - uavDesc.Buffer.NumElements = desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / 4) - : UINT(desc.bufferRange.elementCount / 4); + uavDesc.Buffer.FirstElement = offset / 4; + uavDesc.Buffer.NumElements = UINT(size / 4); uavDesc.Buffer.Flags |= D3D12_BUFFER_UAV_FLAG_RAW; - viewSize = 4ull * uavDesc.Buffer.NumElements; } else { FormatInfo sizeInfo; gfxGetFormatInfo(desc.format, &sizeInfo); assert(sizeInfo.pixelsPerBlock == 1); - uavDesc.Buffer.NumElements = - desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / sizeInfo.blockSizeInBytes) - : (UINT)desc.bufferRange.elementCount; - viewSize = (uint64_t)uavDesc.Buffer.NumElements * sizeInfo.blockSizeInBytes; + uavDesc.Buffer.FirstElement = offset / sizeInfo.blockSizeInBytes; + uavDesc.Buffer.NumElements = UINT(size / sizeInfo.blockSizeInBytes); } - if (viewSize >= (1ull << 32) - 8) + if (size >= (1ull << 32) - 8) { // D3D12 does not support view descriptors that has size near 4GB. // We will not create actual SRV/UAVs for such large buffers. @@ -99,40 +93,30 @@ SlangResult createD3D12BufferDescriptor( D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; srvDesc.Format = D3DUtil::getMapFormat(desc.format); - srvDesc.Buffer.StructureByteStride = 0; - srvDesc.Buffer.FirstElement = desc.bufferRange.firstElement; srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - uint64_t viewSize = 0; - if (desc.bufferElementSize) + if (bufferStride) { - srvDesc.Buffer.StructureByteStride = (UINT)desc.bufferElementSize; - srvDesc.Buffer.NumElements = - desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / desc.bufferElementSize) - : (UINT)desc.bufferRange.elementCount; - viewSize = (uint64_t)desc.bufferElementSize * srvDesc.Buffer.NumElements; + srvDesc.Buffer.FirstElement = offset / bufferStride; + srvDesc.Buffer.NumElements = UINT(size / bufferStride); + srvDesc.Buffer.StructureByteStride = bufferStride; } else if (desc.format == Format::Unknown) { srvDesc.Format = DXGI_FORMAT_R32_TYPELESS; - srvDesc.Buffer.NumElements = desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / 4) - : UINT(desc.bufferRange.elementCount / 4); + srvDesc.Buffer.FirstElement = offset / 4; + srvDesc.Buffer.NumElements = UINT(size / 4); srvDesc.Buffer.Flags |= D3D12_BUFFER_SRV_FLAG_RAW; - viewSize = 4ull * srvDesc.Buffer.NumElements; } else { FormatInfo sizeInfo; gfxGetFormatInfo(desc.format, &sizeInfo); assert(sizeInfo.pixelsPerBlock == 1); - srvDesc.Buffer.NumElements = - desc.bufferRange.elementCount == 0 - ? UINT(resourceDesc.sizeInBytes / sizeInfo.blockSizeInBytes) - : (UINT)desc.bufferRange.elementCount; - viewSize = (uint64_t)srvDesc.Buffer.NumElements * sizeInfo.blockSizeInBytes; + srvDesc.Buffer.FirstElement = offset / sizeInfo.blockSizeInBytes; + srvDesc.Buffer.NumElements = UINT(size / sizeInfo.blockSizeInBytes); } - if (viewSize >= (1ull << 32) - 8) + + if (size >= (1ull << 32) - 8) { // D3D12 does not support view descriptors that has size near 4GB. // We will not create actual SRV/UAVs for such large buffers. @@ -158,14 +142,7 @@ SlangResult ResourceViewInternalImpl::getBufferDescriptorForBinding( uint32_t bufferStride, D3D12Descriptor& outDescriptor) { - // If stride is 0, just use the default descriptor. - if (bufferStride == 0) - { - outDescriptor = m_descriptor; - return SLANG_OK; - } - - // Otherwise, look for an existing descriptor from the cache if it exists. + // Look for an existing descriptor from the cache if it exists. if (auto descriptor = m_mapBufferStrideToDescriptor.tryGetValue(bufferStride)) { outDescriptor = *descriptor; @@ -176,39 +153,11 @@ SlangResult ResourceViewInternalImpl::getBufferDescriptorForBinding( // the given buffer stride. auto bufferResImpl = static_cast<BufferResourceImpl*>(view->m_resource.get()); auto desc = view->m_desc; - uint64_t bufferSize = 0; - if (desc.bufferElementSize == 0) - { - // If buffer element size is 0, we assume the buffer range from original desc is in bytes. - bufferSize = desc.bufferRange.elementCount; - if (bufferSize == 0) - { - bufferSize = bufferResImpl->getDesc()->sizeInBytes - desc.bufferRange.firstElement; - } - desc.bufferElementSize = bufferStride; - desc.bufferRange.firstElement /= bufferStride; - desc.bufferRange.elementCount = bufferSize / bufferStride; - } - else - { - // If buffer element size is not 0, we assume the buffer range from original desc is in elements - // of original stride. - if (desc.bufferRange.elementCount == 0) - { - bufferSize = bufferResImpl->getDesc()->sizeInBytes - desc.bufferRange.firstElement * desc.bufferElementSize; - } - else - { - bufferSize = desc.bufferRange.elementCount * desc.bufferElementSize; - } - desc.bufferElementSize = bufferStride; - desc.bufferRange.firstElement = desc.bufferRange.firstElement * desc.bufferElementSize / bufferStride; - desc.bufferRange.elementCount = bufferSize / bufferStride; - } SLANG_RETURN_ON_FAIL(createD3D12BufferDescriptor( bufferResImpl, static_cast<BufferResourceImpl*>(view->m_counterResource.get()), desc, + bufferStride, device, m_allocator, &outDescriptor)); diff --git a/tools/gfx/d3d12/d3d12-resource-views.h b/tools/gfx/d3d12/d3d12-resource-views.h index f8c6654f2..ac80a9368 100644 --- a/tools/gfx/d3d12/d3d12-resource-views.h +++ b/tools/gfx/d3d12/d3d12-resource-views.h @@ -39,6 +39,7 @@ SlangResult createD3D12BufferDescriptor( BufferResourceImpl* buffer, BufferResourceImpl* counterBuffer, IResourceView::Desc const& desc, + uint32_t bufferStride, DeviceImpl* device, D3D12GeneralExpandingDescriptorHeap* descriptorHeap, D3D12Descriptor* outDescriptor); diff --git a/tools/gfx/d3d12/d3d12-shader-object.cpp b/tools/gfx/d3d12/d3d12-shader-object.cpp index 3d38df5ab..beb88b636 100644 --- a/tools/gfx/d3d12/d3d12-shader-object.cpp +++ b/tools/gfx/d3d12/d3d12-shader-object.cpp @@ -965,13 +965,17 @@ Result ShaderObjectImpl::setResource(ShaderOffset const& offset, IResourceView* } auto descriptorSlotIndex = bindingRange.baseIndex + (int32_t)offset.bindingArrayIndex; - D3D12Descriptor srcDescriptor = {}; + D3D12Descriptor srcDescriptor = internalResourceView->m_descriptor; - SLANG_RETURN_ON_FAIL(internalResourceView->getBufferDescriptorForBinding( - static_cast<DeviceImpl*>(m_device.get()), - resourceViewImpl, - bindingRange.bufferElementStride, - srcDescriptor)); + // Buffer descriptors are created on demand. + if (!srcDescriptor.cpuHandle.ptr) + { + SLANG_RETURN_ON_FAIL(internalResourceView->getBufferDescriptorForBinding( + static_cast<DeviceImpl*>(m_device.get()), + resourceViewImpl, + bindingRange.bufferElementStride, + srcDescriptor)); + } if (srcDescriptor.cpuHandle.ptr) { diff --git a/tools/gfx/gfx.slang b/tools/gfx/gfx.slang index 7bdf4cff7..a6e603469 100644 --- a/tools/gfx/gfx.slang +++ b/tools/gfx/gfx.slang @@ -446,9 +446,8 @@ public struct ClearValue public struct BufferRange { - // TODO: Change to Index and Count? - public uint64_t firstElement; - public uint64_t elementCount; + public Offset offset; ///< Offset in bytes. + public Size size; ///< Size in bytes. }; public enum class TextureAspect : uint32_t @@ -651,8 +650,6 @@ public struct ResourceViewDesc public SubresourceRange subresourceRange; // Specifies the range of a buffer resource for a ShaderResource/UnorderedAccess view. public BufferRange bufferRange; - // Specifies the element size in bytes of a structured buffer. Pass 0 for a raw buffer view. - public Size bufferElementSize; }; [COM("7b6c4926-0884-408c-ad8a-50-3a-8e-23-98-a4")] diff --git a/tools/gfx/vulkan/vk-command-encoder.cpp b/tools/gfx/vulkan/vk-command-encoder.cpp index d0fc0a4fd..568b49179 100644 --- a/tools/gfx/vulkan/vk-command-encoder.cpp +++ b/tools/gfx/vulkan/vk-command-encoder.cpp @@ -665,19 +665,10 @@ void ResourceCommandEncoder::_clearBuffer( VkBuffer buffer, uint64_t bufferSize, const IResourceView::Desc& desc, uint32_t clearValue) { auto& api = m_commandBuffer->m_renderer->m_api; - - FormatInfo info = {}; - gfxGetFormatInfo(desc.format, &info); - auto texelSize = info.blockSizeInBytes; - auto elementCount = desc.bufferRange.elementCount; - auto clearStart = (uint64_t)desc.bufferRange.firstElement * texelSize; - auto clearSize = bufferSize - clearStart; - if (elementCount != 0) - { - clearSize = (uint64_t)elementCount * texelSize; - } + auto clearOffset = desc.bufferRange.offset; + auto clearSize = desc.bufferRange.size == 0 ? bufferSize - clearOffset : desc.bufferRange.size; api.vkCmdFillBuffer( - m_commandBuffer->m_commandBuffer, buffer, clearStart, clearSize, clearValue); + m_commandBuffer->m_commandBuffer, buffer, clearOffset, clearSize, clearValue); } void ResourceCommandEncoder::clearResourceView( @@ -724,13 +715,10 @@ void ResourceCommandEncoder::clearResourceView( clearValue->color.uintValues[2] == clearValue->color.uintValues[0] && clearValue->color.uintValues[3] == clearValue->color.uintValues[0]); auto viewImpl = static_cast<PlainBufferResourceViewImpl*>(viewImplBase); - uint64_t clearStart = viewImpl->m_desc.bufferRange.firstElement; - uint64_t clearSize = viewImpl->m_desc.bufferRange.elementCount; - + uint64_t clearStart = viewImpl->m_desc.bufferRange.offset; + uint64_t clearSize = viewImpl->m_desc.bufferRange.size; if (clearSize == 0) clearSize = viewImpl->m_buffer->getDesc()->sizeInBytes - clearStart; - if (viewImpl->m_desc.bufferElementSize != 0) - clearSize *= viewImpl->m_desc.bufferElementSize; api.vkCmdFillBuffer( m_commandBuffer->m_commandBuffer, viewImpl->m_buffer->m_buffer.m_buffer, diff --git a/tools/gfx/vulkan/vk-device.cpp b/tools/gfx/vulkan/vk-device.cpp index b3124231d..03165f606 100644 --- a/tools/gfx/vulkan/vk-device.cpp +++ b/tools/gfx/vulkan/vk-device.cpp @@ -2189,26 +2189,10 @@ Result DeviceImpl::createBufferView( { auto resourceImpl = (BufferResourceImpl*)buffer; - // TODO: These should come from the `ResourceView::Desc` - auto stride = desc.bufferElementSize; - if (stride == 0) - { - if (desc.format == Format::Unknown) - { - stride = 1; - } - else - { - FormatInfo info; - gfxGetFormatInfo(desc.format, &info); - stride = info.blockSizeInBytes; - assert(info.pixelsPerBlock == 1); - } - } - VkDeviceSize offset = (VkDeviceSize)desc.bufferRange.firstElement * stride; - VkDeviceSize size = desc.bufferRange.elementCount == 0 + VkDeviceSize offset = (VkDeviceSize)desc.bufferRange.offset; + VkDeviceSize size = desc.bufferRange.size == 0 ? (buffer ? resourceImpl->getDesc()->sizeInBytes : 0) - : (VkDeviceSize)desc.bufferRange.elementCount * stride; + : (VkDeviceSize)desc.bufferRange.size; // There are two different cases we need to think about for buffers. // diff --git a/tools/render-test/render-test-main.cpp b/tools/render-test/render-test-main.cpp index 50d99c155..a16ebc2b8 100644 --- a/tools/render-test/render-test-main.cpp +++ b/tools/render-test/render-test-main.cpp @@ -257,7 +257,6 @@ struct AssignValsFromLayoutContext IResourceView::Desc viewDesc = {}; viewDesc.type = IResourceView::Type::UnorderedAccess; viewDesc.format = srcBuffer.format; - viewDesc.bufferElementSize = srcVal->bufferDesc.stride; auto bufferView = device->createBufferView(bufferResource, counterResource, viewDesc); dstCursor.setResource(bufferView); maybeAddOutput(dstCursor, srcVal, bufferResource); |
