add workaround for adreno driver issue
This commit is contained in:
parent
1ca175c598
commit
f207a6eb4a
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
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);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
layers.vbo.bind();
|
if (layers.useVBO)
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
GL.glVertexAttribPointer(shader.aPos, 4,
|
if (layers.useVBO) {
|
||||||
GL20.GL_SHORT, false, 12, off);
|
GL.glVertexAttribPointer(shader.aPos, 4,
|
||||||
|
GL20.GL_SHORT,
|
||||||
GL.glVertexAttribPointer(shader.aTexCoord, 2,
|
false, 12, off);
|
||||||
GL20.GL_SHORT, false, 12, off + 8);
|
|
||||||
|
|
||||||
|
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;
|
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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user