Added clear texture API. (#3836)

This commit is contained in:
Branimir Karadžić
2026-07-16 05:41:58 +00:00
committed by GitHub
parent 759bdeb936
commit 435627021d
28 changed files with 707 additions and 6 deletions
+80
View File
@@ -1701,6 +1701,11 @@ WGPU_IMPORT
m_textures[_handle.idx].update(_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(_mip, _numMips, _layer, _numLayers);
}
bool s_done;
struct ReadTexture
@@ -4200,6 +4205,81 @@ WGPU_IMPORT
wgpuDestroy(m_textureResolve);
}
void TextureWGPU::clear(uint8_t _mip, uint8_t _numMips, uint16_t _layer, uint16_t _numLayers)
{
const bimg::TextureFormat::Enum format = bimg::TextureFormat::Enum(m_textureFormat);
if (0 != (m_flags & BGFX_TEXTURE_RT_WRITE_ONLY) )
{
return;
}
const bool is3D = TextureWGPU::Texture3D == m_type;
const uint32_t bpp = bimg::getBitsPerPixel(format);
const uint8_t numMips = (UINT8_MAX == _numMips)
? uint8_t(m_numMips - _mip)
: _numMips
;
const uint32_t tileDim = textureZeroInitTileDim(bpp);
const uint32_t bytesPerRow = tileDim*bpp/8;
uint8_t zeros[kTextureZeroInitBudget] = {};
BX_ASSERT(bytesPerRow*tileDim <= sizeof(zeros), "Zero-init tile exceeds budget.");
for (uint8_t mip = _mip, mipEnd = uint8_t(_mip + numMips); mip < mipEnd; ++mip)
{
const uint32_t mipW = bx::max(1u, m_width >> mip);
const uint32_t mipH = bx::max(1u, m_height >> mip);
const uint32_t totalSlices = is3D
? bx::max(1u, m_depth >> mip)
: m_numSides
;
const uint32_t numSlices = (UINT16_MAX == _numLayers)
? (totalSlices - _layer)
: _numLayers
;
for (uint32_t slice = _layer, sliceEnd = _layer + numSlices; slice < sliceEnd; ++slice)
{
for (uint32_t yy = 0; yy < mipH; yy += tileDim)
{
const uint32_t th = bx::min<uint32_t>(tileDim, mipH - yy);
for (uint32_t xx = 0; xx < mipW; xx += tileDim)
{
const uint32_t tw = bx::min<uint32_t>(tileDim, mipW - xx);
s_renderWGPU->m_cmd.writeTexture(
{
.texture = m_texture,
.mipLevel = mip,
.origin =
{
.x = xx,
.y = yy,
.z = slice,
},
.aspect = WGPUTextureAspect_All,
}
, zeros
, bytesPerRow*th
, {
.offset = 0,
.bytesPerRow = bytesPerRow,
.rowsPerImage = th,
}
, {
.width = tw,
.height = th,
.depthOrArrayLayers = 1,
});
}
}
}
}
}
void TextureWGPU::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem)
{
const uint32_t bpp = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat) );