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:
parent
600454084b
commit
f6476822a0
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue