fix cubemap uploading

There was a wrong assert in Texture::setImage() as well as a typo when
calling setImage() itself in the sample code.
This commit is contained in:
Mathias Agopian
2022-07-25 09:25:29 -07:00
committed by Mathias Agopian
parent 9cc7fe97c5
commit 2d1d6ffb2c
4 changed files with 24 additions and 9 deletions

View File

@@ -1877,9 +1877,7 @@ void OpenGLDriver::setTextureData(GLTexture* t, uint32_t level,
assert_invariant(width == height);
const size_t faceSize = PixelBufferDescriptor::computeDataSize(
p.format, p.type, p.stride ? p.stride : width, height, p.alignment);
assert_invariant(zoffset + depth <= 6);
UTILS_NOUNROLL
for (size_t face = 0; face < depth; face++) {
GLenum target = getCubemapTarget(zoffset + face);

View File

@@ -245,11 +245,28 @@ void FTexture::setImage(FEngine& engine, size_t level,
return;
}
// effective level is just how we compute the index/depth based on whether we're an array or a 3D texture
const uint8_t effectiveLevel = mTarget == SamplerType::SAMPLER_3D ? level : 0;
if (!ASSERT_POSTCONDITION_NON_FATAL(zoffset + depth <= valueForLevel(effectiveLevel, mDepth),
uint32_t textureDepthOrLayers;
switch (mTarget) {
case SamplerType::SAMPLER_EXTERNAL:
// can't happen by construction, fallthrough...
case SamplerType::SAMPLER_2D:
assert_invariant(mDepth == 1);
textureDepthOrLayers = mDepth;
break;
case SamplerType::SAMPLER_3D:
textureDepthOrLayers = valueForLevel(level, mDepth);
break;
case SamplerType::SAMPLER_2D_ARRAY:
textureDepthOrLayers = mDepth;
break;
case SamplerType::SAMPLER_CUBEMAP:
textureDepthOrLayers = 6;
break;
}
if (!ASSERT_POSTCONDITION_NON_FATAL(zoffset + depth <= textureDepthOrLayers,
"zoffset (%u) + depth (%u) > texture depth (%u) at level (%u)",
unsigned(zoffset), unsigned(depth), unsigned(valueForLevel(effectiveLevel, mDepth)), unsigned(level))) {
unsigned(zoffset), unsigned(depth), textureDepthOrLayers, unsigned(level))) {
return;
}

View File

@@ -199,7 +199,7 @@ bool IBL::loadCubemapLevel(filament::Texture** texture, const utils::Path& path,
uint32_t dim;
Texture::PixelBufferDescriptor buffer;
if (loadCubemapLevel(texture, &buffer, &dim, path, level, levelPrefix)) {
(*texture)->setImage(mEngine, level, 0, 0, dim, dim, std::move(buffer));
(*texture)->setImage(mEngine, level, 0, 0, 0, dim, dim, 6, std::move(buffer));
return true;
}
return false;

View File

@@ -78,7 +78,7 @@ Texture* createTexture(Engine* engine, const Ktx1Bundle& ktx, bool srgb,
for (uint32_t level = 0; level < nmips; ++level) {
ktx.getBlob({ level, 0, 0 }, &data, &size);
const uint32_t dim = texture->getWidth(level);
texture->setImage(*engine, level, 0, 0, dim, dim, {
texture->setImage(*engine, level, 0, 0, 0, dim, dim, 6, {
data, size * 6, cdatatype, size, cb, cbuser
});
}
@@ -97,7 +97,7 @@ Texture* createTexture(Engine* engine, const Ktx1Bundle& ktx, bool srgb,
for (uint32_t level = 0; level < nmips; ++level) {
ktx.getBlob({ level, 0, 0 }, &data, &size);
const uint32_t dim = texture->getWidth(level);
texture->setImage(*engine, level, 0, 0, dim, dim, {
texture->setImage(*engine, level, 0, 0, 0, dim, dim, 6, {
data, size * 6, dataformat, datatype, cb, cbuser
});
}