144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#include "i915_sw_winsys.h"
344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#include "i915/i915_batchbuffer.h"
4fbd681f1a03f6ad62432107dc94e02674f6de7bfJakob Bornecrantz#include "i915/i915_debug.h"
544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#include "util/u_memory.h"
644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define BATCH_RESERVED 16
844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define INTEL_DEFAULT_RELOCS 100
1044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define INTEL_MAX_RELOCS 400
1144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
1244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define INTEL_BATCH_NO_CLIPRECTS 0x1
1344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define INTEL_BATCH_CLIPRECTS    0x2
1444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
1544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#define INTEL_ALWAYS_FLUSH
1644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
1744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstruct i915_sw_batchbuffer
1844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
1944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_winsys_batchbuffer base;
2044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
2144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   size_t actual_size;
2244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz};
2344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
2444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic INLINE struct i915_sw_batchbuffer *
2544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch)
2644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
2744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   return (struct i915_sw_batchbuffer *)batch;
2844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
2944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
3044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void
3144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch)
3244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
3344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   memset(batch->base.map, 0, batch->actual_size);
3444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.ptr = batch->base.map;
3544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.size = batch->actual_size - BATCH_RESERVED;
3644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.relocs = 0;
3744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
3844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
3944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic struct i915_winsys_batchbuffer *
4044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer_create(struct i915_winsys *iws)
4144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
4244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_sw_winsys *isws = i915_sw_winsys(iws);
4344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);
4444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
4544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->actual_size = isws->max_batch_size;
4644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
4744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.map = MALLOC(batch->actual_size);
4844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.ptr = NULL;
4944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.size = 0;
5044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
5144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.relocs = 0;
5244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
5344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.iws = iws;
5444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
5544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   i915_sw_batchbuffer_reset(batch);
5644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
5744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   return &batch->base;
5844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
5944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
603c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetterstatic boolean
613c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetteri915_sw_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
623c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter				     struct i915_winsys_buffer **buffer,
633c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter				     int num_of_buffers)
643c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter{
653c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter   return TRUE;
663c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter}
673c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter
6844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic int
6944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
7044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz                          struct i915_winsys_buffer *buffer,
7144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz                          enum i915_winsys_buffer_usage usage,
721e966636d06e92f562a7dbcd69aa88c4c9283c41Daniel Vetter                          unsigned pre_add, boolean fenced)
7344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
7444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
7544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   int ret = 0;
7644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
7744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   if (usage == I915_USAGE_SAMPLER) {
7844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
7944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   } else if (usage == I915_USAGE_RENDER) {
8044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
8144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   } else if (usage == I915_USAGE_2D_TARGET) {
8244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
8344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   } else if (usage == I915_USAGE_2D_SOURCE) {
8444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
8544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   } else if (usage == I915_USAGE_VERTEX) {
8644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
8744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   } else {
8844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      assert(0);
8944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      return -1;
9044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   }
9144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
9244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   ((uint32_t*)batch->base.ptr)[0] = 0;
9344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   batch->base.ptr += 4;
9444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
9544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   if (!ret)
9644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      batch->base.relocs++;
9744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
9844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   return ret;
9944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
10044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
10144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void
10244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
10344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz                          struct pipe_fence_handle **fence)
10444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
10544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
10644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   unsigned used = 0;
10744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
10844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
10944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
11044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   used = batch->base.ptr - batch->base.map;
11144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   assert((used & 3) == 0);
11244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
11344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#ifdef INTEL_ALWAYS_FLUSH
11444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   /* MI_FLUSH | FLUSH_MAP_CACHE */
1159a371b938c16d4fcb43e4e5ce2fbc2756202752aJakob Bornecrantz   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
11644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   used += 4;
11744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz#endif
11844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
11944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   if ((used & 4) == 0) {
12044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      /* MI_NOOP */
1219a371b938c16d4fcb43e4e5ce2fbc2756202752aJakob Bornecrantz      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
12244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   }
12344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   /* MI_BATCH_BUFFER_END */
1249a371b938c16d4fcb43e4e5ce2fbc2756202752aJakob Bornecrantz   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
12544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
12644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   used = batch->base.ptr - batch->base.map;
12744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   assert((used & 4) == 0);
12844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
12944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
130fbd681f1a03f6ad62432107dc94e02674f6de7bfJakob Bornecrantz      i915_dump_batchbuffer(ibatch);
13144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   }
13244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
13344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   if (fence) {
13444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
13544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
13644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz      (*fence) = i915_sw_fence_create();
13744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   }
13844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
13944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   i915_sw_batchbuffer_reset(batch);
14044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
14144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
14244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzstatic void
14344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzi915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
14444bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
14544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
14644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
14744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   FREE(batch->base.map);
14844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   FREE(batch);
14944bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
15044bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz
15144bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantzvoid i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws)
15244bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz{
15344bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   isws->base.batchbuffer_create = i915_sw_batchbuffer_create;
1543c59b3eb4b6f4f673106d738b62458e6b0b38d46Daniel Vetter   isws->base.validate_buffers = i915_sw_batchbuffer_validate_buffers;
15544bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc;
15644bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush;
15744bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz   isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy;
15844bafca1a0b1e9bf06e05a3ec982e0feab5ada47Jakob Bornecrantz}
159