From dd57734e0ceaceb0da78c7b83bac3e899bab89f2 Mon Sep 17 00:00:00 2001 From: Mihail Marinov Date: Thu, 13 Apr 2017 10:05:57 -0700 Subject: [PATCH] Fix problem with some of the demos that have custom shaders that are using GLSL ES version 100. --- .../framework/src/main/assets/_gvr.xml | 1 + .../org/gearvrf/GVRBaseShaderManager.java | 104 +++++++++++++++--- .../gearvrf/GVRPostEffectShaderManager.java | 18 ++- .../java/org/gearvrf/debug/GVRConsole.java | 3 +- 4 files changed, 108 insertions(+), 18 deletions(-) diff --git a/GVRf/Framework/framework/src/main/assets/_gvr.xml b/GVRf/Framework/framework/src/main/assets/_gvr.xml index f4709daf5..400147a53 100644 --- a/GVRf/Framework/framework/src/main/assets/_gvr.xml +++ b/GVRf/Framework/framework/src/main/assets/_gvr.xml @@ -28,6 +28,7 @@ framebufferPixelsHigh="DEFAULT" framebufferPixelsWide="DEFAULT" showLoadingIcon="true" + useMultiview="false" useProtectedFramebuffer="false" useSrgbFramebuffer="false" > diff --git a/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRBaseShaderManager.java b/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRBaseShaderManager.java index c4526da7b..72dac948c 100644 --- a/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRBaseShaderManager.java +++ b/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRBaseShaderManager.java @@ -16,6 +16,12 @@ package org.gearvrf; +import android.content.res.AssetManager; +import android.content.res.Resources; + +import org.gearvrf.utility.TextFile; +import org.gearvrf.utility.VrAppSettings; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -24,12 +30,6 @@ import java.util.HashMap; import java.util.Map; -import org.gearvrf.utility.TextFile; -import org.gearvrf.utility.VrAppSettings; - -import android.content.res.AssetManager; -import android.content.res.Resources; - /** * Encapsulates the implementation shared between GVRMaterialShaderManager * and GVRPostEffectShaderManager. @@ -42,7 +42,8 @@ protected GVRBaseShaderManager(GVRContext gvrContext, long pointer) { } /** - * Adds a shader from sources in the assets directory. + * Adds a shader from sources in the assets directory. Assumes the shaders use GLSL ES version + * 100. * @param pathPrefix * Optional (may be {@code null}) prefix for shader filenames. If * present, will be prepended to {@code vertexShader} and @@ -61,13 +62,36 @@ protected GVRBaseShaderManager(GVRContext gvrContext, long pointer) { @Override public GVRShaderId addShader(String pathPrefix, String vertexShader_asset, String fragmentShader_asset) { + return addShader(pathPrefix, vertexShader_asset, fragmentShader_asset, GLSLESVersion.V100); + } + + /** + * Adds a shader from sources in the assets directory. + * @param pathPrefix + * Optional (may be {@code null}) prefix for shader filenames. If + * present, will be prepended to {@code vertexShader} and + * {@code fragmentShader}, thus allowing you to build a tree of + * shaders in your assets directory, where each node contains + * vertex and fragment shaders with the same filename. If + * {@code null}, {@code vertexShader} and {@code fragmentShader} + * are the path names of files in the assets directory. + * @param vertexShader_asset + * Filename of a vertex shader, relative to the assets directory + * @param fragmentShader_asset + * Filename of a fragment shader, relative to the assets + * directory + * @param glslesVersion GLSL ES version used by the shaders + * @return ID of new shader added + */ + public GVRShaderId addShader(String pathPrefix, String vertexShader_asset, + String fragmentShader_asset, GLSLESVersion glslesVersion) { Resources resources = getResources(); try { InputStream vertexShader = open(resources, pathPrefix, vertexShader_asset); InputStream fragmentShader = open(resources, pathPrefix, fragmentShader_asset); - return newShader(vertexShader, fragmentShader); + return newShader(vertexShader, fragmentShader, glslesVersion); } catch (IOException e) { e.printStackTrace(); // give user a clue return null; @@ -75,7 +99,7 @@ public GVRShaderId addShader(String pathPrefix, String vertexShader_asset, } /** - * Adds a shader from sources in res/raw. + * Adds a shader from sources in res/raw. Assumes the shaders use GLSL ES version 100. * @param vertexShader_resRaw * R.raw id, for a file containing a vertex shader * @param fragmentShader_resRaw @@ -83,14 +107,27 @@ public GVRShaderId addShader(String pathPrefix, String vertexShader_asset, */ @Override public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw) { + return newShader(vertexShader_resRaw, fragmentShader_resRaw, GLSLESVersion.V100); + } + + /** + * Adds a shader from sources in res/raw. + * @param vertexShader_resRaw + * R.raw id, for a file containing a vertex shader + * @param fragmentShader_resRaw + * R.raw id, for a file containing a fragment shader + * @param glslesVersion GLSL ES version used by the shaders + */ + public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw, GLSLESVersion glslesVersion) { Resources resources = getResources(); InputStream vertexShader = open(resources, vertexShader_resRaw); InputStream fragmentShader = open(resources, fragmentShader_resRaw); - return newShader(vertexShader, fragmentShader); + return newShader(vertexShader, fragmentShader, glslesVersion); } /** - * Adds a shader from sources in separate input streams. + * Adds a shader from sources in separate input streams. Assumes the shaders use GLSL ES version + * 100. * @param vertexShader_stream * GLSL source code for a vertex shader. Stream will be closed * when method returns. @@ -101,20 +138,42 @@ public GVRShaderId newShader(int vertexShader_resRaw, int fragmentShader_resRaw) @Override public GVRShaderId newShader(InputStream vertexShader_stream, InputStream fragmentShader_stream) { + return newShader(vertexShader_stream, fragmentShader_stream, GLSLESVersion.V100); + } + + /** + * Adds a shader from sources in separate input streams. + * @param vertexShader_stream + * GLSL source code for a vertex shader. Stream will be closed + * when method returns. + * @param fragmentShader_stream + * GLSL source code for a fragment shader. Stream will be closed + * when method returns. + * @param glslesVersion GLSL ES version used by the shaders + */ + public GVRShaderId newShader(InputStream vertexShader_stream, + InputStream fragmentShader_stream, GLSLESVersion glslesVersion) { String vertexShader = TextFile.readTextFile(vertexShader_stream); String fragmentShader = TextFile.readTextFile(fragmentShader_stream); final VrAppSettings settings = getGVRContext().getActivity().getAppSettings(); - String defines="#version 300 es\n"; - if (settings.isMultiviewSet()) - { - defines = defines + "#define HAS_MULTIVIEW\n"; + + String defines; + if (GLSLESVersion.V300 == glslesVersion) { + defines = "#version " + glslesVersion.toInt() + " es\n"; + if (settings.isMultiviewSet()) + { + defines = defines + "#define HAS_MULTIVIEW\n"; + } + } else { + defines = ""; } + vertexShader = defines + vertexShader; fragmentShader = defines + fragmentShader; + return newShader(vertexShader, fragmentShader); } - /** * Retrieves the shader template of the specified class. * @@ -205,4 +264,17 @@ protected static InputStream open(Resources resources, int resRawId) { protected Map, GVRShaderTemplate> mShaderTemplates = new HashMap, GVRShaderTemplate>(); + public enum GLSLESVersion { + V100(100), + V300(300); + + private GLSLESVersion(int v) { + this.v = v; + } + private final int v; + + private int toInt() { + return v; + } + } } diff --git a/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRPostEffectShaderManager.java b/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRPostEffectShaderManager.java index d9fb365b7..082765fae 100644 --- a/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRPostEffectShaderManager.java +++ b/GVRf/Framework/framework/src/main/java/org/gearvrf/GVRPostEffectShaderManager.java @@ -77,7 +77,7 @@ public GVRShaderId newShader(String vertexShader, String fragmentShader) /** * Builds a shader program from the supplied vertex and fragment shader - * code from resources in res/raw. + * code from resources in res/raw. Assumes the shaders are using GLSL ES version 100. * * @param vertexShader_resRaw * R.raw id, for a file containing a vertex shader @@ -90,6 +90,22 @@ public GVRCustomPostEffectShaderId addShader(int vertexShader_resRaw, int fragme return (GVRCustomPostEffectShaderId) newShader(vertexShader_resRaw, fragmentShader_resRaw); } + /** + * Builds a shader program from the supplied vertex and fragment shader + * code from resources in res/raw. + * + * @param vertexShader_resRaw + * R.raw id, for a file containing a vertex shader + * @param fragmentShader_resRaw + * R.raw id, for a file containing a fragment shader + * @param glslesVersion GLSL ES version the shaders are using + * @return An opaque type that you can pass to {@link #getShaderMap(GVRCustomPostEffectShaderId)} + * or to the {@link GVRPostEffect} constructor and {@code setShader} methods. + */ + public GVRCustomPostEffectShaderId addShader(int vertexShader_resRaw, int fragmentShader_resRaw, GLSLESVersion glslesVersion) { + return (GVRCustomPostEffectShaderId) newShader(vertexShader_resRaw, fragmentShader_resRaw, glslesVersion); + } + @Override public GVRShaderMaps getShaderMapping(GVRShaderId id) { return posteffects.get(id); diff --git a/GVRf/Framework/framework/src/main/java/org/gearvrf/debug/GVRConsole.java b/GVRf/Framework/framework/src/main/java/org/gearvrf/debug/GVRConsole.java index ae0a9b0b9..6d4313eb5 100644 --- a/GVRf/Framework/framework/src/main/java/org/gearvrf/debug/GVRConsole.java +++ b/GVRf/Framework/framework/src/main/java/org/gearvrf/debug/GVRConsole.java @@ -20,6 +20,7 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import org.gearvrf.GVRBaseShaderManager; import org.gearvrf.GVRBitmapTexture; import org.gearvrf.GVRCamera; import org.gearvrf.GVRCameraRig; @@ -393,7 +394,7 @@ private static synchronized GVRPostEffectShaderId getShaderId( GVRPostEffectShaderManager shaderManager = gvrContext .getPostEffectShaderManager(); shaderId = shaderManager.addShader(R.raw.posteffect_quad, - R.raw.hud_console); + R.raw.hud_console, GVRBaseShaderManager.GLSLESVersion.V300); shaderMap = shaderManager.getShaderMap(shaderId); shaderMap.addTextureKey("u_overlay", MAIN_TEXTURE);