From c0876ca3e842eca0f47eb92ee1d804df94e63c36 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:48:49 +0100 Subject: [PATCH 1/8] CommandBuffer packing --- .../java/rs117/hd/utils/CommandBuffer.java | 100 ++++++++---------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index 03af06a3d7..f184a0524b 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -50,65 +50,55 @@ public void SetBaseOffset(int x, int y, int z) { } public void SetWorldViewIndex(int index) { - ensureCapacity(2); - cmd[writeHead++] = UNIFORM_WORLD_VIEW_ID; - cmd[writeHead++] = index; + ensureCapacity(1); + cmd[writeHead++] = (UNIFORM_WORLD_VIEW_ID & 0xFF) | ((long) index << 8); } public void BindVertexArray(int vao) { - ensureCapacity(2); - cmd[writeHead++] = GL_BIND_VERTEX_ARRAY_TYPE; - cmd[writeHead++] = vao; + ensureCapacity(1); + cmd[writeHead++] = (GL_BIND_VERTEX_ARRAY_TYPE & 0xFF) | ((long) vao << 8); } public void BindElementsArray(int ebo) { - ensureCapacity(2); - cmd[writeHead++] = GL_BIND_ELEMENTS_ARRAY_TYPE; - cmd[writeHead++] = ebo; + ensureCapacity(1); + cmd[writeHead++] = (GL_BIND_ELEMENTS_ARRAY_TYPE & 0xFF) | ((long) ebo << 8); } public void DepthMask(boolean writeDepth) { - ensureCapacity(2); - cmd[writeHead++] = GL_DEPTH_MASK_TYPE; - cmd[writeHead++] = writeDepth ? 1 : 0; + ensureCapacity(1); + cmd[writeHead++] = (GL_DEPTH_MASK_TYPE & 0xFF) | ((writeDepth ? 1 : 0) << 8); } public void ColorMask(boolean writeRed, boolean writeGreen, boolean writeBlue, boolean writeAlpha) { - ensureCapacity(5); - cmd[writeHead++] = GL_COLOR_MASK_TYPE; - cmd[writeHead++] = writeRed ? 1 : 0; - cmd[writeHead++] = writeGreen ? 1 : 0; - cmd[writeHead++] = writeBlue ? 1 : 0; - cmd[writeHead++] = writeAlpha ? 1 : 0; + ensureCapacity(1); + cmd[writeHead++] = (GL_COLOR_MASK_TYPE & 0xFF) | + ((writeRed ? 1 : 0) << 8) | + ((writeGreen ? 1 : 0) << 9) | + ((writeBlue ? 1 : 0) << 10) | + ((writeAlpha ? 1 : 0) << 11); } public void MultiDrawArrays(int mode, int[] offsets, int[] counts) { assert offsets.length == counts.length; - ensureCapacity(3 + (offsets.length * 2)); - cmd[writeHead++] = GL_MULTI_DRAW_ARRAYS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = offsets.length; + /* + ensureCapacity(1 + offsets.length); + cmd[writeHead++] = (GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8) | (long) offsets.length << 32; for (int i = 0; i < offsets.length; i++) { - cmd[writeHead++] = offsets[i]; - cmd[writeHead++] = counts[i]; - } + cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xffffffffL); + }*/ } public void DrawElements(int mode, int vertexCount, long offset) { - ensureCapacity(4); - cmd[writeHead++] = GL_DRAW_ELEMENTS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = vertexCount; + ensureCapacity(2); + cmd[writeHead++] = (GL_DRAW_ELEMENTS_TYPE & 0xFF) | ((long) mode << 8) | (long) vertexCount << 32; cmd[writeHead++] = offset; } public void DrawArrays(int mode, int offset, int vertexCount) { - ensureCapacity(4); - cmd[writeHead++] = GL_DRAW_ARRAYS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = offset; - cmd[writeHead++] = vertexCount; + ensureCapacity(2); + cmd[writeHead++] = (GL_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8); + cmd[writeHead++] = (((long)offset) << 32) | (vertexCount & 0xffffffffL); } public void Enable(int capability) { @@ -130,7 +120,8 @@ public void execute() { IntBuffer offsets = null, counts = null; readHead = 0; while (readHead < writeHead) { - int type = (int) cmd[readHead++]; + long data = (int) cmd[readHead++]; + int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { int x = (int) cmd[readHead++]; @@ -141,38 +132,40 @@ public void execute() { break; } case UNIFORM_WORLD_VIEW_ID: { - int id = (int) cmd[readHead++]; + int id = (int)(data >> 8); if (uboCommandBuffer != null) uboCommandBuffer.worldViewIndex.set(id); break; } case GL_DEPTH_MASK_TYPE: { - int state = (int) cmd[readHead++]; + int state = (int)((data >> 8) & 1); if (SKIP_DEPTH_MASKING) continue; glDepthMask(state == 1); break; } case GL_COLOR_MASK_TYPE: { - int red = (int) cmd[readHead++]; - int green = (int) cmd[readHead++]; - int blue = (int) cmd[readHead++]; - int alpha = (int) cmd[readHead++]; + int red = (int)((data >> 8) & 1); + int green = (int)((data >> 9) & 1); + int blue = (int)((data >> 10) & 1); + int alpha = (int)((data >> 11) & 1); glColorMask(red == 1, green == 1, blue == 1, alpha == 1); break; } case GL_BIND_VERTEX_ARRAY_TYPE: { - glBindVertexArray((int) cmd[readHead++]); + glBindVertexArray((int)(data >> 8)); break; } case GL_BIND_ELEMENTS_ARRAY_TYPE: { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int) cmd[readHead++]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int)(data >> 8)); break; } case GL_DRAW_ARRAYS_TYPE: { - int mode = (int) cmd[readHead++]; - int offset = (int) cmd[readHead++]; - int count = (int) cmd[readHead++]; + long packed = cmd[readHead++]; + + int mode = (int) data >> 8; + int offset = (int)(packed >> 32); + int count = (int)packed; if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -181,9 +174,9 @@ public void execute() { break; } case GL_DRAW_ELEMENTS_TYPE: { - int mode = (int) cmd[readHead++]; - int vertexCount = (int) cmd[readHead++]; - long byteOffset = cmd[readHead++]; + int mode = (int) data >> 8; + long byteOffset = (int)cmd[readHead++]; + int vertexCount = (int)(data >> 32); if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -192,8 +185,8 @@ public void execute() { break; } case GL_MULTI_DRAW_ARRAYS_TYPE: { - int mode = (int) cmd[readHead++]; - int drawCount = (int) cmd[readHead++]; + int mode = (int) data >> 8; + int drawCount = (int)(data >> 32); if (offsets == null || offsets.capacity() < drawCount) { offsets = stack.callocInt(drawCount); @@ -201,8 +194,9 @@ public void execute() { } for (int i = 0; i < drawCount; i++) { - offsets.put((int) cmd[readHead++]); - counts.put((int) cmd[readHead++]); + long packed = cmd[readHead++]; + offsets.put((int)(packed >> 32)); + counts.put((int)packed); } offsets.flip(); From c0369fcd8b3daed6e229aa3aa606fbd8accb3768 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:17:34 +0100 Subject: [PATCH 2/8] MultiDrawArrays is now packed --- src/main/java/rs117/hd/utils/CommandBuffer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index f184a0524b..296b4ff1ea 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -81,12 +81,15 @@ public void ColorMask(boolean writeRed, boolean writeGreen, boolean writeBlue, b public void MultiDrawArrays(int mode, int[] offsets, int[] counts) { assert offsets.length == counts.length; - /* + if(offsets.length == 0) { + return; + } + ensureCapacity(1 + offsets.length); cmd[writeHead++] = (GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8) | (long) offsets.length << 32; for (int i = 0; i < offsets.length; i++) { - cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xffffffffL); - }*/ + cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xFFFFFFFFL); + } } public void DrawElements(int mode, int vertexCount, long offset) { @@ -120,7 +123,7 @@ public void execute() { IntBuffer offsets = null, counts = null; readHead = 0; while (readHead < writeHead) { - long data = (int) cmd[readHead++]; + long data = cmd[readHead++]; int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { From 89ce7733cfc564b36c5d7f422dd2b6428c5b45fa Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:21:18 +0100 Subject: [PATCH 3/8] Pack SetBaseOffset too --- src/main/java/rs117/hd/utils/CommandBuffer.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index 296b4ff1ea..b1edf1f8db 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -42,11 +42,9 @@ private void ensureCapacity(int numLongs) { } public void SetBaseOffset(int x, int y, int z) { - ensureCapacity(4); - cmd[writeHead++] = UNIFORM_BASE_OFFSET; - cmd[writeHead++] = x; - cmd[writeHead++] = y; - cmd[writeHead++] = z; + ensureCapacity(2); + cmd[writeHead++] = (UNIFORM_BASE_OFFSET & 0xFF) | ((long)x << 32); + cmd[writeHead++] = (((long)y) << 32) | (z & 0xFFFFFFFFL); } public void SetWorldViewIndex(int index) { @@ -127,9 +125,10 @@ public void execute() { int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { - int x = (int) cmd[readHead++]; - int y = (int) cmd[readHead++]; - int z = (int) cmd[readHead++]; + long packed = cmd[readHead++]; + int x = (int)(data >> 32); + int y = (int)(packed >> 32); + int z = (int) packed; if (uboCommandBuffer != null) uboCommandBuffer.sceneBase.set(x, y, z); break; From d61b071214e6f0cdf5634518af7605dd6e4410f7 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:48:49 +0100 Subject: [PATCH 4/8] CommandBuffer packing --- .../java/rs117/hd/utils/CommandBuffer.java | 100 ++++++++---------- 1 file changed, 47 insertions(+), 53 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index 03af06a3d7..f184a0524b 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -50,65 +50,55 @@ public void SetBaseOffset(int x, int y, int z) { } public void SetWorldViewIndex(int index) { - ensureCapacity(2); - cmd[writeHead++] = UNIFORM_WORLD_VIEW_ID; - cmd[writeHead++] = index; + ensureCapacity(1); + cmd[writeHead++] = (UNIFORM_WORLD_VIEW_ID & 0xFF) | ((long) index << 8); } public void BindVertexArray(int vao) { - ensureCapacity(2); - cmd[writeHead++] = GL_BIND_VERTEX_ARRAY_TYPE; - cmd[writeHead++] = vao; + ensureCapacity(1); + cmd[writeHead++] = (GL_BIND_VERTEX_ARRAY_TYPE & 0xFF) | ((long) vao << 8); } public void BindElementsArray(int ebo) { - ensureCapacity(2); - cmd[writeHead++] = GL_BIND_ELEMENTS_ARRAY_TYPE; - cmd[writeHead++] = ebo; + ensureCapacity(1); + cmd[writeHead++] = (GL_BIND_ELEMENTS_ARRAY_TYPE & 0xFF) | ((long) ebo << 8); } public void DepthMask(boolean writeDepth) { - ensureCapacity(2); - cmd[writeHead++] = GL_DEPTH_MASK_TYPE; - cmd[writeHead++] = writeDepth ? 1 : 0; + ensureCapacity(1); + cmd[writeHead++] = (GL_DEPTH_MASK_TYPE & 0xFF) | ((writeDepth ? 1 : 0) << 8); } public void ColorMask(boolean writeRed, boolean writeGreen, boolean writeBlue, boolean writeAlpha) { - ensureCapacity(5); - cmd[writeHead++] = GL_COLOR_MASK_TYPE; - cmd[writeHead++] = writeRed ? 1 : 0; - cmd[writeHead++] = writeGreen ? 1 : 0; - cmd[writeHead++] = writeBlue ? 1 : 0; - cmd[writeHead++] = writeAlpha ? 1 : 0; + ensureCapacity(1); + cmd[writeHead++] = (GL_COLOR_MASK_TYPE & 0xFF) | + ((writeRed ? 1 : 0) << 8) | + ((writeGreen ? 1 : 0) << 9) | + ((writeBlue ? 1 : 0) << 10) | + ((writeAlpha ? 1 : 0) << 11); } public void MultiDrawArrays(int mode, int[] offsets, int[] counts) { assert offsets.length == counts.length; - ensureCapacity(3 + (offsets.length * 2)); - cmd[writeHead++] = GL_MULTI_DRAW_ARRAYS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = offsets.length; + /* + ensureCapacity(1 + offsets.length); + cmd[writeHead++] = (GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8) | (long) offsets.length << 32; for (int i = 0; i < offsets.length; i++) { - cmd[writeHead++] = offsets[i]; - cmd[writeHead++] = counts[i]; - } + cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xffffffffL); + }*/ } public void DrawElements(int mode, int vertexCount, long offset) { - ensureCapacity(4); - cmd[writeHead++] = GL_DRAW_ELEMENTS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = vertexCount; + ensureCapacity(2); + cmd[writeHead++] = (GL_DRAW_ELEMENTS_TYPE & 0xFF) | ((long) mode << 8) | (long) vertexCount << 32; cmd[writeHead++] = offset; } public void DrawArrays(int mode, int offset, int vertexCount) { - ensureCapacity(4); - cmd[writeHead++] = GL_DRAW_ARRAYS_TYPE; - cmd[writeHead++] = mode; - cmd[writeHead++] = offset; - cmd[writeHead++] = vertexCount; + ensureCapacity(2); + cmd[writeHead++] = (GL_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8); + cmd[writeHead++] = (((long)offset) << 32) | (vertexCount & 0xffffffffL); } public void Enable(int capability) { @@ -130,7 +120,8 @@ public void execute() { IntBuffer offsets = null, counts = null; readHead = 0; while (readHead < writeHead) { - int type = (int) cmd[readHead++]; + long data = (int) cmd[readHead++]; + int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { int x = (int) cmd[readHead++]; @@ -141,38 +132,40 @@ public void execute() { break; } case UNIFORM_WORLD_VIEW_ID: { - int id = (int) cmd[readHead++]; + int id = (int)(data >> 8); if (uboCommandBuffer != null) uboCommandBuffer.worldViewIndex.set(id); break; } case GL_DEPTH_MASK_TYPE: { - int state = (int) cmd[readHead++]; + int state = (int)((data >> 8) & 1); if (SKIP_DEPTH_MASKING) continue; glDepthMask(state == 1); break; } case GL_COLOR_MASK_TYPE: { - int red = (int) cmd[readHead++]; - int green = (int) cmd[readHead++]; - int blue = (int) cmd[readHead++]; - int alpha = (int) cmd[readHead++]; + int red = (int)((data >> 8) & 1); + int green = (int)((data >> 9) & 1); + int blue = (int)((data >> 10) & 1); + int alpha = (int)((data >> 11) & 1); glColorMask(red == 1, green == 1, blue == 1, alpha == 1); break; } case GL_BIND_VERTEX_ARRAY_TYPE: { - glBindVertexArray((int) cmd[readHead++]); + glBindVertexArray((int)(data >> 8)); break; } case GL_BIND_ELEMENTS_ARRAY_TYPE: { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int) cmd[readHead++]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int)(data >> 8)); break; } case GL_DRAW_ARRAYS_TYPE: { - int mode = (int) cmd[readHead++]; - int offset = (int) cmd[readHead++]; - int count = (int) cmd[readHead++]; + long packed = cmd[readHead++]; + + int mode = (int) data >> 8; + int offset = (int)(packed >> 32); + int count = (int)packed; if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -181,9 +174,9 @@ public void execute() { break; } case GL_DRAW_ELEMENTS_TYPE: { - int mode = (int) cmd[readHead++]; - int vertexCount = (int) cmd[readHead++]; - long byteOffset = cmd[readHead++]; + int mode = (int) data >> 8; + long byteOffset = (int)cmd[readHead++]; + int vertexCount = (int)(data >> 32); if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -192,8 +185,8 @@ public void execute() { break; } case GL_MULTI_DRAW_ARRAYS_TYPE: { - int mode = (int) cmd[readHead++]; - int drawCount = (int) cmd[readHead++]; + int mode = (int) data >> 8; + int drawCount = (int)(data >> 32); if (offsets == null || offsets.capacity() < drawCount) { offsets = stack.callocInt(drawCount); @@ -201,8 +194,9 @@ public void execute() { } for (int i = 0; i < drawCount; i++) { - offsets.put((int) cmd[readHead++]); - counts.put((int) cmd[readHead++]); + long packed = cmd[readHead++]; + offsets.put((int)(packed >> 32)); + counts.put((int)packed); } offsets.flip(); From d936c3ab9e3f9fc2cfaa95f7098bac127621b3f0 Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:17:34 +0100 Subject: [PATCH 5/8] MultiDrawArrays is now packed --- src/main/java/rs117/hd/utils/CommandBuffer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index f184a0524b..296b4ff1ea 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -81,12 +81,15 @@ public void ColorMask(boolean writeRed, boolean writeGreen, boolean writeBlue, b public void MultiDrawArrays(int mode, int[] offsets, int[] counts) { assert offsets.length == counts.length; - /* + if(offsets.length == 0) { + return; + } + ensureCapacity(1 + offsets.length); cmd[writeHead++] = (GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8) | (long) offsets.length << 32; for (int i = 0; i < offsets.length; i++) { - cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xffffffffL); - }*/ + cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xFFFFFFFFL); + } } public void DrawElements(int mode, int vertexCount, long offset) { @@ -120,7 +123,7 @@ public void execute() { IntBuffer offsets = null, counts = null; readHead = 0; while (readHead < writeHead) { - long data = (int) cmd[readHead++]; + long data = cmd[readHead++]; int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { From 52c1a85d3ab9afb1b98bc51db9bb12edc4f6299b Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:21:18 +0100 Subject: [PATCH 6/8] Pack SetBaseOffset too --- src/main/java/rs117/hd/utils/CommandBuffer.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index 296b4ff1ea..b1edf1f8db 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -42,11 +42,9 @@ private void ensureCapacity(int numLongs) { } public void SetBaseOffset(int x, int y, int z) { - ensureCapacity(4); - cmd[writeHead++] = UNIFORM_BASE_OFFSET; - cmd[writeHead++] = x; - cmd[writeHead++] = y; - cmd[writeHead++] = z; + ensureCapacity(2); + cmd[writeHead++] = (UNIFORM_BASE_OFFSET & 0xFF) | ((long)x << 32); + cmd[writeHead++] = (((long)y) << 32) | (z & 0xFFFFFFFFL); } public void SetWorldViewIndex(int index) { @@ -127,9 +125,10 @@ public void execute() { int type = (int)(data & 0xFF); switch (type) { case UNIFORM_BASE_OFFSET: { - int x = (int) cmd[readHead++]; - int y = (int) cmd[readHead++]; - int z = (int) cmd[readHead++]; + long packed = cmd[readHead++]; + int x = (int)(data >> 32); + int y = (int)(packed >> 32); + int z = (int) packed; if (uboCommandBuffer != null) uboCommandBuffer.sceneBase.set(x, y, z); break; From e92d609d504d6a975b5a4855c4e6a38141aad3e8 Mon Sep 17 00:00:00 2001 From: Hooder Date: Tue, 21 Oct 2025 12:50:44 +0200 Subject: [PATCH 7/8] Minor edits --- .../java/rs117/hd/utils/CommandBuffer.java | 87 ++++++++++--------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/src/main/java/rs117/hd/utils/CommandBuffer.java b/src/main/java/rs117/hd/utils/CommandBuffer.java index b1edf1f8db..ade571a835 100644 --- a/src/main/java/rs117/hd/utils/CommandBuffer.java +++ b/src/main/java/rs117/hd/utils/CommandBuffer.java @@ -27,7 +27,8 @@ public class CommandBuffer { private static final int GL_TOGGLE_TYPE = 9; // Combined glEnable & glDisable - private static final long INT_MASK = 0xFFFF_FFFFL; + private static final int INT_MASK = 0xFFFF_FFFF; + private static final int DRAW_MODE_MASK = 0xF; @Setter private UBOCommandBuffer uboCommandBuffer; @@ -43,63 +44,64 @@ private void ensureCapacity(int numLongs) { public void SetBaseOffset(int x, int y, int z) { ensureCapacity(2); - cmd[writeHead++] = (UNIFORM_BASE_OFFSET & 0xFF) | ((long)x << 32); - cmd[writeHead++] = (((long)y) << 32) | (z & 0xFFFFFFFFL); + cmd[writeHead++] = UNIFORM_BASE_OFFSET & 0xFF | (long) x << 32; + cmd[writeHead++] = (long) y << 32 | z & INT_MASK; } public void SetWorldViewIndex(int index) { ensureCapacity(1); - cmd[writeHead++] = (UNIFORM_WORLD_VIEW_ID & 0xFF) | ((long) index << 8); + cmd[writeHead++] = UNIFORM_WORLD_VIEW_ID & 0xFF | (long) index << 8; } public void BindVertexArray(int vao) { ensureCapacity(1); - cmd[writeHead++] = (GL_BIND_VERTEX_ARRAY_TYPE & 0xFF) | ((long) vao << 8); + cmd[writeHead++] = GL_BIND_VERTEX_ARRAY_TYPE & 0xFF | (long) vao << 8; } public void BindElementsArray(int ebo) { ensureCapacity(1); - cmd[writeHead++] = (GL_BIND_ELEMENTS_ARRAY_TYPE & 0xFF) | ((long) ebo << 8); + cmd[writeHead++] = GL_BIND_ELEMENTS_ARRAY_TYPE & 0xFF | (long) ebo << 8; } public void DepthMask(boolean writeDepth) { ensureCapacity(1); - cmd[writeHead++] = (GL_DEPTH_MASK_TYPE & 0xFF) | ((writeDepth ? 1 : 0) << 8); + cmd[writeHead++] = GL_DEPTH_MASK_TYPE & 0xFF | (writeDepth ? 1 : 0) << 8; } public void ColorMask(boolean writeRed, boolean writeGreen, boolean writeBlue, boolean writeAlpha) { ensureCapacity(1); - cmd[writeHead++] = (GL_COLOR_MASK_TYPE & 0xFF) | - ((writeRed ? 1 : 0) << 8) | - ((writeGreen ? 1 : 0) << 9) | - ((writeBlue ? 1 : 0) << 10) | - ((writeAlpha ? 1 : 0) << 11); + cmd[writeHead++] = + GL_COLOR_MASK_TYPE & 0xFF | + (writeRed ? 1 : 0) << 8 | + (writeGreen ? 1 : 0) << 9 | + (writeBlue ? 1 : 0) << 10 | + (writeAlpha ? 1 : 0) << 11; } public void MultiDrawArrays(int mode, int[] offsets, int[] counts) { assert offsets.length == counts.length; - - if(offsets.length == 0) { + assert (mode & DRAW_MODE_MASK) == mode; + if (offsets.length == 0) return; - } ensureCapacity(1 + offsets.length); - cmd[writeHead++] = (GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8) | (long) offsets.length << 32; - for (int i = 0; i < offsets.length; i++) { - cmd[writeHead++] = (((long)offsets[i]) << 32) | (counts[i] & 0xFFFFFFFFL); - } + cmd[writeHead++] = GL_MULTI_DRAW_ARRAYS_TYPE & 0xFF | mode << 8 | (long) offsets.length << 32; + for (int i = 0; i < offsets.length; i++) + cmd[writeHead++] = (long) offsets[i] << 32 | counts[i] & INT_MASK; } public void DrawElements(int mode, int vertexCount, long offset) { + assert (mode & DRAW_MODE_MASK) == mode; ensureCapacity(2); - cmd[writeHead++] = (GL_DRAW_ELEMENTS_TYPE & 0xFF) | ((long) mode << 8) | (long) vertexCount << 32; + cmd[writeHead++] = GL_DRAW_ELEMENTS_TYPE & 0xFF | mode << 8 | (long) vertexCount << 32; cmd[writeHead++] = offset; } public void DrawArrays(int mode, int offset, int vertexCount) { + assert (mode & DRAW_MODE_MASK) == mode; ensureCapacity(2); - cmd[writeHead++] = (GL_DRAW_ARRAYS_TYPE & 0xFF) | ((long) mode << 8); - cmd[writeHead++] = (((long)offset) << 32) | (vertexCount & 0xffffffffL); + cmd[writeHead++] = GL_DRAW_ARRAYS_TYPE & 0xFF | mode << 8; + cmd[writeHead++] = (long) offset << 32 | vertexCount & INT_MASK; } public void Enable(int capability) { @@ -121,53 +123,54 @@ public void execute() { IntBuffer offsets = null, counts = null; readHead = 0; while (readHead < writeHead) { + // Casting from long to int keeps the lower 32 bits long data = cmd[readHead++]; - int type = (int)(data & 0xFF); + int type = (int) data & 0xFF; switch (type) { case UNIFORM_BASE_OFFSET: { long packed = cmd[readHead++]; - int x = (int)(data >> 32); - int y = (int)(packed >> 32); + int x = (int) (data >> 32); + int y = (int) (packed >> 32); int z = (int) packed; if (uboCommandBuffer != null) uboCommandBuffer.sceneBase.set(x, y, z); break; } case UNIFORM_WORLD_VIEW_ID: { - int id = (int)(data >> 8); + int id = (int) (data >> 8); if (uboCommandBuffer != null) uboCommandBuffer.worldViewIndex.set(id); break; } case GL_DEPTH_MASK_TYPE: { - int state = (int)((data >> 8) & 1); + int state = (int) (data >> 8) & 1; if (SKIP_DEPTH_MASKING) continue; glDepthMask(state == 1); break; } case GL_COLOR_MASK_TYPE: { - int red = (int)((data >> 8) & 1); - int green = (int)((data >> 9) & 1); - int blue = (int)((data >> 10) & 1); - int alpha = (int)((data >> 11) & 1); - glColorMask(red == 1, green == 1, blue == 1, alpha == 1); + boolean red = ((data >> 8) & 1) == 1; + boolean green = ((data >> 9) & 1) == 1; + boolean blue = ((data >> 10) & 1) == 1; + boolean alpha = ((data >> 11) & 1) == 1; + glColorMask(red, green, blue, alpha); break; } case GL_BIND_VERTEX_ARRAY_TYPE: { - glBindVertexArray((int)(data >> 8)); + glBindVertexArray((int) (data >> 8)); break; } case GL_BIND_ELEMENTS_ARRAY_TYPE: { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int)(data >> 8)); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (int) (data >> 8)); break; } case GL_DRAW_ARRAYS_TYPE: { long packed = cmd[readHead++]; int mode = (int) data >> 8; - int offset = (int)(packed >> 32); - int count = (int)packed; + int offset = (int) (packed >> 32); + int count = (int) packed; if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -177,8 +180,8 @@ public void execute() { } case GL_DRAW_ELEMENTS_TYPE: { int mode = (int) data >> 8; - long byteOffset = (int)cmd[readHead++]; - int vertexCount = (int)(data >> 32); + int vertexCount = (int) (data >> 32); + long byteOffset = cmd[readHead++]; if (uboCommandBuffer != null && uboCommandBuffer.isDirty()) uboCommandBuffer.upload(); @@ -188,7 +191,7 @@ public void execute() { } case GL_MULTI_DRAW_ARRAYS_TYPE: { int mode = (int) data >> 8; - int drawCount = (int)(data >> 32); + int drawCount = (int) (data >> 32); if (offsets == null || offsets.capacity() < drawCount) { offsets = stack.callocInt(drawCount); @@ -197,8 +200,8 @@ public void execute() { for (int i = 0; i < drawCount; i++) { long packed = cmd[readHead++]; - offsets.put((int)(packed >> 32)); - counts.put((int)packed); + offsets.put((int) (packed >> 32)); + counts.put((int) packed); } offsets.flip(); @@ -215,7 +218,7 @@ public void execute() { } case GL_TOGGLE_TYPE: { long packed = cmd[readHead++]; - int capability = (int) (packed & INT_MASK); + int capability = (int) packed; if ((packed >> 32) != 0) { glEnable(capability); } else { From a3e88495afdcefb07e6543cd197f01b4ef73649f Mon Sep 17 00:00:00 2001 From: Ruffled <105522716+RuffledPlume@users.noreply.github.com> Date: Tue, 21 Oct 2025 14:48:39 +0100 Subject: [PATCH 8/8] Use DrawArrays instead of MultiDrawArrays if length is 1 --- src/main/java/rs117/hd/renderer/zone/Zone.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/rs117/hd/renderer/zone/Zone.java b/src/main/java/rs117/hd/renderer/zone/Zone.java index 35fec691d5..a930e71cc1 100644 --- a/src/main/java/rs117/hd/renderer/zone/Zone.java +++ b/src/main/java/rs117/hd/renderer/zone/Zone.java @@ -238,7 +238,11 @@ void renderOpaque(CommandBuffer cmd, int zx, int zz, int minLevel, int currentLe cmd.SetBaseOffset(zx << 10, 0, zz << 10); cmd.BindVertexArray(glVao); - cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + if(glDrawOffset.length > 1) { + cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + } else { + cmd.DrawArrays(GL_TRIANGLES, glDrawOffset[0], glDrawLength[0]); + } } void renderOpaqueLevel(CommandBuffer cmd, int zx, int zz, int level) { @@ -254,7 +258,11 @@ void renderOpaqueLevel(CommandBuffer cmd, int zx, int zz, int level) { cmd.SetBaseOffset(zx << 10, 0, zz << 10); cmd.BindVertexArray(glVao); - cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + if(glDrawOffset.length > 1) { + cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + } else { + cmd.DrawArrays(GL_TRIANGLES, glDrawOffset[0], glDrawLength[0]); + } } private static void pushRange(int start, int end) { @@ -625,7 +633,11 @@ private void flush(CommandBuffer cmd) { } else if (drawIdx != 0) { convertForDraw(VAO.VERT_SIZE); cmd.BindVertexArray(lastVao); - cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + if(glDrawOffset.length > 1) { + cmd.MultiDrawArrays(GL_TRIANGLES, glDrawOffset, glDrawLength); + } else { + cmd.DrawArrays(GL_TRIANGLES, glDrawOffset[0], glDrawLength[0]); + } drawIdx = 0; } }