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

@@ -831,18 +831,49 @@ void GPUContextVulkan::ClearDepth(GPUTextureView* depthBuffer, float depthValue)
void GPUContextVulkan::ClearUA(GPUBuffer* buf, const Vector4& value)
{
const auto bufVulkan = static_cast<GPUBufferVulkan*>(buf);
if (bufVulkan)
{
const auto cmdBuffer = _cmdBufferManager->GetCmdBuffer();
if (cmdBuffer->IsInsideRenderPass())
EndRenderPass();
// TODO: add support for other components if buffer has them
uint32_t* data = (uint32_t*)&value;
vkCmdFillBuffer(cmdBuffer->GetHandle(), bufVulkan->GetHandle(), 0, bufVulkan->GetSize(), *data);
}
}
void GPUContextVulkan::ClearUA(GPUBuffer* buf, const uint32 value[4])
{
const auto bufVulkan = static_cast<GPUBufferVulkan*>(buf);
if (bufVulkan)
{
const auto cmdBuffer = _cmdBufferManager->GetCmdBuffer();
if (cmdBuffer->IsInsideRenderPass())
EndRenderPass();
// TODO: add support for other components if buffer has them
vkCmdFillBuffer(cmdBuffer->GetHandle(), bufVulkan->GetHandle(), 0, bufVulkan->GetSize(), value[0]);
}
}
void GPUContextVulkan::ClearUA(GPUTexture* texture, const uint32 value[4])
{
const auto texVulkan = static_cast<GPUTextureVulkan*>(texture);
if (texVulkan)
{
auto rtVulkan = static_cast<GPUTextureViewVulkan*>(texVulkan->View(0));
const auto cmdBuffer = _cmdBufferManager->GetCmdBuffer();
if (cmdBuffer->IsInsideRenderPass())
EndRenderPass();
AddImageBarrier(rtVulkan, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
FlushBarriers();
vkCmdClearColorImage(cmdBuffer->GetHandle(), rtVulkan->Image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (const VkClearColorValue*)value, 1, &rtVulkan->Info.subresourceRange);
}
}
void GPUContextVulkan::ResetRenderTarget()
{
if (_rtDepth || _rtCount != 0)