Commit b931e721 by Geoff Lang

Check for EGL extension existance during validation.

BUG=angle:658 Change-Id: I078d7f9ab4ab42bd7d3cd3865572ead8ed1f0b29 Reviewed-on: https://chromium-review.googlesource.com/234763Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 1b765456
...@@ -60,12 +60,6 @@ Error Surface::swap() ...@@ -60,12 +60,6 @@ Error Surface::swap()
Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
{ {
if (!isPostSubBufferSupported())
{
// Spec is not clear about how this should be handled.
return Error(EGL_SUCCESS);
}
return mImplementation->postSubBuffer(x, y, width, height); return mImplementation->postSubBuffer(x, y, width, height);
} }
......
...@@ -450,9 +450,19 @@ EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint a ...@@ -450,9 +450,19 @@ EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint a
*value = eglSurface->getWidth(); *value = eglSurface->getWidth();
break; break;
case EGL_POST_SUB_BUFFER_SUPPORTED_NV: case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
if (!display->getExtensions().postSubBuffer)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
*value = eglSurface->isPostSubBufferSupported(); *value = eglSurface->isPostSubBufferSupported();
break; break;
case EGL_FIXED_SIZE_ANGLE: case EGL_FIXED_SIZE_ANGLE:
if (!display->getExtensions().windowFixedSize)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
*value = eglSurface->isFixedSize(); *value = eglSurface->isFixedSize();
break; break;
default: default:
...@@ -469,6 +479,12 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -469,6 +479,12 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLContext share_context = 0x%0.8p, " EVENT("(EGLDisplay dpy = 0x%0.8p, EGLConfig config = 0x%0.8p, EGLContext share_context = 0x%0.8p, "
"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);
Display *display = static_cast<Display*>(dpy);
if (!ValidateDisplay(display))
{
return EGL_NO_CONTEXT;
}
// 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 clientMajorVersion = 1; EGLint clientMajorVersion = 1;
EGLint clientMinorVersion = 0; EGLint clientMinorVersion = 0;
...@@ -485,6 +501,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -485,6 +501,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
case EGL_CONTEXT_CLIENT_VERSION: case EGL_CONTEXT_CLIENT_VERSION:
clientMajorVersion = attribute[1]; clientMajorVersion = attribute[1];
break; break;
case EGL_CONTEXT_MINOR_VERSION: case EGL_CONTEXT_MINOR_VERSION:
clientMinorVersion = attribute[1]; clientMinorVersion = attribute[1];
break; break;
...@@ -499,12 +516,16 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -499,12 +516,16 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT: case EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT:
if (!display->getExtensions().createContextRobustness)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
}
if (attribute[1] != EGL_TRUE && attribute[1] != EGL_FALSE) if (attribute[1] != EGL_TRUE && 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); robustAccess = (attribute[1] == EGL_TRUE);
break; break;
...@@ -513,6 +534,11 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -513,6 +534,11 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
META_ASSERT(EGL_NO_RESET_NOTIFICATION_EXT == EGL_NO_RESET_NOTIFICATION_KHR); META_ASSERT(EGL_NO_RESET_NOTIFICATION_EXT == EGL_NO_RESET_NOTIFICATION_KHR);
// same as EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, fall through // 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 (!display->getExtensions().createContextRobustness)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
}
if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT) if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT)
{ {
resetNotification = true; resetNotification = true;
...@@ -523,6 +549,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -523,6 +549,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
break; break;
default: default:
SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
...@@ -557,12 +584,9 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -557,12 +584,9 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
Display *display = static_cast<Display*>(dpy);
if (share_context) if (share_context)
{ {
gl::Context* sharedGLContext = static_cast<gl::Context*>(share_context); gl::Context* sharedGLContext = static_cast<gl::Context*>(share_context);
if (sharedGLContext->isResetNotificationEnabled() != resetNotification) if (sharedGLContext->isResetNotificationEnabled() != resetNotification)
{ {
SetGlobalError(Error(EGL_BAD_MATCH)); SetGlobalError(Error(EGL_BAD_MATCH));
......
...@@ -65,6 +65,12 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa ...@@ -65,6 +65,12 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
return EGL_FALSE; return EGL_FALSE;
} }
if (!display->getExtensions().querySurfacePointer)
{
SetGlobalError(Error(EGL_SUCCESS));
return EGL_FALSE;
}
if (surface == EGL_NO_SURFACE) if (surface == EGL_NO_SURFACE)
{ {
SetGlobalError(Error(EGL_BAD_SURFACE)); SetGlobalError(Error(EGL_BAD_SURFACE));
...@@ -75,7 +81,13 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa ...@@ -75,7 +81,13 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
switch (attribute) switch (attribute)
{ {
case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE: case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
if (!display->getExtensions().surfaceD3DTexture2DShareHandle)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
break; break;
default: default:
SetGlobalError(Error(EGL_BAD_ATTRIBUTE)); SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE; return EGL_FALSE;
...@@ -118,6 +130,13 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin ...@@ -118,6 +130,13 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin
return EGL_FALSE; return EGL_FALSE;
} }
if (!display->getExtensions().postSubBuffer)
{
// Spec is not clear about how this should be handled.
SetGlobalError(Error(EGL_SUCCESS));
return EGL_TRUE;
}
Error error = eglSurface->postSubBuffer(x, y, width, height); Error error = eglSurface->postSubBuffer(x, y, width, height);
if (error.isError()) if (error.isError())
{ {
...@@ -135,9 +154,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp ...@@ -135,9 +154,16 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp
EVENT("(EGLenum platform = %d, void* native_display = 0x%0.8p, const EGLint* attrib_list = 0x%0.8p)", EVENT("(EGLenum platform = %d, void* native_display = 0x%0.8p, const EGLint* attrib_list = 0x%0.8p)",
platform, native_display, attrib_list); platform, native_display, attrib_list);
const ClientExtensions &clientExtensions = Display::getClientExtensions();
switch (platform) switch (platform)
{ {
case EGL_PLATFORM_ANGLE_ANGLE: case EGL_PLATFORM_ANGLE_ANGLE:
if (!clientExtensions.platformANGLE)
{
SetGlobalError(Error(EGL_SUCCESS));
return EGL_NO_DISPLAY;
}
break; break;
default: default:
...@@ -145,8 +171,6 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp ...@@ -145,8 +171,6 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp
return EGL_NO_DISPLAY; return EGL_NO_DISPLAY;
} }
const ClientExtensions &clientExtensions = Display::getClientExtensions();
EGLint platformType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE; EGLint platformType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
bool majorVersionSpecified = false; bool majorVersionSpecified = false;
bool minorVersionSpecified = false; bool minorVersionSpecified = false;
......
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