mColorBufferType = EGL_RGB_BUFFER;
mConfigCaveat = isSlowConfig() ? EGL_SLOW_CONFIG : EGL_NONE;
mConfigID = 0;
- mConformant = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT;
+ mConformant = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
switch (depthStencilFormat)
{
mNativeRenderable = EGL_FALSE;
mNativeVisualID = 0;
mNativeVisualType = 0;
- mRenderableType = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT;
+ mRenderableType = EGL_OPENGL_ES_BIT | EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT;
mSampleBuffers = multiSample ? 1 : 0;
mSamples = multiSample;
mSurfaceType = EGL_PBUFFER_BIT | EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT;
context = es1::createContext(config, shareContext);
}
}
- else if(clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT)
+ else if((clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT) ||
+ (clientVersion == 3 && config->mRenderableType & EGL_OPENGL_ES3_BIT))
{
if(es2::createContext != 0)
{
- context = es2::createContext(config, shareContext);
+ context = es2::createContext(config, shareContext, clientVersion);
}
}
else
#endif\r
\r
libGLESv2 = loadLibrary(libGLESv2_lib);\r
- es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLESv2, "glCreateContext");\r
+ es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*, EGLint))getProcAddress(libGLESv2, "glCreateContext");\r
es2::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");\r
\r
es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLES_CM, "createBackBuffer");\r
\r
namespace es2\r
{\r
- egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;\r
+ egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion) = 0;\r
__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;\r
}\r
\r
// libGLESv2 dependencies
namespace es2
{
- extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
+ extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion);
extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
}
\r
namespace es2\r
{\r
-Context::Context(const egl::Config *config, const Context *shareContext) : mConfig(config)\r
+Context::Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion)\r
+ : mConfig(config), clientVersion(clientVersion)\r
{\r
sw::Context *context = new sw::Context();\r
device = new es2::Device(context);\r
delete this;\r
}\r
\r
-int Context::getClientVersion()\r
+EGLint Context::getClientVersion()\r
{\r
- return 2;\r
+ return clientVersion;\r
}\r
\r
// This function will set all of the state-related dirty flags, so that all state is set during next pre-draw.\r
// Exported functions for use by EGL\r
extern "C"\r
{\r
- es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext)\r
+ es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext, int clientVersion)\r
{\r
- return new es2::Context(config, shareContext);\r
+ return new es2::Context(config, shareContext, clientVersion);\r
}\r
}\r
class Context : public egl::Context\r
{\r
public:\r
- Context(const egl::Config *config, const Context *shareContext);\r
+ Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion);\r
\r
virtual void makeCurrent(egl::Surface *surface);\r
virtual void destroy();\r
- virtual int getClientVersion();\r
+ virtual EGLint getClientVersion();\r
\r
void markAllStateDirty();\r
\r
bool cullSkipsDraw(GLenum drawMode);\r
bool isTriangleMode(GLenum drawMode);\r
\r
+ const EGLint clientVersion;\r
const egl::Config *const mConfig;\r
\r
State mState;\r
return error(GL_INVALID_VALUE);\r
}\r
\r
- if(internalformat != format)\r
- {\r
- return error(GL_INVALID_OPERATION);\r
- }\r
+ es2::Context *context = es2::getContext();\r
\r
- switch(format)\r
+ if(context)\r
{\r
- case GL_ALPHA:\r
- case GL_LUMINANCE:\r
- case GL_LUMINANCE_ALPHA:\r
- switch(type)\r
+ if(context->getClientVersion() < 3)\r
{\r
- case GL_UNSIGNED_BYTE:\r
- case GL_FLOAT:\r
- case GL_HALF_FLOAT_OES:\r
- break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
+ if(internalformat != format)\r
+ {\r
+ return error(GL_INVALID_OPERATION);\r
+ }\r
}\r
- break;\r
- case GL_RGB:\r
- switch(type)\r
+\r
+ switch(format)\r
{\r
- case GL_UNSIGNED_BYTE:\r
- case GL_UNSIGNED_SHORT_5_6_5:\r
- case GL_FLOAT:\r
- case GL_HALF_FLOAT_OES:\r
+ case GL_ALPHA:\r
+ case GL_LUMINANCE:\r
+ case GL_LUMINANCE_ALPHA:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_BYTE:\r
+ case GL_FLOAT:\r
+ case GL_HALF_FLOAT_OES:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_RGBA:\r
- switch(type)\r
- {\r
- case GL_UNSIGNED_BYTE:\r
- case GL_UNSIGNED_SHORT_4_4_4_4:\r
- case GL_UNSIGNED_SHORT_5_5_5_1:\r
- case GL_FLOAT:\r
- case GL_HALF_FLOAT_OES:\r
+ case GL_RGB:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_BYTE:\r
+ case GL_UNSIGNED_SHORT_5_6_5:\r
+ case GL_FLOAT:\r
+ case GL_HALF_FLOAT_OES:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_BGRA_EXT:\r
- switch(type)\r
- {\r
- case GL_UNSIGNED_BYTE:\r
+ case GL_RGBA:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_BYTE:\r
+ case GL_UNSIGNED_SHORT_4_4_4_4:\r
+ case GL_UNSIGNED_SHORT_5_5_5_1:\r
+ case GL_FLOAT:\r
+ case GL_HALF_FLOAT_OES:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_ETC1_RGB8_OES:\r
- return error(GL_INVALID_OPERATION);\r
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
- if(S3TC_SUPPORT)\r
- {\r
+ case GL_BGRA_EXT:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_BYTE:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
+ break;\r
+ case GL_ETC1_RGB8_OES:\r
return error(GL_INVALID_OPERATION);\r
- }\r
- else\r
- {\r
- return error(GL_INVALID_ENUM);\r
- }\r
- case GL_DEPTH_COMPONENT:\r
- switch(type)\r
- {\r
- case GL_UNSIGNED_SHORT:\r
- case GL_UNSIGNED_INT:\r
+ case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
+ case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
+ case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
+ case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
+ if(S3TC_SUPPORT)\r
+ {\r
+ return error(GL_INVALID_OPERATION);\r
+ }\r
+ else\r
+ {\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
+ case GL_DEPTH_COMPONENT:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_SHORT:\r
+ case GL_UNSIGNED_INT:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
break;\r
- default:\r
- return error(GL_INVALID_ENUM);\r
- }\r
- break;\r
- case GL_DEPTH_STENCIL_OES:\r
- switch(type)\r
- {\r
- case GL_UNSIGNED_INT_24_8_OES:\r
+ case GL_DEPTH_STENCIL_OES:\r
+ switch(type)\r
+ {\r
+ case GL_UNSIGNED_INT_24_8_OES:\r
+ break;\r
+ default:\r
+ return error(GL_INVALID_ENUM);\r
+ }\r
break;\r
default:\r
- return error(GL_INVALID_ENUM);\r
+ return error(GL_INVALID_VALUE);\r
}\r
- break;\r
- default:\r
- return error(GL_INVALID_VALUE);\r
- }\r
\r
- if(border != 0)\r
- {\r
- return error(GL_INVALID_VALUE);\r
- }\r
-\r
- es2::Context *context = es2::getContext();\r
+ if(border != 0)\r
+ {\r
+ return error(GL_INVALID_VALUE);\r
+ }\r
\r
- if(context)\r
- {\r
switch(target)\r
{\r
case GL_TEXTURE_2D:\r
{\r
egl::Context *context = egl::getCurrentContext();\r
\r
- if(context && context->getClientVersion() == 2)\r
+ if(context && (context->getClientVersion() == 2 ||\r
+ context->getClientVersion() == 3))\r
{\r
return static_cast<es2::Context*>(context);\r
}\r