[Fix] (MG_Impl/GLImpl): unblock the non-texture sections of GL CTS per-case state reset - clamp advertised GL_MAX_UNIFORM_BUFFER_BINDINGS to the state layer indexed-binding capacity (glBindBufferBase rejected indices past it), let glBindRenderbuffer(0) unbind without recording INVALID_OPERATION (name 0 must never reach the name-table lookup), and allow writes to generic vertex attribute 0 current value (core GL has no attribute-0 restriction; gluStateReset writes vertexAttrib4f(0,...) after every case) - with these plus the default-texture work, multi-case glcts batches complete in one process instead of aborting after the first case

This commit is contained in:
2026-07-16 23:36:58 -04:00
parent 076cd0d19d
commit 981f10e4da
4 changed files with 32 additions and 13 deletions
+9 -1
View File
@@ -1894,7 +1894,15 @@ namespace MobileGL::MG_Impl::GLImpl {
*params = dynamicParameters.MaxTextureSize;
break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS:
*params = std::max(dynamicParameters.MaxUniformBufferBindings, kFrontendMinUniformBufferBindings);
// Never advertise more indexed binding points than the state layer's fixed per-target
// array can store (BufferBindingPointCount): glBindBufferBase rejects indices past
// that capacity, and GL CTS's per-case state reset walks every advertised binding
// (gluStateReset), so an over-advertised value aborts whole test batches. The floor
// equals the GL 3.3 core minimum (36), so the clamp never under-advertises.
*params = static_cast<GLint>(std::min<SizeT>(
static_cast<SizeT>(std::max(dynamicParameters.MaxUniformBufferBindings,
kFrontendMinUniformBufferBindings)),
MG_State::GLState::BufferBindingPointCount));
break;
case GL_MAX_UNIFORM_BLOCK_SIZE:
*params = dynamicParameters.MaxUniformBlockSize;