Commit 22bcf7cf by Jamie Madill

Implement KHR_create_context.

We need the functionality of this extension to support dEQP. Likely we only needed the minor version enum to not generate an error, but we can take the time to implement the few cases for the other enums as well. We don't support any debug context functionality currently, but we may want to support it in the future. BUG=angle:501 Change-Id: Ib74cd2e4581e054f8153bb358824d9296b9f8a1c Reviewed-on: https://chromium-review.googlesource.com/238083Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 2445143a
...@@ -660,10 +660,7 @@ void Display::initDisplayExtensionString() ...@@ -660,10 +660,7 @@ void Display::initDisplayExtensionString()
extensions.push_back("EGL_NV_post_sub_buffer"); extensions.push_back("EGL_NV_post_sub_buffer");
} }
#if defined (ANGLE_TEST_CONFIG)
// TODO: complete support for the EGL_KHR_create_context extension
extensions.push_back("EGL_KHR_create_context"); extensions.push_back("EGL_KHR_create_context");
#endif
std::ostringstream stream; std::ostringstream stream;
std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " ")); std::copy(extensions.begin(), extensions.end(), std::ostream_iterator<std::string>(stream, " "));
......
...@@ -463,9 +463,11 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -463,9 +463,11 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
"const EGLint *attrib_list = 0x%0.8p)", dpy, config, share_context, attrib_list); "const EGLint *attrib_list = 0x%0.8p)", dpy, config, share_context, attrib_list);
// Get the requested client version (default is 1) and check it is 2 or 3. // Get the requested client version (default is 1) and check it is 2 or 3.
EGLint client_version = 1; EGLint clientMajorVersion = 1;
bool reset_notification = false; EGLint clientMinorVersion = 0;
bool robust_access = false; EGLint contextFlags = 0;
bool resetNotification = false;
bool robustAccess = false;
if (attrib_list) if (attrib_list)
{ {
...@@ -474,25 +476,39 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -474,25 +476,39 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
switch (attribute[0]) switch (attribute[0])
{ {
case EGL_CONTEXT_CLIENT_VERSION: case EGL_CONTEXT_CLIENT_VERSION:
client_version = attribute[1]; clientMajorVersion = attribute[1];
break; break;
case EGL_CONTEXT_MINOR_VERSION:
clientMinorVersion = attribute[1];
break;
case EGL_CONTEXT_FLAGS_KHR:
contextFlags = attribute[1];
break;
case EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR:
// Only valid for OpenGL (non-ES) contexts
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT: case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
if (attribute[1] == EGL_TRUE) if (attribute[1] != EGL_TRUE && attribute[1] != EGL_FALSE)
{
SetGlobalError(Error(EGL_BAD_CONFIG)); // Unimplemented
return EGL_NO_CONTEXT;
// robust_access = true;
}
else if (attribute[1] != EGL_FALSE)
{ {
SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
robustAccess = (attribute[1] == EGL_TRUE);
break; break;
case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR:
META_ASSERT(EGL_LOSE_CONTEXT_ON_RESET_EXT == EGL_LOSE_CONTEXT_ON_RESET_KHR);
META_ASSERT(EGL_NO_RESET_NOTIFICATION_EXT == EGL_NO_RESET_NOTIFICATION_KHR);
// same as EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, fall through
case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT: case EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT:
if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT) if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT)
{ {
reset_notification = true; resetNotification = true;
} }
else if (attribute[1] != EGL_NO_RESET_NOTIFICATION_EXT) else if (attribute[1] != EGL_NO_RESET_NOTIFICATION_EXT)
{ {
...@@ -507,8 +523,29 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -507,8 +523,29 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
} }
} }
if (client_version != 2 && client_version != 3) if ((clientMajorVersion != 2 && clientMajorVersion != 3) || clientMinorVersion != 0)
{
SetGlobalError(Error(EGL_BAD_CONFIG));
return EGL_NO_CONTEXT;
}
// Note: EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR does not apply to ES
const EGLint validContextFlags = (EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR |
EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR);
if ((contextFlags & ~validContextFlags) != 0)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
}
if ((contextFlags & EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR) > 0)
{
robustAccess = true;
}
if (robustAccess)
{ {
// Unimplemented
SetGlobalError(Error(EGL_BAD_CONFIG)); SetGlobalError(Error(EGL_BAD_CONFIG));
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
...@@ -519,13 +556,13 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -519,13 +556,13 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
{ {
gl::Context* sharedGLContext = static_cast<gl::Context*>(share_context); gl::Context* sharedGLContext = static_cast<gl::Context*>(share_context);
if (sharedGLContext->isResetNotificationEnabled() != reset_notification) if (sharedGLContext->isResetNotificationEnabled() != resetNotification)
{ {
SetGlobalError(Error(EGL_BAD_MATCH)); SetGlobalError(Error(EGL_BAD_MATCH));
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
if (sharedGLContext->getClientVersion() != client_version) if (sharedGLContext->getClientVersion() != clientMajorVersion)
{ {
SetGlobalError(Error(EGL_BAD_CONTEXT)); SetGlobalError(Error(EGL_BAD_CONTEXT));
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
...@@ -545,8 +582,8 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -545,8 +582,8 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
} }
EGLContext context = EGL_NO_CONTEXT; EGLContext context = EGL_NO_CONTEXT;
Error error = display->createContext(config, client_version, static_cast<gl::Context*>(share_context), Error error = display->createContext(config, clientMajorVersion, static_cast<gl::Context*>(share_context),
reset_notification, robust_access, &context); resetNotification, robustAccess, &context);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment