Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
a188849
Enable new functionality of GL ES 2/3/3.1 via ifdefs
Sep 6, 2015
c2607fc
Android Studio 1.3/1.4 compatibility, and a fix.
Sep 6, 2015
2ff0dd9
Get an OpenGL ES 3.1 context if possible.
Sep 8, 2015
930a323
Fixes.
Sep 8, 2015
88ebd73
Misc fixes
Sep 12, 2015
34d99a4
Minor fixes when using GLES1.
Sep 17, 2015
c39a8a1
More consistent API.
Sep 17, 2015
c4eb506
Update EGL window class to use new GLES settings class.
Sep 17, 2015
2202093
Fixed problem with broken textures.
Sep 18, 2015
0a0e8ca
Smaller fixes
Sep 30, 2015
0ab1b27
.
Sep 30, 2015
bb908d8
Remove old android changes
danoli3 Apr 6, 2026
38d0272
ofImageType
danoli3 Apr 7, 2026
2411707
ofGLRenderer
danoli3 Apr 7, 2026
ca0a7c3
ofGLUtils fix
danoli3 Apr 7, 2026
e7dd500
Update ofAppEGLWindow.cpp
danoli3 Apr 7, 2026
554a942
OpenGLES 3 changes for ofFbo and ofGLProgrammableRenderer
danoli3 Apr 7, 2026
abbb642
Refactor GLES version variables in ofGLESWindowSettings
danoli3 Apr 7, 2026
035a1c2
OpenGLES 3.0 and Emscripten
danoli3 Apr 7, 2026
be88e47
ofBufferObject OpenGLES 3 fixes
danoli3 Apr 8, 2026
cc19f02
ofVbo and ofFbo OpenGLES 3 fixes
danoli3 Apr 8, 2026
f0ecca2
ofWindowSettings fix for scope
danoli3 Apr 8, 2026
ea6e218
OpenGLES 3 fixes for ofGLProgrammableRenderer and BaseTypes
danoli3 Apr 8, 2026
7510a89
OpenGLES 3
danoli3 Apr 8, 2026
495400e
OpenGLES fixes
danoli3 Apr 8, 2026
e054404
OpenGLES shader defaults fixed
danoli3 Apr 8, 2026
a939676
ofMaterial fixes
danoli3 Apr 8, 2026
84dfcc4
Android Window
danoli3 Apr 8, 2026
b123a5d
ofAppAndroidWindow Fix
danoli3 Apr 8, 2026
7759c6a
ofAppAndroidWindow
danoli3 Apr 8, 2026
5eb2934
Android Window
danoli3 Apr 8, 2026
6a2377f
ofGLUtils Android Fix
danoli3 Apr 8, 2026
5e16e83
OpenGLES 3.0
danoli3 Aug 11, 2026
6197743
ofWindowSettings with hidpi c++ default cpy ctor
danoli3 Apr 9, 2026
deae16d
OpenGLES defines with targetable undefs in ofConstants
danoli3 Apr 9, 2026
c53c73f
ofMesh Mode to Triangles on init
danoli3 Apr 9, 2026
c0e4463
ofShader Fix
danoli3 Apr 9, 2026
2e34317
OpenGL fixes
danoli3 Apr 9, 2026
7d4ead6
Update Emscripten to 6.0.6
danoli3 Aug 6, 2026
92b995a
Fix client-side mesh indices on OpenGL ES 2
danoli3 Aug 6, 2026
9087f2b
Restore line topology for ofMesh axis
danoli3 Aug 6, 2026
90949f5
Guard desktop buffer invalidation on OpenGL ES
danoli3 Aug 6, 2026
b163468
Android View null fix
danoli3 Aug 6, 2026
3e5c08d
Add Android GLES lifecycle hardware stress test
danoli3 Aug 6, 2026
f4db476
Skip Android hardware tests on desktop CI
danoli3 Aug 6, 2026
b15ce0c
OpenGL / OpenGL ES Tests
danoli3 Aug 13, 2026
3895f44
Fix GLES CI: ccache CC, skip foreign tests, xvfb for GLFW
danoli3 Aug 31, 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