add workaround for adreno driver issue

This commit is contained in:
Hannes Janetzek 2014-05-07 18:05:41 +02:00
parent 1ca175c598
commit f207a6eb4a
6 changed files with 67 additions and 15 deletions

View File

@ -29,6 +29,12 @@ public class GLAdapter {
public static boolean NON_PREMUL_CANVAS; public static boolean NON_PREMUL_CANVAS;
/**
* Set false as workaround for adreno driver issue:
* https://github.com/opensciencemap/vtm/issues/52
*/
public static boolean VBO_TEXTURE_LAYERS = false;
public static GL20 get() { public static GL20 get() {
if (g == null) if (g == null)
throw new IllegalStateException(); throw new IllegalStateException();

View File

@ -19,6 +19,7 @@ package org.oscim.layers.marker;
import java.util.Comparator; import java.util.Comparator;
import org.oscim.backend.GLAdapter;
import org.oscim.core.MercatorProjection; import org.oscim.core.MercatorProjection;
import org.oscim.core.Point; import org.oscim.core.Point;
import org.oscim.core.Tile; import org.oscim.core.Tile;
@ -61,6 +62,8 @@ public class MarkerRenderer extends ElementRenderer {
} }
public MarkerRenderer(MarkerLayer<MarkerItem> markerLayer, MarkerSymbol defaultSymbol) { public MarkerRenderer(MarkerLayer<MarkerItem> markerLayer, MarkerSymbol defaultSymbol) {
layers.useVBO = GLAdapter.VBO_TEXTURE_LAYERS;
mSymbolLayer = new SymbolLayer(); mSymbolLayer = new SymbolLayer();
mMarkerLayer = markerLayer; mMarkerLayer = markerLayer;
mDefaultMarker = defaultSymbol; mDefaultMarker = defaultSymbol;

View File

@ -30,6 +30,8 @@ package org.oscim.layers.tile.vector.labeling;
// 5 QuadTree might be handy // 5 QuadTree might be handy
// //
import org.oscim.backend.GL20;
import org.oscim.backend.GLAdapter;
import org.oscim.layers.tile.vector.labeling.LabelLayer.Worker; import org.oscim.layers.tile.vector.labeling.LabelLayer.Worker;
import org.oscim.renderer.ElementRenderer; import org.oscim.renderer.ElementRenderer;
import org.oscim.renderer.GLState; import org.oscim.renderer.GLState;
@ -47,6 +49,8 @@ class TextRenderer extends ElementRenderer {
public TextRenderer(Worker worker) { public TextRenderer(Worker worker) {
mWorker = worker; mWorker = worker;
layers.useVBO = GLAdapter.VBO_TEXTURE_LAYERS;
} }
long lastDraw = 0; long lastDraw = 0;
@ -77,14 +81,17 @@ class TextRenderer extends ElementRenderer {
GLState.test(false, false); GLState.test(false, false);
//Debug.draw(pos, layers); //Debug.draw(pos, layers);
if (layers.useVBO)
layers.vbo.bind(); layers.vbo.bind();
else
GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
float scale = (float) (v.pos.scale / mMapPosition.scale); float scale = (float) (v.pos.scale / mMapPosition.scale);
setMatrix(v, false); setMatrix(v, false);
for (RenderElement l = layers.getTextureLayers(); l != null;) for (RenderElement l = layers.getTextureLayers(); l != null;)
l = TextureLayer.Renderer.draw(l, v, scale); l = TextureLayer.Renderer.draw(layers, l, v, scale);
} }
} }

View File

@ -23,6 +23,8 @@ import static org.oscim.renderer.elements.RenderElement.POLYGON;
import static org.oscim.renderer.elements.RenderElement.SYMBOL; import static org.oscim.renderer.elements.RenderElement.SYMBOL;
import static org.oscim.renderer.elements.RenderElement.TEXLINE; import static org.oscim.renderer.elements.RenderElement.TEXLINE;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import org.oscim.backend.GL20; import org.oscim.backend.GL20;
@ -80,7 +82,11 @@ public abstract class ElementRenderer extends LayerRenderer {
protected synchronized void render(GLViewport v) { protected synchronized void render(GLViewport v) {
MapPosition layerPos = mMapPosition; MapPosition layerPos = mMapPosition;
if (layers.useVBO)
layers.vbo.bind(); layers.vbo.bind();
else
GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0);
GLState.test(false, false); GLState.test(false, false);
GLState.blend(true); GLState.blend(true);
@ -121,7 +127,7 @@ public abstract class ElementRenderer extends LayerRenderer {
continue; continue;
} }
if (l.type == SYMBOL) { if (l.type == SYMBOL) {
l = TextureLayer.Renderer.draw(l, v, div); l = TextureLayer.Renderer.draw(layers, l, v, div);
continue; continue;
} }
log.debug("invalid layer {}", l.type); log.debug("invalid layer {}", l.type);
@ -144,7 +150,7 @@ public abstract class ElementRenderer extends LayerRenderer {
return; return;
} }
if (layers.vbo == null) if (layers.useVBO && layers.vbo == null)
layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize);
if (uploadLayers(layers, newSize, true)) if (uploadLayers(layers, newSize, true))
@ -157,7 +163,15 @@ public abstract class ElementRenderer extends LayerRenderer {
if (addFill) if (addFill)
newSize += 8; newSize += 8;
ShortBuffer sbuf = MapRenderer.getShortBuffer(newSize); ShortBuffer sbuf;
if (layers.useVBO) {
sbuf = MapRenderer.getShortBuffer(newSize);
} else {
layers.vertexArrayBuffer = ByteBuffer
.allocateDirect(newSize * 2)
.order(ByteOrder.nativeOrder());
sbuf = layers.vertexArrayBuffer.asShortBuffer();
}
if (addFill) if (addFill)
sbuf.put(fillCoords, 0, 8); sbuf.put(fillCoords, 0, 8);
@ -172,8 +186,9 @@ public abstract class ElementRenderer extends LayerRenderer {
+ " buffer fill: " + sbuf.remaining()); + " buffer fill: " + sbuf.remaining());
return false; return false;
} }
if (layers.useVBO)
layers.vbo.loadBufferData(sbuf.flip(), newSize * 2); layers.vbo.loadBufferData(sbuf.flip(), newSize * 2);
return true; return true;
} }

