Add GPUContext.ClearUA for buffer and texture with uint format

This commit is contained in:
Wojtek Figat
2021-10-07 14:17:05 +02:00
parent f328fbefa9
commit 949766e3a0
7 changed files with 101 additions and 4 deletions

View File

@@ -170,12 +170,24 @@ void GPUContextDX11::ClearDepth(GPUTextureView* depthBuffer, float depthValue)
void GPUContextDX11::ClearUA(GPUBuffer* buf, const Vector4& value)
{
ASSERT(buf != nullptr && buf->IsUnorderedAccess());
auto uav = ((GPUBufferViewDX11*)buf->View())->UAV();
_context->ClearUnorderedAccessViewFloat(uav, value.Raw);
}
void GPUContextDX11::ClearUA(GPUBuffer* buf, const uint32 value[4])
{
ASSERT(buf != nullptr && buf->IsUnorderedAccess());
auto uav = ((GPUBufferViewDX11*)buf->View())->UAV();
_context->ClearUnorderedAccessViewUint(uav, value);
}
void GPUContextDX11::ClearUA(GPUTexture* texture, const uint32 value[4])
{
ASSERT(texture != nullptr && texture->IsUnorderedAccess());
auto uav = ((GPUTextureViewDX11*)texture->View())->UAV();
_context->ClearUnorderedAccessViewUint(uav, value);
}
void GPUContextDX11::ResetRenderTarget()
{
if (_rtCount != 0 || _rtDepth)

View File

@@ -108,6 +108,8 @@ public:
void Clear(GPUTextureView* rt, const Color& color) override;
void ClearDepth(GPUTextureView* depthBuffer, float depthValue) override;
void ClearUA(GPUBuffer* buf, const Vector4& value) override;
void ClearUA(GPUBuffer* buf, const uint32 value[4]) override;
void ClearUA(GPUTexture* texture, const uint32 value[4]) override;
void ResetRenderTarget() override;
void SetRenderTarget(GPUTextureView* rt) override;
void SetRenderTarget(GPUTextureView* depthBuffer, GPUTextureView* rt) override;

View File

@@ -727,6 +727,34 @@ void GPUContextDX12::ClearUA(GPUBuffer* buf, const Vector4& value)
_commandList->ClearUnorderedAccessViewFloat(desc.GPU, uav, bufDX12->GetResource(), value.Raw, 0, nullptr);
}
void GPUContextDX12::ClearUA(GPUBuffer* buf, const uint32 value[4])
{
ASSERT(buf != nullptr && buf->IsUnorderedAccess());
auto bufDX12 = reinterpret_cast<GPUBufferDX12*>(buf);
SetResourceState(bufDX12, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
flushRBs();
auto uav = ((GPUBufferViewDX12*)bufDX12->View())->UAV();
Descriptor desc;
GetActiveHeapDescriptor(uav, desc);
_commandList->ClearUnorderedAccessViewUint(desc.GPU, uav, bufDX12->GetResource(), value, 0, nullptr);
}
void GPUContextDX12::ClearUA(GPUTexture* texture, const uint32 value[4])
{
ASSERT(texture != nullptr && texture->IsUnorderedAccess());
auto texDX12 = reinterpret_cast<GPUTextureDX12*>(texture);
SetResourceState(texDX12, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
flushRBs();
auto uav = ((GPUTextureViewDX12*)texDX12->View(0))->UAV();
Descriptor desc;
GetActiveHeapDescriptor(uav, desc);
_commandList->ClearUnorderedAccessViewUint(desc.GPU, uav, texDX12->GetResource(), value, 0, nullptr);
}
void GPUContextDX12::ResetRenderTarget()
{
if (_rtDepth || _rtCount != 0)