Commit dcab33be by Geoff Lang

Add stubs for EGL image entry points and validation.

BUG=angleproject:970 Change-Id: Ic3b9f9f60146920571e0e5f00fac2273c35fff2f Reviewed-on: https://chromium-review.googlesource.com/287162Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent cc7bbafa
......@@ -136,6 +136,9 @@ Extensions::Extensions()
fboRenderMipmap(false),
discardFramebuffer(false),
debugMarker(false),
eglImage(false),
eglImageExternal(false),
eglImageExternalEssl3(false),
colorBufferFloat(false)
{
}
......@@ -144,6 +147,7 @@ std::vector<std::string> Extensions::getStrings() const
{
std::vector<std::string> extensionStrings;
// clang-format off
// | Extension name | Supported flag | Output vector |
InsertExtensionString("GL_OES_element_index_uint", elementIndexUint, &extensionStrings);
InsertExtensionString("GL_OES_packed_depth_stencil", packedDepthStencil, &extensionStrings);
......@@ -188,7 +192,11 @@ std::vector<std::string> Extensions::getStrings() const
InsertExtensionString("GL_OES_fbo_render_mipmap", fboRenderMipmap, &extensionStrings);
InsertExtensionString("GL_EXT_discard_framebuffer", discardFramebuffer, &extensionStrings);
InsertExtensionString("GL_EXT_debug_marker", debugMarker, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image", eglImage, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external", eglImageExternal, &extensionStrings);
InsertExtensionString("GL_OES_EGL_image_external_essl3", eglImageExternalEssl3, &extensionStrings);
InsertExtensionString("GL_EXT_color_buffer_float", colorBufferFloat, &extensionStrings);
// clang-format on
return extensionStrings;
}
......@@ -506,7 +514,14 @@ DisplayExtensions::DisplayExtensions()
windowFixedSize(false),
postSubBuffer(false),
createContext(false),
deviceQuery(false)
deviceQuery(false),
image(false),
imageBase(false),
imagePixmap(false),
glTexture2DImage(false),
glTextureCubemapImage(false),
glTexture3DImage(false),
glRenderbufferImage(false)
{
}
......@@ -514,6 +529,7 @@ std::vector<std::string> DisplayExtensions::getStrings() const
{
std::vector<std::string> extensionStrings;
// clang-format off
// | Extension name | Supported flag | Output vector |
InsertExtensionString("EGL_EXT_create_context_robustness", createContextRobustness, &extensionStrings);
InsertExtensionString("EGL_ANGLE_d3d_share_handle_client_buffer", d3dShareHandleClientBuffer, &extensionStrings);
......@@ -523,6 +539,14 @@ std::vector<std::string> DisplayExtensions::getStrings() const
InsertExtensionString("EGL_NV_post_sub_buffer", postSubBuffer, &extensionStrings);
InsertExtensionString("EGL_KHR_create_context", createContext, &extensionStrings);
InsertExtensionString("EGL_EXT_device_query", deviceQuery, &extensionStrings);
InsertExtensionString("EGL_KHR_image", image, &extensionStrings);
InsertExtensionString("EGL_KHR_image_base", imageBase, &extensionStrings);
InsertExtensionString("EGL_KHR_image_pixmap", imagePixmap, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_texture_2D_image", glTexture2DImage, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_texture_cubemap_image", glTextureCubemapImage, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_texture_3D_image", glTexture3DImage, &extensionStrings);
InsertExtensionString("EGL_KHR_gl_renderbuffer_image", glRenderbufferImage, &extensionStrings);
// clang-format on
return extensionStrings;
}
......@@ -555,12 +579,14 @@ std::vector<std::string> ClientExtensions::getStrings() const
{
std::vector<std::string> extensionStrings;
// clang-format off
// | Extension name | Supported flag | Output vector |
InsertExtensionString("EGL_EXT_client_extensions", clientExtensions, &extensionStrings);
InsertExtensionString("EGL_EXT_platform_base", platformBase, &extensionStrings);
InsertExtensionString("EGL_ANGLE_platform_angle", platformANGLE, &extensionStrings);
InsertExtensionString("EGL_ANGLE_platform_angle_d3d", platformANGLED3D, &extensionStrings);
InsertExtensionString("EGL_ANGLE_platform_angle_opengl", platformANGLEOpenGL, &extensionStrings);
// clang-format on
return extensionStrings;
}
......
......@@ -219,6 +219,15 @@ struct Extensions
// EXT_debug_marker
bool debugMarker;
// GL_OES_EGL_image
bool eglImage;
// GL_OES_EGL_image_external
bool eglImageExternal;
// GL_OES_EGL_image_external_essl3
bool eglImageExternalEssl3;
// ES3 Extension support
// GL_EXT_color_buffer_float
......@@ -376,6 +385,27 @@ struct DisplayExtensions
// EGL_EXT_device_query
bool deviceQuery;
// EGL_KHR_image
bool image;
// EGL_KHR_image_base
bool imageBase;
// EGL_KHR_image_pixmap
bool imagePixmap;
// EGL_KHR_gl_texture_2D_image
bool glTexture2DImage;
// EGL_KHR_gl_texture_cubemap_image
bool glTextureCubemapImage;
// EGL_KHR_gl_texture_3D_image
bool glTexture3DImage;
// EGL_KHR_gl_renderbuffer_image
bool glRenderbufferImage;
};
struct DeviceExtensions
......
......@@ -485,6 +485,27 @@ Error Display::createPixmapSurface(const Config *configuration, NativePixmapType
return Error(EGL_SUCCESS);
}
Error Display::createImage(gl::Context *context,
EGLenum target,
EGLClientBuffer buffer,
const AttributeMap &attribs,
Image **outImage)
{
ASSERT(isInitialized());
if (mImplementation->testDeviceLost())
{
Error error = restoreLostDevice();
if (error.isError())
{
return error;
}
}
UNIMPLEMENTED();
return Error(EGL_SUCCESS);
}
Error Display::createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &attribs,
gl::Context **outContext)
{
......@@ -570,6 +591,11 @@ void Display::destroySurface(Surface *surface)
mImplementation->destroySurface(surface);
}
void Display::destroyImage(egl::Image *image)
{
UNIMPLEMENTED();
}
void Display::destroyContext(gl::Context *context)
{
mContextSet.erase(context);
......
......@@ -32,8 +32,9 @@ class DisplayImpl;
namespace egl
{
class Surface;
class Device;
class Image;
class Surface;
class Display final : angle::NonCopyable
{
......@@ -59,12 +60,19 @@ class Display final : angle::NonCopyable
Error createPixmapSurface(const Config *configuration, NativePixmapType nativePixmap, const AttributeMap &attribs,
Surface **outSurface);
Error createImage(gl::Context *context,
EGLenum target,
EGLClientBuffer buffer,
const AttributeMap &attribs,
Image **outImage);
Error createContext(const Config *configuration, gl::Context *shareContext, const AttributeMap &attribs,
gl::Context **outContext);
Error makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context);
void destroySurface(egl::Surface *surface);
void destroyImage(egl::Image *image);
void destroyContext(gl::Context *context);
bool isInitialized() const;
......
......@@ -24,6 +24,7 @@ class AttributeMap;
class Display;
struct Config;
class Surface;
class ImageSibling;
}
namespace gl
......@@ -34,6 +35,7 @@ class Context;
namespace rx
{
class SurfaceImpl;
class ImageImpl;
struct ConfigDesc;
class DeviceImpl;
......@@ -57,6 +59,11 @@ class DisplayImpl : angle::NonCopyable
virtual SurfaceImpl *createPixmapSurface(const egl::Config *configuration,
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) = 0;
virtual ImageImpl *createImage(EGLenum target,
egl::ImageSibling *buffer,
const egl::AttributeMap &attribs) = 0;
virtual egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
gl::Context **outContext) = 0;
......
......@@ -199,6 +199,14 @@ SurfaceImpl *DisplayD3D::createPixmapSurface(const egl::Config *configuration,
return nullptr;
}
ImageImpl *DisplayD3D::createImage(EGLenum target,
egl::ImageSibling *buffer,
const egl::AttributeMap &attribs)
{
UNIMPLEMENTED();
return nullptr;
}
egl::Error DisplayD3D::getDevice(DeviceImpl **device)
{
*device = reinterpret_cast<DeviceImpl*>(mDevice);
......
......@@ -37,6 +37,10 @@ class DisplayD3D : public DisplayImpl
NativePixmapType nativePixmap,
const egl::AttributeMap &attribs) override;
ImageImpl *createImage(EGLenum target,
egl::ImageSibling *buffer,
const egl::AttributeMap &attribs) override;
egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
gl::Context **outContext) override;
......
......@@ -47,6 +47,14 @@ void DisplayGL::terminate()
SafeDelete(mRenderer);
}
ImageImpl *DisplayGL::createImage(EGLenum target,
egl::ImageSibling *buffer,
const egl::AttributeMap &attribs)
{
UNIMPLEMENTED();
return nullptr;
}
egl::Error DisplayGL::createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs, gl::Context **outContext)
{
ASSERT(mRenderer != nullptr);
......
......@@ -26,6 +26,10 @@ class DisplayGL : public DisplayImpl
egl::Error initialize(egl::Display *display) override;
void terminate() override;
ImageImpl *createImage(EGLenum target,
egl::ImageSibling *buffer,
const egl::AttributeMap &attribs) override;
egl::Error createContext(const egl::Config *config, const gl::Context *shareContext, const egl::AttributeMap &attribs,
gl::Context **outContext) override;
......
......@@ -531,4 +531,19 @@ Error ValidateCompatibleConfigs(const Config *config1, const Config *config2, EG
return Error(EGL_SUCCESS);
}
Error ValidateCreateImageKHR(const Display *display,
gl::Context *context,
EGLenum target,
EGLClientBuffer buffer,
const AttributeMap &attributes)
{
UNIMPLEMENTED();
return Error(EGL_SUCCESS);
}
Error ValidateDestroyImageKHR(const Display *display, const Image *image)
{
UNIMPLEMENTED();
return Error(EGL_SUCCESS);
}
}
......@@ -24,6 +24,7 @@ namespace egl
class AttributeMap;
struct Config;
class Display;
class Image;
class Surface;
// Object validation
......@@ -43,6 +44,13 @@ Error ValidateCreatePbufferSurface(Display *display, Config *config, const Attri
Error ValidateCreatePbufferFromClientBuffer(Display *display, EGLenum buftype, EGLClientBuffer buffer,
Config *config, const AttributeMap& attributes);
Error ValidateCreateImageKHR(const Display *display,
gl::Context *context,
EGLenum target,
EGLClientBuffer buffer,
const AttributeMap &attributes);
Error ValidateDestroyImageKHR(const Display *display, const Image *image);
// Other validation
Error ValidateCompatibleConfigs(const Config *config1, const Config *config2, EGLint surfaceType);
......
......@@ -2001,4 +2001,21 @@ bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *ma
return true;
}
bool ValidateEGLImageTargetTexture2DOES(Context *context,
egl::Display *display,
GLenum target,
egl::Image *image)
{
UNIMPLEMENTED();
return true;
}
bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
egl::Display *display,
GLenum target,
egl::Image *image)
{
UNIMPLEMENTED();
return true;
}
}
......@@ -14,6 +14,12 @@
#include <GLES2/gl2.h>
#include <GLES3/gl3.h>
namespace egl
{
class Display;
class Image;
}
namespace gl
{
......@@ -94,6 +100,15 @@ bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei num
bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker);
bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker);
bool ValidateEGLImageTargetTexture2DOES(Context *context,
egl::Display *display,
GLenum target,
egl::Image *image);
bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
egl::Display *display,
GLenum target,
egl::Image *image);
}
#endif // LIBANGLE_VALIDATION_ES_H_
......@@ -257,6 +257,20 @@ const char * EGLAPIENTRY eglQueryDeviceStringEXT(EGLDeviceEXT device, EGLint nam
return egl::QueryDeviceStringEXT(device, name);
}
EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy,
EGLContext ctx,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list)
{
return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
}
EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
{
return egl::DestroyImageKHR(dpy, image);
}
__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
{
return egl::GetProcAddress(procname);
......
......@@ -42,6 +42,8 @@ EXPORTS
eglQueryDisplayAttribEXT @48
eglQueryDeviceAttribEXT @49
eglQueryDeviceStringEXT @50
eglCreateImageKHR @51
eglDestroyImageKHR @52
; 1.5 entry points
eglCreateSync @38
......
......@@ -1126,6 +1126,7 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *
__eglMustCastToProperFunctionPointerType address;
};
// clang-format off
static const Extension extensions[] =
{
{ "eglQueryDeviceAttribEXT", (__eglMustCastToProperFunctionPointerType)QueryDeviceAttribEXT },
......@@ -1134,6 +1135,8 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *
{ "eglQuerySurfacePointerANGLE", (__eglMustCastToProperFunctionPointerType)QuerySurfacePointerANGLE },
{ "eglPostSubBufferNV", (__eglMustCastToProperFunctionPointerType)PostSubBufferNV },
{ "eglGetPlatformDisplayEXT", (__eglMustCastToProperFunctionPointerType)GetPlatformDisplayEXT },
{ "eglCreateImageKHR", (__eglMustCastToProperFunctionPointerType)CreateImageKHR },
{ "eglDestroyImageKHR", (__eglMustCastToProperFunctionPointerType)DestroyImageKHR },
{ "glBlitFramebufferANGLE", (__eglMustCastToProperFunctionPointerType)gl::BlitFramebufferANGLE },
{ "glRenderbufferStorageMultisampleANGLE", (__eglMustCastToProperFunctionPointerType)gl::RenderbufferStorageMultisampleANGLE },
{ "glDeleteFencesNV", (__eglMustCastToProperFunctionPointerType)gl::DeleteFencesNV },
......@@ -1171,8 +1174,11 @@ __eglMustCastToProperFunctionPointerType EGLAPIENTRY GetProcAddress(const char *
{ "glInsertEventMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::InsertEventMarkerEXT },
{ "glPushGroupMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::PushGroupMarkerEXT },
{ "glPopGroupMarkerEXT", (__eglMustCastToProperFunctionPointerType)gl::PopGroupMarkerEXT },
{ "glEGLImageTargetTexture2DOES", (__eglMustCastToProperFunctionPointerType)gl::EGLImageTargetTexture2DOES },
{ "glEGLImageTargetRenderbufferStorageOES", (__eglMustCastToProperFunctionPointerType)gl::EGLImageTargetRenderbufferStorageOES },
{ "", NULL },
};
// clang-format on
for (const Extension *extension = &extensions[0]; extension->address != nullptr; extension++)
{
......
......@@ -386,4 +386,55 @@ EGLBoolean EGLAPIENTRY QueryDisplayAttribEXT(EGLDisplay dpy, EGLint attribute, E
return (error.isError() ? EGL_FALSE : EGL_TRUE);
}
ANGLE_EXPORT EGLImageKHR EGLAPIENTRY CreateImageKHR(EGLDisplay dpy,
EGLContext ctx,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list)
{
EVENT(
"(EGLDisplay dpy = 0x%0.8p, EGLContext ctx = 0x%0.8p, EGLenum target = 0x%X, "
"EGLClientBuffer buffer = 0x%0.8p, const EGLAttrib *attrib_list = 0x%0.8p)",
dpy, ctx, target, buffer, attrib_list);
Display *display = static_cast<Display *>(dpy);
gl::Context *context = static_cast<gl::Context *>(ctx);
AttributeMap attributes(attrib_list);
Error error = ValidateCreateImageKHR(display, context, target, buffer, attributes);
if (error.isError())
{
SetGlobalError(error);
return EGL_NO_IMAGE;
}
Image *image = nullptr;
error = display->createImage(context, target, buffer, attributes, &image);
if (error.isError())
{
SetGlobalError(error);
return EGL_NO_IMAGE;
}
return static_cast<EGLImage>(image);
}
ANGLE_EXPORT EGLBoolean EGLAPIENTRY DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
{
EVENT("(EGLDisplay dpy = 0x%0.8p, EGLImage image = 0x%0.8p)", dpy, image);
Display *display = static_cast<Display *>(dpy);
Image *img = static_cast<Image *>(image);
Error error = ValidateDestroyImageKHR(display, img);
if (error.isError())
{
SetGlobalError(error);
return EGL_FALSE;
}
display->destroyImage(img);
return EGL_TRUE;
}
}
......@@ -30,6 +30,13 @@ ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryDisplayAttribEXT(EGLDisplay dpy, EGLint
ANGLE_EXPORT EGLBoolean EGLAPIENTRY QueryDeviceAttribEXT(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);
ANGLE_EXPORT const char * EGLAPIENTRY QueryDeviceStringEXT(EGLDeviceEXT device, EGLint name);
// EGL_KHR_image_base/EGL_KHR_image
ANGLE_EXPORT EGLImageKHR EGLAPIENTRY CreateImageKHR(EGLDisplay dpy,
EGLContext ctx,
EGLenum target,
EGLClientBuffer buffer,
const EGLint *attrib_list);
ANGLE_EXPORT EGLBoolean EGLAPIENTRY DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
}
#endif // LIBGLESV2_ENTRYPOINTSEGLEXT_H_
......@@ -1182,4 +1182,40 @@ void GL_APIENTRY PopGroupMarkerEXT()
}
}
ANGLE_EXPORT void GL_APIENTRY EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
{
EVENT("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
Context *context = GetValidGlobalContext();
if (context)
{
egl::Display *display = egl::GetGlobalDisplay();
egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
if (!ValidateEGLImageTargetTexture2DOES(context, display, target, imageObject))
{
return;
}
UNIMPLEMENTED();
}
}
ANGLE_EXPORT void GL_APIENTRY EGLImageTargetRenderbufferStorageOES(GLenum target,
GLeglImageOES image)
{
EVENT("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
Context *context = GetValidGlobalContext();
if (context)
{
egl::Display *display = egl::GetGlobalDisplay();
egl::Image *imageObject = reinterpret_cast<egl::Image *>(image);
if (!ValidateEGLImageTargetRenderbufferStorageOES(context, display, target, imageObject))
{
return;
}
UNIMPLEMENTED();
}
}
}
......@@ -81,6 +81,10 @@ ANGLE_EXPORT void GL_APIENTRY InsertEventMarkerEXT(GLsizei length, const char *m
ANGLE_EXPORT void GL_APIENTRY PushGroupMarkerEXT(GLsizei length, const char *marker);
ANGLE_EXPORT void GL_APIENTRY PopGroupMarkerEXT();
// GL_OES_EGL_image
ANGLE_EXPORT void GL_APIENTRY EGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image);
ANGLE_EXPORT void GL_APIENTRY EGLImageTargetRenderbufferStorageOES(GLenum target,
GLeglImageOES image);
}
#endif // LIBGLESV2_ENTRYPOINTGLES20EXT_H_
......@@ -1431,4 +1431,13 @@ void GL_APIENTRY glPopGroupMarkerEXT()
return gl::PopGroupMarkerEXT();
}
void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
{
return gl::EGLImageTargetTexture2DOES(target, image);
}
void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
{
return gl::EGLImageTargetRenderbufferStorageOES(target, image);
}
}
......@@ -181,6 +181,8 @@ EXPORTS
glInsertEventMarkerEXT @294
glPushGroupMarkerEXT @295
glPopGroupMarkerEXT @296
glEGLImageTargetTexture2DOES @297
glEGLImageTargetRenderbufferStorageOES @298
; GLES 3.0 Functions
glReadBuffer @180
......
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