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
private int captureNextFrameId;
private GLData data;
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 List<GLTexture> contentTextures = new ArrayList<>();
private List<Bitmap> contentBitmaps = new ArrayList<>();
private Map<Integer, GLShader> shaders = new HashMap<>();
private Map<Integer, GLFBO> fbos = new HashMap<>();
private Map<Integer, GLShader> shaders;
private Map<Integer, GLFBO> 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<Uri, GLImage> 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, Float> uniformsFloat = new HashMap<>();
Map<String, IntBuffer> 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();
}
......
......@@ -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;
......
......@@ -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();
......
......@@ -27,7 +27,7 @@ public class RNGLContext extends ReactContextBaseJavaModule {
"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<>();
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));
}
}
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