MapRenderer: refactor native buffer utils
This commit is contained in:
parent
a835d44187
commit
01830707dc
@ -16,8 +16,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.renderer;
|
package org.oscim.renderer;
|
||||||
|
|
||||||
import java.nio.ByteBuffer;
|
|
||||||
import java.nio.ByteOrder;
|
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
import java.nio.IntBuffer;
|
import java.nio.IntBuffer;
|
||||||
import java.nio.ShortBuffer;
|
import java.nio.ShortBuffer;
|
||||||
@ -29,8 +27,6 @@ import org.oscim.map.Map;
|
|||||||
import org.oscim.renderer.elements.ElementLayers;
|
import org.oscim.renderer.elements.ElementLayers;
|
||||||
import org.oscim.renderer.elements.TextureItem;
|
import org.oscim.renderer.elements.TextureItem;
|
||||||
import org.oscim.renderer.elements.TextureLayer;
|
import org.oscim.renderer.elements.TextureLayer;
|
||||||
import org.oscim.utils.pool.Inlist;
|
|
||||||
import org.oscim.utils.pool.Pool;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -54,61 +50,15 @@ public class MapRenderer {
|
|||||||
public static long frametime;
|
public static long frametime;
|
||||||
private static boolean rerender;
|
private static boolean rerender;
|
||||||
|
|
||||||
/**
|
private static NativeBufferPool mBufferPool;
|
||||||
* Pool to retrieve temporary native buffer on GL-Thread:
|
|
||||||
* This pool ensures to not use the same buffer to upload data twice
|
|
||||||
* within a frame.
|
|
||||||
* - Contrary to what the OpenGL doc says data seems *not* to be
|
|
||||||
* always* copied after glBufferData returns...
|
|
||||||
* - Somehow it does always copy when using Android GL bindings
|
|
||||||
* but not when using libgdx bindings (LWJGL or AndroidGL20)
|
|
||||||
*/
|
|
||||||
static class BufferPool extends Pool<BufferItem> {
|
|
||||||
private BufferItem mUsedBuffers;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected BufferItem createItem() {
|
|
||||||
// unused;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public BufferItem get(int size) {
|
|
||||||
BufferItem b = mPool;
|
|
||||||
|
|
||||||
if (b == null) {
|
|
||||||
b = new BufferItem();
|
|
||||||
} else {
|
|
||||||
mPool = b.next;
|
|
||||||
b.next = null;
|
|
||||||
}
|
|
||||||
if (b.tmpBufferSize < size)
|
|
||||||
b.growBuffer(size);
|
|
||||||
|
|
||||||
mUsedBuffers = Inlist.push(mUsedBuffers, b);
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void releaseBuffers() {
|
|
||||||
mUsedBuffers = releaseAll(mUsedBuffers);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static BufferPool mBufferPool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param map
|
|
||||||
* the MapView
|
|
||||||
*/
|
|
||||||
public MapRenderer(Map map) {
|
public MapRenderer(Map map) {
|
||||||
|
|
||||||
mMap = map;
|
mMap = map;
|
||||||
|
|
||||||
mViewport = new GLViewport();
|
mViewport = new GLViewport();
|
||||||
mBufferPool = new BufferPool();
|
mBufferPool = new NativeBufferPool();
|
||||||
|
|
||||||
// FIXME should be done in 'destroy' method
|
/* FIXME should be done in 'destroy' method
|
||||||
// clear all previous vbo refs
|
* clear all previous vbo refs */
|
||||||
BufferObject.clear();
|
BufferObject.clear();
|
||||||
setBackgroundColor(Color.DKGRAY);
|
setBackgroundColor(Color.DKGRAY);
|
||||||
}
|
}
|
||||||
@ -117,57 +67,6 @@ public class MapRenderer {
|
|||||||
mClearColor = GLUtils.colorToFloat(color);
|
mClearColor = GLUtils.colorToFloat(color);
|
||||||
}
|
}
|
||||||
|
|
||||||
static class BufferItem extends Inlist<BufferItem> {
|
|
||||||
|
|
||||||
ShortBuffer shortBuffer;
|
|
||||||
FloatBuffer floatBuffer;
|
|
||||||
IntBuffer intBuffer;
|
|
||||||
int tmpBufferSize;
|
|
||||||
|
|
||||||
void growBuffer(int size) {
|
|
||||||
//log.debug("grow buffer " + size);
|
|
||||||
// 32kb min size
|
|
||||||
if (size < (1 << 15))
|
|
||||||
size = (1 << 15);
|
|
||||||
|
|
||||||
ByteBuffer buf = ByteBuffer
|
|
||||||
.allocateDirect(size)
|
|
||||||
.order(ByteOrder.nativeOrder());
|
|
||||||
|
|
||||||
this.floatBuffer = buf.asFloatBuffer();
|
|
||||||
this.shortBuffer = buf.asShortBuffer();
|
|
||||||
this.intBuffer = buf.asIntBuffer();
|
|
||||||
this.tmpBufferSize = size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only use on GL Thread! Get a native ShortBuffer for temporary use.
|
|
||||||
*/
|
|
||||||
public static ShortBuffer getShortBuffer(int size) {
|
|
||||||
BufferItem b = mBufferPool.get(size * 2);
|
|
||||||
b.shortBuffer.clear();
|
|
||||||
return b.shortBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only use on GL Thread! Get a native FloatBuffer for temporary use.
|
|
||||||
*/
|
|
||||||
public static FloatBuffer getFloatBuffer(int size) {
|
|
||||||
BufferItem b = mBufferPool.get(size * 4);
|
|
||||||
b.floatBuffer.clear();
|
|
||||||
return b.floatBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Only use on GL Thread! Get a native IntBuffer for temporary use.
|
|
||||||
*/
|
|
||||||
public static IntBuffer getIntBuffer(int size) {
|
|
||||||
BufferItem b = mBufferPool.get(size * 4);
|
|
||||||
b.intBuffer.clear();
|
|
||||||
return b.intBuffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDrawFrame() {
|
public void onDrawFrame() {
|
||||||
frametime = System.currentTimeMillis();
|
frametime = System.currentTimeMillis();
|
||||||
draw();
|
draw();
|
||||||
@ -197,8 +96,8 @@ public class MapRenderer {
|
|||||||
mViewport.setFrom(mMap.viewport());
|
mViewport.setFrom(mMap.viewport());
|
||||||
|
|
||||||
if (GLAdapter.debugView) {
|
if (GLAdapter.debugView) {
|
||||||
// modify this to scale only the view, to see
|
/* modify this to scale only the view, to see
|
||||||
// which tiles are rendered
|
* which tiles are rendered */
|
||||||
mViewport.mvp.setScale(0.5f, 0.5f, 1);
|
mViewport.mvp.setScale(0.5f, 0.5f, 1);
|
||||||
mViewport.viewproj.multiplyLhs(mViewport.mvp);
|
mViewport.viewproj.multiplyLhs(mViewport.mvp);
|
||||||
mViewport.proj.multiplyLhs(mViewport.mvp);
|
mViewport.proj.multiplyLhs(mViewport.mvp);
|
||||||
@ -365,4 +264,17 @@ public class MapRenderer {
|
|||||||
public static void animate() {
|
public static void animate() {
|
||||||
rerender = true;
|
rerender = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static FloatBuffer getFloatBuffer(int size) {
|
||||||
|
return mBufferPool.getFloatBuffer(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ShortBuffer getShortBuffer(int size) {
|
||||||
|
return mBufferPool.getShortBuffer(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IntBuffer getIntBuffer(int size) {
|
||||||
|
return mBufferPool.getIntBuffer(size);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
123
vtm/src/org/oscim/renderer/NativeBufferPool.java
Normal file
123
vtm/src/org/oscim/renderer/NativeBufferPool.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
package org.oscim.renderer;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.nio.FloatBuffer;
|
||||||
|
import java.nio.IntBuffer;
|
||||||
|
import java.nio.ShortBuffer;
|
||||||
|
|
||||||
|
import org.oscim.renderer.NativeBufferPool.BufferItem;
|
||||||
|
import org.oscim.utils.pool.Inlist;
|
||||||
|
import org.oscim.utils.pool.Pool;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pool to retrieve temporary native buffer on GL-Thread:
|
||||||
|
* This pool ensures to not use the same buffer to upload data twice
|
||||||
|
* within a frame.
|
||||||
|
* - Contrary to what the OpenGL doc says data seems *not* to be
|
||||||
|
* always* copied after glBufferData returns...
|
||||||
|
* - Somehow it does always copy when using Android GL bindings
|
||||||
|
* but not when using libgdx bindings (LWJGL or AndroidGL20)
|
||||||
|
*/
|
||||||
|
public class NativeBufferPool extends Pool<BufferItem> {
|
||||||
|
|
||||||
|
static final class BufferItem extends Inlist<BufferItem> {
|
||||||
|
ByteBuffer byteBuffer;
|
||||||
|
ShortBuffer sBuffer;
|
||||||
|
FloatBuffer fBuffer;
|
||||||
|
IntBuffer iBuffer;
|
||||||
|
|
||||||
|
int size;
|
||||||
|
|
||||||
|
void growBuffer(int size) {
|
||||||
|
//log.debug("grow buffer " + size);
|
||||||
|
// 32kb min size
|
||||||
|
if (size < (1 << 15))
|
||||||
|
size = (1 << 15);
|
||||||
|
|
||||||
|
byteBuffer = ByteBuffer
|
||||||
|
.allocateDirect(size)
|
||||||
|
.order(ByteOrder.nativeOrder());
|
||||||
|
this.size = size;
|
||||||
|
|
||||||
|
sBuffer = null;
|
||||||
|
iBuffer = null;
|
||||||
|
fBuffer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BufferItem mUsedBuffers;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected BufferItem createItem() {
|
||||||
|
// unused;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BufferItem get(int size) {
|
||||||
|
BufferItem b = mPool;
|
||||||
|
|
||||||
|
if (b == null) {
|
||||||
|
b = new BufferItem();
|
||||||
|
} else {
|
||||||
|
mPool = b.next;
|
||||||
|
b.next = null;
|
||||||
|
}
|
||||||
|
if (b.size < size)
|
||||||
|
b.growBuffer(size);
|
||||||
|
|
||||||
|
mUsedBuffers = Inlist.push(mUsedBuffers, b);
|
||||||
|
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void releaseBuffers() {
|
||||||
|
mUsedBuffers = releaseAll(mUsedBuffers);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only use on GL Thread! Get a native ShortBuffer for temporary use.
|
||||||
|
*/
|
||||||
|
public ShortBuffer getShortBuffer(int size) {
|
||||||
|
BufferItem b = get(size * 2);
|
||||||
|
|
||||||
|
if (b.sBuffer == null) {
|
||||||
|
b.byteBuffer.clear();
|
||||||
|
b.sBuffer = b.byteBuffer.asShortBuffer();
|
||||||
|
} else {
|
||||||
|
b.sBuffer.clear();
|
||||||
|
}
|
||||||
|
return b.sBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only use on GL Thread! Get a native FloatBuffer for temporary use.
|
||||||
|
*/
|
||||||
|
public FloatBuffer getFloatBuffer(int size) {
|
||||||
|
BufferItem b = get(size * 4);
|
||||||
|
if (b.fBuffer == null) {
|
||||||
|
b.byteBuffer.clear();
|
||||||
|
b.fBuffer = b.byteBuffer.asFloatBuffer();
|
||||||
|
} else {
|
||||||
|
b.fBuffer.clear();
|
||||||
|
}
|
||||||
|
b.fBuffer.clear();
|
||||||
|
|
||||||
|
return b.fBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Only use on GL Thread! Get a native IntBuffer for temporary use.
|
||||||
|
*/
|
||||||
|
public IntBuffer getIntBuffer(int size) {
|
||||||
|
BufferItem b = get(size * 4);
|
||||||
|
if (b.iBuffer == null) {
|
||||||
|
b.byteBuffer.clear();
|
||||||
|
b.iBuffer = b.byteBuffer.asIntBuffer();
|
||||||
|
} else {
|
||||||
|
b.iBuffer.clear();
|
||||||
|
}
|
||||||
|
return b.iBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user