summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/drm/intel/egl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/drm/intel/egl')
-rw-r--r--src/gallium/winsys/drm/intel/egl/Makefile31
-rw-r--r--src/gallium/winsys/drm/intel/egl/intel_api.c10
-rw-r--r--src/gallium/winsys/drm/intel/egl/intel_api.h14
-rw-r--r--src/gallium/winsys/drm/intel/egl/intel_context.c83
-rw-r--r--src/gallium/winsys/drm/intel/egl/intel_device.c48
5 files changed, 186 insertions, 0 deletions
diff --git a/src/gallium/winsys/drm/intel/egl/Makefile b/src/gallium/winsys/drm/intel/egl/Makefile
new file mode 100644
index 0000000000..7147d89e0d
--- /dev/null
+++ b/src/gallium/winsys/drm/intel/egl/Makefile
@@ -0,0 +1,31 @@
+TOP = ../../../../../..
+include $(TOP)/configs/current
+
+LIBNAME = EGL_i915.so
+
+PIPE_DRIVERS = \
+ ../gem/libinteldrm.a \
+ $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
+ $(TOP)/src/gallium/drivers/i915simple/libi915simple.a \
+ $(TOP)/src/gallium/state_trackers/egl/libegldrm.a \
+
+
+DRIVER_SOURCES = \
+ intel_context.c \
+ intel_device.c \
+ intel_api.c
+
+C_SOURCES = \
+ $(COMMON_GALLIUM_SOURCES) \
+ $(DRIVER_SOURCES)
+
+DRIVER_EXTRAS = -ldrm_intel
+
+ASM_SOURCES =
+
+DRIVER_DEFINES = -I../gem $(shell pkg-config libdrm --atleast-version=2.3.1 \
+ && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP")
+
+include ../../Makefile.template
+
+symlinks:
diff --git a/src/gallium/winsys/drm/intel/egl/intel_api.c b/src/gallium/winsys/drm/intel/egl/intel_api.c
new file mode 100644
index 0000000000..5dc4a7b052
--- /dev/null
+++ b/src/gallium/winsys/drm/intel/egl/intel_api.c
@@ -0,0 +1,10 @@
+
+#include "intel_api.h"
+
+struct drm_api drm_api_hocks =
+{
+ .create_screen = intel_create_screen,
+ .create_context = intel_create_context,
+ .buffer_from_handle = intel_be_buffer_from_handle,
+ .handle_from_buffer = intel_be_handle_from_buffer,
+};
diff --git a/src/gallium/winsys/drm/intel/egl/intel_api.h b/src/gallium/winsys/drm/intel/egl/intel_api.h
new file mode 100644
index 0000000000..8ec165ab01
--- /dev/null
+++ b/src/gallium/winsys/drm/intel/egl/intel_api.h
@@ -0,0 +1,14 @@
+
+#ifndef _INTEL_API_H_
+#define _INTEL_API_H_
+
+#include "pipe/p_compiler.h"
+
+#include "state_tracker/drm_api.h"
+
+#include "intel_be_device.h"
+
+struct pipe_screen *intel_create_screen(int drmFD, int pciID);
+struct pipe_context *intel_create_context(struct pipe_screen *screen);
+
+#endif
diff --git a/src/gallium/winsys/drm/intel/egl/intel_context.c b/src/gallium/winsys/drm/intel/egl/intel_context.c
new file mode 100644
index 0000000000..57e5ff7bc1
--- /dev/null
+++ b/src/gallium/winsys/drm/intel/egl/intel_context.c
@@ -0,0 +1,83 @@
+
+#include "i915simple/i915_screen.h"
+
+#include "intel_be_device.h"
+#include "intel_be_context.h"
+
+#include "pipe/p_defines.h"
+#include "pipe/p_context.h"
+
+#include "intel_api.h"
+
+struct intel_context
+{
+ struct intel_be_context base;
+
+ /* stuff */
+};
+
+/*
+ * Hardware lock functions.
+ * Doesn't do anything in EGL
+ */
+
+static void
+intel_lock_hardware(struct intel_be_context *context)
+{
+ (void)context;
+}
+
+static void
+intel_unlock_hardware(struct intel_be_context *context)
+{
+ (void)context;
+}
+
+static boolean
+intel_locked_hardware(struct intel_be_context *context)
+{
+ (void)context;
+ return FALSE;
+}
+
+
+/*
+ * Misc functions.
+ */
+static void
+intel_destroy_be_context(struct i915_winsys *winsys)
+{
+ struct intel_context *intel = (struct intel_context *)winsys;
+
+ intel_be_destroy_context(&intel->base);
+ free(intel);
+}
+
+struct pipe_context *
+intel_create_context(struct pipe_screen *screen)
+{
+ struct intel_context *intel;
+ struct pipe_context *pipe;
+ struct intel_be_device *device = (struct intel_be_device *)screen->winsys;
+
+ intel = (struct intel_context *)malloc(sizeof(*intel));
+ memset(intel, 0, sizeof(*intel));
+
+ intel->base.hardware_lock = intel_lock_hardware;
+ intel->base.hardware_unlock = intel_unlock_hardware;
+ intel->base.hardware_locked = intel_locked_hardware;
+
+ intel_be_init_context(&intel->base, device);
+
+ intel->base.base.destroy = intel_destroy_be_context;
+
+#if 0
+ pipe = intel_create_softpipe(intel, screen->winsys);
+#else
+ pipe = i915_create_context(screen, &device->base, &intel->base.base);
+#endif
+
+ pipe->priv = intel;
+
+ return pipe;
+}
diff --git a/src/gallium/winsys/drm/intel/egl/intel_device.c b/src/gallium/winsys/drm/intel/egl/intel_device.c
new file mode 100644
index 0000000000..6b281402d5
--- /dev/null
+++ b/src/gallium/winsys/drm/intel/egl/intel_device.c
@@ -0,0 +1,48 @@
+
+#include <stdio.h>
+#include "pipe/p_defines.h"
+#include "intel_be_device.h"
+#include "i915simple/i915_screen.h"
+
+#include "intel_api.h"
+
+struct intel_device
+{
+ struct intel_be_device base;
+
+ int deviceID;
+};
+
+static void
+intel_destroy_winsys(struct pipe_winsys *winsys)
+{
+ struct intel_device *dev = (struct intel_device *)winsys;
+
+ intel_be_destroy_device(&dev->base);
+
+ free(dev);
+}
+
+struct pipe_screen *
+intel_create_screen(int drmFD, int deviceID)
+{
+ struct intel_device *dev;
+ struct pipe_screen *screen;
+
+ /* Allocate the private area */
+ dev = malloc(sizeof(*dev));
+ if (!dev)
+ return NULL;
+ memset(dev, 0, sizeof(*dev));
+
+ dev->deviceID = deviceID;
+
+ intel_be_init_device(&dev->base, drmFD, deviceID);
+
+ /* we need to hock our own destroy function in here */
+ dev->base.base.destroy = intel_destroy_winsys;
+
+ screen = i915_create_screen(&dev->base.base, deviceID);
+
+ return screen;
+}