aboutsummaryrefslogtreecommitdiff
path: root/src/waffle/x11_egl/xegl_display.h
diff options
context:
space:
mode:
authorChad Versace <chad.versace@linux.intel.com>2012-05-31 21:57:40 -0700
committerChad Versace <chad.versace@linux.intel.com>2012-06-03 16:29:43 -0700
commit602fc904b0b15d4841c7a40a27d50351e9147296 (patch)
tree1a6379a2302dc156462b2d4ffb778dee1c350b9b /src/waffle/x11_egl/xegl_display.h
parent50b0bca22427bf2890ac07cee2b61cfa4fcd8240 (diff)
downloadwaffle-602fc904b0b15d4841c7a40a27d50351e9147296.tar.gz
all: Replace tagged unions with a more traditional object model
This rewrites the bulk of Waffle's code. When I first began writing Waffle, I wanted to experiment with a non-traditional object model that used tagged unions. Very soon I began to abhor the "innovative" decision. This patch replaces the tagged-union model with a more traditional object model (as found in the Linux kernel [1], Google's NaCl, libdrm, and many other places) that uses vtables and embedded structures. [1] Neil Brown. LWN, 2011 June 1. Object-oriented design patterns in the kernel. (Part 1: http://lwn.net/Articles/444910/). (Part 2: http://lwn.net/Articles/446317/). As an example of the new object model, below is an outline of how waffle_window_swap_buffers() is now implemeneted. // file: waffle_window.c bool waffle_window_swap_buffers(struct waffle_window *self) { struct wcore_window *wc_self = wcore_window(self); // safe cast // Check preconditions ... return wc_self->vtbl->swap_buffers(wc_self); } // file: wcore_window.h struct wcore_window_vtbl { bool (*swap_buffers)(struct wcore_window *self); // More member functions ... }; struct wcore_window { const struct wcore_window_vtbl *vtbl; struct waffle_window {} wfl; // More members ... }; // file: glx_window.h struct glx_window { struct wcore_window wcore; // More members ... }; // file: glx_window.c static bool glx_window_swap_buffers(struct wcore_window *wc_self) { struct glx_window *self = glx_window(wc_self); // safe cast // Call glXSwapBuffers ... return true; } static const struct wcore_window_vtbl glx_window_wcore_vtbl = { .swap_buffers = glx_window_swap_buffers, // More members ... }; Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'src/waffle/x11_egl/xegl_display.h')
-rw-r--r--src/waffle/x11_egl/xegl_display.h38
1 files changed, 19 insertions, 19 deletions
diff --git a/src/waffle/x11_egl/xegl_display.h b/src/waffle/x11_egl/xegl_display.h
index 68595d8..062f088 100644
--- a/src/waffle/x11_egl/xegl_display.h
+++ b/src/waffle/x11_egl/xegl_display.h
@@ -23,31 +23,31 @@
// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-/// @defgroup xegl_display xegl_display
-/// @ingroup xegl
-/// @{
-
-/// @file
-
#pragma once
#include <stdbool.h>
#include <stdint.h>
-union native_display;
-union native_platform;
+#include <EGL/egl.h>
+#include <X11/Xlib-xcb.h>
+
+#include <waffle/core/wcore_display.h>
+#include <waffle/core/wcore_util.h>
+#include <waffle/x11/x11_display.h>
-union native_display*
-xegl_display_connect(
- union native_platform *platform,
- const char *name);
+struct wcore_platform;
-bool
-xegl_display_disconnect(union native_display *self);
+struct xegl_display {
+ struct wcore_display wcore;
+ struct x11_display x11;
+ EGLDisplay egl;
+};
-bool
-xegl_display_supports_context_api(
- union native_display *self,
- int32_t context_api);
+DEFINE_CONTAINER_CAST_FUNC(xegl_display,
+ struct xegl_display,
+ struct wcore_display,
+ wcore)
-/// @}
+struct wcore_display*
+xegl_display_connect(struct wcore_platform *wc_plat,
+ const char *name);