summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/i915-tex/intel_bufmgr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/i915-tex/intel_bufmgr.c')
-rw-r--r--src/mesa/drivers/dri/i915-tex/intel_bufmgr.c444
1 files changed, 0 insertions, 444 deletions
diff --git a/src/mesa/drivers/dri/i915-tex/intel_bufmgr.c b/src/mesa/drivers/dri/i915-tex/intel_bufmgr.c
deleted file mode 100644
index 46631555dc2..00000000000
--- a/src/mesa/drivers/dri/i915-tex/intel_bufmgr.c
+++ /dev/null
@@ -1,444 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Steamboat Springs, CO.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- *
- **************************************************************************/
-
-#include "intel_bufmgr.h"
-
-#include "intel_context.h"
-#include "intel_ioctl.h"
-
-#include "hash.h"
-#include "simple_list.h"
-#include "mm.h"
-#include "imports.h"
-#include "glthread.h"
-#include <sys/ioctl.h>
-#include <unistd.h>
-#include <drm.h>
-
-struct _mesa_HashTable;
-
-/* The buffer manager is really part of the gl_shared_state struct.
- * TODO: Organize for the bufmgr to be created/deleted with the shared
- * state and stored within the DriverData of that struct. Currently
- * there are no mesa callbacks for this.
- */
-
-#define BM_MAX 16
-static struct bufmgr
-{
- _glthread_Mutex mutex; /**< for thread safety */
- int driFd;
- int refcount;
- struct _mesa_HashTable *hash;
-
- unsigned buf_nr; /* for generating ids */
- drmMMPool batchPool;
-
-} bufmgr_pool[BM_MAX];
-
-static int nr_bms;
-
-#define LOCK(bm) _glthread_LOCK_MUTEX(bm->mutex)
-#define UNLOCK(bm) _glthread_UNLOCK_MUTEX(bm->mutex)
-
-static void
-bmError(int val, const char *file, const char *function, int line)
-{
- _mesa_printf("Fatal video memory manager error \"%s\".\n"
- "Check kernel logs or set the LIBGL_DEBUG\n"
- "environment variable to \"verbose\" for more info.\n"
- "Detected in file %s, line %d, function %s.\n",
- strerror(-val), file, line, function);
-#ifndef NDEBUG
- exit(-1);
-#else
- abort();
-#endif
-}
-
-#define BM_CKFATAL(val) \
- do{ \
- int tstVal = (val); \
- if (tstVal) \
- bmError(tstVal, __FILE__, __FUNCTION__, __LINE__); \
- } while(0);
-
-/***********************************************************************
- * Public functions
- */
-
-/* The initialization functions are skewed in the fake implementation.
- * This call would be to attach to an existing manager, rather than to
- * create a local one.
- */
-
-struct bufmgr *
-bm_intel_Attach(struct intel_context *intel)
-{
- GLuint i;
-
- for (i = 0; i < nr_bms; i++)
- if (bufmgr_pool[i].driFd == intel->driFd) {
- bufmgr_pool[i].refcount++;
- _mesa_printf("retrieive old bufmgr for fd %d\n",
- bufmgr_pool[i].driFd);
- return &bufmgr_pool[i];
- }
-
- if (nr_bms < BM_MAX) {
- struct bufmgr *bm = &bufmgr_pool[nr_bms++];
-
- _mesa_printf("create new bufmgr for fd %d\n", intel->driFd);
- bm->driFd = intel->driFd;
- bm->hash = _mesa_NewHashTable();
- bm->refcount = 1;
- _glthread_INIT_MUTEX(bm->mutex);
-
- drmGetLock(bm->driFd, intel->hHWContext, 0);
- BM_CKFATAL(drmMMAllocBufferPool(bm->driFd, mmPoolRing, 0,
- DRM_MM_TT | DRM_MM_NO_EVICT |
- DRM_MM_READ | DRM_MM_EXE |
- BM_BATCHBUFFER, 1024 * 1024, 4096,
- &bm->batchPool));
-
- drmUnlock(bm->driFd, intel->hHWContext);
- return bm;
- }
-
- _mesa_printf("failed to create new bufmgr for fd %d\n", intel->driFd);
- return NULL;
-}
-
-void
-bmGenBuffers(struct bufmgr *bm, unsigned n, unsigned *buffers, unsigned flags)
-{
- LOCK(bm);
- {
- unsigned i;
- unsigned bFlags =
- (flags) ? flags : DRM_MM_TT | DRM_MM_VRAM | DRM_MM_SYSTEM;
-
- for (i = 0; i < n; i++) {
- drmMMBuf *buf = calloc(sizeof(*buf), 1);
-
- BM_CKFATAL(drmMMInitBuffer(bm->driFd, bFlags, 12, buf));
- buf->client_priv = ++bm->buf_nr;
- buffers[i] = buf->client_priv;
- _mesa_HashInsert(bm->hash, buffers[i], buf);
- }
- }
- UNLOCK(bm);
-}
-
-void
-bmSetShared(struct bufmgr *bm, unsigned buffer, unsigned flags,
- unsigned long offset, void *virtual)
-{
- LOCK(bm);
- {
- drmMMBuf *buf = _mesa_HashLookup(bm->hash, buffer);
-
- assert(buf);
-
- buf->flags = DRM_MM_NO_EVICT | DRM_MM_SHARED
- | DRM_MM_WRITE | DRM_MM_READ;
- buf->flags |= flags & DRM_MM_MEMTYPE_MASK;
- buf->offset = offset;
- buf->virtual = virtual;
- BM_CKFATAL(drmMMAllocBuffer(bm->driFd, 0, NULL, 0, buf));
- }
- UNLOCK(bm);
-}
-
-void
-bmDeleteBuffers(struct bufmgr *bm, unsigned n, unsigned *buffers)
-{
- LOCK(bm);
- {
- unsigned i;
-
- for (i = 0; i < n; i++) {
- drmMMBuf *buf = _mesa_HashLookup(bm->hash, buffers[i]);
-
- if (buf) {
- BM_CKFATAL(drmMMFreeBuffer(bm->driFd, buf));
-
- _mesa_HashRemove(bm->hash, buffers[i]);
- }
- }
- }
- UNLOCK(bm);
-}
-
-/* If buffer size changes, free and reallocate. Otherwise update in
- * place.
- */
-
-void
-bmBufferData(struct bufmgr *bm,
- unsigned buffer, unsigned size, const void *data, unsigned flags)
-{
- LOCK(bm);
- {
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- DBG("bmBufferData %d sz 0x%x data: %p\n", buffer, size, data);
-
- assert(buf);
- assert(!buf->mapped);
-
- if (buf->flags & BM_BATCHBUFFER) {
- BM_CKFATAL(drmMMFreeBuffer(bm->driFd, buf));
- BM_CKFATAL(drmMMAllocBuffer
- (bm->driFd, size, &bm->batchPool, 1, buf));
- } else if (!(buf->flags & DRM_MM_SHARED)) {
-
- if (buf->block && (buf->size < size || drmBufIsBusy(bm->driFd, buf))) {
- BM_CKFATAL(drmMMFreeBuffer(bm->driFd, buf));
- }
- if (!buf->block) {
- BM_CKFATAL(drmMMAllocBuffer(bm->driFd, size, NULL, 0, buf));
- }
-
- }
-
- if (data != NULL) {
-
- memcpy(drmMMMapBuffer(bm->driFd, buf), data, size);
- drmMMUnmapBuffer(bm->driFd, buf);
-
- }
- }
- UNLOCK(bm);
-}
-
-/* Update the buffer in place, in whatever space it is currently resident:
- */
-void
-bmBufferSubData(struct bufmgr *bm,
- unsigned buffer,
- unsigned offset, unsigned size, const void *data)
-{
- LOCK(bm);
- {
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- DBG("bmBufferSubdata %d offset 0x%x sz 0x%x\n", buffer, offset, size);
-
- assert(buf);
- drmBufWaitBusy(bm->driFd, buf);
-
- if (size) {
- memcpy((unsigned char *) drmMMMapBuffer(bm->driFd, buf) + offset,
- data, size);
- drmMMUnmapBuffer(bm->driFd, buf);
- }
- }
- UNLOCK(bm);
-}
-
-/* Extract data from the buffer:
- */
-void
-bmBufferGetSubData(struct bufmgr *bm,
- unsigned buffer,
- unsigned offset, unsigned size, void *data)
-{
- LOCK(bm);
- {
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- DBG("bmBufferSubdata %d offset 0x%x sz 0x%x\n", buffer, offset, size);
-
- assert(buf);
- drmBufWaitBusy(bm->driFd, buf);
-
- if (size) {
- memcpy(data,
- (unsigned char *) drmMMMapBuffer(bm->driFd, buf) + offset,
- size);
- drmMMUnmapBuffer(bm->driFd, buf);
- }
- }
- UNLOCK(bm);
-}
-
-/* Return a pointer to whatever space the buffer is currently resident in:
- */
-void *
-bmMapBuffer(struct bufmgr *bm, unsigned buffer, unsigned flags)
-{
- void *retval;
-
- LOCK(bm);
- {
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- DBG("bmMapBuffer %d\n", buffer);
- DBG("Map: Block is 0x%x\n", &buf->block);
-
- assert(buf);
- /* assert(!buf->mapped); */
- retval = drmMMMapBuffer(bm->driFd, buf);
- }
- UNLOCK(bm);
-
- return retval;
-}
-
-void
-bmUnmapBuffer(struct bufmgr *bm, unsigned buffer)
-{
- LOCK(bm);
- {
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- if (!buf)
- goto out;
-
- DBG("bmUnmapBuffer %d\n", buffer);
-
- drmMMUnmapBuffer(bm->driFd, buf);
- }
- out:
- UNLOCK(bm);
-}
-
-/* Build the list of buffers to validate. Note that the buffer list
- * isn't a shared structure so we don't need mutexes when manipulating
- * it.
- *
- * XXX: need refcounting for drmMMBuf structs so that they can't be
- * deleted while on these lists.
- */
-struct _drmMMBufList *
-bmNewBufferList(void)
-{
- return drmMMInitListHead();
-}
-
-int
-bmAddBuffer(struct bufmgr *bm,
- struct _drmMMBufList *list,
- unsigned buffer,
- unsigned flags,
- unsigned *memtype_return, unsigned long *offset_return)
-{
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- assert(buf);
- return drmMMBufListAdd(list, buf, 0, flags, memtype_return, offset_return);
-}
-
-void
-bmFreeBufferList(struct _drmMMBufList *list)
-{
- drmMMFreeBufList(list);
-}
-
-int
-bmScanBufferList(struct bufmgr *bm,
- struct _drmMMBufList *list, unsigned buffer)
-{
- drmMMBuf *buf = (drmMMBuf *) _mesa_HashLookup(bm->hash, buffer);
-
- assert(buf);
- return drmMMScanBufList(list, buf);
-}
-
-/* To be called prior to emitting commands to hardware which reference
- * these buffers. The buffer_usage list provides information on where
- * the buffers should be placed and whether their contents need to be
- * preserved on copying. The offset and pool data elements are return
- * values from this function telling the driver exactly where the
- * buffers are currently located.
- */
-
-int
-bmValidateBufferList(struct bufmgr *bm,
- struct _drmMMBufList *list, unsigned flags)
-{
- BM_CKFATAL(drmMMValidateBuffers(bm->driFd, list));
- return 0;
-}
-
-/* After commands are emitted but before unlocking, this must be
- * called so that the buffer manager can correctly age the buffers.
- * The buffer manager keeps track of the list of validated buffers, so
- * already knows what to apply the fence to.
- *
- * The buffer manager knows how to emit and test fences directly
- * through the drm and without callbacks or whatever into the driver.
- */
-unsigned
-bmFenceBufferList(struct bufmgr *bm, struct _drmMMBufList *list)
-{
- drmFence fence;
-
- BM_CKFATAL(drmMMFenceBuffers(bm->driFd, list));
- BM_CKFATAL(drmEmitFence(bm->driFd, 0, &fence));
-
- return fence.fenceSeq;
-}
-
-/* This functionality is used by the buffer manager, not really sure
- * if we need to be exposing it in this way, probably libdrm will
- * offer equivalent calls.
- *
- * For now they can stay, but will likely change/move before final:
- */
-unsigned
-bmSetFence(struct bufmgr *bm)
-{
- drmFence dFence;
-
- BM_CKFATAL(drmEmitFence(bm->driFd, 0, &dFence));
-
- return dFence.fenceSeq;
-}
-
-int
-bmTestFence(struct bufmgr *bm, unsigned fence)
-{
- drmFence dFence;
- int retired;
-
- dFence.fenceType = 0;
- dFence.fenceSeq = fence;
- BM_CKFATAL(drmTestFence(bm->driFd, dFence, 0, &retired));
- return retired;
-}
-
-void
-bmFinishFence(struct bufmgr *bm, unsigned fence)
-{
- drmFence dFence;
- dFence.fenceType = 0;
- dFence.fenceSeq = fence;
- BM_CKFATAL(drmWaitFence(bm->driFd, dFence));
-}