summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/i915/drm/i915_drm_winsys.c
diff options
context:
space:
mode:
authorJakob Bornecrantz <wallbraker@gmail.com>2010-05-29 13:31:30 +0200
committerJakob Bornecrantz <wallbraker@gmail.com>2010-05-29 13:31:30 +0200
commite7f0f6bb72c63fd6e6ddcb7a815be68682f1764c (patch)
tree7bf4eded7ff149f974e51c7ecaecbeb142b6d644 /src/gallium/winsys/i915/drm/i915_drm_winsys.c
parent835f5a65a11ae9ca9f4b36ceb6656c77041ec901 (diff)
i915g: Rename winsys c file
Diffstat (limited to 'src/gallium/winsys/i915/drm/i915_drm_winsys.c')
-rw-r--r--src/gallium/winsys/i915/drm/i915_drm_winsys.c93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/gallium/winsys/i915/drm/i915_drm_winsys.c b/src/gallium/winsys/i915/drm/i915_drm_winsys.c
new file mode 100644
index 00000000000..5a6b45e6c9f
--- /dev/null
+++ b/src/gallium/winsys/i915/drm/i915_drm_winsys.c
@@ -0,0 +1,93 @@
+#include <stdio.h>
+
+#include "state_tracker/drm_api.h"
+
+#include "i915_drm_winsys.h"
+#include "util/u_memory.h"
+
+#include "i915/i915_context.h"
+#include "i915/i915_screen.h"
+
+#include "trace/tr_drm.h"
+
+/*
+ * Helper functions
+ */
+
+
+static void
+i915_drm_get_device_id(unsigned int *device_id)
+{
+ char path[512];
+ FILE *file;
+ void *shutup_gcc;
+
+ /*
+ * FIXME: Fix this up to use a drm ioctl or whatever.
+ */
+
+ snprintf(path, sizeof(path), "/sys/class/drm/card0/device/device");
+ file = fopen(path, "r");
+ if (!file) {
+ return;
+ }
+
+ shutup_gcc = fgets(path, sizeof(path), file);
+ (void) shutup_gcc;
+ sscanf(path, "%x", device_id);
+ fclose(file);
+}
+
+static void
+i915_drm_winsys_destroy(struct i915_winsys *iws)
+{
+ struct i915_drm_winsys *idws = i915_drm_winsys(iws);
+
+ drm_intel_bufmgr_destroy(idws->pools.gem);
+
+ FREE(idws);
+}
+
+static struct pipe_screen *
+i915_drm_create_screen(struct drm_api *api, int drmFD)
+{
+ struct i915_drm_winsys *idws;
+ unsigned int deviceID;
+
+ idws = CALLOC_STRUCT(i915_drm_winsys);
+ if (!idws)
+ return NULL;
+
+ i915_drm_get_device_id(&deviceID);
+
+ i915_drm_winsys_init_batchbuffer_functions(idws);
+ i915_drm_winsys_init_buffer_functions(idws);
+ i915_drm_winsys_init_fence_functions(idws);
+
+ idws->fd = drmFD;
+ idws->base.pci_id = deviceID;
+ idws->max_batch_size = 16 * 4096;
+
+ idws->base.destroy = i915_drm_winsys_destroy;
+
+ idws->pools.gem = drm_intel_bufmgr_gem_init(idws->fd, idws->max_batch_size);
+ drm_intel_bufmgr_gem_enable_reuse(idws->pools.gem);
+
+ idws->dump_cmd = debug_get_bool_option("INTEL_DUMP_CMD", FALSE);
+
+ return i915_screen_create(&idws->base);
+}
+
+static struct drm_api i915_drm_api =
+{
+ .name = "i915",
+ .driver_name = "i915",
+ .create_screen = i915_drm_create_screen,
+ .destroy = NULL,
+};
+
+struct drm_api *
+drm_api_create()
+{
+ return trace_drm_create(&i915_drm_api);
+}