View File

@ -21,6 +21,7 @@ import static org.oscim.renderer.elements.RenderElement.MESH;
import static org.oscim.renderer.elements.RenderElement.POLYGON; import static org.oscim.renderer.elements.RenderElement.POLYGON;
import static org.oscim.renderer.elements.RenderElement.TEXLINE; import static org.oscim.renderer.elements.RenderElement.TEXLINE;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import org.oscim.backend.GL20; import org.oscim.backend.GL20;
@ -72,6 +73,10 @@ public class ElementLayers extends TileData {
* ... * ...
*/ */
public BufferObject vbo; public BufferObject vbo;
public boolean useVBO = true;
/* holds vertex data for rendering when not using VBO */
public ByteBuffer vertexArrayBuffer;
/** /**
* To not need to switch VertexAttribPointer positions all the time: * To not need to switch VertexAttribPointer positions all the time:
@ -379,6 +384,8 @@ public class ElementLayers extends TileData {
if (vbo != null) if (vbo != null)
vbo = BufferObject.release(vbo); vbo = BufferObject.release(vbo);
vertexArrayBuffer = null;
} }
@Override @Override

View File

@ -150,14 +150,15 @@ public abstract class TextureLayer extends RenderElement {
pool.init(0); pool.init(0);
} }
public static RenderElement draw(RenderElement l, GLViewport v, float scale) { public static RenderElement draw(ElementLayers layers, RenderElement l,
shader.useProgram(); GLViewport v, float scale) {
GLState.test(false, false); GLState.test(false, false);
GLState.blend(true); GLState.blend(true);
TextureLayer tl = (TextureLayer) l; shader.useProgram();
TextureLayer tl = (TextureLayer) l;
GL.glUniform1f(shader.uScale, tl.fixed ? 1 / scale : 1); GL.glUniform1f(shader.uScale, tl.fixed ? 1 / scale : 1);
v.proj.setAsUniform(shader.uProj); v.proj.setAsUniform(shader.uProj);
@ -179,18 +180,31 @@ public abstract class TextureLayer extends RenderElement {
* / 6(indices) == 8) */ * / 6(indices) == 8) */
int off = (t.offset + i) * 8 + tl.offset; int off = (t.offset + i) * 8 + tl.offset;
if (layers.useVBO) {
GL.glVertexAttribPointer(shader.aPos, 4, GL.glVertexAttribPointer(shader.aPos, 4,
GL20.GL_SHORT, false, 12, off); GL20.GL_SHORT,
false, 12, off);
GL.glVertexAttribPointer(shader.aTexCoord, 2, GL.glVertexAttribPointer(shader.aTexCoord, 2,
GL20.GL_SHORT, false, 12, off + 8); GL20.GL_SHORT,
false, 12, off + 8);
} else {
layers.vertexArrayBuffer.position(off);
GL.glVertexAttribPointer(shader.aPos, 4,
GL20.GL_SHORT, false, 12,
layers.vertexArrayBuffer);
layers.vertexArrayBuffer.position(off + 8);
GL.glVertexAttribPointer(shader.aTexCoord,
2, GL20.GL_SHORT, false, 12,
layers.vertexArrayBuffer);
}
int numVertices = t.vertices - i; int numVertices = t.vertices - i;
if (numVertices > maxVertices) if (numVertices > maxVertices)
numVertices = maxVertices; numVertices = maxVertices;
GL.glDrawElements(GL20.GL_TRIANGLES, numVertices, GL.glDrawElements(GL20.GL_TRIANGLES, numVertices,
GL20.GL_UNSIGNED_SHORT, 0); GL20.GL_UNSIGNED_SHORT, 0);
} }
} }