diff options
Diffstat (limited to 'src/gallium/winsys/drm/intel/gem')
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/Makefile | 12 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/Makefile.template | 64 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_api.c | 15 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_api.h | 14 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c | 7 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_context.c | 44 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_context.h | 17 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_device.c | 111 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_device.h | 32 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/gem/intel_be_fence.h | 18 |
10 files changed, 187 insertions, 147 deletions
diff --git a/src/gallium/winsys/drm/intel/gem/Makefile b/src/gallium/winsys/drm/intel/gem/Makefile index b25fc258f4..7ab1a2a771 100644 --- a/src/gallium/winsys/drm/intel/gem/Makefile +++ b/src/gallium/winsys/drm/intel/gem/Makefile @@ -6,13 +6,11 @@ LIBNAME = inteldrm C_SOURCES = \ intel_be_batchbuffer.c \ intel_be_context.c \ - intel_be_device.c + intel_be_device.c \ + intel_be_api.c +LIBRARY_INCLUDES = $(shell pkg-config libdrm --cflags-only-I) -include ./Makefile.template - -DRIVER_DEFINES = $(shell pkg-config libdrm --cflags \ - && pkg-config libdrm --atleast-version=2.3.1 \ - && echo "-DDRM_VBLANK_FLIP=DRM_VBLANK_FLIP") -symlinks: +LIBRARY_DEFINES = $(shell pkg-config libdrm --cflags-only-other) +include ../../../../Makefile.template diff --git a/src/gallium/winsys/drm/intel/gem/Makefile.template b/src/gallium/winsys/drm/intel/gem/Makefile.template deleted file mode 100644 index b60e978894..0000000000 --- a/src/gallium/winsys/drm/intel/gem/Makefile.template +++ /dev/null @@ -1,64 +0,0 @@ -# -*-makefile-*- - - -# We still have a dependency on the "dri" buffer manager. Most likely -# the interface can be reused in non-dri environments, and also as a -# frontend to simpler memory managers. -# -COMMON_SOURCES = - -OBJECTS = $(C_SOURCES:.c=.o) \ - $(CPP_SOURCES:.cpp=.o) \ - $(ASM_SOURCES:.S=.o) - - -### Include directories -INCLUDES = \ - -I. \ - -I$(TOP)/src/gallium/include \ - -I$(TOP)/src/gallium/auxiliary \ - -I$(TOP)/src/gallium/drivers \ - -I$(TOP)/include \ - $(DRIVER_INCLUDES) - - -##### RULES ##### - -.c.o: - $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ - -.cpp.o: - $(CXX) -c $(INCLUDES) $(CXXFLAGS) $(DRIVER_DEFINES) $< -o $@ - -.S.o: - $(CC) -c $(INCLUDES) $(CFLAGS) $(DRIVER_DEFINES) $< -o $@ - - -##### TARGETS ##### - -default: depend symlinks lib$(LIBNAME).a - - -lib$(LIBNAME).a: $(OBJECTS) Makefile Makefile.template - $(TOP)/bin/mklib -o $(LIBNAME) -static $(OBJECTS) $(DRIVER_LIBS) - - -depend: $(C_SOURCES) $(CPP_SOURCES) $(ASM_SOURCES) $(SYMLINKS) - rm -f depend - touch depend - $(MKDEP) $(MKDEP_OPTIONS) $(DRIVER_DEFINES) $(INCLUDES) $(C_SOURCES) $(CPP_SOURCES) \ - $(ASM_SOURCES) 2> /dev/null - - -# Emacs tags -tags: - etags `find . -name \*.[ch]` `find ../include` - - -# Remove .o and backup files -clean:: - -rm -f *.o */*.o *~ *.so *.a *~ server/*.o $(SYMLINKS) - -rm -f depend depend.bak - - -include depend diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.c b/src/gallium/winsys/drm/intel/gem/intel_be_api.c new file mode 100644 index 0000000000..f4ef7c2d88 --- /dev/null +++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.c @@ -0,0 +1,15 @@ + +#include "intel_be_api.h" +#include "i915simple/i915_winsys.h" + +struct drm_api drm_api_hooks = +{ + /* intel_be_context.c */ + .create_context = intel_be_create_context, + /* intel_be_device.c */ + .create_screen = intel_be_create_screen, + .buffer_from_texture = i915_get_texture_buffer, + .buffer_from_handle = intel_be_buffer_from_handle, + .handle_from_buffer = intel_be_handle_from_buffer, + .global_handle_from_buffer = intel_be_global_handle_from_buffer, +}; diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_api.h b/src/gallium/winsys/drm/intel/gem/intel_be_api.h new file mode 100644 index 0000000000..73e458d4ba --- /dev/null +++ b/src/gallium/winsys/drm/intel/gem/intel_be_api.h @@ -0,0 +1,14 @@ + +#ifndef _INTEL_BE_API_H_ +#define _INTEL_BE_API_H_ + +#include "pipe/p_compiler.h" + +#include "state_tracker/drm_api.h" + +#include "intel_be_device.h" + +struct pipe_screen *intel_be_create_screen(int drmFD, int pciID); +struct pipe_context *intel_be_create_context(struct pipe_screen *screen); + +#endif diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c index d9556e1f38..d5e63c3bae 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_batchbuffer.c @@ -21,7 +21,7 @@ intel_be_batchbuffer_alloc(struct intel_be_context *intel) batch->base.size = 0; batch->base.actual_size = intel->device->max_batch_size; batch->base.relocs = 0; - batch->base.max_relocs = INTEL_DEFAULT_RELOCS; + batch->base.max_relocs = 500;/*INTEL_DEFAULT_RELOCS;*/ batch->base.map = malloc(batch->base.actual_size); memset(batch->base.map, 0, batch->base.actual_size); @@ -47,7 +47,6 @@ intel_be_batchbuffer_reset(struct intel_be_batchbuffer *batch) batch->base.size = batch->base.actual_size - BATCH_RESERVED; batch->base.relocs = 0; - batch->base.max_relocs = INTEL_DEFAULT_RELOCS; batch->bo = drm_intel_bo_alloc(dev->pools.gem, "gallium3d_batch_buffer", @@ -115,10 +114,10 @@ intel_be_batchbuffer_flush(struct intel_be_batchbuffer *batch, if (fence) { if (*fence) - intel_be_fence_unreference(*fence); + intel_be_fence_reference(fence, NULL); (*fence) = CALLOC_STRUCT(intel_be_fence); - (*fence)->refcount = 1; + pipe_reference_init(&(*fence)->reference, 1); (*fence)->bo = NULL; } } diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_context.c b/src/gallium/winsys/drm/intel/gem/intel_be_context.c index 95e761d78d..bb6f1b916c 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_context.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_context.c @@ -1,10 +1,14 @@ +#include "pipe/p_screen.h" + #include "intel_be_device.h" #include "intel_be_context.h" #include "intel_be_batchbuffer.h" #include "i915_drm.h" +#include "intel_be_api.h" + static struct i915_batchbuffer * intel_be_batch_get(struct i915_winsys *sws) { @@ -57,6 +61,21 @@ intel_be_batch_flush(struct i915_winsys *sws, intel_be_batchbuffer_flush(intel->batch, f); } + +/* + * Misc functions. + */ + +static void +intel_be_destroy_context(struct i915_winsys *winsys) +{ + struct intel_be_context *intel = intel_be_context(winsys); + + intel_be_batchbuffer_free(intel->batch); + + free(intel); +} + boolean intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device) { @@ -68,13 +87,32 @@ intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *de intel->base.batch_reloc = intel_be_batch_reloc; intel->base.batch_flush = intel_be_batch_flush; + intel->base.destroy = intel_be_destroy_context; + intel->batch = intel_be_batchbuffer_alloc(intel); return true; } -void -intel_be_destroy_context(struct intel_be_context *intel) +struct pipe_context * +intel_be_create_context(struct pipe_screen *screen) { - intel_be_batchbuffer_free(intel->batch); + struct intel_be_context *intel; + struct pipe_context *pipe; + struct intel_be_device *device = intel_be_device(screen->winsys); + + intel = (struct intel_be_context *)malloc(sizeof(*intel)); + memset(intel, 0, sizeof(*intel)); + + intel_be_init_context(intel, device); + +#if 0 + pipe = intel_create_softpipe(intel, screen->winsys); +#else + pipe = i915_create_context(screen, &device->base, &intel->base); +#endif + + pipe->priv = intel; + + return pipe; } diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_context.h b/src/gallium/winsys/drm/intel/gem/intel_be_context.h index 9cee1a4e52..5a369669c0 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_context.h +++ b/src/gallium/winsys/drm/intel/gem/intel_be_context.h @@ -11,15 +11,6 @@ struct intel_be_context struct intel_be_device *device; struct intel_be_batchbuffer *batch; - - /* - * Hardware lock functions. - * - * Needs to be filled in by the winsys. - */ - void (*hardware_lock)(struct intel_be_context *context); - void (*hardware_unlock)(struct intel_be_context *context); - boolean (*hardware_locked)(struct intel_be_context *context); }; static INLINE struct intel_be_context * @@ -37,12 +28,4 @@ boolean intel_be_init_context(struct intel_be_context *intel, struct intel_be_device *device); -/** - * Destroy a intel_be_context. - * - * Does not free the struct that is up to the winsys. - */ -void -intel_be_destroy_context(struct intel_be_context *intel); - #endif diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.c b/src/gallium/winsys/drm/intel/gem/intel_be_device.c index 82c1cb2f32..0f6300323b 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_device.c +++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.c @@ -9,17 +9,9 @@ #include "intel_be_fence.h" -#include "i915simple/i915_screen.h" +#include "i915simple/i915_winsys.h" - -/** - * Turn a pipe winsys into an intel/pipe winsys: - */ -static INLINE struct intel_be_device * -intel_be_device(struct pipe_winsys *winsys) -{ - return (struct intel_be_device *)winsys; -} +#include "intel_be_api.h" /* * Buffer @@ -34,6 +26,12 @@ intel_be_buffer_map(struct pipe_winsys *winsys, int write = 0; int ret; + if (flags & PIPE_BUFFER_USAGE_DONTBLOCK) { + /* Remove this when drm_intel_bo_map supports DONTBLOCK + */ + return NULL; + } + if (flags & PIPE_BUFFER_USAGE_CPU_WRITE) write = 1; @@ -53,8 +51,7 @@ intel_be_buffer_unmap(struct pipe_winsys *winsys, } static void -intel_be_buffer_destroy(struct pipe_winsys *winsys, - struct pipe_buffer *buf) +intel_be_buffer_destroy(struct pipe_buffer *buf) { drm_intel_bo_unreference(intel_bo(buf)); free(buf); @@ -74,10 +71,12 @@ intel_be_buffer_create(struct pipe_winsys *winsys, if (!buffer) return NULL; - buffer->base.refcount = 1; + pipe_reference_init(&buffer->base.reference, 1); buffer->base.alignment = alignment; buffer->base.usage = usage; buffer->base.size = size; + buffer->flinked = FALSE; + buffer->flink = 0; if (usage & (PIPE_BUFFER_USAGE_VERTEX | PIPE_BUFFER_USAGE_CONSTANT)) { /* Local buffer */ @@ -115,7 +114,7 @@ intel_be_user_buffer_create(struct pipe_winsys *winsys, void *ptr, unsigned byte if (!buffer) return NULL; - buffer->base.refcount = 1; + pipe_reference_init(&buffer->base.reference, 1); buffer->base.alignment = 0; buffer->base.usage = 0; buffer->base.size = bytes; @@ -141,10 +140,10 @@ err: } struct pipe_buffer * -intel_be_buffer_from_handle(struct pipe_winsys *winsys, +intel_be_buffer_from_handle(struct pipe_screen *screen, const char* name, unsigned handle) { - struct intel_be_device *dev = intel_be_device(winsys); + struct intel_be_device *dev = intel_be_device(screen->winsys); struct intel_be_buffer *buffer = CALLOC_STRUCT(intel_be_buffer); if (!buffer) @@ -155,7 +154,8 @@ intel_be_buffer_from_handle(struct pipe_winsys *winsys, if (!buffer->bo) goto err; - buffer->base.refcount = 1; + pipe_reference_init(&buffer->base.reference, 1); + buffer->base.screen = screen; buffer->base.alignment = buffer->bo->align; buffer->base.usage = PIPE_BUFFER_USAGE_GPU_READ | PIPE_BUFFER_USAGE_GPU_WRITE | @@ -170,14 +170,39 @@ err: return NULL; } -unsigned -intel_be_handle_from_buffer(struct pipe_winsys *winsys, - struct pipe_buffer *buf) +boolean +intel_be_handle_from_buffer(struct pipe_screen *screen, + struct pipe_buffer *buffer, + unsigned *handle) { - drm_intel_bo *bo = intel_bo(buf); - return bo->handle; + drm_intel_bo *bo; + + if (!buffer) + return FALSE; + + *handle = intel_bo(buffer)->handle; + return TRUE; } +boolean +intel_be_global_handle_from_buffer(struct pipe_screen *screen, + struct pipe_buffer *buffer, + unsigned *handle) +{ + struct intel_be_buffer *buf = intel_be_buffer(buffer); + + if (!buffer) + return FALSE; + + if (!buf->flinked) { + if (drm_intel_bo_flink(intel_bo(buffer), &buf->flink)) + return FALSE; + buf->flinked = TRUE; + } + + *handle = buf->flink; + return TRUE; +} /* * Fence */ @@ -190,15 +215,7 @@ intel_be_fence_refunref(struct pipe_winsys *sws, struct intel_be_fence **p = (struct intel_be_fence **)ptr; struct intel_be_fence *f = (struct intel_be_fence *)fence; - assert(p); - - if (f) - intel_be_fence_reference(f); - - if (*p) - intel_be_fence_unreference(*p); - - *p = f; + intel_be_fence_reference(p, f); } static int @@ -233,10 +250,21 @@ intel_be_fence_finish(struct pipe_winsys *sws, * Misc functions */ +static void +intel_be_destroy_winsys(struct pipe_winsys *winsys) +{ + struct intel_be_device *dev = intel_be_device(winsys); + + drm_intel_bufmgr_destroy(dev->pools.gem); + + free(dev); +} + boolean intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id) { dev->fd = fd; + dev->id = id; dev->max_batch_size = 16 * 4096; dev->max_vertex_size = 128 * 4096; @@ -253,13 +281,28 @@ intel_be_init_device(struct intel_be_device *dev, int fd, unsigned id) dev->base.fence_signalled = intel_be_fence_signalled; dev->base.fence_finish = intel_be_fence_finish; + dev->base.destroy = intel_be_destroy_winsys; + dev->pools.gem = drm_intel_bufmgr_gem_init(dev->fd, dev->max_batch_size); return true; } -void -intel_be_destroy_device(struct intel_be_device *dev) +struct pipe_screen * +intel_be_create_screen(int drmFD, int deviceID) { - drm_intel_bufmgr_destroy(dev->pools.gem); + struct intel_be_device *dev; + struct pipe_screen *screen; + + /* Allocate the private area */ + dev = malloc(sizeof(*dev)); + if (!dev) + return NULL; + memset(dev, 0, sizeof(*dev)); + + intel_be_init_device(dev, drmFD, deviceID); + + screen = i915_create_screen(&dev->base, deviceID); + + return screen; } diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_device.h b/src/gallium/winsys/drm/intel/gem/intel_be_device.h index f06890163c..47d2176cb4 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_device.h +++ b/src/gallium/winsys/drm/intel/gem/intel_be_device.h @@ -18,6 +18,8 @@ struct intel_be_device int fd; /**< Drm file discriptor */ + unsigned id; + size_t max_batch_size; size_t max_vertex_size; @@ -26,12 +28,15 @@ struct intel_be_device } pools; }; +static INLINE struct intel_be_device * +intel_be_device(struct pipe_winsys *winsys) +{ + return (struct intel_be_device *)winsys; +} + boolean intel_be_init_device(struct intel_be_device *device, int fd, unsigned id); -void -intel_be_destroy_device(struct intel_be_device *dev); - /* * Buffer */ @@ -39,6 +44,8 @@ intel_be_destroy_device(struct intel_be_device *dev); struct intel_be_buffer { struct pipe_buffer base; drm_intel_bo *bo; + boolean flinked; + unsigned flink; }; /** @@ -47,7 +54,7 @@ struct intel_be_buffer { * Takes a reference. */ struct pipe_buffer * -intel_be_buffer_from_handle(struct pipe_winsys *winsys, +intel_be_buffer_from_handle(struct pipe_screen *screen, const char* name, unsigned handle); /** @@ -55,9 +62,20 @@ intel_be_buffer_from_handle(struct pipe_winsys *winsys, * * If buffer is destroyed handle may become invalid. */ -unsigned -intel_be_handle_from_buffer(struct pipe_winsys *winsys, - struct pipe_buffer *buffer); +boolean +intel_be_handle_from_buffer(struct pipe_screen *screen, + struct pipe_buffer *buffer, + unsigned *handle); + +/** + * Gets the global handle from a buffer. + * + * If buffer is destroyed handle may become invalid. + */ +boolean +intel_be_global_handle_from_buffer(struct pipe_screen *screen, + struct pipe_buffer *buffer, + unsigned *handle); static INLINE struct intel_be_buffer * intel_be_buffer(struct pipe_buffer *buf) diff --git a/src/gallium/winsys/drm/intel/gem/intel_be_fence.h b/src/gallium/winsys/drm/intel/gem/intel_be_fence.h index 0fe18f66f8..a8abb01a9e 100644 --- a/src/gallium/winsys/drm/intel/gem/intel_be_fence.h +++ b/src/gallium/winsys/drm/intel/gem/intel_be_fence.h @@ -15,23 +15,19 @@ */ struct intel_be_fence { - uint32_t refcount; + struct pipe_reference reference; drm_intel_bo *bo; }; static INLINE void -intel_be_fence_reference(struct intel_be_fence *f) +intel_be_fence_reference(struct intel_be_fence **ptr, struct intel_be_fence *f) { - f->refcount++; -} + struct intel_be_fence *old_fence = *ptr; -static INLINE void -intel_be_fence_unreference(struct intel_be_fence *f) -{ - if (!--f->refcount) { - if (f->bo) - drm_intel_bo_unreference(f->bo); - free(f); + if (pipe_reference((struct pipe_reference**)ptr, &f->reference)) { + if (old_fence->bo) + drm_intel_bo_unreference(old_fence->bo); + free(old_fence); } } |
