summaryrefslogtreecommitdiff
path: root/src/gallium/winsys
diff options
context:
space:
mode:
authorKeith Whitwell <keithw@vmware.com>2009-11-01 19:30:53 +0000
committerKeith Whitwell <keithw@vmware.com>2009-11-01 19:30:53 +0000
commit15a8ac2c9d6ed13468ef88f3f3bd3ccf4ee2fd0e (patch)
treef84ed0c5a9169caf1486b7325a7bc9dc6f40b63f /src/gallium/winsys
parentefda453d646c767fbf0f8e85aa09178095ab04d6 (diff)
i965g: driver and winsys compile
A milestone of sorts. Still a long way from something working -- the old one compiled too, at least some of the time...
Diffstat (limited to 'src/gallium/winsys')
-rw-r--r--src/gallium/winsys/drm/i965/gem/Makefile4
-rw-r--r--src/gallium/winsys/drm/i965/gem/SConscript2
-rw-r--r--src/gallium/winsys/drm/i965/gem/i965_drm_api.c105
-rw-r--r--src/gallium/winsys/drm/i965/gem/i965_drm_batchbuffer.c244
-rw-r--r--src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c287
-rw-r--r--src/gallium/winsys/drm/i965/gem/i965_drm_fence.c81
-rw-r--r--src/gallium/winsys/drm/i965/gem/i965_drm_winsys.h50
7 files changed, 262 insertions, 511 deletions
diff --git a/src/gallium/winsys/drm/i965/gem/Makefile b/src/gallium/winsys/drm/i965/gem/Makefile
index 74d81b4bc8..6a7497b6be 100644
--- a/src/gallium/winsys/drm/i965/gem/Makefile
+++ b/src/gallium/winsys/drm/i965/gem/Makefile
@@ -1,12 +1,10 @@
TOP = ../../../../../..
include $(TOP)/configs/current
-LIBNAME = inteldrm
+LIBNAME = i965drm
C_SOURCES = \
- i965_drm_batchbuffer.c \
i965_drm_buffer.c \
- i965_drm_fence.c \
i965_drm_api.c
LIBRARY_INCLUDES = $(shell pkg-config libdrm --cflags-only-I)
diff --git a/src/gallium/winsys/drm/i965/gem/SConscript b/src/gallium/winsys/drm/i965/gem/SConscript
index 9f1391caff..6256ec6eaf 100644
--- a/src/gallium/winsys/drm/i965/gem/SConscript
+++ b/src/gallium/winsys/drm/i965/gem/SConscript
@@ -4,9 +4,7 @@ env = drienv.Clone()
i965drm_sources = [
'i965_drm_api.c',
- 'i965_drm_batchbuffer.c',
'i965_drm_buffer.c',
- 'i965_drm_fence.c',
]
i965drm = env.ConvenienceLibrary(
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_api.c b/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
index de68cb3551..8b9c777a6f 100644
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
+++ b/src/gallium/winsys/drm/i965/gem/i965_drm_api.c
@@ -1,11 +1,12 @@
+#include <stdio.h>
#include "state_tracker/drm_api.h"
#include "i965_drm_winsys.h"
#include "util/u_memory.h"
-#include "brw/brw_context.h" /* XXX: shouldn't be doing this */
-#include "brw/brw_screen.h" /* XXX: shouldn't be doing this */
+#include "i965/brw_context.h" /* XXX: shouldn't be doing this */
+#include "i965/brw_screen.h" /* XXX: shouldn't be doing this */
#include "trace/tr_drm.h"
@@ -15,7 +16,7 @@
static void
-i965_drm_get_device_id(unsigned int *device_id)
+i965_libdrm_get_device_id(unsigned int *device_id)
{
char path[512];
FILE *file;
@@ -36,29 +37,28 @@ i965_drm_get_device_id(unsigned int *device_id)
fclose(file);
}
-static struct i965_buffer *
-i965_drm_buffer_from_handle(struct i965_drm_winsys *idws,
+static struct i965_libdrm_buffer *
+i965_libdrm_buffer_from_handle(struct i965_libdrm_winsys *idws,
const char* name, unsigned handle)
{
- struct i965_drm_buffer *buf = CALLOC_STRUCT(i965_drm_buffer);
+ struct i965_libdrm_buffer *buf = CALLOC_STRUCT(i965_libdrm_buffer);
uint32_t tile = 0, swizzle = 0;
if (!buf)
return NULL;
- buf->magic = 0xDEAD1337;
- buf->bo = drm_i965_bo_gem_create_from_name(idws->pools.gem, name, handle);
+ buf->bo = drm_intel_bo_gem_create_from_name(idws->gem, name, handle);
buf->flinked = TRUE;
buf->flink = handle;
if (!buf->bo)
goto err;
- drm_i965_bo_get_tiling(buf->bo, &tile, &swizzle);
- if (tile != I965_TILE_NONE)
+ drm_intel_bo_get_tiling(buf->bo, &tile, &swizzle);
+ if (tile != 0)
buf->map_gtt = TRUE;
- return (struct i965_buffer *)buf;
+ return buf;
err:
FREE(buf);
@@ -72,38 +72,43 @@ err:
static struct pipe_texture *
-i965_drm_texture_from_shared_handle(struct drm_api *api,
+i965_libdrm_texture_from_shared_handle(struct drm_api *api,
struct pipe_screen *screen,
- struct pipe_texture *templ,
+ struct pipe_texture *template,
const char* name,
unsigned pitch,
unsigned handle)
{
- struct i965_drm_winsys *idws = i965_drm_winsys(i965_screen(screen)->iws);
- struct i965_buffer *buffer;
+ /* XXX: this is silly -- there should be a way to get directly from
+ * the "drm_api" struct to ourselves, without peering into
+ * unrelated code:
+ */
+ struct i965_libdrm_winsys *idws = i965_libdrm_winsys(brw_screen(screen)->sws);
+ struct i965_libdrm_buffer *buffer;
- buffer = i965_drm_buffer_from_handle(idws, name, handle);
+ buffer = i965_libdrm_buffer_from_handle(idws, name, handle);
if (!buffer)
return NULL;
- return i965_texture_blanket_i965(screen, templ, pitch, buffer);
+ return brw_texture_blanket_winsys_buffer(screen, template, pitch, &buffer->base);
}
+
static boolean
-i965_drm_shared_handle_from_texture(struct drm_api *api,
+i965_libdrm_shared_handle_from_texture(struct drm_api *api,
struct pipe_screen *screen,
struct pipe_texture *texture,
unsigned *pitch,
unsigned *handle)
{
- struct i965_drm_buffer *buf = NULL;
- struct i965_buffer *buffer = NULL;
- if (!i965_get_texture_buffer_i965(texture, &buffer, pitch))
+ struct i965_libdrm_buffer *buf = NULL;
+ struct brw_winsys_buffer *buffer = NULL;
+ if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
return FALSE;
- buf = i965_drm_buffer(buffer);
+ buf = i965_libdrm_buffer(buffer);
if (!buf->flinked) {
- if (drm_i965_bo_flink(buf->bo, &buf->flink))
+ if (drm_intel_bo_flink(buf->bo, &buf->flink))
return FALSE;
buf->flinked = TRUE;
}
@@ -114,36 +119,36 @@ i965_drm_shared_handle_from_texture(struct drm_api *api,
}
static boolean
-i965_drm_local_handle_from_texture(struct drm_api *api,
+i965_libdrm_local_handle_from_texture(struct drm_api *api,
struct pipe_screen *screen,
struct pipe_texture *texture,
unsigned *pitch,
unsigned *handle)
{
- struct i965_buffer *buffer = NULL;
- if (!i965_get_texture_buffer_i965(texture, &buffer, pitch))
+ struct brw_winsys_buffer *buffer = NULL;
+ if (!brw_texture_get_winsys_buffer(texture, &buffer, pitch))
return FALSE;
- *handle = i965_drm_buffer(buffer)->bo->handle;
+ *handle = i965_libdrm_buffer(buffer)->bo->handle;
return TRUE;
}
static void
-i965_drm_winsys_destroy(struct i965_winsys *iws)
+i965_libdrm_winsys_destroy(struct brw_winsys_screen *iws)
{
- struct i965_drm_winsys *idws = i965_drm_winsys(iws);
+ struct i965_libdrm_winsys *idws = i965_libdrm_winsys(iws);
- drm_i965_bufmgr_destroy(idws->pools.gem);
+ drm_intel_bufmgr_destroy(idws->gem);
FREE(idws);
}
static struct pipe_screen *
-i965_drm_create_screen(struct drm_api *api, int drmFD,
+i965_libdrm_create_screen(struct drm_api *api, int drmFD,
struct drm_create_screen_arg *arg)
{
- struct i965_drm_winsys *idws;
+ struct i965_libdrm_winsys *idws;
unsigned int deviceID;
if (arg != NULL) {
@@ -155,35 +160,31 @@ i965_drm_create_screen(struct drm_api *api, int drmFD,
}
}
- idws = CALLOC_STRUCT(i965_drm_winsys);
+ idws = CALLOC_STRUCT(i965_libdrm_winsys);
if (!idws)
return NULL;
- i965_drm_get_device_id(&deviceID);
+ i965_libdrm_get_device_id(&deviceID);
- i965_drm_winsys_init_batchbuffer_functions(idws);
- i965_drm_winsys_init_buffer_functions(idws);
- i965_drm_winsys_init_fence_functions(idws);
+ i965_libdrm_winsys_init_buffer_functions(idws);
idws->fd = drmFD;
idws->id = deviceID;
- idws->max_batch_size = 16 * 4096;
- idws->base.destroy = i965_drm_winsys_destroy;
+ idws->base.destroy = i965_libdrm_winsys_destroy;
- idws->pools.gem = drm_i965_bufmgr_gem_init(idws->fd, idws->max_batch_size);
- drm_i965_bufmgr_gem_enable_reuse(idws->pools.gem);
+ idws->gem = drm_intel_bufmgr_gem_init(idws->fd, BRW_BATCH_SIZE);
+ drm_intel_bufmgr_gem_enable_reuse(idws->gem);
- idws->softpipe = FALSE;
idws->dump_cmd = debug_get_bool_option("I965_DUMP_CMD", FALSE);
- return i965_create_screen(&idws->base, deviceID);
+ return brw_create_screen(&idws->base, deviceID);
}
static struct pipe_context *
-i965_drm_create_context(struct drm_api *api, struct pipe_screen *screen)
+i965_libdrm_create_context(struct drm_api *api, struct pipe_screen *screen)
{
- return i965_create_context(screen);
+ return brw_create_context(screen);
}
static void
@@ -192,18 +193,18 @@ destroy(struct drm_api *api)
}
-struct drm_api i965_drm_api =
+struct drm_api i965_libdrm_api =
{
- .create_context = i965_drm_create_context,
- .create_screen = i965_drm_create_screen,
- .texture_from_shared_handle = i965_drm_texture_from_shared_handle,
- .shared_handle_from_texture = i965_drm_shared_handle_from_texture,
- .local_handle_from_texture = i965_drm_local_handle_from_texture,
+ .create_context = i965_libdrm_create_context,
+ .create_screen = i965_libdrm_create_screen,
+ .texture_from_shared_handle = i965_libdrm_texture_from_shared_handle,
+ .shared_handle_from_texture = i965_libdrm_shared_handle_from_texture,
+ .local_handle_from_texture = i965_libdrm_local_handle_from_texture,
.destroy = destroy,
};
struct drm_api *
drm_api_create()
{
- return trace_drm_create(&i965_drm_api);
+ return trace_drm_create(&i965_libdrm_api);
}
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_batchbuffer.c b/src/gallium/winsys/drm/i965/gem/i965_drm_batchbuffer.c
deleted file mode 100644
index 5b4dafc8e4..0000000000
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_batchbuffer.c
+++ /dev/null
@@ -1,244 +0,0 @@
-
-#include "intel_drm_winsys.h"
-#include "util/u_memory.h"
-
-#include "i915_drm.h"
-
-#define BATCH_RESERVED 16
-
-#define INTEL_DEFAULT_RELOCS 100
-#define INTEL_MAX_RELOCS 400
-
-#define INTEL_BATCH_NO_CLIPRECTS 0x1
-#define INTEL_BATCH_CLIPRECTS 0x2
-
-#undef INTEL_RUN_SYNC
-#undef INTEL_MAP_BATCHBUFFER
-#undef INTEL_MAP_GTT
-#define INTEL_ALWAYS_FLUSH
-
-struct intel_drm_batchbuffer
-{
- struct intel_batchbuffer base;
-
- size_t actual_size;
-
- drm_intel_bo *bo;
-};
-
-static INLINE struct intel_drm_batchbuffer *
-intel_drm_batchbuffer(struct intel_batchbuffer *batch)
-{
- return (struct intel_drm_batchbuffer *)batch;
-}
-
-static void
-intel_drm_batchbuffer_reset(struct intel_drm_batchbuffer *batch)
-{
- struct intel_drm_winsys *idws = intel_drm_winsys(batch->base.iws);
- int ret;
-
- if (batch->bo)
- drm_intel_bo_unreference(batch->bo);
- batch->bo = drm_intel_bo_alloc(idws->pools.gem,
- "gallium3d_batchbuffer",
- batch->actual_size,
- 4096);
-
-#ifdef INTEL_MAP_BATCHBUFFER
-#ifdef INTEL_MAP_GTT
- ret = drm_intel_gem_bo_map_gtt(batch->bo);
-#else
- ret = drm_intel_bo_map(batch->bo, TRUE);
-#endif
- assert(ret == 0);
- batch->base.map = batch->bo->virtual;
-#else
- (void)ret;
-#endif
-
- memset(batch->base.map, 0, batch->actual_size);
- batch->base.ptr = batch->base.map;
- batch->base.size = batch->actual_size - BATCH_RESERVED;
- batch->base.relocs = 0;
-}
-
-static struct intel_batchbuffer *
-intel_drm_batchbuffer_create(struct intel_winsys *iws)
-{
- struct intel_drm_winsys *idws = intel_drm_winsys(iws);
- struct intel_drm_batchbuffer *batch = CALLOC_STRUCT(intel_drm_batchbuffer);
-
- batch->actual_size = idws->max_batch_size;
-
-#ifdef INTEL_MAP_BATCHBUFFER
- batch->base.map = NULL;
-#else
- batch->base.map = MALLOC(batch->actual_size);
-#endif
- batch->base.ptr = NULL;
- batch->base.size = 0;
-
- batch->base.relocs = 0;
- batch->base.max_relocs = 300;/*INTEL_DEFAULT_RELOCS;*/
-
- batch->base.iws = iws;
-
- intel_drm_batchbuffer_reset(batch);
-
- return &batch->base;
-}
-
-static int
-intel_drm_batchbuffer_reloc(struct intel_batchbuffer *ibatch,
- struct intel_buffer *buffer,
- enum intel_buffer_usage usage,
- unsigned pre_add)
-{
- struct intel_drm_batchbuffer *batch = intel_drm_batchbuffer(ibatch);
- unsigned write_domain = 0;
- unsigned read_domain = 0;
- unsigned offset;
- int ret = 0;
-
- assert(batch->base.relocs < batch->base.max_relocs);
-
- if (usage == INTEL_USAGE_SAMPLER) {
- write_domain = 0;
- read_domain = I915_GEM_DOMAIN_SAMPLER;
-
- } else if (usage == INTEL_USAGE_RENDER) {
- write_domain = I915_GEM_DOMAIN_RENDER;
- read_domain = I915_GEM_DOMAIN_RENDER;
-
- } else if (usage == INTEL_USAGE_2D_TARGET) {
- write_domain = I915_GEM_DOMAIN_RENDER;
- read_domain = I915_GEM_DOMAIN_RENDER;
-
- } else if (usage == INTEL_USAGE_2D_SOURCE) {
- write_domain = 0;
- read_domain = I915_GEM_DOMAIN_RENDER;
-
- } else if (usage == INTEL_USAGE_VERTEX) {
- write_domain = 0;
- read_domain = I915_GEM_DOMAIN_VERTEX;
-
- } else {
- assert(0);
- return -1;
- }
-
- offset = (unsigned)(batch->base.ptr - batch->base.map);
-
- ret = drm_intel_bo_emit_reloc(batch->bo, offset,
- intel_bo(buffer), pre_add,
- read_domain,
- write_domain);
-
- ((uint32_t*)batch->base.ptr)[0] = intel_bo(buffer)->offset + pre_add;
- batch->base.ptr += 4;
-
- if (!ret)
- batch->base.relocs++;
-
- return ret;
-}
-
-static void
-intel_drm_batchbuffer_flush(struct intel_batchbuffer *ibatch,
- struct pipe_fence_handle **fence)
-{
- struct intel_drm_batchbuffer *batch = intel_drm_batchbuffer(ibatch);
- unsigned used = 0;
- int ret = 0;
- int i;
-
- assert(intel_batchbuffer_space(ibatch) >= 0);
-
- used = batch->base.ptr - batch->base.map;
- assert((used & 3) == 0);
-
-
-#ifdef INTEL_ALWAYS_FLUSH
- /* MI_FLUSH | FLUSH_MAP_CACHE */
- intel_batchbuffer_dword(ibatch, (0x4<<23)|(1<<0));
- used += 4;
-#endif
-
- if ((used & 4) == 0) {
- /* MI_NOOP */
- intel_batchbuffer_dword(ibatch, 0);
- }
- /* MI_BATCH_BUFFER_END */
- intel_batchbuffer_dword(ibatch, (0xA<<23));
-
- used = batch->base.ptr - batch->base.map;
- assert((used & 4) == 0);
-
-#ifdef INTEL_MAP_BATCHBUFFER
-#ifdef INTEL_MAP_GTT
- drm_intel_gem_bo_unmap_gtt(batch->bo);
-#else
- drm_intel_bo_unmap(batch->bo);
-#endif
-#else
- drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
-#endif
-
- /* Do the sending to HW */
- ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
- assert(ret == 0);
-
- if (intel_drm_winsys(ibatch->iws)->dump_cmd) {
- unsigned *ptr;
- drm_intel_bo_map(batch->bo, FALSE);
- ptr = (unsigned*)batch->bo->virtual;
-
- debug_printf("%s:\n", __func__);
- for (i = 0; i < used / 4; i++, ptr++) {
- debug_printf("\t%08x: %08x\n", i*4, *ptr);
- }
-
- drm_intel_bo_unmap(batch->bo);
- } else {
-#ifdef INTEL_RUN_SYNC
- drm_intel_bo_map(batch->bo, FALSE);
- drm_intel_bo_unmap(batch->bo);
-#endif
- }
-
- if (fence) {
- ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
-
-#ifdef INTEL_RUN_SYNC
- /* we run synced to GPU so just pass null */
- (*fence) = intel_drm_fence_create(NULL);
-#else
- (*fence) = intel_drm_fence_create(batch->bo);
-#endif
- }
-
- intel_drm_batchbuffer_reset(batch);
-}
-
-static void
-intel_drm_batchbuffer_destroy(struct intel_batchbuffer *ibatch)
-{
- struct intel_drm_batchbuffer *batch = intel_drm_batchbuffer(ibatch);
-
- if (batch->bo)
- drm_intel_bo_unreference(batch->bo);
-
-#ifndef INTEL_MAP_BATCHBUFFER
- FREE(batch->base.map);
-#endif
- FREE(batch);
-}
-
-void intel_drm_winsys_init_batchbuffer_functions(struct intel_drm_winsys *idws)
-{
- idws->base.batchbuffer_create = intel_drm_batchbuffer_create;
- idws->base.batchbuffer_reloc = intel_drm_batchbuffer_reloc;
- idws->base.batchbuffer_flush = intel_drm_batchbuffer_flush;
- idws->base.batchbuffer_destroy = intel_drm_batchbuffer_destroy;
-}
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c b/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
index 4f123bae05..5dbfd2e6b0 100644
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
+++ b/src/gallium/winsys/drm/i965/gem/i965_drm_buffer.c
@@ -3,48 +3,58 @@
#include "util/u_memory.h"
#include "i915_drm.h"
-
-static struct intel_buffer *
-intel_drm_buffer_create(struct intel_winsys *iws,
- unsigned size, unsigned alignment,
- enum intel_buffer_type type)
+#include "intel_bufmgr.h"
+
+const char *names[BRW_BUFFER_TYPE_MAX] = {
+ "texture",
+ "scanout",
+ "vertex",
+ "curbe",
+ "query",
+ "shader_constants",
+ "wm_scratch",
+ "batch",
+ "state_cache",
+};
+
+static struct brw_winsys_buffer *
+i965_libdrm_bo_alloc( struct brw_winsys_screen *sws,
+ enum brw_buffer_type type,
+ unsigned size,
+ unsigned alignment )
{
- struct intel_drm_buffer *buf = CALLOC_STRUCT(intel_drm_buffer);
- struct intel_drm_winsys *idws = intel_drm_winsys(iws);
- drm_intel_bufmgr *pool;
- char *name;
+ struct i965_libdrm_winsys *idws = i965_libdrm_winsys(sws);
+ struct i965_libdrm_buffer *buf;
+ buf = CALLOC_STRUCT(i965_libdrm_buffer);
if (!buf)
return NULL;
- buf->magic = 0xDEAD1337;
- buf->flinked = FALSE;
- buf->flink = 0;
- buf->map_gtt = FALSE;
-
- if (type == INTEL_NEW_TEXTURE) {
- name = "gallium3d_texture";
- pool = idws->pools.gem;
- } else if (type == INTEL_NEW_VERTEX) {
- name = "gallium3d_vertex";
- pool = idws->pools.gem;
+ switch (type) {
+ case BRW_BUFFER_TYPE_TEXTURE:
+ break;
+ case BRW_BUFFER_TYPE_VERTEX:
buf->map_gtt = TRUE;
- } else if (type == INTEL_NEW_SCANOUT) {
- name = "gallium3d_scanout";
- pool = idws->pools.gem;
+ break;
+ case BRW_BUFFER_TYPE_SCANOUT:
buf->map_gtt = TRUE;
- } else {
- assert(0);
- name = "gallium3d_unknown";
- pool = idws->pools.gem;
+ break;
+ default:
+ break;
}
- buf->bo = drm_intel_bo_alloc(pool, name, size, alignment);
+ buf->bo = drm_intel_bo_alloc(idws->gem,
+ names[type],
+ size,
+ alignment);
if (!buf->bo)
goto err;
- return (struct intel_buffer *)buf;
+ buf->base.offset = &buf->bo->offset;
+ buf->base.size = size;
+
+ return &buf->base;
err:
assert(0);
@@ -52,103 +62,186 @@ err:
return NULL;
}
-static int
-intel_drm_buffer_set_fence_reg(struct intel_winsys *iws,
- struct intel_buffer *buffer,
- unsigned stride,
- enum intel_buffer_tile tile)
+
+
+
+/* Reference and unreference buffers:
+ */
+static void
+i965_libdrm_bo_reference( struct brw_winsys_buffer *buffer )
{
- struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
- assert(I915_TILING_NONE == INTEL_TILE_NONE);
- assert(I915_TILING_X == INTEL_TILE_X);
- assert(I915_TILING_Y == INTEL_TILE_Y);
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
- if (tile != INTEL_TILE_NONE) {
- assert(buf->map_count == 0);
- buf->map_gtt = TRUE;
- }
+ /* I think we have to refcount ourselves and then just pass through
+ * the final dereference to the bo on destruction.
+ */
+ buf->cheesy_refcount++;
+}
- return drm_intel_bo_set_tiling(buf->bo, &tile, stride);
+static void
+i965_libdrm_bo_unreference( struct brw_winsys_buffer *buffer )
+{
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+
+ if (--buf->cheesy_refcount == 0) {
+ drm_intel_bo_unreference(buf->bo);
+ FREE(buffer);
+ }
}
-static void *
-intel_drm_buffer_map(struct intel_winsys *iws,
- struct intel_buffer *buffer,
- boolean write)
+ /* XXX: parameter names!!
+ */
+static int
+i965_libdrm_bo_emit_reloc( struct brw_winsys_buffer *buffer,
+ unsigned domain,
+ unsigned a,
+ unsigned b,
+ unsigned offset,
+ struct brw_winsys_buffer *buffer2)
{
- struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
- drm_intel_bo *bo = intel_bo(buffer);
- int ret = 0;
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+ struct i965_libdrm_buffer *buf2 = i965_libdrm_buffer(buffer2);
+ int ret;
- assert(bo);
+ ret = dri_bo_emit_reloc( buf->bo, domain, a, b, offset, buf2->bo );
+ if (ret)
+ return -1;
- if (buf->map_count)
- goto out;
+ return 0;
+}
- if (buf->map_gtt)
- ret = drm_intel_gem_bo_map_gtt(bo);
- else
- ret = drm_intel_bo_map(bo, write);
+static int
+i965_libdrm_bo_exec( struct brw_winsys_buffer *buffer,
+ unsigned bytes_used )
+{
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+ int ret;
- buf->ptr = bo->virtual;
+ ret = dri_bo_exec(buf->bo, bytes_used, NULL, 0, 0);
+ if (ret)
+ return -1;
+
+ return 0;
+}
+
+static int
+i965_libdrm_bo_subdata(struct brw_winsys_buffer *buffer,
+ size_t offset,
+ size_t size,
+ const void *data)
+{
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+ int ret;
- assert(ret == 0);
-out:
+ /* XXX: use bo_map_gtt/memcpy/unmap_gtt under some circumstances???
+ */
+ ret = drm_intel_bo_subdata(buf->bo, offset, size, (void*)data);
if (ret)
- return NULL;
+ return -1;
+
+ return 0;
+}
- buf->map_count++;
- return buf->ptr;
+
+static boolean
+i965_libdrm_bo_is_busy(struct brw_winsys_buffer *buffer)
+{
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+
+ return drm_intel_bo_busy(buf->bo);
}
-static void
-intel_drm_buffer_unmap(struct intel_winsys *iws,
- struct intel_buffer *buffer)
+static boolean
+i965_libdrm_bo_references(struct brw_winsys_buffer *a,
+ struct brw_winsys_buffer *b)
{
- struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
+ struct i965_libdrm_buffer *bufa = i965_libdrm_buffer(a);
+ struct i965_libdrm_buffer *bufb = i965_libdrm_buffer(b);
- if (--buf->map_count)
- return;
+ /* XXX: can't find this func:
+ */
+ return drm_intel_bo_references(bufa->bo, bufb->bo);
+}
- if (buf->map_gtt)
- drm_intel_gem_bo_unmap_gtt(intel_bo(buffer));
- else
- drm_intel_bo_unmap(intel_bo(buffer));
+/* XXX: couldn't this be handled by returning true/false on
+ * bo_emit_reloc?
+ */
+static boolean
+i965_libdrm_check_aperture_space( struct brw_winsys_screen *iws,
+ struct brw_winsys_buffer **buffers,
+ unsigned count )
+{
+ static drm_intel_bo *bos[128];
+ int i;
+
+ if (count > Elements(bos)) {
+ assert(0);
+ return FALSE;
+ }
+
+ for (i = 0; i < count; i++)
+ bos[i] = i965_libdrm_buffer(buffers[i])->bo;
+
+ return dri_bufmgr_check_aperture_space(bos, count);
}
-static int
-intel_drm_buffer_write(struct intel_winsys *iws,
- struct intel_buffer *buffer,
- size_t offset,
- size_t size,
- const void *data)
+/**
+ * Map a buffer.
+ */
+static void *
+i965_libdrm_bo_map(struct brw_winsys_buffer *buffer,
+ boolean write)
{
- struct intel_drm_buffer *buf = intel_drm_buffer(buffer);
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
+ int ret;
+
+ if (!buf->map_count) {
+ if (buf->map_gtt) {
+ ret = drm_intel_gem_bo_map_gtt(buf->bo);
+ if (ret)
+ return NULL;
+ }
+ else {
+ ret = drm_intel_bo_map(buf->bo, write);
+ if (ret)
+ return NULL;
+ }
+ }
- return drm_intel_bo_subdata(buf->bo, offset, size, (void*)data);
+ buf->map_count++;
+ return buf->bo->virtual;
}
-static void
-intel_drm_buffer_destroy(struct intel_winsys *iws,
- struct intel_buffer *buffer)
+/**
+ * Unmap a buffer.
+ */
+static void
+i965_libdrm_bo_unmap(struct brw_winsys_buffer *buffer)
{
- drm_intel_bo_unreference(intel_bo(buffer));
+ struct i965_libdrm_buffer *buf = i965_libdrm_buffer(buffer);
-#ifdef DEBUG
- intel_drm_buffer(buffer)->magic = 0;
- intel_drm_buffer(buffer)->bo = NULL;
-#endif
+ if (--buf->map_count > 0)
+ return;
- FREE(buffer);
+ if (buf->map_gtt)
+ drm_intel_gem_bo_unmap_gtt(buf->bo);
+ else
+ drm_intel_bo_unmap(buf->bo);
}
+
void
-intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws)
+i965_libdrm_winsys_init_buffer_functions(struct i965_libdrm_winsys *idws)
{
- idws->base.buffer_create = intel_drm_buffer_create;
- idws->base.buffer_set_fence_reg = intel_drm_buffer_set_fence_reg;
- idws->base.buffer_map = intel_drm_buffer_map;
- idws->base.buffer_unmap = intel_drm_buffer_unmap;
- idws->base.buffer_write = intel_drm_buffer_write;
- idws->base.buffer_destroy = intel_drm_buffer_destroy;
+ idws->base.bo_alloc = i965_libdrm_bo_alloc;
+ idws->base.bo_reference = i965_libdrm_bo_reference;
+ idws->base.bo_unreference = i965_libdrm_bo_unreference;
+ idws->base.bo_emit_reloc = i965_libdrm_bo_emit_reloc;
+ idws->base.bo_exec = i965_libdrm_bo_exec;
+ idws->base.bo_subdata = i965_libdrm_bo_subdata;
+ idws->base.bo_is_busy = i965_libdrm_bo_is_busy;
+ idws->base.bo_references = i965_libdrm_bo_references;
+ idws->base.check_aperture_space = i965_libdrm_check_aperture_space;
+ idws->base.bo_map = i965_libdrm_bo_map;
+ idws->base.bo_unmap = i965_libdrm_bo_unmap;
}
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_fence.c b/src/gallium/winsys/drm/i965/gem/i965_drm_fence.c
deleted file mode 100644
index e70bfe7b44..0000000000
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_fence.c
+++ /dev/null
@@ -1,81 +0,0 @@
-
-#include "intel_drm_winsys.h"
-#include "util/u_memory.h"
-#include "pipe/p_refcnt.h"
-
-/**
- * Because gem does not have fence's we have to create our own fences.
- *
- * They work by keeping the batchbuffer around and checking if that has
- * been idled. If bo is NULL fence has expired.
- */
-struct intel_drm_fence
-{
- struct pipe_reference reference;
- drm_intel_bo *bo;
-};
-
-
-struct pipe_fence_handle *
-intel_drm_fence_create(drm_intel_bo *bo)
-{
- struct intel_drm_fence *fence = CALLOC_STRUCT(intel_drm_fence);
-
- pipe_reference_init(&fence->reference, 1);
- /* bo is null if fence already expired */
- if (bo) {
- drm_intel_bo_reference(bo);
- fence->bo = bo;
- }
-
- return (struct pipe_fence_handle *)fence;
-}
-
-static void
-intel_drm_fence_reference(struct intel_winsys *iws,
- struct pipe_fence_handle **ptr,
- struct pipe_fence_handle *fence)
-{
- struct intel_drm_fence *old = (struct intel_drm_fence *)*ptr;
- struct intel_drm_fence *f = (struct intel_drm_fence *)fence;
-
- if (pipe_reference((struct pipe_reference**)ptr, &f->reference)) {
- if (old->bo)
- drm_intel_bo_unreference(old->bo);
- FREE(old);
- }
-}
-
-static int
-intel_drm_fence_signalled(struct intel_winsys *iws,
- struct pipe_fence_handle *fence)
-{
- assert(0);
-
- return 0;
-}
-
-static int
-intel_drm_fence_finish(struct intel_winsys *iws,
- struct pipe_fence_handle *fence)
-{
- struct intel_drm_fence *f = (struct intel_drm_fence *)fence;
-
- /* fence already expired */
- if (!f->bo)
- return 0;
-
- drm_intel_bo_wait_rendering(f->bo);
- drm_intel_bo_unreference(f->bo);
- f->bo = NULL;
-
- return 0;
-}
-
-void
-intel_drm_winsys_init_fence_functions(struct intel_drm_winsys *idws)
-{
- idws->base.fence_reference = intel_drm_fence_reference;
- idws->base.fence_signalled = intel_drm_fence_signalled;
- idws->base.fence_finish = intel_drm_fence_finish;
-}
diff --git a/src/gallium/winsys/drm/i965/gem/i965_drm_winsys.h b/src/gallium/winsys/drm/i965/gem/i965_drm_winsys.h
index 9854756880..bfcd512cef 100644
--- a/src/gallium/winsys/drm/i965/gem/i965_drm_winsys.h
+++ b/src/gallium/winsys/drm/i965/gem/i965_drm_winsys.h
@@ -2,56 +2,45 @@
#ifndef INTEL_DRM_WINSYS_H
#define INTEL_DRM_WINSYS_H
-#include "i965/intel_batchbuffer.h"
+#include "i965/brw_winsys.h"
#include "drm.h"
#include "intel_bufmgr.h"
+
/*
* Winsys
*/
-struct intel_drm_winsys
+struct i965_libdrm_winsys
{
- struct intel_winsys base;
+ struct brw_winsys_screen base;
+ drm_intel_bufmgr *gem;
- boolean softpipe;
boolean dump_cmd;
int fd; /**< Drm file discriptor */
unsigned id;
-
- size_t max_batch_size;
-
- struct {
- drm_intel_bufmgr *gem;
- } pools;
};
-static INLINE struct intel_drm_winsys *
-intel_drm_winsys(struct intel_winsys *iws)
+static INLINE struct i965_libdrm_winsys *
+i965_libdrm_winsys(struct brw_winsys_screen *iws)
{
- return (struct intel_drm_winsys *)iws;
+ return (struct i965_libdrm_winsys *)iws;
}
-struct intel_drm_winsys * intel_drm_winsys_create(int fd, unsigned pci_id);
-struct pipe_fence_handle * intel_drm_fence_create(drm_intel_bo *bo);
+struct i965_libdrm_winsys *i965_libdrm_winsys_create(int fd, unsigned pci_id);
-void intel_drm_winsys_init_batchbuffer_functions(struct intel_drm_winsys *idws);
-void intel_drm_winsys_init_buffer_functions(struct intel_drm_winsys *idws);
-void intel_drm_winsys_init_fence_functions(struct intel_drm_winsys *idws);
+void i965_libdrm_winsys_init_buffer_functions(struct i965_libdrm_winsys *idws);
-/*
- * Buffer
+/* Buffer.
*/
-
-
-struct intel_drm_buffer {
- unsigned magic;
+struct i965_libdrm_buffer {
+ struct brw_winsys_buffer base;
drm_intel_bo *bo;
@@ -61,18 +50,15 @@ struct intel_drm_buffer {
boolean flinked;
unsigned flink;
+
+ unsigned cheesy_refcount;
};
-static INLINE struct intel_drm_buffer *
-intel_drm_buffer(struct intel_buffer *buffer)
+static INLINE struct i965_libdrm_buffer *
+i965_libdrm_buffer(struct brw_winsys_buffer *buffer)
{
- return (struct intel_drm_buffer *)buffer;
+ return (struct i965_libdrm_buffer *)buffer;
}
-static INLINE drm_intel_bo *
-intel_bo(struct intel_buffer *buffer)
-{
- return intel_drm_buffer(buffer)->bo;
-}
#endif