Commit dd43fccc by Geoff Lang

Add EGL validation helper files and move some validation to them.

BUG=angle:658 Change-Id: Id560268a280f2fa7d75a7d0727dac830fe8de9f1 Reviewed-on: https://chromium-review.googlesource.com/242034Reviewed-by: 's avatarKenneth Russell <kbr@chromium.org> Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 1d8ae673
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// validationEGL.cpp: Validation functions for generic EGL entry point parameters
#include "libANGLE/validationEGL.h"
#include "libANGLE/Config.h"
#include "libANGLE/Context.h"
#include "libANGLE/Display.h"
#include "libANGLE/Surface.h"
namespace egl
{
Error ValidateDisplay(const Display *display)
{
if (display == EGL_NO_DISPLAY)
{
return Error(EGL_BAD_DISPLAY);
}
if (!display->isInitialized())
{
return Error(EGL_NOT_INITIALIZED);
}
return Error(EGL_SUCCESS);
}
Error ValidateSurface(const Display *display, Surface *surface)
{
Error error = ValidateDisplay(display);
if (error.isError())
{
return error;
}
if (!display->isValidSurface(surface))
{
return Error(EGL_BAD_SURFACE);
}
return Error(EGL_SUCCESS);
}
Error ValidateConfig(const Display *display, const Config *config)
{
Error error = ValidateDisplay(display);
if (error.isError())
{
return error;
}
if (!display->isValidConfig(config))
{
return Error(EGL_BAD_CONFIG);
}
return Error(EGL_SUCCESS);
}
Error ValidateContext(const Display *display, gl::Context *context)
{
Error error = ValidateDisplay(display);
if (error.isError())
{
return error;
}
if (!display->isValidContext(context))
{
return Error(EGL_BAD_CONTEXT);
}
return Error(EGL_SUCCESS);
}
}
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// validationEGL.h: Validation functions for generic EGL entry point parameters
#ifndef LIBANGLE_VALIDATIONEGL_H_
#define LIBANGLE_VALIDATIONEGL_H_
#include "libANGLE/Error.h"
namespace gl
{
class Context;
}
namespace egl
{
struct Config;
class Display;
class Surface;
// Object validation
Error ValidateDisplay(const Display *display);
Error ValidateSurface(const Display *display, Surface *surface);
Error ValidateConfig(const Display *display, const Config *config);
Error ValidateContext(const Display *display, gl::Context *context);
}
#endif // LIBANGLE_VALIDATIONEGL_H_
...@@ -129,6 +129,8 @@ ...@@ -129,6 +129,8 @@
'libANGLE/renderer/TransformFeedbackImpl.h', 'libANGLE/renderer/TransformFeedbackImpl.h',
'libANGLE/renderer/VertexArrayImpl.h', 'libANGLE/renderer/VertexArrayImpl.h',
'libANGLE/renderer/Workarounds.h', 'libANGLE/renderer/Workarounds.h',
'libANGLE/validationEGL.cpp',
'libANGLE/validationEGL.h',
'libANGLE/validationES.cpp', 'libANGLE/validationES.cpp',
'libANGLE/validationES.h', 'libANGLE/validationES.h',
'libANGLE/validationES2.cpp', 'libANGLE/validationES2.cpp',
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "libANGLE/Display.h" #include "libANGLE/Display.h"
#include "libANGLE/Texture.h" #include "libANGLE/Texture.h"
#include "libANGLE/Surface.h" #include "libANGLE/Surface.h"
#include "libANGLE/validationEGL.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/version.h" #include "common/version.h"
...@@ -25,72 +26,6 @@ ...@@ -25,72 +26,6 @@
namespace egl namespace egl
{ {
// EGL object validation
static bool ValidateDisplay(const Display *display)
{
if (display == EGL_NO_DISPLAY)
{
SetGlobalError(Error(EGL_BAD_DISPLAY));
return false;
}
if (!display->isInitialized())
{
SetGlobalError(Error(EGL_NOT_INITIALIZED));
return false;
}
return true;
}
static bool ValidateConfig(const Display *display, const Config *config)
{
if (!ValidateDisplay(display))
{
return false;
}
if (!display->isValidConfig(config))
{
SetGlobalError(Error(EGL_BAD_CONFIG));
return false;
}
return true;
}
static bool ValidateContext(const Display *display, gl::Context *context)
{
if (!ValidateDisplay(display))
{
return false;
}
if (!display->isValidContext(context))
{
SetGlobalError(Error(EGL_BAD_CONTEXT));
return false;
}
return true;
}
static bool ValidateSurface(Display *display, Surface *surface)
{
if (!ValidateDisplay(display))
{
return false;
}
if (!display->isValidSurface(surface))
{
SetGlobalError(Error(EGL_BAD_SURFACE));
return false;
}
return true;
}
// EGL 1.0 // EGL 1.0
EGLint EGLAPIENTRY GetError(void) EGLint EGLAPIENTRY GetError(void)
{ {
...@@ -165,10 +100,15 @@ const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name) ...@@ -165,10 +100,15 @@ const char *EGLAPIENTRY QueryString(EGLDisplay dpy, EGLint name)
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name); EVENT("(EGLDisplay dpy = 0x%0.8p, EGLint name = %d)", dpy, name);
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) && !ValidateDisplay(display)) if (!(display == EGL_NO_DISPLAY && name == EGL_EXTENSIONS))
{ {
Error error = ValidateDisplay(display);
if (error.isError())
{
SetGlobalError(error);
return NULL; return NULL;
} }
}
const char *result; const char *result;
switch (name) switch (name)
...@@ -209,8 +149,10 @@ EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint con ...@@ -209,8 +149,10 @@ EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint con
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
if (!ValidateDisplay(display)) Error error = ValidateDisplay(display);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -243,8 +185,10 @@ EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, E ...@@ -243,8 +185,10 @@ EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, E
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
if (!ValidateDisplay(display)) Error error = ValidateDisplay(display);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -277,8 +221,10 @@ EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint ...@@ -277,8 +221,10 @@ EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config); Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration)) Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -300,8 +246,10 @@ EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGL ...@@ -300,8 +246,10 @@ EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGL
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config); Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration)) Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_NO_SURFACE; return EGL_NO_SURFACE;
} }
...@@ -312,7 +260,7 @@ EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGL ...@@ -312,7 +260,7 @@ EGLSurface EGLAPIENTRY CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGL
} }
EGLSurface surface = EGL_NO_SURFACE; EGLSurface surface = EGL_NO_SURFACE;
Error error = display->createWindowSurface(win, configuration, attrib_list, &surface); error = display->createWindowSurface(win, configuration, attrib_list, &surface);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
...@@ -330,13 +278,15 @@ EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, co ...@@ -330,13 +278,15 @@ EGLSurface EGLAPIENTRY CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, co
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config); Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration)) Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_NO_SURFACE; return EGL_NO_SURFACE;
} }
EGLSurface surface = EGL_NO_SURFACE; EGLSurface surface = EGL_NO_SURFACE;
Error error = display->createOffscreenSurface(configuration, NULL, attrib_list, &surface); error = display->createOffscreenSurface(configuration, NULL, attrib_list, &surface);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
...@@ -354,8 +304,10 @@ EGLSurface EGLAPIENTRY CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGL ...@@ -354,8 +304,10 @@ EGLSurface EGLAPIENTRY CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGL
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config); Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration)) Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_NO_SURFACE; return EGL_NO_SURFACE;
} }
...@@ -372,8 +324,10 @@ EGLBoolean EGLAPIENTRY DestroySurface(EGLDisplay dpy, EGLSurface surface) ...@@ -372,8 +324,10 @@ EGLBoolean EGLAPIENTRY DestroySurface(EGLDisplay dpy, EGLSurface surface)
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -397,8 +351,10 @@ EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint a ...@@ -397,8 +351,10 @@ EGLBoolean EGLAPIENTRY QuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint a
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = (Surface*)surface; Surface *eglSurface = (Surface*)surface;
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -489,8 +445,12 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -489,8 +445,12 @@ 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);
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
if (!ValidateDisplay(display)) Config *configuration = static_cast<Config*>(config);
Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_NO_CONTEXT; return EGL_NO_CONTEXT;
} }
...@@ -617,14 +577,8 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex ...@@ -617,14 +577,8 @@ EGLContext EGLAPIENTRY CreateContext(EGLDisplay dpy, EGLConfig config, EGLContex
} }
} }
Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration))
{
return EGL_NO_CONTEXT;
}
EGLContext context = EGL_NO_CONTEXT; EGLContext context = EGL_NO_CONTEXT;
Error error = display->createContext(configuration, share_context, egl::AttributeMap(attrib_list), &context); error = display->createContext(configuration, share_context, egl::AttributeMap(attrib_list), &context);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
...@@ -641,8 +595,10 @@ EGLBoolean EGLAPIENTRY DestroyContext(EGLDisplay dpy, EGLContext ctx) ...@@ -641,8 +595,10 @@ EGLBoolean EGLAPIENTRY DestroyContext(EGLDisplay dpy, EGLContext ctx)
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
gl::Context *context = static_cast<gl::Context*>(ctx); gl::Context *context = static_cast<gl::Context*>(ctx);
if (!ValidateContext(display, context)) Error error = ValidateContext(display, context);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -680,10 +636,15 @@ EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface r ...@@ -680,10 +636,15 @@ EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface r
return EGL_FALSE; return EGL_FALSE;
} }
if (ctx != EGL_NO_CONTEXT && !ValidateContext(display, context)) if (ctx != EGL_NO_CONTEXT)
{ {
Error error = ValidateContext(display, context);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
}
if (dpy != EGL_NO_DISPLAY && display->isInitialized()) if (dpy != EGL_NO_DISPLAY && display->isInitialized())
{ {
...@@ -701,13 +662,26 @@ EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface r ...@@ -701,13 +662,26 @@ EGLBoolean EGLAPIENTRY MakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface r
} }
Surface *drawSurface = static_cast<Surface*>(draw); Surface *drawSurface = static_cast<Surface*>(draw);
Surface *readSurface = static_cast<Surface*>(read); if (draw != EGL_NO_SURFACE)
{
Error error = ValidateSurface(display, drawSurface);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
}
if ((draw != EGL_NO_SURFACE && !ValidateSurface(display, drawSurface)) || Surface *readSurface = static_cast<Surface*>(read);
(read != EGL_NO_SURFACE && !ValidateSurface(display, readSurface))) if (read != EGL_NO_SURFACE)
{ {
Error error = ValidateSurface(display, readSurface);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
}
if (draw != read) if (draw != read)
{ {
...@@ -767,8 +741,10 @@ EGLBoolean EGLAPIENTRY QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attri ...@@ -767,8 +741,10 @@ EGLBoolean EGLAPIENTRY QueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attri
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
gl::Context *context = static_cast<gl::Context*>(ctx); gl::Context *context = static_cast<gl::Context*>(ctx);
if (!ValidateContext(display, context)) Error error = ValidateContext(display, context);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -805,8 +781,10 @@ EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface) ...@@ -805,8 +781,10 @@ EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface)
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = (Surface*)surface; Surface *eglSurface = (Surface*)surface;
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -822,7 +800,7 @@ EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface) ...@@ -822,7 +800,7 @@ EGLBoolean EGLAPIENTRY SwapBuffers(EGLDisplay dpy, EGLSurface surface)
return EGL_FALSE; return EGL_FALSE;
} }
Error error = eglSurface->swap(); error = eglSurface->swap();
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
...@@ -840,8 +818,10 @@ EGLBoolean EGLAPIENTRY CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNative ...@@ -840,8 +818,10 @@ EGLBoolean EGLAPIENTRY CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNative
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -865,8 +845,10 @@ EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint b ...@@ -865,8 +845,10 @@ EGLBoolean EGLAPIENTRY BindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint b
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -921,8 +903,10 @@ EGLBoolean EGLAPIENTRY SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint ...@@ -921,8 +903,10 @@ EGLBoolean EGLAPIENTRY SurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -939,8 +923,10 @@ EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLin ...@@ -939,8 +923,10 @@ EGLBoolean EGLAPIENTRY ReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLin
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -979,8 +965,10 @@ EGLBoolean EGLAPIENTRY SwapInterval(EGLDisplay dpy, EGLint interval) ...@@ -979,8 +965,10 @@ EGLBoolean EGLAPIENTRY SwapInterval(EGLDisplay dpy, EGLint interval)
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
if (!ValidateDisplay(display)) Error error = ValidateDisplay(display);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -1040,10 +1028,12 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf ...@@ -1040,10 +1028,12 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf
dpy, buftype, buffer, config, attrib_list); dpy, buftype, buffer, config, attrib_list);
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config); Config *configuration = static_cast<Config*>(config);
if (!ValidateConfig(display, configuration))
Error error = ValidateConfig(display, configuration);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_NO_SURFACE; return EGL_NO_SURFACE;
} }
...@@ -1054,7 +1044,7 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf ...@@ -1054,7 +1044,7 @@ EGLSurface EGLAPIENTRY CreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buf
} }
EGLSurface surface = EGL_NO_SURFACE; EGLSurface surface = EGL_NO_SURFACE;
Error error = display->createOffscreenSurface(configuration, buffer, attrib_list, &surface); error = display->createOffscreenSurface(configuration, buffer, attrib_list, &surface);
if (error.isError()) if (error.isError())
{ {
SetGlobalError(error); SetGlobalError(error);
......
...@@ -11,46 +11,13 @@ ...@@ -11,46 +11,13 @@
#include "libANGLE/Display.h" #include "libANGLE/Display.h"
#include "libANGLE/Surface.h" #include "libANGLE/Surface.h"
#include "libANGLE/validationEGL.h"
#include "common/debug.h" #include "common/debug.h"
namespace egl namespace egl
{ {
// EGL object validation
static bool ValidateDisplay(Display *display)
{
if (display == EGL_NO_DISPLAY)
{
SetGlobalError(Error(EGL_BAD_DISPLAY));
return false;
}
if (!display->isInitialized())
{
SetGlobalError(Error(EGL_NOT_INITIALIZED));
return false;
}
return true;
}
static bool ValidateSurface(Display *display, Surface *surface)
{
if (!ValidateDisplay(display))
{
return false;
}
if (!display->isValidSurface(surface))
{
SetGlobalError(Error(EGL_BAD_SURFACE));
return false;
}
return true;
}
// EGL_ANGLE_query_surface_pointer // EGL_ANGLE_query_surface_pointer
EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value) EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value)
{ {
...@@ -58,10 +25,12 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa ...@@ -58,10 +25,12 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
dpy, surface, attribute, value); dpy, surface, attribute, value);
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = (Surface*)surface; Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -93,7 +62,7 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa ...@@ -93,7 +62,7 @@ EGLBoolean EGLAPIENTRY QuerySurfacePointerANGLE(EGLDisplay dpy, EGLSurface surfa
return EGL_FALSE; return EGL_FALSE;
} }
Error error = eglSurface->querySurfacePointerANGLE(attribute, value); error = eglSurface->querySurfacePointerANGLE(attribute, value);
SetGlobalError(error); SetGlobalError(error);
return (error.isError() ? EGL_FALSE : EGL_TRUE); return (error.isError() ? EGL_FALSE : EGL_TRUE);
} }
...@@ -113,8 +82,10 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin ...@@ -113,8 +82,10 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin
Display *display = static_cast<Display*>(dpy); Display *display = static_cast<Display*>(dpy);
Surface *eglSurface = static_cast<Surface*>(surface); Surface *eglSurface = static_cast<Surface*>(surface);
if (!ValidateSurface(display, eglSurface)) Error error = ValidateSurface(display, eglSurface);
if (error.isError())
{ {
SetGlobalError(error);
return EGL_FALSE; return EGL_FALSE;
} }
...@@ -137,7 +108,7 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin ...@@ -137,7 +108,7 @@ EGLBoolean EGLAPIENTRY PostSubBufferNV(EGLDisplay dpy, EGLSurface surface, EGLin
return EGL_TRUE; return EGL_TRUE;
} }
Error error = eglSurface->postSubBuffer(x, y, width, height); error = eglSurface->postSubBuffer(x, y, width, height);
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