rework backend texture upload APIs

The main goal is to allow more flexibility, allow cubemap arrays in
the future and better match vk and metal apis.

Main changes:
- remove updateCubeImage
- remove update2DImage
- update3DImage is now the only texture upload backend API

cubemaps are now treated just like a 2D array of 6 layers.

For this reason, Texture::setImage(..., FaceOFfsets) is deprecated.
Additionally, the 2D versions of Texture::setImage() become inline
helpers.

A side effect of this change is that it is now possible to update only
a single face of a cubemap, but also a region of a face (or faces).
This commit is contained in:
Mathias Agopian
2022-07-15 10:39:23 -07:00
committed by Mathias Agopian
parent 815d202f6d
commit 61fb5a588e
29 changed files with 233 additions and 587 deletions

View File

@@ -76,25 +76,30 @@ Texture* createTexture(Engine* engine, const Ktx1Bundle& ktx, bool srgb,
if (isCompressed(ktxinfo)) {
if (ktx.isCubemap()) {
for (uint32_t level = 0; level < nmips; ++level) {
ktx.getBlob({level, 0, 0}, &data, &size);
PixelBufferDescriptor pbd(data, size * 6, cdatatype, size, cb, cbuser);
texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size));
ktx.getBlob({ level, 0, 0 }, &data, &size);
const uint32_t dim = texture->getWidth(level);
texture->setImage(*engine, level, 0, 0, dim, dim, {
data, size * 6, cdatatype, size, cb, cbuser
});
}
return texture;
}
for (uint32_t level = 0; level < nmips; ++level) {
ktx.getBlob({level, 0, 0}, &data, &size);
PixelBufferDescriptor pbd(data, size, cdatatype, size, cb, cbuser);
texture->setImage(*engine, level, std::move(pbd));
ktx.getBlob({ level, 0, 0 }, &data, &size);
texture->setImage(*engine, level, {
data, size, cdatatype, size, cb, cbuser
});
}
return texture;
}
if (ktx.isCubemap()) {
for (uint32_t level = 0; level < nmips; ++level) {
ktx.getBlob({level, 0, 0}, &data, &size);
PixelBufferDescriptor pbd(data, size * 6, dataformat, datatype, cb, cbuser);
texture->setImage(*engine, level, std::move(pbd), Texture::FaceOffsets(size));
ktx.getBlob({ level, 0, 0 }, &data, &size);
const uint32_t dim = texture->getWidth(level);
texture->setImage(*engine, level, 0, 0, dim, dim, {
data, size * 6, dataformat, datatype, cb, cbuser
});
}
return texture;
}