Commit 60386e4d authored by Gaëtan Renaudeau's avatar Gaëtan Renaudeau

one context per instance

parent 479bfb4f
...@@ -51,14 +51,14 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -51,14 +51,14 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
private int captureNextFrameId; private int captureNextFrameId;
private GLData data; private GLData data;
private List<Uri> imagesToPreload; private List<Uri> imagesToPreload;
private List<Uri> preloaded; private List<Uri> preloaded = new ArrayList<>(); // FIXME double check that this works
private Map<Uri, GLImage> images = new HashMap<>(); private Map<Uri, GLImage> images = new HashMap<>();
private List<GLTexture> contentTextures = new ArrayList<>(); private List<GLTexture> contentTextures = new ArrayList<>();
private List<Bitmap> contentBitmaps = new ArrayList<>(); private List<Bitmap> contentBitmaps = new ArrayList<>();
private Map<Integer, GLShader> shaders = new HashMap<>(); private Map<Integer, GLShader> shaders;
private Map<Integer, GLFBO> fbos = new HashMap<>(); private Map<Integer, GLFBO> fbos;
public GLCanvas(ThemedReactContext context) { public GLCanvas(ThemedReactContext context) {
super(context); super(context);
...@@ -78,9 +78,27 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -78,9 +78,27 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
requestRender(); 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 @Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 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 @Override
...@@ -182,7 +200,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -182,7 +200,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
} }
private boolean ensureCompiledShader (GLData data) { private boolean ensureCompiledShader (GLData data) {
GLShader shader = rnglContext.getShader(data.shader); GLShader shader = getShader(data.shader);
return shader != null && return shader != null &&
shader.ensureCompile() && shader.ensureCompile() &&
ensureCompiledShader(data.children) && ensureCompiledShader(data.children) &&
...@@ -341,7 +359,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -341,7 +359,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
public GLRenderData recSyncData (GLData data, HashMap<Uri, GLImage> images) { public GLRenderData recSyncData (GLData data, HashMap<Uri, GLImage> images) {
Map<Uri, GLImage> prevImages = this.images; Map<Uri, GLImage> prevImages = this.images;
GLShader shader = rnglContext.getShader(data.shader); GLShader shader = getShader(data.shader);
Map<String, Integer> uniformsInteger = new HashMap<>(); Map<String, Integer> uniformsInteger = new HashMap<>();
Map<String, Float> uniformsFloat = new HashMap<>(); Map<String, Float> uniformsFloat = new HashMap<>();
Map<String, IntBuffer> uniformsIntBuffer = new HashMap<>(); Map<String, IntBuffer> uniformsIntBuffer = new HashMap<>();
...@@ -390,7 +408,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -390,7 +408,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
} }
else if (t.equals("fbo")) { else if (t.equals("fbo")) {
int id = value.getInt("id"); int id = value.getInt("id");
GLFBO fbo = rnglContext.getFBO(id); GLFBO fbo = getFBO(id);
textures.put(uniformName, fbo.color.get(0)); textures.put(uniformName, fbo.color.get(0));
} }
else if (t.equals("uri")) { else if (t.equals("uri")) {
...@@ -580,7 +598,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R ...@@ -580,7 +598,7 @@ public class GLCanvas extends GLSurfaceView implements GLSurfaceView.Renderer, R
glViewport(0, 0, w, h); glViewport(0, 0, w, h);
} }
else { else {
GLFBO fbo = rnglContext.getFBO(renderData.fboId); GLFBO fbo = getFBO(renderData.fboId);
fbo.setShape(w, h); fbo.setShape(w, h);
fbo.bind(); fbo.bind();
} }
......
...@@ -22,7 +22,7 @@ https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/ ...@@ -22,7 +22,7 @@ https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/
also inspired from also inspired from
https://github.com/CyberAgent/android-gpuimage/blob/master/library/src/jp/co/cyberagent/android/gpuimage/GPUImage.java 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 final Context context;
private Uri src; private Uri src;
private GLTexture texture; private GLTexture texture;
......
...@@ -27,6 +27,12 @@ public class GLShader { ...@@ -27,6 +27,12 @@ public class GLShader {
this.frag = frag; this.frag = frag;
} }
public GLShader(GLShaderData data) {
this.name = data.name;
this.vert = data.vert;
this.frag = data.frag;
}
@Override @Override
protected void finalize() throws Throwable { protected void finalize() throws Throwable {
super.finalize(); super.finalize();
......
...@@ -27,7 +27,7 @@ public class RNGLContext extends ReactContextBaseJavaModule { ...@@ -27,7 +27,7 @@ public class RNGLContext extends ReactContextBaseJavaModule {
"uv = vec2(0.5, 0.5) * (position+vec2(1.0, 1.0));"+ "uv = vec2(0.5, 0.5) * (position+vec2(1.0, 1.0));"+
"}"; "}";
private Map<Integer, GLShader> shaders = new HashMap<>(); private Map<Integer, GLShaderData> shaders = new HashMap<>();
private Map<Integer, GLFBO> fbos = new HashMap<>(); private Map<Integer, GLFBO> fbos = new HashMap<>();
public RNGLContext (ReactApplicationContext reactContext) { public RNGLContext (ReactApplicationContext reactContext) {
...@@ -39,21 +39,14 @@ public class RNGLContext extends ReactContextBaseJavaModule { ...@@ -39,21 +39,14 @@ public class RNGLContext extends ReactContextBaseJavaModule {
return "RNGLContext"; return "RNGLContext";
} }
public GLShader getShader (Integer id) { public GLShaderData getShader (Integer id) {
return shaders.get(id); return shaders.get(id);
} }
public GLFBO getFBO (Integer id) {
if (!fbos.containsKey(id)) {
fbos.put(id, new GLFBO());
}
return fbos.get(id);
}
@ReactMethod @ReactMethod
public void addShader (final Integer id, final ReadableMap config) { public void addShader (final Integer id, final ReadableMap config) {
final String frag = config.getString("frag"); final String frag = config.getString("frag");
final String name = config.getString("name"); final String name = config.getString("name");
shaders.put(id, new GLShader(name, STATIC_VERT, frag)); shaders.put(id, new GLShaderData(name, STATIC_VERT, frag));
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment