Delegate extensions to the right implementation based on client version.
BUG=18110152
Change-Id: I3e7ccef4b466e3980210ce931ae9c1f0ff411a5b
Reviewed-on: https://swiftshader-review.googlesource.com/1272
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/GLES2/libEGL/libEGL.cpp b/src/GLES2/libEGL/libEGL.cpp
index b76a420..e5c92e3 100644
--- a/src/GLES2/libEGL/libEGL.cpp
+++ b/src/GLES2/libEGL/libEGL.cpp
@@ -1189,7 +1189,17 @@
}
}
- return gl2::getProcAddress(procname);
+ if(gl2::getProcAddress != 0)
+ {
+ __eglMustCastToProperFunctionPointerType proc = gl2::getProcAddress(procname);
+ if(proc) return proc;
+ }
+
+ if(gl::getProcAddress != 0)
+ {
+ __eglMustCastToProperFunctionPointerType proc = gl::getProcAddress(procname);
+ if(proc) return proc;
+ }
}
catch(std::bad_alloc&)
{
diff --git a/src/GLES2/libGLESv2/libGLESv2.cpp b/src/GLES2/libGLESv2/libGLESv2.cpp
index e60e5d3..657e7f0 100644
--- a/src/GLES2/libGLESv2/libGLESv2.cpp
+++ b/src/GLES2/libGLESv2/libGLESv2.cpp
@@ -6088,7 +6088,7 @@
try
{
- UNIMPLEMENTED(); // FIXME
+ UNIMPLEMENTED(); // FIXME
}
catch(std::bad_alloc&)
{
@@ -6098,6 +6098,12 @@
void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
{
+ if(egl::getClientVersion() == 1)
+ {
+ static PFNGLEGLIMAGETARGETTEXTURE2DOESPROC glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)gl::getProcAddress("glEGLImageTargetTexture2DOES");
+ return glEGLImageTargetTexture2DOES(target, image);
+ }
+
TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
try
diff --git a/src/GLES2/libGLESv2/main.cpp b/src/GLES2/libGLESv2/main.cpp
index a6a0d48..6055850 100644
--- a/src/GLES2/libGLESv2/main.cpp
+++ b/src/GLES2/libGLESv2/main.cpp
@@ -53,6 +53,15 @@
egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "eglGetCurrentContext");
egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "eglGetCurrentDisplay");
+ #if defined(_WIN32)
+ const char *libGLES_CM_lib = "libGLES_CM.dll";
+ #else
+ const char *libGLES_CM_lib = "libGLES_CM.so.1";
+ #endif
+
+ libGLES_CM = loadLibrary(libGLES_CM_lib);
+ gl::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");
+
return libEGL != 0;
}
@@ -62,6 +71,7 @@
glDetachThread();
freeLibrary(libEGL);
+ freeLibrary(libGLES_CM);
}
#if defined(_WIN32)
@@ -116,6 +126,16 @@
}
}
+namespace egl
+{
+GLint getClientVersion()
+{
+ Context *context = egl::getCurrentContext();
+
+ return context ? context->getClientVersion() : 0;
+}
+}
+
// Records an error code
void error(GLenum errorCode)
{
@@ -156,4 +176,10 @@
egl::Display *(*getCurrentDisplay)() = 0;
}
-void *libEGL = 0; // Handle to the libEGL module
\ No newline at end of file
+namespace gl
+{
+ __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;
+}
+
+void *libEGL = 0; // Handle to the libEGL module
+void *libGLES_CM = 0; // Handle to the libGLES_CM module
diff --git a/src/GLES2/libGLESv2/main.h b/src/GLES2/libGLESv2/main.h
index 99c8596..dea1c7d 100644
--- a/src/GLES2/libGLESv2/main.h
+++ b/src/GLES2/libGLESv2/main.h
@@ -30,6 +30,11 @@
Device *getDevice();
}
+namespace egl
+{
+ GLint getClientVersion();
+}
+
void error(GLenum errorCode);
template<class T>
@@ -47,6 +52,13 @@
extern egl::Display *(*getCurrentDisplay)();
}
-extern void *libEGL; // Handle to the libEGL module
+// libGLES_CM dependencies
+namespace gl
+{
+ extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
+}
+
+extern void *libEGL; // Handle to the libEGL module
+extern void *libGLES_CM; // Handle to the libGLES_CM module
#endif // LIBGLESV2_MAIN_H_