diff options
Diffstat (limited to 'src/gallium/winsys/drm/intel/egl')
-rw-r--r-- | src/gallium/winsys/drm/intel/egl/Makefile | 31 | ||||
-rw-r--r-- | src/gallium/winsys/drm/intel/egl/intel_api.c | 10 | ||||
-rw-r--r-- | src/gallium/winsys/drm/intel/egl/intel_api.h | 14 | ||||
-rw-r--r-- | src/gallium/winsys/drm/intel/egl/intel_context.c | 83 | ||||
-rw-r--r-- | src/gallium/winsys/drm/intel/egl/intel_device.c | 48 |
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; +} |