#ifndef egl_Context_hpp\r
#define egl_Context_hpp\r
\r
+#define EGLAPI\r
+#include <EGL/egl.h>\r
+#define GL_API\r
+#include <GLES/gl.h>\r
+\r
+namespace gl\r
+{\r
+class Image;\r
+}\r
+\r
namespace egl\r
{\r
class Surface;\r
public:\r
virtual void destroy() = 0;\r
virtual void bindTexImage(Surface *surface) = 0;\r
+ virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;\r
+ virtual gl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;\r
};\r
}\r
\r
#include "Display.h"\r
\r
#include "main.h"\r
-#include "libGLESv2/mathutil.h"\r
#include "libGLESv2/Device.hpp"\r
#include "libEGL/Surface.h"\r
#include "libEGL/Context.hpp"\r
\r
if(static_cast<egl::Surface*>(getCurrentDrawSurface()) == this)\r
{\r
- gl::makeCurrent(static_cast<gl::Context*>(getCurrentContext()), static_cast<egl::Display*>(getCurrentDisplay()), this);\r
+ gl::makeCurrent(static_cast<egl::Context*>(getCurrentContext()), static_cast<egl::Display*>(getCurrentDisplay()), this);\r
}\r
\r
return true;\r
#include "Display.h"\r
#include "Surface.h"\r
#include "Texture2D.hpp"\r
-#include "libGLESv2/Context.h"\r
-#include "libGLESv2/Texture.h"\r
+#include "Context.hpp"\r
+#include "libGLESv2/Image.hpp"\r
#include "common/debug.h"\r
#include "Common/Version.h"\r
\r
try\r
{\r
egl::Display *display = static_cast<egl::Display*>(dpy);\r
- gl::Context *context = static_cast<gl::Context*>(ctx);\r
+ egl::Context *context = static_cast<egl::Context*>(ctx);\r
\r
if(ctx != EGL_NO_CONTEXT && !validateContext(display, context))\r
{\r
try\r
{\r
egl::Display *display = static_cast<egl::Display*>(dpy);\r
- gl::Context *context = static_cast<gl::Context*>(ctx);\r
+ egl::Context *context = static_cast<egl::Context*>(ctx);\r
\r
if(!validateContext(display, context))\r
{\r
try\r
{\r
egl::Display *display = static_cast<egl::Display*>(dpy);\r
- gl::Context *context = static_cast<gl::Context*>(ctx);\r
+ egl::Context *context = static_cast<egl::Context*>(ctx);\r
\r
if(!validateDisplay(display))\r
{\r
return error(EGL_BAD_CONTEXT, EGL_NO_IMAGE_KHR);\r
}\r
\r
- GLenum textureTarget = GL_NONE;\r
-\r
- switch(target)\r
- {\r
- case EGL_GL_TEXTURE_2D_KHR:\r
- textureTarget = GL_TEXTURE_2D;\r
- break;\r
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:\r
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:\r
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:\r
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:\r
- case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:\r
- case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:\r
- textureTarget = GL_TEXTURE_CUBE_MAP;\r
- break;\r
- case EGL_GL_RENDERBUFFER_KHR:\r
- break;\r
- default:\r
- return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
EGLenum imagePreserved = EGL_FALSE;\r
GLuint textureLevel = 0;\r
if(attrib_list)\r
}\r
}\r
\r
- if(textureLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
- {\r
- return error(EGL_BAD_MATCH, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
GLuint name = reinterpret_cast<intptr_t>(buffer);\r
\r
if(name == 0)\r
return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
}\r
\r
- gl::Image *image = 0;\r
-\r
- if(textureTarget != GL_NONE)\r
- {\r
- gl::Texture *texture = context->getTexture(name);\r
-\r
- if(!texture || texture->getTarget() != textureTarget)\r
- {\r
- return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
- if(texture->isShared(textureTarget, textureLevel)) // Bound to an EGLSurface or already an EGLImage sibling\r
- {\r
- return error(EGL_BAD_ACCESS, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
- if(textureLevel != 0 && !texture->isSamplerComplete())\r
- {\r
- return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
- if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
- {\r
- return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
- }\r
-\r
- image = texture->createSharedImage(textureTarget, textureLevel);\r
- }\r
- else if(target == EGL_GL_RENDERBUFFER_KHR)\r
- {\r
- gl::Renderbuffer *renderbuffer = context->getRenderbuffer(name);\r
-\r
- if(!renderbuffer)\r
- {\r
- return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);\r
- }\r
+ EGLenum validationResult = context->validateSharedImage(target, name, textureLevel);\r
\r
- if(renderbuffer->isShared()) // Already an EGLImage sibling\r
- {\r
- return error(EGL_BAD_ACCESS, EGL_NO_IMAGE_KHR);\r
- }\r
+ if(validationResult != EGL_SUCCESS)\r
+ {\r
+ return error(validationResult, EGL_NO_IMAGE_KHR);\r
+ }\r
\r
- image = renderbuffer->createSharedImage();\r
- }\r
- else UNREACHABLE();\r
+ gl::Image *image = context->createSharedImage(target, name, textureLevel);\r
\r
if(!image)\r
{\r
libGLESv2 = loadLibrary(libGLESv2_lib);\r
gl::createDevice = (gl::Device*(*)())getProcAddress(libGLESv2, "createDevice");\r
gl::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLESv2, "glCreateContext");\r
- gl::makeCurrent = (void (*)(gl::Context*, egl::Display*, egl::Surface*))getProcAddress(libGLESv2, "glMakeCurrent");\r
+ gl::makeCurrent = (void (*)(egl::Context*, egl::Display*, egl::Surface*))getProcAddress(libGLESv2, "glMakeCurrent");\r
gl::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");\r
gl::createBackBuffer = (gl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLESv2, "createBackBuffer");\r
gl::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLESv2, "createFrameBuffer");\r
Device *(*createDevice)() = 0;\r
egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;\r
void (*bindTexImage)(egl::Surface *surface) = 0;\r
- void (*makeCurrent)(Context *context, egl::Display *display, egl::Surface *surface) = 0;\r
- Context *(*getCurrentContext)() = 0;\r
+ void (*makeCurrent)(egl::Context *context, egl::Display *display, egl::Surface *surface) = 0;\r
+ egl::Context *(*getCurrentContext)() = 0;\r
__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;\r
Image *(*createBackBuffer)(int width, int height, const egl::Config *config) = 0;\r
sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height) = 0;\r
namespace gl
{
class Device;
- class Context;
class Image;
extern Device *(*createDevice)();
extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
- extern void (*makeCurrent)(Context *context, egl::Display *display, egl::Surface *surface);
+ extern void (*makeCurrent)(egl::Context *context, egl::Display *display, egl::Surface *surface);
extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
extern Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
extern sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
#include "libEGL/Surface.h"\r
#include "Common/Half.hpp"\r
\r
+#include <EGL/eglext.h>\r
+\r
#undef near\r
#undef far\r
\r
}\r
}\r
\r
+EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+ switch(target)\r
+ {\r
+ case EGL_GL_TEXTURE_2D_KHR:\r
+ break;\r
+ case EGL_GL_RENDERBUFFER_KHR:\r
+ break;\r
+ default:\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(textureLevel >= IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+ {\r
+ return EGL_BAD_MATCH;\r
+ }\r
+\r
+ if(target == EGL_GL_TEXTURE_2D_KHR)\r
+ {\r
+ Texture *texture = getTexture(name);\r
+\r
+ if(!texture || texture->getTarget() != target)\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(texture->isShared(GL_TEXTURE_2D, textureLevel)) // Bound to an EGLSurface or already an EGLImage sibling\r
+ {\r
+ return EGL_BAD_ACCESS;\r
+ }\r
+\r
+ if(textureLevel != 0 && !texture->isSamplerComplete())\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+ }\r
+ else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+ {\r
+ Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+ if(!renderbuffer)\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(renderbuffer->isShared()) // Already an EGLImage sibling\r
+ {\r
+ return EGL_BAD_ACCESS;\r
+ }\r
+ }\r
+ else UNREACHABLE();\r
+\r
+ return EGL_SUCCESS;\r
+}\r
+\r
+Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+ if(target == EGL_GL_TEXTURE_2D_KHR)\r
+ {\r
+ gl::Texture *texture = getTexture(name);\r
+\r
+ return texture->createSharedImage(GL_TEXTURE_2D, textureLevel);\r
+ }\r
+ else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+ {\r
+ gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+ return renderbuffer->createSharedImage();\r
+ }\r
+ else UNREACHABLE();\r
+\r
+ return 0;\r
+}\r
+\r
}\r
\r
// Exported functions for use by EGL\r
static int getSupportedMultiSampleDepth(sw::Format format, int requested);\r
\r
virtual void bindTexImage(egl::Surface *surface);\r
+ virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
+ virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
\r
private:\r
virtual ~Context();\r
#include "libEGL/Surface.h"\r
#include "Common/Half.hpp"\r
\r
+#include <EGL/eglext.h>\r
+\r
#undef near\r
#undef far\r
\r
}\r
}\r
\r
+EGLenum Context::validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+ GLenum textureTarget = GL_NONE;\r
+\r
+ switch(target)\r
+ {\r
+ case EGL_GL_TEXTURE_2D_KHR:\r
+ textureTarget = GL_TEXTURE_2D;\r
+ break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR:\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR:\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR:\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR:\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR:\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR:\r
+ textureTarget = GL_TEXTURE_CUBE_MAP;\r
+ break;\r
+ case EGL_GL_RENDERBUFFER_KHR:\r
+ break;\r
+ default:\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+ \r
+ if(textureLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)\r
+ {\r
+ return EGL_BAD_MATCH;\r
+ }\r
+\r
+ if(textureTarget != GL_NONE)\r
+ {\r
+ gl::Texture *texture = getTexture(name);\r
+\r
+ if(!texture || texture->getTarget() != textureTarget)\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(texture->isShared(textureTarget, textureLevel)) // Bound to an EGLSurface or already an EGLImage sibling\r
+ {\r
+ return EGL_BAD_ACCESS;\r
+ }\r
+\r
+ if(textureLevel != 0 && !texture->isSamplerComplete())\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(textureLevel == 0 && !(texture->isSamplerComplete() && texture->getLevelCount() == 1))\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+ }\r
+ else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+ {\r
+ gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+ if(!renderbuffer)\r
+ {\r
+ return EGL_BAD_PARAMETER;\r
+ }\r
+\r
+ if(renderbuffer->isShared()) // Already an EGLImage sibling\r
+ {\r
+ return EGL_BAD_ACCESS;\r
+ }\r
+ }\r
+ else UNREACHABLE();\r
+\r
+ return EGL_SUCCESS;\r
+}\r
+\r
+Image *Context::createSharedImage(EGLenum target, GLuint name, GLuint textureLevel)\r
+{\r
+ GLenum textureTarget = GL_NONE;\r
+\r
+ switch(target)\r
+ {\r
+ case EGL_GL_TEXTURE_2D_KHR: textureTarget = GL_TEXTURE_2D; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_X; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_X; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Y; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_POSITIVE_Z; break;\r
+ case EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR: textureTarget = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; break;\r
+ }\r
+\r
+ if(textureTarget != GL_NONE)\r
+ {\r
+ gl::Texture *texture = getTexture(name);\r
+\r
+ return texture->createSharedImage(textureTarget, textureLevel);\r
+ }\r
+ else if(target == EGL_GL_RENDERBUFFER_KHR)\r
+ {\r
+ gl::Renderbuffer *renderbuffer = getRenderbuffer(name);\r
+\r
+ return renderbuffer->createSharedImage();\r
+ }\r
+ else UNREACHABLE();\r
+\r
+ return 0;\r
+}\r
+\r
}\r
\r
// Exported functions for use by EGL\r
GLbitfield mask);\r
\r
virtual void bindTexImage(egl::Surface *surface);\r
+ virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
+ virtual gl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel);\r
\r
private:\r
virtual ~Context();\r