Commit 65603eb8 by Geoff Lang Committed by Commit Bot

Refactor EGL config entry points to to separate validation.

BUG=angleproject:1707 BUG=angleproject:798 Change-Id: I34fefa9f9bbd42ef05f222c8caf856a22cf206a3 Reviewed-on: https://chromium-review.googlesource.com/428293 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 8ad9e757
......@@ -536,59 +536,6 @@ std::vector<const Config*> Display::getConfigs(const egl::AttributeMap &attribs)
return mConfigSet.filter(attribs);
}
bool Display::getConfigAttrib(const Config *configuration, EGLint attribute, EGLint *value)
{
switch (attribute)
{
case EGL_BUFFER_SIZE: *value = configuration->bufferSize; break;
case EGL_ALPHA_SIZE: *value = configuration->alphaSize; break;
case EGL_BLUE_SIZE: *value = configuration->blueSize; break;
case EGL_GREEN_SIZE: *value = configuration->greenSize; break;
case EGL_RED_SIZE: *value = configuration->redSize; break;
case EGL_DEPTH_SIZE: *value = configuration->depthSize; break;
case EGL_STENCIL_SIZE: *value = configuration->stencilSize; break;
case EGL_CONFIG_CAVEAT: *value = configuration->configCaveat; break;
case EGL_CONFIG_ID: *value = configuration->configID; break;
case EGL_LEVEL: *value = configuration->level; break;
case EGL_NATIVE_RENDERABLE: *value = configuration->nativeRenderable; break;
case EGL_NATIVE_VISUAL_ID: *value = configuration->nativeVisualID; break;
case EGL_NATIVE_VISUAL_TYPE: *value = configuration->nativeVisualType; break;
case EGL_SAMPLES: *value = configuration->samples; break;
case EGL_SAMPLE_BUFFERS: *value = configuration->sampleBuffers; break;
case EGL_SURFACE_TYPE: *value = configuration->surfaceType; break;
case EGL_TRANSPARENT_TYPE: *value = configuration->transparentType; break;
case EGL_TRANSPARENT_BLUE_VALUE: *value = configuration->transparentBlueValue; break;
case EGL_TRANSPARENT_GREEN_VALUE: *value = configuration->transparentGreenValue; break;
case EGL_TRANSPARENT_RED_VALUE: *value = configuration->transparentRedValue; break;
case EGL_BIND_TO_TEXTURE_RGB: *value = configuration->bindToTextureRGB; break;
case EGL_BIND_TO_TEXTURE_RGBA: *value = configuration->bindToTextureRGBA; break;
case EGL_MIN_SWAP_INTERVAL: *value = configuration->minSwapInterval; break;
case EGL_MAX_SWAP_INTERVAL: *value = configuration->maxSwapInterval; break;
case EGL_LUMINANCE_SIZE: *value = configuration->luminanceSize; break;
case EGL_ALPHA_MASK_SIZE: *value = configuration->alphaMaskSize; break;
case EGL_COLOR_BUFFER_TYPE: *value = configuration->colorBufferType; break;
case EGL_RENDERABLE_TYPE: *value = configuration->renderableType; break;
case EGL_MATCH_NATIVE_PIXMAP: *value = false; UNIMPLEMENTED(); break;
case EGL_CONFORMANT: *value = configuration->conformant; break;
case EGL_MAX_PBUFFER_WIDTH: *value = configuration->maxPBufferWidth; break;
case EGL_MAX_PBUFFER_HEIGHT: *value = configuration->maxPBufferHeight; break;
case EGL_MAX_PBUFFER_PIXELS: *value = configuration->maxPBufferPixels; break;
case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
if (!getExtensions().surfaceOrientation)
{
return false;
}
*value = configuration->optimalOrientation;
break;
default:
return false;
}
return true;
}
Error Display::createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs,
Surface **outSurface)
{
......
......@@ -60,7 +60,6 @@ class Display final : angle::NonCopyable
static const std::string &getClientExtensionString();
std::vector<const Config*> getConfigs(const egl::AttributeMap &attribs) const;
bool getConfigAttrib(const Config *configuration, EGLint attribute, EGLint *value);
Error createWindowSurface(const Config *configuration, EGLNativeWindowType window, const AttributeMap &attribs,
Surface **outSurface);
......
......@@ -11,6 +11,7 @@
#include "common/utilities.h"
#include "libANGLE/Buffer.h"
#include "libANGLE/Config.h"
#include "libANGLE/Framebuffer.h"
#include "libANGLE/Program.h"
#include "libANGLE/Renderbuffer.h"
......@@ -870,4 +871,124 @@ void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params)
{
SetSamplerParameterBase(sampler, pname, params);
}
} // namespace gl
namespace egl
{
void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value)
{
ASSERT(config != nullptr);
switch (attribute)
{
case EGL_BUFFER_SIZE:
*value = config->bufferSize;
break;
case EGL_ALPHA_SIZE:
*value = config->alphaSize;
break;
case EGL_BLUE_SIZE:
*value = config->blueSize;
break;
case EGL_GREEN_SIZE:
*value = config->greenSize;
break;
case EGL_RED_SIZE:
*value = config->redSize;
break;
case EGL_DEPTH_SIZE:
*value = config->depthSize;
break;
case EGL_STENCIL_SIZE:
*value = config->stencilSize;
break;
case EGL_CONFIG_CAVEAT:
*value = config->configCaveat;
break;
case EGL_CONFIG_ID:
*value = config->configID;
break;
case EGL_LEVEL:
*value = config->level;
break;
case EGL_NATIVE_RENDERABLE:
*value = config->nativeRenderable;
break;
case EGL_NATIVE_VISUAL_ID:
*value = config->nativeVisualID;
break;
case EGL_NATIVE_VISUAL_TYPE:
*value = config->nativeVisualType;
break;
case EGL_SAMPLES:
*value = config->samples;
break;
case EGL_SAMPLE_BUFFERS:
*value = config->sampleBuffers;
break;
case EGL_SURFACE_TYPE:
*value = config->surfaceType;
break;
case EGL_TRANSPARENT_TYPE:
*value = config->transparentType;
break;
case EGL_TRANSPARENT_BLUE_VALUE:
*value = config->transparentBlueValue;
break;
case EGL_TRANSPARENT_GREEN_VALUE:
*value = config->transparentGreenValue;
break;
case EGL_TRANSPARENT_RED_VALUE:
*value = config->transparentRedValue;
break;
case EGL_BIND_TO_TEXTURE_RGB:
*value = config->bindToTextureRGB;
break;
case EGL_BIND_TO_TEXTURE_RGBA:
*value = config->bindToTextureRGBA;
break;
case EGL_MIN_SWAP_INTERVAL:
*value = config->minSwapInterval;
break;
case EGL_MAX_SWAP_INTERVAL:
*value = config->maxSwapInterval;
break;
case EGL_LUMINANCE_SIZE:
*value = config->luminanceSize;
break;
case EGL_ALPHA_MASK_SIZE:
*value = config->alphaMaskSize;
break;
case EGL_COLOR_BUFFER_TYPE:
*value = config->colorBufferType;
break;
case EGL_RENDERABLE_TYPE:
*value = config->renderableType;
break;
case EGL_MATCH_NATIVE_PIXMAP:
*value = false;
UNIMPLEMENTED();
break;
case EGL_CONFORMANT:
*value = config->conformant;
break;
case EGL_MAX_PBUFFER_WIDTH:
*value = config->maxPBufferWidth;
break;
case EGL_MAX_PBUFFER_HEIGHT:
*value = config->maxPBufferHeight;
break;
case EGL_MAX_PBUFFER_PIXELS:
*value = config->maxPBufferPixels;
break;
case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
*value = config->optimalOrientation;
break;
default:
UNREACHABLE();
break;
}
}
} // namespace egl
......@@ -12,6 +12,8 @@
#include "angle_gl.h"
#include "common/angleutils.h"
#include <EGL/egl.h>
namespace gl
{
class Buffer;
......@@ -84,6 +86,15 @@ void SetSamplerParameterf(Sampler *sampler, GLenum pname, GLfloat param);
void SetSamplerParameterfv(Sampler *sampler, GLenum pname, const GLfloat *params);
void SetSamplerParameteri(Sampler *sampler, GLenum pname, GLint param);
void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params);
}
} // namespace gl
namespace egl
{
struct Config;
void QueryConfigAttrib(const Config *config, EGLint attribute, EGLint *value);
} // namespace egl
#endif // LIBANGLE_QUERYUTILS_H_
......@@ -152,6 +152,71 @@ egl::Error ValidateCreateImageKHRMipLevelCommon(gl::Context *context,
return egl::Error(EGL_SUCCESS);
}
egl::Error ValidateConfigAttribute(const egl::Display *display, EGLAttrib attribute)
{
switch (attribute)
{
case EGL_BUFFER_SIZE:
case EGL_ALPHA_SIZE:
case EGL_BLUE_SIZE:
case EGL_GREEN_SIZE:
case EGL_RED_SIZE:
case EGL_DEPTH_SIZE:
case EGL_STENCIL_SIZE:
case EGL_CONFIG_CAVEAT:
case EGL_CONFIG_ID:
case EGL_LEVEL:
case EGL_NATIVE_RENDERABLE:
case EGL_NATIVE_VISUAL_ID:
case EGL_NATIVE_VISUAL_TYPE:
case EGL_SAMPLES:
case EGL_SAMPLE_BUFFERS:
case EGL_SURFACE_TYPE:
case EGL_TRANSPARENT_TYPE:
case EGL_TRANSPARENT_BLUE_VALUE:
case EGL_TRANSPARENT_GREEN_VALUE:
case EGL_TRANSPARENT_RED_VALUE:
case EGL_BIND_TO_TEXTURE_RGB:
case EGL_BIND_TO_TEXTURE_RGBA:
case EGL_MIN_SWAP_INTERVAL:
case EGL_MAX_SWAP_INTERVAL:
case EGL_LUMINANCE_SIZE:
case EGL_ALPHA_MASK_SIZE:
case EGL_COLOR_BUFFER_TYPE:
case EGL_RENDERABLE_TYPE:
case EGL_MATCH_NATIVE_PIXMAP:
case EGL_CONFORMANT:
case EGL_MAX_PBUFFER_WIDTH:
case EGL_MAX_PBUFFER_HEIGHT:
case EGL_MAX_PBUFFER_PIXELS:
break;
case EGL_OPTIMAL_SURFACE_ORIENTATION_ANGLE:
if (!display->getExtensions().surfaceOrientation)
{
return egl::Error(EGL_BAD_ATTRIBUTE,
"EGL_ANGLE_surface_orientation is not enabled.");
}
break;
default:
return egl::Error(EGL_BAD_ATTRIBUTE, "Unknown attribute.");
}
return egl::NoError();
}
egl::Error ValidateConfigAttributes(const egl::Display *display,
const egl::AttributeMap &attributes)
{
for (const auto &attrib : attributes)
{
ANGLE_TRY(ValidateConfigAttribute(display, attrib.first));
}
return egl::NoError();
}
} // namespace
namespace egl
......@@ -1613,6 +1678,41 @@ Error ValidateSwapBuffersWithDamageEXT(const Display *display,
return Error(EGL_SUCCESS);
}
Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute)
{
ANGLE_TRY(ValidateConfig(display, config));
ANGLE_TRY(ValidateConfigAttribute(display, static_cast<EGLAttrib>(attribute)));
return NoError();
}
Error ValidateChooseConfig(const Display *display,
const AttributeMap &attribs,
EGLint configSize,
EGLint *numConfig)
{
ANGLE_TRY(ValidateDisplay(display));
ANGLE_TRY(ValidateConfigAttributes(display, attribs));
if (numConfig == nullptr)
{
return Error(EGL_BAD_PARAMETER, "num_config cannot be null.");
}
return NoError();
}
Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig)
{
ANGLE_TRY(ValidateDisplay(display));
if (numConfig == nullptr)
{
return Error(EGL_BAD_PARAMETER, "num_config cannot be null.");
}
return NoError();
}
Error ValidatePlatformType(const ClientExtensions &clientExtensions, EGLint platformType)
{
switch (platformType)
......
......@@ -101,6 +101,13 @@ Error ValidateSwapBuffersWithDamageEXT(const Display *display,
EGLint *rects,
EGLint n_rects);
Error ValidateGetConfigAttrib(const Display *display, const Config *config, EGLint attribute);
Error ValidateChooseConfig(const Display *display,
const AttributeMap &attribs,
EGLint configSize,
EGLint *numConfig);
Error ValidateGetConfigs(const Display *display, EGLint configSize, EGLint *numConfig);
// Other validation
Error ValidateCompatibleConfigs(const Display *display,
const Config *config1,
......
......@@ -20,6 +20,7 @@
#include "libANGLE/Thread.h"
#include "libANGLE/Surface.h"
#include "libANGLE/validationEGL.h"
#include "libANGLE/queryutils.h"
#include "common/debug.h"
#include "common/version.h"
......@@ -31,6 +32,28 @@
namespace egl
{
namespace
{
void ClipConfigs(const std::vector<const Config *> &filteredConfigs,
EGLConfig *output_configs,
EGLint config_size,
EGLint *num_config)
{
EGLint result_size = static_cast<EGLint>(filteredConfigs.size());
if (output_configs)
{
result_size = std::max(std::min(result_size, config_size), 0);
for (EGLint i = 0; i < result_size; i++)
{
output_configs[i] = const_cast<Config *>(filteredConfigs[i]);
}
}
*num_config = result_size;
}
} // anonymous namespace
// EGL 1.0
EGLint EGLAPIENTRY GetError(void)
{
......@@ -156,29 +179,14 @@ EGLBoolean EGLAPIENTRY GetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint con
Display *display = static_cast<Display*>(dpy);
Error error = ValidateDisplay(display);
Error error = ValidateGetConfigs(display, config_size, num_config);
if (error.isError())
{
thread->setError(error);
return EGL_FALSE;
}
if (!num_config)
{
thread->setError(Error(EGL_BAD_PARAMETER));
return EGL_FALSE;
}
std::vector<const Config*> filteredConfigs = display->getConfigs(AttributeMap());
if (configs)
{
filteredConfigs.resize(std::min<size_t>(filteredConfigs.size(), config_size));
for (size_t i = 0; i < filteredConfigs.size(); i++)
{
configs[i] = const_cast<Config*>(filteredConfigs[i]);
}
}
*num_config = static_cast<EGLint>(filteredConfigs.size());
ClipConfigs(display->getConfigs(AttributeMap()), configs, config_size, num_config);
thread->setError(Error(EGL_SUCCESS));
return EGL_TRUE;
......@@ -193,31 +201,16 @@ EGLBoolean EGLAPIENTRY ChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, E
Thread *thread = GetCurrentThread();
Display *display = static_cast<Display*>(dpy);
AttributeMap attribMap = AttributeMap::CreateFromIntArray(attrib_list);
Error error = ValidateDisplay(display);
Error error = ValidateChooseConfig(display, attribMap, config_size, num_config);
if (error.isError())
{
thread->setError(error);
return EGL_FALSE;
}
if (!num_config)
{
thread->setError(Error(EGL_BAD_PARAMETER));
return EGL_FALSE;
}
std::vector<const Config *> filteredConfigs =
display->getConfigs(AttributeMap::CreateFromIntArray(attrib_list));
if (configs)
{
filteredConfigs.resize(std::min<size_t>(filteredConfigs.size(), config_size));
for (size_t i = 0; i < filteredConfigs.size(); i++)
{
configs[i] = const_cast<Config*>(filteredConfigs[i]);
}
}
*num_config = static_cast<EGLint>(filteredConfigs.size());
ClipConfigs(display->getConfigs(attribMap), configs, config_size, num_config);
thread->setError(Error(EGL_SUCCESS));
return EGL_TRUE;
......@@ -234,18 +227,14 @@ EGLBoolean EGLAPIENTRY GetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint
Display *display = static_cast<Display*>(dpy);
Config *configuration = static_cast<Config*>(config);
Error error = ValidateConfig(display, configuration);
Error error = ValidateGetConfigAttrib(display, configuration, attribute);
if (error.isError())
{
thread->setError(error);
return EGL_FALSE;
}
if (!display->getConfigAttrib(configuration, attribute, value))
{
thread->setError(Error(EGL_BAD_ATTRIBUTE));
return EGL_FALSE;
}
QueryConfigAttrib(configuration, attribute, value);
thread->setError(Error(EGL_SUCCESS));
return EGL_TRUE;
......
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