mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-13 22:58:30 +09:00
[Fix] (DirectGLES): resolve an aliased texture unit by the sampler's type
Desktop GL_TEXTURE_1D/1D_ARRAY are emulated on ES GL_TEXTURE_2D/2D_ARRAY, so one native binding serves two of a unit's frontend slots. An earlier fix settled the real-versus-default case; two REAL textures can collide just as easily, and there the slot iteration order decided it. KHR-GL3x.texture_size_promotion keeps its 1D source texture and its 2D destination texture bound to the same unit, so the shader sampled the render target it was drawing into instead of the source. GL resolves this from the shader's sampler type, so ask the program: the frontend's uniform reflection still carries the original GLSL type, which maps straight back to the target the lookup means. Only consulted when a collision actually happens, so an ordinary unit costs nothing, and the first binding placed stands when the program gives no answer rather than being overwritten by whichever slot happens to come last. Also adds the read-colour clamp that goes with it: GL clamps a glReadPixels from a fixed-point colour buffer to [0,1] (GL_CLAMP_READ_COLOR defaults to GL_FIXED_ONLY), which ES has no equivalent for at all - a GL_R16_SNORM target holding -0.125 read back unclamped. Applied to the wide rows before they are repacked, for float, half, short and byte reads alike, and deliberately NOT for glGetTexImage, which reaches the same helper through a scratch framebuffer but is not subject to read-colour clamping. texture_size_promotion now clears every 1D case (it stops at the first failure and has moved on to GL_TEXTURE_RECTANGLE, which DirectGLES does not emulate at all yet), and KHR-GL33.texture_swizzle's GL_DEPTH_COMPONENT32 1D cases pass. DirectVulkan re-verified unchanged.
This commit is contained in:
@@ -2679,6 +2679,31 @@ namespace MobileGL::MG_Backend::DirectGLES {
|
||||
return false;
|
||||
}
|
||||
|
||||
Bool IsFixedPointFallbackReadAttachment() {
|
||||
const auto& readFBO =
|
||||
MG_State::pGLContext->GetFramebufferBindingSlot(FramebufferTarget::Read).GetBoundObject();
|
||||
if (!readFBO) {
|
||||
return false;
|
||||
}
|
||||
const auto readBuffer = readFBO->GetReadBuffer();
|
||||
if (readBuffer < FramebufferAttachmentType::Color0 || readBuffer > FramebufferAttachmentType::Color31) {
|
||||
return false;
|
||||
}
|
||||
// Any signed-normalized attachment, not just the ones currently substituted:
|
||||
// ES has no GL_CLAMP_READ_COLOR at all, so even a natively stored SNORM buffer
|
||||
// hands back the negative half that desktop GL clamps away.
|
||||
const auto& attachmentObject = readFBO->GetAttachment(readBuffer);
|
||||
if (attachmentObject.IsTexture()) {
|
||||
const auto& textureObject = attachmentObject.GetTexture();
|
||||
return textureObject && IsSnormFormat(textureObject->GetFormat());
|
||||
}
|
||||
if (attachmentObject.IsRenderbuffer()) {
|
||||
const auto& renderbufferObject = attachmentObject.GetRenderbuffer();
|
||||
return renderbufferObject && IsSnormFormat(renderbufferObject->GetInternalFormat());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void BackendFramebufferObject::SyncReadBufferToBackend(
|
||||
const SharedPtr<MG_State::GLState::FramebufferObject>& stateFBOObject) {
|
||||
if (!stateFBOObject) {
|
||||
|
||||
Reference in New Issue
Block a user