diff options
author | Chad Versace <chad.versace@linux.intel.com> | 2012-05-31 21:57:40 -0700 |
---|---|---|
committer | Chad Versace <chad.versace@linux.intel.com> | 2012-06-03 16:29:43 -0700 |
commit | 602fc904b0b15d4841c7a40a27d50351e9147296 (patch) | |
tree | 1a6379a2302dc156462b2d4ffb778dee1c350b9b /src/waffle/x11_egl/xegl_display.h | |
parent | 50b0bca22427bf2890ac07cee2b61cfa4fcd8240 (diff) | |
download | waffle-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.h | 38 |
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); |