diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index 624f990d35..d89a7906cc 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -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); diff --git a/filament/src/details/Texture.cpp b/filament/src/details/Texture.cpp index 0917c13d1e..e41abee5de 100644 --- a/filament/src/details/Texture.cpp +++ b/filament/src/details/Texture.cpp @@ -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; } diff --git a/libs/filamentapp/src/IBL.cpp b/libs/filamentapp/src/IBL.cpp index 0ec5474759..762610db6d 100644 --- a/libs/filamentapp/src/IBL.cpp +++ b/libs/filamentapp/src/IBL.cpp @@ -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; diff --git a/libs/ktxreader/src/Ktx1Reader.cpp b/libs/ktxreader/src/Ktx1Reader.cpp index 180dbfb482..5c0f425cf2 100644 --- a/libs/ktxreader/src/Ktx1Reader.cpp +++ b/libs/ktxreader/src/Ktx1Reader.cpp @@ -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 }); }