Inline optimizations to state trackers by MatthiasM

This commit is contained in:
Elias Naur 2007-04-22 21:29:28 +00:00
parent 2d7c4b20d7
commit 31aa4355ca
3 changed files with 27 additions and 27 deletions

View File

@ -40,23 +40,26 @@ class ReferencesStack {
} }
public void pushState() { public void pushState() {
stack_pos++; int pos = ++stack_pos;
if (stack_pos == references_stack.length) { if (pos == references_stack.length) {
References[] new_references_stack = new References[references_stack.length + 1]; growStack();
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]); references_stack[pos].copy(references_stack[pos - 1]);
} }
public References popState() { public References popState() {
References result = references_stack[stack_pos]; References result = references_stack[stack_pos--];
references_stack[stack_pos].clear(); result.clear();
stack_pos--;
return result; return result;
} }
private void growStack() {
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();
}
ReferencesStack() { ReferencesStack() {
references_stack = new References[1]; references_stack = new References[1];
stack_pos = 0; stack_pos = 0;

View File

@ -39,24 +39,22 @@ class StateStack {
return state_stack[stack_pos]; return state_stack[stack_pos];
} }
public void setState(int new_state) { public void pushState(int new_state) {
state_stack[stack_pos] = new_state; int pos = ++stack_pos;
} if (pos == state_stack.length) {
growState();
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]; state_stack[pos] = new_state;
} }
public int popState() { public int popState() {
int result = state_stack[stack_pos]; return state_stack[stack_pos--];
stack_pos--; }
return result;
public void growState() {
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;
} }
StateStack(int initial_value) { StateStack(int initial_value) {

View File

@ -55,8 +55,7 @@ final class StateTracker {
} }
private void doPushAttrib(int mask) { private void doPushAttrib(int mask) {
attrib_stack.pushState(); attrib_stack.pushState(mask);
attrib_stack.setState(mask);
if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) { if ((mask & GL11.GL_CLIENT_VERTEX_ARRAY_BIT) != 0) {
references_stack.pushState(); references_stack.pushState();
} }