Added clear texture API. (#3836)

This commit is contained in:
Branimir Karadžić
2026-07-15 22:41:58 -07:00
committed by GitHub
parent 759bdeb936
commit 435627021d
28 changed files with 707 additions and 6 deletions

View File

@@ -1220,6 +1220,8 @@ VK_IMPORT_DEVICE
);
}
struct TextureVK;
struct RendererContextVK : public RendererContextI
{
RendererContextVK()
@@ -2613,6 +2615,11 @@ VK_IMPORT_DEVICE
m_textures[_handle.idx].update(m_commandBuffer, _side, _mip, _rect, _z, _depth, _pitch, _mem);
}
void clearTexture(TextureHandle _handle, uint8_t _mip, uint8_t _numMips, uint16_t _layer, uint16_t _numLayers) override
{
m_textures[_handle.idx].clear(m_commandBuffer, _mip, _numMips, _layer, _numLayers);
}
void readTexture(TextureHandle _handle, void* _data, uint16_t _layer, uint8_t _mip) override
{
TextureVK& texture = m_textures[_handle.idx];
@@ -7389,6 +7396,44 @@ VK_DESTROY
}
}
void TextureVK::clear(VkCommandBuffer _commandBuffer, uint8_t _mip, uint8_t _numMips, uint16_t _layer, uint16_t _numLayers)
{
const VkImageLayout saved = m_currentImageLayout;
setState(_commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
const VkClearColorValue clearColor = { { 0.0f, 0.0f, 0.0f, 0.0f } };
VkImageSubresourceRange range =
{
.aspectMask = m_aspectFlags,
.baseMipLevel = _mip,
.levelCount = (UINT8_MAX == _numMips)
? VK_REMAINING_MIP_LEVELS
: _numMips
,
.baseArrayLayer = _layer,
.layerCount = (UINT16_MAX == _numLayers)
? VK_REMAINING_ARRAY_LAYERS
: _numLayers
,
};
vkCmdClearColorImage(
_commandBuffer
, m_textureImage
, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
, &clearColor
, 1
, &range
);
if (VK_IMAGE_LAYOUT_UNDEFINED != saved
&& VK_IMAGE_LAYOUT_PREINITIALIZED != saved)
{
setState(_commandBuffer, saved);
}
}
VkResult TextureVK::createView(uint32_t _layer, uint32_t _numLayers, uint32_t _mip, uint32_t _numMips, VkImageViewType _type, VkImageAspectFlags _aspectMask, bool _renderTarget, ::VkImageView* _view) const
{
VkResult result = VK_SUCCESS;