Skip to content

Commit bb76375

Browse files
committed
make BufferObject's regions getData() return a clean slice
1 parent 4b4780d commit bb76375

3 files changed

Lines changed: 37 additions & 30 deletions

File tree

jme3-core/src/main/java/com/jme3/shader/bufferobject/BufferRegion.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,21 +70,15 @@ public BufferRegion() {
7070
* @return ByteBuffer
7171
*/
7272
public ByteBuffer getData() {
73-
ByteBuffer d = bo.getData();
74-
if (source == null || d != source || slice == null) {
75-
source = d;
76-
int currentPos = source.position();
77-
int currentLimit = source.limit();
78-
assert end < source.capacity() : "Can't set limit at " + end + " on capacity " + source.capacity();
79-
source.limit(end + 1);
80-
source.position(start);
81-
slice = source.slice();
82-
slice.order(source.order());
83-
assert slice.limit() == (end - start + 1) : "Capacity is " + slice.limit() + " but " + (end - start + 1) + " expected";
84-
source.limit(currentLimit);
85-
source.position(currentPos);
86-
}
87-
slice.rewind();
73+
ByteBuffer source = bo.getData();
74+
assert end < source.capacity() : "Can't set limit at " + end + " on capacity " + source.capacity();
75+
76+
ByteBuffer view = source.duplicate();
77+
view.position(start);
78+
view.limit(end + 1);
79+
80+
ByteBuffer slice = view.slice().order(source.order());
81+
assert slice.limit() == (end - start + 1) : "Capacity is " + slice.limit() + " but " + (end - start + 1) + " expected";
8882
return slice;
8983
}
9084

jme3-core/src/main/java/com/jme3/shader/bufferobject/DirtyRegionsIterator.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,11 @@ private static class DirtyRegion extends BufferRegion {
4848

4949
@Override
5050
public ByteBuffer getData() {
51-
ByteBuffer d = bo.getData();
52-
if (source == null || d != source || slice == null) {
53-
source = d;
54-
int currentPos = source.position();
55-
int currentLimit = source.limit();
56-
source.limit(source.capacity());
57-
source.position(0);
58-
slice = source.slice();
59-
source.limit(currentLimit);
60-
source.position(currentPos);
61-
}
62-
slice.limit(end + 1);
63-
slice.position(start);
64-
return slice;
51+
ByteBuffer source = bo.getData();
52+
ByteBuffer view = source.duplicate();
53+
view.position(start);
54+
view.limit(end + 1);
55+
return view.slice().order(source.order());
6556
}
6657

6758
public void clearDirty() {

jme3-core/src/test/java/com/jme3/shader/bufferobject/DirtyRegionsIteratorTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
import static org.junit.jupiter.api.Assertions.assertEquals;
44
import static org.junit.jupiter.api.Assertions.assertFalse;
55
import static org.junit.jupiter.api.Assertions.assertNotNull;
6-
import static org.junit.jupiter.api.Assertions.assertNull;
76
import static org.junit.jupiter.api.Assertions.assertTrue;
87

98
import java.nio.ByteBuffer;
9+
import java.nio.ByteOrder;
1010
import java.util.Arrays;
1111

1212
import org.junit.jupiter.api.Test;
@@ -53,6 +53,28 @@ public void testMergedDirtyRegionSliceUsesInclusiveEnd() {
5353
assertEquals(8, region.getData().remaining());
5454
}
5555

56+
@Test
57+
public void testMergedDirtyRegionGetDataUsesZeroBasedSliceAndPreservesOrder() {
58+
BufferObject bo = new BufferObject();
59+
bo.setRegions(Arrays.asList(
60+
new BufferRegion(0, 3),
61+
new BufferRegion(4, 7),
62+
new BufferRegion(8, 11)));
63+
64+
bo.getData().order(ByteOrder.LITTLE_ENDIAN);
65+
bo.getRegion(0).markDirty();
66+
bo.getRegion(1).markDirty();
67+
bo.getRegion(2).clearDirty();
68+
bo.setUpdateNeeded(false);
69+
70+
BufferRegion region = bo.getDirtyRegions().next();
71+
ByteBuffer data = region.getData();
72+
73+
assertEquals(0, data.position());
74+
assertEquals(8, data.remaining());
75+
assertEquals(ByteOrder.LITTLE_ENDIAN, data.order());
76+
}
77+
5678
@Test
5779
public void testNoRegionsHasNextContract() {
5880
BufferObject bo = new BufferObject();

0 commit comments

Comments
 (0)