i915g: Fix closure of full batch buffers

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
[danvet: incorporate comments by Dr_Jakob]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Jakob Bornecrantz <wallbraker@gmail.com>
Signed-off-by: Jakob Bornecrantz <wallbraker@gmail.com>
This commit is contained in:
Chris Wilson 2010-12-01 21:57:41 +01:00 committed by Jakob Bornecrantz
parent 600454084b
commit f6476822a0
2 changed files with 37 additions and 79 deletions

View File

@ -29,42 +29,47 @@
#define I915_BATCHBUFFER_H
#include "i915_winsys.h"
#include "util/u_debug.h"
struct i915_context;
static INLINE boolean
i915_winsys_batchbuffer_check(struct i915_winsys_batchbuffer *batch,
size_t dwords,
size_t relocs)
{
return dwords * 4 <= batch->size - (batch->ptr - batch->map) &&
relocs <= (batch->max_relocs - batch->relocs);
}
static INLINE size_t
i915_winsys_batchbuffer_space(struct i915_winsys_batchbuffer *batch)
{
return batch->size - (batch->ptr - batch->map);
}
static INLINE boolean
i915_winsys_batchbuffer_check(struct i915_winsys_batchbuffer *batch,
size_t dwords,
size_t relocs)
{
return dwords * 4 <= i915_winsys_batchbuffer_space(batch) &&
relocs <= (batch->max_relocs - batch->relocs);
}
static INLINE void
i915_winsys_batchbuffer_dword(struct i915_winsys_batchbuffer *batch,
i915_winsys_batchbuffer_dword_unchecked(struct i915_winsys_batchbuffer *batch,
unsigned dword)
{
if (i915_winsys_batchbuffer_space(batch) < 4)
return;
*(unsigned *)batch->ptr = dword;
batch->ptr += 4;
}
static INLINE void
i915_winsys_batchbuffer_write(struct i915_winsys_batchbuffer *batch,
void *data,
size_t size)
i915_winsys_batchbuffer_dword(struct i915_winsys_batchbuffer *batch,
unsigned dword)
{
if (i915_winsys_batchbuffer_space(batch) < size)
return;
assert (i915_winsys_batchbuffer_space(batch) >= 4);
i915_winsys_batchbuffer_dword_unchecked(batch, dword);
}
static INLINE void
i915_winsys_batchbuffer_write(struct i915_winsys_batchbuffer *batch,
void *data,
size_t size)
{
assert (i915_winsys_batchbuffer_space(batch) >= size);
memcpy(data, batch->ptr, size);
batch->ptr += size;

View File

@ -14,9 +14,6 @@
#define INTEL_BATCH_CLIPRECTS 0x2
#undef INTEL_RUN_SYNC
#undef INTEL_MAP_BATCHBUFFER
#undef INTEL_MAP_GTT
#define INTEL_ALWAYS_FLUSH
struct i915_drm_batchbuffer
{
@ -72,11 +69,7 @@ i915_drm_batchbuffer_create(struct i915_winsys *iws)
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;
@ -157,71 +150,33 @@ i915_drm_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
struct pipe_fence_handle **fence)
{
struct i915_drm_batchbuffer *batch = i915_drm_batchbuffer(ibatch);
unsigned used = 0;
int ret = 0;
unsigned used;
int ret;
assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
used = batch->base.ptr - batch->base.map;
assert((used & 3) == 0);
#ifdef INTEL_ALWAYS_FLUSH
/* MI_FLUSH | FLUSH_MAP_CACHE */
i915_winsys_batchbuffer_dword(ibatch, (0x4<<23)|(1<<0));
used += 4;
#endif
if ((used & 4) == 0) {
/* MI_NOOP */
i915_winsys_batchbuffer_dword(ibatch, 0);
}
/* MI_BATCH_BUFFER_END */
i915_winsys_batchbuffer_dword(ibatch, (0xA<<23));
i915_winsys_batchbuffer_dword_unchecked(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
if (used & 4) {
/* MI_NOOP */
i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
used += 4;
}
/* Do the sending to HW */
if (i915_drm_winsys(ibatch->iws)->send_cmd)
ret = drm_intel_bo_subdata(batch->bo, 0, used, batch->base.map);
if (ret == 0 && i915_drm_winsys(ibatch->iws)->send_cmd)
ret = drm_intel_bo_exec(batch->bo, used, NULL, 0, 0);
else
ret = 0;
if (ret != 0 || i915_drm_winsys(ibatch->iws)->dump_cmd) {
#ifdef INTEL_MAP_BATCHBUFFER
#ifdef INTEL_MAP_GTT
drm_intel_gem_bo_map_gtt(batch->bo);
#else
drm_intel_bo_map(batch->bo, 0);
#endif
#endif
i915_dump_batchbuffer(ibatch);
assert(ret == 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
#endif
} else {
#ifdef INTEL_RUN_SYNC
drm_intel_bo_map(batch->bo, FALSE);
drm_intel_bo_unmap(batch->bo);
#endif
}
#ifdef INTEL_RUN_SYNC
drm_intel_bo_wait_rendering(batch->bo);
#endif
if (fence) {
ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
@ -244,9 +199,7 @@ i915_drm_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
if (batch->bo)
drm_intel_bo_unreference(batch->bo);
#ifndef INTEL_MAP_BATCHBUFFER
FREE(batch->base.map);
#endif
FREE(batch);
}