From a8662d4dcefd88b67ffa391de0a13bf8c56b80a3 Mon Sep 17 00:00:00 2001
From: Hannes Janetzek <hannes.janetzek@gmail.com>
Date: Sun, 4 May 2014 22:25:31 +0200
Subject: [PATCH] s3db: disable postprocess mode

- seems old mali having issues with dependent texture reads..
- add bypass shader for testing
---
 vtm/resources/assets/shaders/post_bypass.glsl | 28 +++++++++
 .../org/oscim/layers/tile/s3db/S3DBLayer.java | 26 ++++++---
 .../layers/tile/vector/BuildingLayer.java     |  3 +-
 .../org/oscim/renderer/OffscreenRenderer.java | 57 +++++++++++++------
 4 files changed, 89 insertions(+), 25 deletions(-)
 create mode 100644 vtm/resources/assets/shaders/post_bypass.glsl

diff --git a/vtm/resources/assets/shaders/post_bypass.glsl b/vtm/resources/assets/shaders/post_bypass.glsl
new file mode 100644
index 00000000..65162fb7
--- /dev/null
+++ b/vtm/resources/assets/shaders/post_bypass.glsl
@@ -0,0 +1,28 @@
+#ifdef GLES
+precision highp float;
+#endif
+uniform vec2 u_pixel;
+attribute vec4 a_pos;
+varying vec2 tex_pos;
+
+void main()
+{
+  gl_Position = a_pos;
+  tex_pos = (a_pos.xy + 1.0) * 0.5;
+}
+
+$$
+
+#ifdef GLES
+precision highp float;
+#endif
+uniform sampler2D u_texColor;
+uniform vec2 u_pixel;
+varying vec2 tex_pos;
+
+void main(){
+  
+  gl_FragColor = texture2D(u_texColor, tex_pos) * 0.8;
+}
+
+
diff --git a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java b/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java
index df21c952..57bcaba3 100644
--- a/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java
+++ b/vtm/src/org/oscim/layers/tile/s3db/S3DBLayer.java
@@ -8,6 +8,7 @@ import org.oscim.map.Map;
 import org.oscim.renderer.ExtrusionRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.OffscreenRenderer;
+import org.oscim.renderer.OffscreenRenderer.Mode;
 import org.oscim.tiling.TileSource;
 import org.oscim.utils.ColorUtil;
 import org.oscim.utils.ColorsCSS;
