src/gui/egl/qegl_p.h
changeset 30 5dc02b23752f
parent 23 89e065397ea6
child 33 3e2da88830cd
--- a/src/gui/egl/qegl_p.h	Wed Jun 23 19:07:03 2010 +0300
+++ b/src/gui/egl/qegl_p.h	Tue Jul 06 15:10:48 2010 +0300
@@ -53,13 +53,58 @@
 // We mean it.
 //
 
-#include <QtCore/qsize.h>
-#include <QtGui/qimage.h>
-
-#include <private/qeglproperties_p.h>
-
 QT_BEGIN_INCLUDE_NAMESPACE
 
+#ifndef QT_NO_EGL
+#if defined(QT_OPENGL_ES_2)
+#   include <GLES2/gl2.h>
+#endif
+
+#if defined(QT_GLES_EGL)
+#   include <GLES/egl.h>
+#else
+#   include <EGL/egl.h>
+#endif
+#else
+
+//types from egltypes.h for compiling stub without EGL headers
+typedef int EGLBoolean;
+typedef int EGLint;
+typedef int EGLenum;
+typedef int    NativeDisplayType;
+typedef void*  NativeWindowType;
+typedef void*  NativePixmapType;
+typedef int EGLDisplay;
+typedef int EGLConfig;
+typedef int EGLSurface;
+typedef int EGLContext;
+typedef int EGLClientBuffer;
+#define EGL_NONE            0x3038  /* Attrib list terminator */
+
+#endif
+
+#if defined(Q_WS_X11)
+// If <EGL/egl.h> included <X11/Xlib.h>, then the global namespace
+// may have been polluted with X #define's.  The following makes sure
+// the X11 headers were included properly and then cleans things up.
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#undef Bool
+#undef Status
+#undef None
+#undef KeyPress
+#undef KeyRelease
+#undef FocusIn
+#undef FocusOut
+#undef Type
+#undef FontChange
+#undef CursorShape
+#undef Unsorted
+#undef GrayScale
+#endif
+
+// Internally we use the EGL-prefixed native types which are used in EGL >= 1.3.
+// For older versions of EGL, we have to define these types ourselves here:
 #if !defined(EGL_VERSION_1_3) && !defined(QEGL_NATIVE_TYPES_DEFINED)
 #undef EGLNativeWindowType
 #undef EGLNativePixmapType
@@ -69,74 +114,124 @@
 typedef NativeDisplayType EGLNativeDisplayType;
 #define QEGL_NATIVE_TYPES_DEFINED 1
 #endif
+
 QT_END_INCLUDE_NAMESPACE
 
+#include <QtGui/qpaintdevice.h>
+#include <QFlags>
+
 QT_BEGIN_NAMESPACE
 
