From 60386e4d2cca2d8a828165d637325d2b379cdec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Renaudeau?= Date: Mon, 16 Nov 2015 19:04:32 +0100 Subject: [PATCH] one context per instance --- .../com/projectseptember/RNGL/GLCanvas.java | 34 ++++++++++++++----- .../com/projectseptember/RNGL/GLImage.java | 2 +- .../com/projectseptember/RNGL/GLShader.java | 6 ++++ .../projectseptember/RNGL/RNGLContext.java | 13 ++----- 4 files changed, 36 insertions(+), 19 deletions(-) diff --git a/android/src/main/java/com/projectseptember/RNGL/GLCanvas.java b/android/src/main/java/com/projectseptember/RNGL/GLCanvas.java index b432e7e..4f0e5d8 100644 --- a/android/src/main/java/com/projectseptember/RNGL/GLCanvas.java +++ b/android/src/main/java/com/projectseptember/RNGL/GLCanvas.java @@ -51,14 +51,14 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R private int captureNextFrameId; private GLData data; private List imagesToPreload; - private List preloaded; + private List preloaded = new ArrayList<>(); // FIXME double check that this works private Map images = new HashMap<>(); private List contentTextures = new ArrayList<>(); private List contentBitmaps = new ArrayList<>(); - private Map shaders = new HashMap<>(); - private Map fbos = new HashMap<>(); + private Map shaders; + private Map fbos; public GLCanvas(ThemedReactContext context) { super(context); @@ -78,9 +78,27 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R requestRender(); } + public GLFBO getFBO (Integer id) { + if (!fbos.containsKey(id)) { + fbos.put(id, new GLFBO()); + } + return fbos.get(id); + } + + public GLShader getShader (Integer id) { + if (!shaders.containsKey(id)) { + GLShaderData shaderData = rnglContext.getShader(id); + if (shaderData == null) return null; + shaders.put(id, new GLShader(shaderData)); + } + return shaders.get(id); + } + @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { - // FIXME anything to do here? + fbos = new HashMap<>(); + shaders = new HashMap<>(); + // TODO : need to reset GLImage and GLTexture. in a smart way (images if already loaded just need to re-set the bitmap) } @Override @@ -182,7 +200,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R } private boolean ensureCompiledShader (GLData data) { - GLShader shader = rnglContext.getShader(data.shader); + GLShader shader = getShader(data.shader); return shader != null && shader.ensureCompile() && ensureCompiledShader(data.children) && @@ -341,7 +359,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R public GLRenderData recSyncData (GLData data, HashMap images) { Map prevImages = this.images; - GLShader shader = rnglContext.getShader(data.shader); + GLShader shader = getShader(data.shader); Map uniformsInteger = new HashMap<>(); Map uniformsFloat = new HashMap<>(); Map uniformsIntBuffer = new HashMap<>(); @@ -390,7 +408,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R } else if (t.equals("fbo")) { int id = value.getInt("id"); - GLFBO fbo = rnglContext.getFBO(id); + GLFBO fbo = getFBO(id); textures.put(uniformName, fbo.color.get(0)); } else if (t.equals("uri")) { @@ -580,7 +598,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R glViewport(0, 0, w, h); } else { - GLFBO fbo = rnglContext.getFBO(renderData.fboId); + GLFBO fbo = getFBO(renderData.fboId); fbo.setShape(w, h); fbo.bind(); } diff --git a/android/src/main/java/com/projectseptember/RNGL/GLImage.java b/android/src/main/java/com/projectseptember/RNGL/GLImage.java index 86e1da0..287b49a 100644 --- a/android/src/main/java/com/projectseptember/RNGL/GLImage.java +++ b/android/src/main/java/com/projectseptember/RNGL/GLImage.java @@ -22,7 +22,7 @@ https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/ also inspired from https://github.com/CyberAgent/android-gpuimage/blob/master/library/src/jp/co/cyberagent/android/gpuimage/GPUImage.java */ -public class GLImage { +public class GLImage { // TODO : we need to check support for local images private final Context context; private Uri src; private GLTexture texture; diff --git a/android/src/main/java/com/projectseptember/RNGL/GLShader.java b/android/src/main/java/com/projectseptember/RNGL/GLShader.java index 16b0184..e19dab7 100644 --- a/android/src/main/java/com/projectseptember/RNGL/GLShader.java +++ b/android/src/main/java/com/projectseptember/RNGL/GLShader.java @@ -27,6 +27,12 @@ public class GLShader { this.frag = frag; } + public GLShader(GLShaderData data) { + this.name = data.name; + this.vert = data.vert; + this.frag = data.frag; + } + @Override protected void finalize() throws Throwable { super.finalize(); diff --git a/android/src/main/java/com/projectseptember/RNGL/RNGLContext.java b/android/src/main/java/com/projectseptember/RNGL/RNGLContext.java index 4eb4814..7e29e19 100644 --- a/android/src/main/java/com/projectseptember/RNGL/RNGLContext.java +++ b/android/src/main/java/com/projectseptember/RNGL/RNGLContext.java @@ -27,7 +27,7 @@ public class RNGLContext extends ReactContextBaseJavaModule { "uv = vec2(0.5, 0.5) * (position+vec2(1.0, 1.0));"+ "}"; - private Map shaders = new HashMap<>(); + private Map shaders = new HashMap<>(); private Map fbos = new HashMap<>(); public RNGLContext (ReactApplicationContext reactContext) { @@ -39,21 +39,14 @@ public class RNGLContext extends ReactContextBaseJavaModule { return "RNGLContext"; } - public GLShader getShader (Integer id) { + public GLShaderData getShader (Integer id) { return shaders.get(id); } - public GLFBO getFBO (Integer id) { - if (!fbos.containsKey(id)) { - fbos.put(id, new GLFBO()); - } - return fbos.get(id); - } - @ReactMethod public void addShader (final Integer id, final ReadableMap config) { final String frag = config.getString("frag"); final String name = config.getString("name"); - shaders.put(id, new GLShader(name, STATIC_VERT, frag)); + shaders.put(id, new GLShaderData(name, STATIC_VERT, frag)); } } -- 2.26.2