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()
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);
}
......
......@@ -450,9 +450,19 @@ EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint a
*value = eglSurface->getWidth();
break;
case EGL_POST_SUB_BUFFER_SUPPORTED_NV:
if (!display->getExtensions().postSubBuffer)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
*value = eglSurface->isPostSubBufferSupported();
break;
case EGL_FIXED_SIZE_ANGLE:
if (!display->getExtensions().windowFixedSize)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
*value = eglSurface->isFixedSize();
break;
default:
......@@ -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, "
"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.
EGLint clientMajorVersion = 1;
EGLint clientMinorVersion = 0;
......@@ -485,6 +501,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
case EGL_CONTEXT_CLIENT_VERSION:
clientMajorVersion = attribute[1];
break;
case EGL_CONTEXT_MINOR_VERSION:
clientMinorVersion = attribute[1];
break;
......@@ -499,12 +516,16 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT;
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)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
}
robustAccess = (attribute[1] == EGL_TRUE);
break;
......@@ -513,6 +534,11 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
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:
if (!display->getExtensions().createContextRobustness)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
}
if (attribute[1] == EGL_LOSE_CONTEXT_ON_RESET_EXT)
{
resetNotification = true;
......@@ -523,6 +549,7 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT;
}
break;
default:
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_NO_CONTEXT;
......@@ -557,12 +584,9 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
return EGL_NO_CONTEXT;
}
Display *display = static_cast<Display*>(dpy);
if (share_context)
{
gl::Context* sharedGLContext = static_cast<gl::Context*>(share_context);
if (sharedGLContext->isResetNotificationEnabled() != resetNotification)
{
SetGlobalError(Error(EGL_BAD_MATCH));
......
......@@ -65,6 +65,12 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
return EGL_FALSE;
}
if (!display->getExtensions().querySurfacePointer)
{
SetGlobalError(Error(EGL_SUCCESS));
return EGL_FALSE;
}
if (surface == EGL_NO_SURFACE)
{
SetGlobalError(Error(EGL_BAD_SURFACE));
......@@ -75,7 +81,13 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
switch (attribute)
{
case EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE:
if (!display->getExtensions().surfaceD3DTexture2DShareHandle)
{
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
break;
default:
SetGlobalError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
......@@ -118,6 +130,13 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin
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);
if (error.isError())
{
......@@ -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)",
platform, native_display, attrib_list);
const ClientExtensions &clientExtensions = Display::getClientExtensions();
switch (platform)
{
case EGL_PLATFORM_ANGLE_ANGLE:
if (!clientExtensions.platformANGLE)
{
SetGlobalError(Error(EGL_SUCCESS));
return EGL_NO_DISPLAY;
}
break;
default:
......@@ -145,8 +171,6 @@ EGLDisplay EGLAPIENTRY GetPlatformDisplayEXT(EGLenum platform, void *native_disp
return EGL_NO_DISPLAY;
}
const ClientExtensions &clientExtensions = Display::getClientExtensions();
EGLint platformType = EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE;
bool majorVersionSpecified = 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