mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-13 14:48:32 +09:00
[Fix] (MG_Backend/DirectVulkan+DirectGLES, MG_State): cap per-stage GL_MAX_TEXTURE_IMAGE_UNITS to 32
Adreno/Qualcomm report a huge maxPerStageDescriptorSampledImages, and the per-stage texture-unit limits were clamped only to the combined array capacity (TextureState::MAX_TEXTURE_IMAGE_UNITS = 192). glGetIntegerv thus advertised 192 for GL_MAX_TEXTURE_IMAGE_UNITS, but host code treats it as an array bound: Minecraft's Blaze3D GlStateManager.TEXTURES[] holds 128 entries and Iris iterates [0, GL_MAX_TEXTURE_IMAGE_UNITS) over it in CompositeRenderer.renderAll, throwing ArrayIndexOutOfBoundsException: Index 128 out of bounds for length 128. Introduce MAX_PER_STAGE_TEXTURE_IMAGE_UNITS = 32 (desktop-driver value) and clamp the per-stage sampler limits to it in both backends (DirectGLES previously did not clamp at all), keeping the combined limit at the array capacity. Update SanityTest.
This commit is contained in:
@@ -37,7 +37,13 @@ namespace MobileGL::MG_State::GLState {
|
||||
|
||||
class TextureState {
|
||||
public:
|
||||
// Capacity of the combined texture-unit state arrays (indexed by glActiveTexture unit).
|
||||
static constexpr int MAX_TEXTURE_IMAGE_UNITS = 192;
|
||||
// Per-stage sampler limit advertised through GL_MAX_TEXTURE_IMAGE_UNITS /
|
||||
// GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS. Held at the desktop-driver value (32) so it never exceeds
|
||||
// host-side fixed arrays sized off this query -- e.g. Minecraft's 128-entry Blaze3D
|
||||
// GlStateManager.TEXTURES[], which Iris iterates over in CompositeRenderer.renderAll.
|
||||
static constexpr int MAX_PER_STAGE_TEXTURE_IMAGE_UNITS = 32;
|
||||
|
||||
TextureState();
|
||||
void GenerateNames(Uint number, Vector<Uint>& textures);
|
||||
|
||||
Reference in New Issue
Block a user