From 6e1913e4dfb139d2880062157191d0374edd8037 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 31 Jul 2006 22:54:21 +0000 Subject: [PATCH] Don't trust GL_MAX_CLIENT_ATTRIB_STACK_DEPTH since it is 0 on Xgl in linux. Instead make sure the state trackers are sized according to demand --- src/java/org/lwjgl/opengl/ReferencesStack.java | 12 +++++++++--- src/java/org/lwjgl/opengl/StateStack.java | 13 ++++++++----- src/java/org/lwjgl/opengl/StateTracker.java | 9 ++------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/java/org/lwjgl/opengl/ReferencesStack.java b/src/java/org/lwjgl/opengl/ReferencesStack.java index 87d7aeea..0580c323 100644 --- a/src/java/org/lwjgl/opengl/ReferencesStack.java +++ b/src/java/org/lwjgl/opengl/ReferencesStack.java @@ -32,7 +32,7 @@ package org.lwjgl.opengl; class ReferencesStack { - private final References[] references_stack; + private References[] references_stack; private int stack_pos; public References getReferences() { @@ -41,6 +41,12 @@ class ReferencesStack { public void pushState() { stack_pos++; + if (stack_pos == references_stack.length) { + References[] new_references_stack = new References[references_stack.length + 1]; + System.arraycopy(references_stack, 0, new_references_stack, 0, references_stack.length); + references_stack = new_references_stack; + references_stack[references_stack.length - 1] = new References(); + } references_stack[stack_pos].copy(references_stack[stack_pos - 1]); } @@ -51,8 +57,8 @@ class ReferencesStack { return result; } - ReferencesStack(int stack_size) { - references_stack = new References[stack_size]; + ReferencesStack() { + references_stack = new References[1]; stack_pos = 0; for (int i = 0; i < references_stack.length; i++) references_stack[i] = new References(); diff --git a/src/java/org/lwjgl/opengl/StateStack.java b/src/java/org/lwjgl/opengl/StateStack.java index 14b1b127..a989f60e 100644 --- a/src/java/org/lwjgl/opengl/StateStack.java +++ b/src/java/org/lwjgl/opengl/StateStack.java @@ -32,9 +32,7 @@ package org.lwjgl.opengl; class StateStack { - - /** Only int state is tracked */ - private final int[] state_stack; + private int[] state_stack; private int stack_pos; public int getState() { @@ -47,6 +45,11 @@ class StateStack { public void pushState() { stack_pos++; + if (stack_pos == state_stack.length) { + int[] new_state_stack = new int[state_stack.length + 1]; + System.arraycopy(state_stack, 0, new_state_stack, 0, state_stack.length); + state_stack = new_state_stack; + } state_stack[stack_pos] = state_stack[stack_pos - 1]; } @@ -56,8 +59,8 @@ class StateStack { return result; } - StateStack(int stack_size, int initial_value) { - state_stack = new int[stack_size]; + StateStack(int initial_value) { + state_stack = new int[1]; stack_pos = 0; state_stack[stack_pos] = initial_value; } diff --git a/src/java/org/lwjgl/opengl/StateTracker.java b/src/java/org/lwjgl/opengl/StateTracker.java index 5cdbba61..bf10562f 100644 --- a/src/java/org/lwjgl/opengl/StateTracker.java +++ b/src/java/org/lwjgl/opengl/StateTracker.java @@ -31,19 +31,14 @@ */ package org.lwjgl.opengl; - -/** Track Vertex Buffer Objects by context. */ final class StateTracker { private final ReferencesStack references_stack; private final StateStack attrib_stack; StateTracker() { - int stack_size = Math.max(1, Util.glGetInteger(GL11.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH)); - - references_stack = new ReferencesStack(stack_size); - - attrib_stack = new StateStack(stack_size, 0); + references_stack = new ReferencesStack(); + attrib_stack = new StateStack(0); } static void popAttrib() {