-class Q_GUI_EXPORT QEglContext
-{
-public:
-    QEglContext();
-    ~QEglContext();
+#define QEGL_NO_CONFIG ((EGLConfig)-1)
+
+#ifndef EGLAPIENTRY
+#define EGLAPIENTRY
+#endif
+
+// Try to get some info to debug the symbian build failues:
+#ifdef Q_OS_SYMBIAN
 
-    bool isValid() const;
-    bool isCurrent() const;
-    bool isSharing() const { return sharing; }
+#ifdef EGL_KHR_image
+#warning "EGL_KHR_image is defined"
+#else
+#warning "EGL_KHR_image is NOT defined"
+#endif
 
-    QEgl::API api() const { return apiType; }
-    void setApi(QEgl::API api) { apiType = api; }
+#ifdef EGL_KHR_image_base
+#warning "EGL_KHR_image_base is defined"
+#else
+#warning "EGL_KHR_image_base is NOT defined"
+#endif
 
-    bool chooseConfig(const QEglProperties& properties, QEgl::PixelFormatMatch match = QEgl::ExactPixelFormat);
-    bool createContext(QEglContext *shareContext = 0, const QEglProperties *properties = 0);
-    void destroyContext();
-    EGLSurface createSurface(QPaintDevice *device, const QEglProperties *properties = 0);
-    void destroySurface(EGLSurface surface);
+#ifdef EGL_EGLEXT_PROTOTYPES
+#warning "EGL_EGLEXT_PROTOTYPES is defined"
+#else
+#warning "EGL_EGLEXT_PROTOTYPES NOT not defined"
+#endif
+
+#endif
+
 
-    bool makeCurrent(EGLSurface surface);
-    bool doneCurrent();
-    bool lazyDoneCurrent();
-    bool swapBuffers(EGLSurface surface);
+// Declare/define the bits of EGL_KHR_image_base we need:
+#if !defined(EGL_KHR_image) && !defined(EGL_KHR_image_base)
+#ifdef Q_OS_SYMBIAN
+//symbian version of eglext.h differs from the khronos reference
+typedef int EGLImageKHR;
+#else
+typedef void *EGLImageKHR;
+#endif
 
-    void waitNative();
-    void waitClient();
+#define EGL_NO_IMAGE_KHR            ((EGLImageKHR)0)
+#define EGL_IMAGE_PRESERVED_KHR     0x30D2
+#define EGL_KHR_image_base
+#endif
 
-    bool configAttrib(int name, EGLint *value) const;
+#if !defined(EGL_KHR_image) && !defined(EGL_KHR_image_pixmap)
+#define EGL_NATIVE_PIXMAP_KHR       0x30B0
+#define EGL_KHR_image_pixmap
+#endif
+
+
+class QEglProperties;
 
-    static void clearError();
-    static EGLint error();
-    static QString errorString(EGLint code);
+namespace QEgl {
+    enum API
+    {
+        OpenGL,
+        OpenVG
+    };
 
-    static EGLDisplay display();
+    enum PixelFormatMatch
+    {
+        ExactPixelFormat,
+        BestPixelFormat
+    };
 
-    EGLContext context() const { return ctx; }
-    void setContext(EGLContext context) { ctx = context; ownsContext = false;}
+    enum ConfigOption
+    {
+        NoOptions   = 0,
+        Translucent = 0x01,
+        Renderable  = 0x02  // Config will be compatable with the paint engines (VG or GL)
+    };
+    Q_DECLARE_FLAGS(ConfigOptions, ConfigOption)
 
-    EGLConfig config() const { return cfg; }
-    void setConfig(EGLConfig config) { cfg = config; }
-
-    QEglProperties configProperties(EGLConfig cfg = 0) const;
-
-    void dumpAllConfigs();
+    // Most of the time we use the same config for things like widgets & pixmaps, so rather than
+    // go through the eglChooseConfig loop every time, we use defaultConfig, which will return
+    // the config for a particular device/api/option combo. This function assumes that once a
+    // config is chosen for a particular combo, it's safe to always use that combo.
+    Q_GUI_EXPORT EGLConfig  defaultConfig(int devType, API api, ConfigOptions options);
 
-    static QString extensions();
-    static bool hasExtension(const char* extensionName);
+    Q_GUI_EXPORT EGLConfig  chooseConfig(const QEglProperties* configAttribs, QEgl::PixelFormatMatch match = QEgl::ExactPixelFormat);
+    Q_GUI_EXPORT EGLSurface createSurface(QPaintDevice *device, EGLConfig cfg, const QEglProperties *surfaceAttribs = 0);
+
+    Q_GUI_EXPORT void dumpAllConfigs();
+
+#ifdef QT_NO_EGL
+    Q_GUI_EXPORT QString errorString(EGLint code = 0);
+#else
+    Q_GUI_EXPORT QString errorString(EGLint code = eglGetError());
+#endif
+
+    Q_GUI_EXPORT QString extensions();
+    Q_GUI_EXPORT bool hasExtension(const char* extensionName);
 
-private:
-    QEgl::API apiType;
-    EGLContext ctx;
-    EGLConfig cfg;
-    EGLSurface currentSurface;
-    bool current;
-    bool ownsContext;
-    bool sharing;
+    Q_GUI_EXPORT EGLDisplay display();
+
+    Q_GUI_EXPORT EGLNativeDisplayType nativeDisplay();
+    Q_GUI_EXPORT EGLNativeWindowType  nativeWindow(QWidget*);
+    Q_GUI_EXPORT EGLNativePixmapType  nativePixmap(QPixmap*);
 
-    static EGLDisplay dpy;
-    static EGLNativeDisplayType nativeDisplay();
+    // Extension functions
+    Q_GUI_EXPORT EGLImageKHR eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+    Q_GUI_EXPORT EGLBoolean  eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR img);
 
-    static QEglContext *currentContext(QEgl::API api);
-    static void setCurrentContext(QEgl::API api, QEglContext *context);
-};
+#ifdef Q_WS_X11
+    Q_GUI_EXPORT VisualID getCompatibleVisualId(EGLConfig config);
+#endif
+}
+
+Q_DECLARE_OPERATORS_FOR_FLAGS(QEgl::ConfigOptions)
 
 QT_END_NAMESPACE
 
-#endif // QEGL_P_H
+#endif //QEGL_P_H