@@ -16,6 +17,7 @@ import org.slf4j.LoggerFactory;
 
 public class S3DBLayer extends TileLayer {
 	static final Logger log = LoggerFactory.getLogger(S3DBLayer.class);
+	static final boolean POST_FXAA = false;
 
 	private final static int MAX_CACHE = 20;
 	private final static int SRC_ZOOM = 16;
@@ -46,23 +48,31 @@ public class S3DBLayer extends TileLayer {
 
 		public S3DBRenderer() {
 			mExtRenderer = new ExtrusionRenderer(this, 16, true, false);
-
-			or = new OffscreenRenderer();
-			or.setRenderer(mExtRenderer);
+			if (POST_FXAA) {
+				or = new OffscreenRenderer(Mode.FXAA);
+				or.setRenderer(mExtRenderer);
+			}
 		}
 
 		@Override
 		protected synchronized void update(GLViewport v) {
 			super.update(v);
-			//mExtRenderer.update(v);
-			or.update(v);
-			setReady(or.isReady());
+			if (POST_FXAA) {
+				or.update(v);
+				setReady(or.isReady());
+			} else {
+				mExtRenderer.update(v);
+				setReady(mExtRenderer.isReady());
+			}
 		}
 
 		@Override
 		protected synchronized void render(GLViewport v) {
-			or.render(v);
-			//mExtRenderer.render(v);
+			if (POST_FXAA) {
+				or.render(v);
+			} else {
+				mExtRenderer.render(v);
+			}
 		}
 	}
 
diff --git a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java
index 834b5f27..67a6d875 100644
--- a/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java
+++ b/vtm/src/org/oscim/layers/tile/vector/BuildingLayer.java
@@ -26,6 +26,7 @@ import org.oscim.map.Map;
 import org.oscim.renderer.ExtrusionRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.OffscreenRenderer;
+import org.oscim.renderer.OffscreenRenderer.Mode;
 import org.oscim.renderer.elements.ElementLayers;
 import org.oscim.renderer.elements.ExtrusionLayer;
 import org.oscim.theme.styles.ExtrusionStyle;
@@ -100,7 +101,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
 		};
 
 		if (POST_AA) {
-			OffscreenRenderer or = new OffscreenRenderer();
+			OffscreenRenderer or = new OffscreenRenderer(Mode.FXAA);
 			or.setRenderer(mExtRenderer);
 			mRenderer = or;
 		} else {
diff --git a/vtm/src/org/oscim/renderer/OffscreenRenderer.java b/vtm/src/org/oscim/renderer/OffscreenRenderer.java
index ad1891a9..19a05bf9 100644
--- a/vtm/src/org/oscim/renderer/OffscreenRenderer.java
+++ b/vtm/src/org/oscim/renderer/OffscreenRenderer.java
@@ -9,6 +9,13 @@ import org.slf4j.LoggerFactory;
 public class OffscreenRenderer extends LayerRenderer {
 	final static Logger log = LoggerFactory.getLogger(OffscreenRenderer.class);
 
+	public enum Mode {
+		FXAA,
+		SSAO,
+		SSAO_FXAA,
+		BYPASS
+	}
+
 	int fb;
 	int renderTex;
 	int renderDepth;
@@ -20,6 +27,7 @@ public class OffscreenRenderer extends LayerRenderer {
 	private float[] mClearColor = { 0, 0, 0, 0 };
 
 	private boolean useDepthTexture = false;
+	private Shader mShader;
 
 	static class Shader extends GLShader {
 		int aPos, uTexDepth, uTexColor, uPixel;
@@ -34,6 +42,12 @@ public class OffscreenRenderer extends LayerRenderer {
 		}
 	}
 
+	public final Mode mode;
+
+	public OffscreenRenderer(Mode mode) {
+		this.mode = mode;
+	}
+
 	protected boolean setupFBO(GLViewport viewport) {
 		IntBuffer buf = MapRenderer.getIntBuffer(1);
 
@@ -54,8 +68,11 @@ public class OffscreenRenderer extends LayerRenderer {
 		// generate color texture
 		GL.glBindTexture(GL20.GL_TEXTURE_2D, renderTex);
 
-		GLUtils.setTextureParameter(GL20.GL_NEAREST,
-		                            GL20.GL_NEAREST,
+		GLUtils.setTextureParameter(
+		                            GL20.GL_LINEAR,
+		                            GL20.GL_LINEAR,
+		                            //GL20.GL_NEAREST,
+		                            //GL20.GL_NEAREST,
 		                            GL20.GL_CLAMP_TO_EDGE,
 		                            GL20.GL_CLAMP_TO_EDGE);
 
@@ -121,13 +138,8 @@ public class OffscreenRenderer extends LayerRenderer {
 
 	static void init(GL20 gl20) {
 		GL = gl20;
-		shaders[0] = new Shader("post_fxaa");
-		shaders[1] = new Shader("post_ssao");
-		shaders[2] = new Shader("post_combined");
 	}
 
-	static Shader[] shaders = new Shader[3];
-
 	public void enable(boolean on) {
 		if (on)
 			GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, fb);
@@ -149,9 +161,23 @@ public class OffscreenRenderer extends LayerRenderer {
 
 	@Override
 	public void update(GLViewport viewport) {
-		if (texW != viewport.getWidth() || texH != viewport.getHeight())
+		if (texW != viewport.getWidth() || texH != viewport.getHeight()) {
 			setupFBO(viewport);
-
+			switch (mode) {
+				case FXAA:
+					mShader = new Shader("post_fxaa");
+					break;
+				case SSAO:
+					mShader = new Shader("post_ssao");
+					break;
+				case SSAO_FXAA:
+					mShader = new Shader("post_combined");
+					break;
+				case BYPASS:
+					mShader = new Shader("post_bypass");
+					break;
+			}
+		}
 		mRenderer.update(viewport);
 		setReady(mRenderer.isReady());
 	}
@@ -168,27 +194,26 @@ public class OffscreenRenderer extends LayerRenderer {
 
 		GL.glBindFramebuffer(GL20.GL_FRAMEBUFFER, 0);
 
-		Shader s = shaders[0];
-		s.useProgram();
+		mShader.useProgram();
 
 		/* bind depth texture */
 		if (useDepthTexture) {
 			GL.glActiveTexture(GL20.GL_TEXTURE1);
 			GLState.bindTex2D(renderDepth);
-			GL.glUniform1i(s.uTexDepth, 1);
+			GL.glUniform1i(mShader.uTexDepth, 1);
 			GL.glActiveTexture(GL20.GL_TEXTURE0);
 		}
 		/* bind color texture */
 		GLState.bindTex2D(renderTex);
-		GL.glUniform1i(s.uTexColor, 0);
+		GL.glUniform1i(mShader.uTexColor, 0);
 
-		MapRenderer.bindQuadVertexVBO(s.aPos, true);
+		MapRenderer.bindQuadVertexVBO(mShader.aPos, true);
 
-		GL.glUniform2f(s.uPixel,
+		GL.glUniform2f(mShader.uPixel,
 		               (float) (1.0 / texW * 0.5),
 		               (float) (1.0 / texH * 0.5));
 
-		GLState.enableVertexArrays(s.aPos, -1);
+		GLState.enableVertexArrays(mShader.aPos, -1);
 
 		GLState.test(false, false);
 		GLState.blend(true);