Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
109f87d
Enable new functionality of GL ES 2/3/3.1 via ifdefs
Sep 6, 2015
7da164f
Android Studio 1.3/1.4 compatibility, and a fix.
Sep 6, 2015
8b5fd4c
Get an OpenGL ES 3.1 context if possible.
Sep 8, 2015
9a7d728
Fixes.
Sep 8, 2015
e134fe6
Misc fixes
Sep 12, 2015
d2b980e
Minor fixes when using GLES1.
Sep 17, 2015
fab1a21
More consistent API.
Sep 17, 2015
880f6bc
Update EGL window class to use new GLES settings class.
Sep 17, 2015
e78931f
Fixed problem with broken textures.
Sep 18, 2015
5d842fa
Smaller fixes
Sep 30, 2015
ba78f1a
.
Sep 30, 2015
5362e39
Remove old android changes
danoli3 Apr 6, 2026
7a09c58
ofImageType
danoli3 Apr 7, 2026
d5d69b7
ofGLRenderer
danoli3 Apr 7, 2026
bd98b51
ofGLUtils fix
danoli3 Apr 7, 2026
d5cf302
Update ofAppEGLWindow.cpp
danoli3 Apr 7, 2026
48fa5f2
OpenGLES 3 changes for ofFbo and ofGLProgrammableRenderer
danoli3 Apr 7, 2026
1b5d861
Refactor GLES version variables in ofGLESWindowSettings
danoli3 Apr 7, 2026
3c92729
OpenGLES 3.0 and Emscripten
danoli3 Apr 7, 2026
c4a1f6d
ofBufferObject OpenGLES 3 fixes
danoli3 Apr 8, 2026
91f6bdc
ofVbo and ofFbo OpenGLES 3 fixes
danoli3 Apr 8, 2026
57f4ed5
ofWindowSettings fix for scope
danoli3 Apr 8, 2026
cfc2f20
OpenGLES 3 fixes for ofGLProgrammableRenderer and BaseTypes
danoli3 Apr 8, 2026
cb9d066
OpenGLES 3
danoli3 Apr 8, 2026
46311e0
OpenGLES fixes
danoli3 Apr 8, 2026
97791e3
OpenGLES shader defaults fixed
danoli3 Apr 8, 2026
971962c
ofMaterial fixes
danoli3 Apr 8, 2026
ee082cf
Android Window
danoli3 Apr 8, 2026
ca9bfb0
ofAppAndroidWindow Fix
danoli3 Apr 8, 2026
e828d0a
ofAppAndroidWindow
danoli3 Apr 8, 2026
0ccd339
Android Window
danoli3 Apr 8, 2026
e42e434
ofGLUtils Android Fix
danoli3 Apr 8, 2026
2d221d9
OpenGLES 3.0
danoli3 Aug 11, 2026
2149e56
ofWindowSettings with hidpi c++ default cpy ctor
danoli3 Apr 9, 2026
412ebfc
OpenGLES defines with targetable undefs in ofConstants
danoli3 Apr 9, 2026
0ce676b
ofMesh Mode to Triangles on init
danoli3 Apr 9, 2026
676097e
ofShader Fix
danoli3 Apr 9, 2026
ec3219a
OpenGL fixes
danoli3 Apr 9, 2026
521f28b
Update Emscripten to 6.0.6
danoli3 Aug 6, 2026
13b4474
Fix client-side mesh indices on OpenGL ES 2
danoli3 Aug 6, 2026
9d59e0d
Restore line topology for ofMesh axis
danoli3 Aug 6, 2026
9c2607a
Guard desktop buffer invalidation on OpenGL ES
danoli3 Aug 6, 2026
b53ea8b
Android View null fix
danoli3 Aug 6, 2026
2e225c8
Add Android GLES lifecycle hardware stress test
danoli3 Aug 6, 2026
242eb57
Skip Android hardware tests on desktop CI
danoli3 Aug 6, 2026
7eec513
OpenGL / OpenGL ES Tests
danoli3 Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/manual-web-examples.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Docker Step
run: docker run -di --name emscripten -v $PWD:/src emscripten/emsdk:3.1.50 bash
run: docker run -di --name emscripten -v $PWD:/src emscripten/emsdk:6.0.6 bash
- name: Download libs
run: ./scripts/dev/download_libs.sh -p emscripten
- name: Install dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/of.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
steps:
- uses: actions/checkout@v6
- name: Docker Step
run: "docker run -di --name emscripten -v $PWD:/src emscripten/emsdk:5.0.7 bash"
run: "docker run -di --name emscripten -v $PWD:/src emscripten/emsdk:6.0.6 bash"
# - name: Determine Release
# id: vars
# shell: bash
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,14 +273,14 @@ public static void onResume(){
OFAndroid.onStart();
}
}
else if( glView.getRenderer() == null){
else if(glView == null || glView.getRenderer() == null){
Log.w(TAG,"onResume glView is null or not setup");
OFAndroid.setupGL(OFAndroid.eglVersion, true);
if(OFAndroidLifeCycle.coreLibraryLoaded && OFAndroidLifeCycle.appLibraryLoaded) {
OFAndroid.onStart();
}
}
else if( glView != null && glView.getDisplay() == null) {
else if(glView.getDisplay() == null) {
Log.w(TAG,"onResume glView has a null display");
OFAndroid.setupGL(OFAndroid.eglVersion, true);
if(OFAndroidLifeCycle.coreLibraryLoaded && OFAndroidLifeCycle.appLibraryLoaded) {
Expand Down
109 changes: 53 additions & 56 deletions addons/ofxAndroid/src/ofAppAndroidWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,19 @@ ofAppAndroidWindow::ofAppAndroidWindow() {
window = this;
msaaSamples = 1;
glesVersion = 2;

#ifdef TARGET_PROGRAMMABLE_GL
#ifdef GL_ES_VERSION_3_0
glesVersion = 3;
#ifdef GL_ES_VERSION_3_1
glesVersionMinor = 1;
#endif
#else
glesVersion = 2;
#endif
#else
glesVersion = 1;
#endif
window = this;
ofGetMainLoop()->setCurrentWindow(this);
}

Expand Down Expand Up @@ -164,17 +176,22 @@ ofAppAndroidWindow::~ofAppAndroidWindow() {
// TODO Auto-generated destructor stub
}


bool ofAppAndroidWindow::isSurfaceDestroyed() {
return surfaceDestroyed;
}

void ofAppAndroidWindow::setup(const ofGLESWindowSettings & settings)
{
glesVersion = settings.getGLESVersionMajor();
glesVersionMinor = settings.getGLESVersionMinor();
setup( (const ofxAndroidWindowSettings &)settings );
}

void ofAppAndroidWindow::setup(const ofxAndroidWindowSettings & settings){

glesVersion = settings.getGLESVersionMajor();
glesVersionMinor = settings.getGLESVersionMinor();
if(window == nullptr) {
ofLogError("ofAppAndroidWindow") << "Setup and Window is nullptr ! Fixing";
setCurrentWindow();
Expand All @@ -186,25 +203,18 @@ void ofAppAndroidWindow::setup(const ofxAndroidWindowSettings & settings){
}else{
currentRenderer = std::make_shared<ofGLProgrammableRenderer>(this);
}

jclass javaClass = ofGetJNIEnv()->FindClass("cc/openframeworks/OFAndroid");

if(javaClass==nullptr){
ofLogError("ofAppAndroidWindow") << "setupOpenGL(): couldn't find OFAndroid java class";
return;
}

makeCurrent();

jmethodID method = ofGetJNIEnv()->GetStaticMethodID(javaClass,"setupGL","(IZ)V");
if(!method){
ofLogError("ofAppAndroidWindow") << "setupOpenGL(): couldn't find OFAndroid setupGL method";
return;
}

ofGetJNIEnv()->CallStaticVoidMethod(javaClass,method,glesVersion,settings.preserveContextOnPause);


}

void ofAppAndroidWindow::update(){
Expand Down Expand Up @@ -330,6 +340,10 @@ int ofAppAndroidWindow::getGlesVersion()
return glesVersion;
}

int ofAppAndroidWindow::getGlesVersionMinor()
{
return glesVersionMinor;
}

extern "C"{

Expand Down Expand Up @@ -443,57 +457,46 @@ Java_cc_openframeworks_OFAndroid_onSurfaceDestroyed( JNIEnv* env, jclass thiz
}
}


JNIEXPORT void JNICALL
Java_cc_openframeworks_OFAndroid_onSurfaceCreated( JNIEnv* env, jclass thiz ){
if(appSetup){
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated";
if(!surfaceDestroyed){
ofNotifyEvent(ofxAndroidEvents().unloadGL);
}
ofNotifyEvent(ofxAndroidEvents().reloadGL);
window->renderer()->pushStyle();
window->renderer()->setupGraphicDefaults();
window->renderer()->popStyle();
window->setThreadedEvents(false);
int glesVersion = window->getGlesVersion();
bSetupScreen = true;
if( glesVersion < 2 )
{
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 1";
dynamic_cast<ofGLRenderer*>(window->renderer().get())->setup();
}
else
{
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 2.0";
dynamic_cast<ofGLProgrammableRenderer*>(window->renderer().get())->setup(glesVersion,0);
}
Java_cc_openframeworks_OFAndroid_onSurfaceCreated( JNIEnv* env, jclass thiz ){
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated";

}else{
if(window != nullptr) {
int glesVersion = window->getGlesVersion();
bSetupScreen = true;
if (glesVersion < 2) {
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 1";
dynamic_cast<ofGLRenderer *>(window->renderer().get())->setup();
} else {
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 2.0";
dynamic_cast<ofGLProgrammableRenderer *>(window->renderer().get())->setup(
glesVersion, 0);
}
}
}
if(!surfaceDestroyed && appSetup){
ofNotifyEvent(ofxAndroidEvents().unloadGL);
}
ofNotifyEvent(ofxAndroidEvents().reloadGL);

if(appSetup){
window->renderer()->pushStyle();
window->renderer()->setupGraphicDefaults();
window->renderer()->popStyle();
window->setThreadedEvents(false);
}

bSetupScreen = true;
int glesVersion = window->getGlesVersion();
int glesVersionMinor = window->getGlesVersionMinor();

if(glesVersion < 2){
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 1";
dynamic_cast<ofGLRenderer*>(window->renderer().get())->setup();
}else{
ofLogVerbose("ofAppAndroidWindow") << "onSurfaceCreated OpenGLES 2.0+";
dynamic_cast<ofGLProgrammableRenderer*>(window->renderer().get())->setup(glesVersion, glesVersionMinor);
}

surfaceDestroyed = false;
surfaceDestroyed = false;
}

JNIEXPORT jboolean JNICALL
Java_cc_openframeworks_OFAndroid_isWindowReady( JNIEnv* env, jclass thiz) {

if(window != nullptr && window->renderer() != nullptr) {
return true;
} else {
if(window != nullptr && window->renderer() != nullptr) {
return true;
} else {
return false;
}
}
}

JNIEXPORT void JNICALL
Expand Down Expand Up @@ -554,25 +557,19 @@ Java_cc_openframeworks_OFAndroid_setAssetManager(JNIEnv *env, jclass thiz,
jobject jAssetManager) {

env->NewGlobalRef(jAssetManager);

AAssetManager *aaAssetManager = AAssetManager_fromJava(env, jAssetManager);
if (aaAssetManager == nullptr) {
ofLogError("ofAppAndroidWindow") << "Could not obtain the AAssetManager";
return;
}

assetManager = aaAssetManager;

if(window == nullptr || (window != nullptr && window->renderer() == nullptr)) {
ofLogVerbose("ofAppAndroidWindow") << "setAssetManager window is null";
return;
}

window->setAssetManager(assetManager);




}

/* Call to render the next GL frame */
Expand Down
6 changes: 5 additions & 1 deletion addons/ofxAndroid/src/ofAppAndroidWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,16 +110,20 @@ class ofAppAndroidWindow: public ofAppBaseGLESWindow {


int getGlesVersion();
int getGlesVersionMinor();

AAssetManager& getAssetManager();
void setAssetManager(AAssetManager* assetManager);

int glesVersion;
int glesVersionMinor;



private:
ofCoreEvents coreEvents;
std::shared_ptr<ofBaseRenderer> currentRenderer;
int glesVersion;

int msaaSamples;
AAssetManager* assetManager = nullptr;

Expand Down
51 changes: 25 additions & 26 deletions addons/ofxAndroid/src/ofxAndroidVideoGrabber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,35 +132,34 @@ ofxAndroidVideoGrabber::Data::~Data(){
}

void ofxAndroidVideoGrabber::Data::loadTexture(){
ofTextureData td;
GLuint texId[1];
glGenTextures(1, texId);

glEnable(GL_TEXTURE_EXTERNAL_OES);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId[0]);

glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
if (!ofIsGLProgrammableRenderer()) {
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
ofTextureData td;
GLuint texId[1];
glGenTextures(1, texId);

glEnable(GL_TEXTURE_EXTERNAL_OES);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId[0]);

glDisable(GL_TEXTURE_EXTERNAL_OES);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// Set the externally created texture reference
texture.setUseExternalTextureID(texId[0]);
texture.texData.width = width;
texture.texData.height = height;
texture.texData.tex_w = width;
texture.texData.tex_h = height;
texture.texData.tex_t = 1; // Hack!
texture.texData.tex_u = 1;
texture.texData.textureTarget = GL_TEXTURE_EXTERNAL_OES;
texture.texData.glInternalFormat = GL_RGBA;
#ifndef TARGET_PROGRAMMABLE_GL
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
#endif

glDisable(GL_TEXTURE_EXTERNAL_OES);

// Set the externally created texture reference
texture.setUseExternalTextureID(texId[0]);
texture.texData.width = width;
texture.texData.height = height;
texture.texData.tex_w = width;
texture.texData.tex_h = height;
texture.texData.tex_t = 1; // Hack!
texture.texData.tex_u = 1;
texture.texData.textureTarget = GL_TEXTURE_EXTERNAL_OES;
texture.texData.glInternalFormat = GL_RGBA;
}


Expand Down Expand Up @@ -262,7 +261,7 @@ void ofxAndroidVideoGrabber::close(){
} else {
ofLogError("ofxAndroidVideoGrabber") << "close(): couldn't get OFAndroidVideoGrabber close grabber method";
}

data->bGrabberInited = false;
}

Expand Down
2 changes: 2 additions & 0 deletions addons/ofxAndroid/src/ofxAndroidVideoPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ void ofxAndroidVideoPlayer::reloadTexture(){
glTexParameterf(texture.texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(texture.texData.textureTarget, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(texture.texData.textureTarget, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
#ifndef TARGET_PROGRAMMABLE_GL
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
#endif

glDisable(texture.texData.textureTarget);

Expand Down
2 changes: 1 addition & 1 deletion addons/ofxEmscripten/src/ofxAppEmscriptenWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ EM_BOOL ofxAppEmscriptenWindow::mousedown_cb(int eventType, const EmscriptenMous
return true;
}
EM_BOOL ofxAppEmscriptenWindow::rescale(int* x, int* y) {

return false;
}

//------------------------------------------------------------
Expand Down
4 changes: 2 additions & 2 deletions addons/ofxEmscripten/src/ofxEmscriptenURLFileLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ ofHttpResponse ofxEmscriptenURLFileLoader::get(const string & url){

int ofxEmscriptenURLFileLoader::getAsync(const string & url, const string & name){
ofHttpRequest * req = new ofHttpRequest(url,name,false);
#if __EMSCRIPTEN_major__>1 || (__EMSCRIPTEN_major__==1 && __EMSCRIPTEN_minor__>22)
#if __EMSCRIPTEN_MAJOR__ > 1 || (__EMSCRIPTEN_MAJOR__ == 1 && __EMSCRIPTEN_MINOR__ > 22)
emscripten_async_wget2_data(url.c_str(), "GET", "", req, true, &onload_cb, &onerror_cb, NULL);
#endif
return req->getId();
Expand All @@ -37,7 +37,7 @@ ofHttpResponse ofxEmscriptenURLFileLoader::saveTo(const string & url, const of::

int ofxEmscriptenURLFileLoader::saveAsync(const string & url, const of::filesystem::path & path){
ofHttpRequest * req = new ofHttpRequest(url,url,true);
#if __EMSCRIPTEN_major__>1 || (__EMSCRIPTEN_major__==1 && __EMSCRIPTEN_minor__>22)
#if __EMSCRIPTEN_MAJOR__ > 1 || (__EMSCRIPTEN_MAJOR__ == 1 && __EMSCRIPTEN_MINOR__ > 22)
emscripten_async_wget2(url.c_str(), path.c_str(), "GET", "", req, &onload_file_cb, &onerror_file_cb, NULL);
#endif
return 0;
Expand Down
Loading
Loading