expo-gl
Version:
Provides GLView that acts as OpenGL ES render target and gives GL context object implementing WebGL 2.0 specification.
41 lines (39 loc) • 1.5 kB
text/typescript
import { ExpoWebGLRenderingContext } from './GLView.types';
// This method needs to be in a separate file because react-native-reanimated
// import wrapped in try catch does not work correctly with inlineRequires option
// in metro.config.js
//
// It looks like in generated bundle "react-native-reanimated" is not present
// in _dependencyMap, but references to it count it as if it was, e.g. bundle contains
// a line "(0, _$$_REQUIRE(_dependencyMap[15], "./GLUtils").configureLogging)(gl);"
// but dependencyMap contains only 15 elements
export function createWorkletContextManager(): {
getContext: (contextId: number) => ExpoWebGLRenderingContext | undefined;
unregister?: (contextId: number) => void;
} {
try {
// reanimated needs to be imported before any workletized code
// is created, but we don't want to make it dependency on expo-gl.
const { runOnUI } = require('react-native-reanimated');
return {
getContext: (contextId: number): ExpoWebGLRenderingContext | undefined => {
'worklet';
return global.__EXGLContexts?.[String(contextId)];
},
unregister: (contextId: number): void => {
runOnUI((contextId: number) => {
'worklet';
if (global.__EXGLContexts) {
delete global.__EXGLContexts[String(contextId)];
}
})(contextId);
},
};
} catch {
return {
getContext: () => {
throw new Error('Worklet runtime is not available');
},
};
}
}