From f207a6eb4a763e2762563f4c83f6c9c3f7b2eccb Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 7 May 2014 18:05:41 +0200 Subject: [PATCH] add workaround for adreno driver issue --- vtm/src/org/oscim/backend/GLAdapter.java | 6 ++++ .../oscim/layers/marker/MarkerRenderer.java | 3 ++ .../tile/vector/labeling/TextRenderer.java | 11 +++++-- .../org/oscim/renderer/ElementRenderer.java | 25 ++++++++++++---- .../renderer/elements/ElementLayers.java | 7 +++++ .../oscim/renderer/elements/TextureLayer.java | 30 ++++++++++++++----- 6 files changed, 67 insertions(+), 15 deletions(-) diff --git a/vtm/src/org/oscim/backend/GLAdapter.java b/vtm/src/org/oscim/backend/GLAdapter.java index 0d68aea9..ac41af74 100644 --- a/vtm/src/org/oscim/backend/GLAdapter.java +++ b/vtm/src/org/oscim/backend/GLAdapter.java @@ -29,6 +29,12 @@ public class GLAdapter { 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() { if (g == null) throw new IllegalStateException(); diff --git a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java index 90c0fe05..24858995 100644 --- a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java +++ b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java @@ -19,6 +19,7 @@ package org.oscim.layers.marker; import java.util.Comparator; +import org.oscim.backend.GLAdapter; import org.oscim.core.MercatorProjection; import org.oscim.core.Point; import org.oscim.core.Tile; @@ -61,6 +62,8 @@ public class MarkerRenderer extends ElementRenderer { } public MarkerRenderer(MarkerLayer markerLayer, MarkerSymbol defaultSymbol) { + layers.useVBO = GLAdapter.VBO_TEXTURE_LAYERS; + mSymbolLayer = new SymbolLayer(); mMarkerLayer = markerLayer; mDefaultMarker = defaultSymbol; diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java index 87a9abdf..3a1faa78 100644 --- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java +++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java @@ -30,6 +30,8 @@ package org.oscim.layers.tile.vector.labeling; // 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.renderer.ElementRenderer; import org.oscim.renderer.GLState; @@ -47,6 +49,8 @@ class TextRenderer extends ElementRenderer { public TextRenderer(Worker worker) { mWorker = worker; + + layers.useVBO = GLAdapter.VBO_TEXTURE_LAYERS; } long lastDraw = 0; @@ -77,14 +81,17 @@ class TextRenderer extends ElementRenderer { GLState.test(false, false); //Debug.draw(pos, layers); - layers.vbo.bind(); + if (layers.useVBO) + layers.vbo.bind(); + else + GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0); float scale = (float) (v.pos.scale / mMapPosition.scale); setMatrix(v, false); for (RenderElement l = layers.getTextureLayers(); l != null;) - l = TextureLayer.Renderer.draw(l, v, scale); + l = TextureLayer.Renderer.draw(layers, l, v, scale); } } diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/ElementRenderer.java index fb6bc4e7..b9357fcc 100644 --- a/vtm/src/org/oscim/renderer/ElementRenderer.java +++ b/vtm/src/org/oscim/renderer/ElementRenderer.java @@ -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.TEXLINE; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.nio.ShortBuffer; import org.oscim.backend.GL20; @@ -80,7 +82,11 @@ public abstract class ElementRenderer extends LayerRenderer { protected synchronized void render(GLViewport v) { MapPosition layerPos = mMapPosition; - layers.vbo.bind(); + if (layers.useVBO) + layers.vbo.bind(); + else + GL.glBindBuffer(GL20.GL_ARRAY_BUFFER, 0); + GLState.test(false, false); GLState.blend(true); @@ -121,7 +127,7 @@ public abstract class ElementRenderer extends LayerRenderer { continue; } if (l.type == SYMBOL) { - l = TextureLayer.Renderer.draw(l, v, div); + l = TextureLayer.Renderer.draw(layers, l, v, div); continue; } log.debug("invalid layer {}", l.type); @@ -144,7 +150,7 @@ public abstract class ElementRenderer extends LayerRenderer { return; } - if (layers.vbo == null) + if (layers.useVBO && layers.vbo == null) layers.vbo = BufferObject.get(GL20.GL_ARRAY_BUFFER, newSize); if (uploadLayers(layers, newSize, true)) @@ -157,7 +163,15 @@ public abstract class ElementRenderer extends LayerRenderer { if (addFill) 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) sbuf.put(fillCoords, 0, 8); @@ -172,8 +186,9 @@ public abstract class ElementRenderer extends LayerRenderer { + " buffer fill: " + sbuf.remaining()); return false; } + if (layers.useVBO) + layers.vbo.loadBufferData(sbuf.flip(), newSize * 2); - layers.vbo.loadBufferData(sbuf.flip(), newSize * 2); return true; } diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/elements/ElementLayers.java index 1c087ea8..87667044 100644 --- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java +++ b/vtm/src/org/oscim/renderer/elements/ElementLayers.java @@ -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.TEXLINE; +import java.nio.ByteBuffer; import java.nio.ShortBuffer; import org.oscim.backend.GL20; @@ -72,6 +73,10 @@ public class ElementLayers extends TileData { * ... */ 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: @@ -379,6 +384,8 @@ public class ElementLayers extends TileData { if (vbo != null) vbo = BufferObject.release(vbo); + + vertexArrayBuffer = null; } @Override diff --git a/vtm/src/org/oscim/renderer/elements/TextureLayer.java b/vtm/src/org/oscim/renderer/elements/TextureLayer.java index a62fe11f..c39ee970 100644 --- a/vtm/src/org/oscim/renderer/elements/TextureLayer.java +++ b/vtm/src/org/oscim/renderer/elements/TextureLayer.java @@ -150,14 +150,15 @@ public abstract class TextureLayer extends RenderElement { pool.init(0); } - public static RenderElement draw(RenderElement l, GLViewport v, float scale) { - shader.useProgram(); + public static RenderElement draw(ElementLayers layers, RenderElement l, + GLViewport v, float scale) { GLState.test(false, false); GLState.blend(true); - TextureLayer tl = (TextureLayer) l; + shader.useProgram(); + TextureLayer tl = (TextureLayer) l; GL.glUniform1f(shader.uScale, tl.fixed ? 1 / scale : 1); v.proj.setAsUniform(shader.uProj); @@ -179,18 +180,31 @@ public abstract class TextureLayer extends RenderElement { * / 6(indices) == 8) */ int off = (t.offset + i) * 8 + tl.offset; - GL.glVertexAttribPointer(shader.aPos, 4, - GL20.GL_SHORT, false, 12, off); - - GL.glVertexAttribPointer(shader.aTexCoord, 2, - GL20.GL_SHORT, false, 12, off + 8); + if (layers.useVBO) { + GL.glVertexAttribPointer(shader.aPos, 4, + GL20.GL_SHORT, + false, 12, off); + GL.glVertexAttribPointer(shader.aTexCoord, 2, + 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; if (numVertices > maxVertices) numVertices = maxVertices; GL.glDrawElements(GL20.GL_TRIANGLES, numVertices, GL20.GL_UNSIGNED_SHORT, 0); + } }