mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
[Fix] (MG_Backend/DirectGLES): fix bad texture binding in CopyTexImage2D
This commit is contained in:
@@ -784,6 +784,46 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
{
|
||||||
|
#ifdef TRACY_ENABLE
|
||||||
|
ZoneScopedNC("BindCurrentTexturesAtTarget", TRACY_ZONECOLOR_BACKEND);
|
||||||
|
#endif
|
||||||
|
auto unit = MG_State::pGLContext->GetActiveTextureUnit();
|
||||||
|
auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(unit);
|
||||||
|
|
||||||
|
MG_External::GLES::glActiveTexture(GL_TEXTURE0 + unit);
|
||||||
|
auto textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
if (textureTarget == TextureTarget::Texture1D ||
|
||||||
|
textureTarget == TextureTarget::TextureRectangle ||
|
||||||
|
textureTarget == TextureTarget::Texture2DMultisampleArray ||
|
||||||
|
textureTarget == TextureTarget::Texture1DArray ||
|
||||||
|
textureTarget == TextureTarget::Texture2DMultisample ||
|
||||||
|
textureTarget == TextureTarget::Texture2DArray) {
|
||||||
|
MOBILEGL_ASSERT(false, " Texture target %s is not supported, skipping.",
|
||||||
|
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& bindingSlot = textureUnit.GetBindingSlot(textureTarget);
|
||||||
|
{
|
||||||
|
const auto &textureObject = bindingSlot.GetBoundObject();
|
||||||
|
if (!textureObject) {
|
||||||
|
MGLOG_W("%s: Texture target %s does not have texture bound.", __func__,
|
||||||
|
MG_Util::ConvertTextureTargetToString(textureTarget).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto &backendTextureIt = TextureImpl::g_backendTextureObjects.find(
|
||||||
|
textureObject);
|
||||||
|
if (backendTextureIt == TextureImpl::g_backendTextureObjects.end()) {
|
||||||
|
MGLOG_W("%s: No backend texture object found for frontend texture object %d.", __func__,
|
||||||
|
textureObject->GetExternalIndex());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
backendTextureIt->second->Bind(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// GLint realInternalFormat;
|
// GLint realInternalFormat;
|
||||||
// MG_External::GLES::glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat);
|
// MG_External::GLES::glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat);
|
||||||
// errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) {
|
// errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) {
|
||||||
@@ -794,7 +834,12 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
|||||||
|
|
||||||
GLenum format = GL_DEPTH_COMPONENT;
|
GLenum format = GL_DEPTH_COMPONENT;
|
||||||
GLenum type = GL_UNSIGNED_INT;
|
GLenum type = GL_UNSIGNED_INT;
|
||||||
TextureImpl::GenerateTextureFormatInfo(mglInternalFormat, &internalformat, &type, &format);
|
TextureImpl::GenerateTextureFormatInfo(mglInternalFormat, &internalformat, &format, &type);
|
||||||
|
MOBILEGL_ASSERT(format != GL_NONE && type != GL_NONE, "%s: cannot GenerateTextureFormatInfo(%s): out internalformat=%s, format=%s, type=%s",
|
||||||
|
MG_Util::ConvertTextureInternalFormatToString(mglInternalFormat).c_str(),
|
||||||
|
MG_Util::ConvertGLEnumToString(internalformat).c_str(),
|
||||||
|
MG_Util::ConvertGLEnumToString(format).c_str(),
|
||||||
|
MG_Util::ConvertGLEnumToString(type).c_str());
|
||||||
TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type);
|
TexturePixelDataType texturePixelDataType = MG_Util::ConvertGLEnumToTexturePixelDataType(type);
|
||||||
|
|
||||||
bool isDepthFormat =
|
bool isDepthFormat =
|
||||||
|
|||||||
@@ -679,6 +679,9 @@ namespace MobileGL {
|
|||||||
const SizeT internalBpp = MG_Util::GetInternalBytesPerPixel(textureInternalFormat, texturePixelDataType);
|
const SizeT internalBpp = MG_Util::GetInternalBytesPerPixel(textureInternalFormat, texturePixelDataType);
|
||||||
const SizeT internalBytes = width * height * internalBpp;
|
const SizeT internalBytes = width * height * internalBpp;
|
||||||
|
|
||||||
|
MGLOG_D("%s: texture object had internal format %s, new format %s", __func__,
|
||||||
|
MG_Util::ConvertTextureInternalFormatToString(textureObject->GetFormat()).c_str(),
|
||||||
|
MG_Util::ConvertTextureInternalFormatToString(textureInternalFormat).c_str());
|
||||||
textureObject->SetInternalFormat(textureInternalFormat);
|
textureObject->SetInternalFormat(textureInternalFormat);
|
||||||
|
|
||||||
// if isProxy, no more pixel transfer needed below
|
// if isProxy, no more pixel transfer needed below
|
||||||
|
|||||||
Reference in New Issue
Block a user