193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "i915_sw_winsys.h"
393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "i915/i915_batchbuffer.h"
493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "i915/i915_debug.h"
593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#include "util/u_memory.h"
693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define BATCH_RESERVED 16
893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define INTEL_DEFAULT_RELOCS 100
1093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define INTEL_MAX_RELOCS 400
1193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
1293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define INTEL_BATCH_NO_CLIPRECTS 0x1
1393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define INTEL_BATCH_CLIPRECTS    0x2
1493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
1593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#define INTEL_ALWAYS_FLUSH
1693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
1793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestruct i915_sw_batchbuffer
1893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
1993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   struct i915_winsys_batchbuffer base;
2093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
2193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   size_t actual_size;
2293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke};
2393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
2493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic INLINE struct i915_sw_batchbuffer *
2593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkei915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch)
2693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
2793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   return (struct i915_sw_batchbuffer *)batch;
2893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
2993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
3093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void
3193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkei915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch)
3293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
3393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   memset(batch->base.map, 0, batch->actual_size);
3493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   batch->base.ptr = batch->base.map;
35c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg   batch->base.size = batch->actual_size - BATCH_RESERVED;
36c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg   batch->base.relocs = 0;
3793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
3893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
3993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic struct i915_winsys_batchbuffer *
406b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzkei915_sw_batchbuffer_create(struct i915_winsys *iws)
416b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke{
426b369c4c7cd8a52f99bbff2a57fb316b33a87495Benjamin Franzke   struct i915_sw_winsys *isws = i915_sw_winsys(iws);
4351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);
4451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
4551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->actual_size = isws->max_batch_size;
4651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
4751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->base.map = MALLOC(batch->actual_size);
4851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->base.ptr = NULL;
4951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->base.size = 0;
5051f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
5151f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->base.relocs = 0;
5251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
5351f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   batch->base.iws = iws;
5451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
5551f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   i915_sw_batchbuffer_reset(batch);
5651f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
5751f2820922b669af3947fcedd17109524644bb94Benjamin Franzke   return &batch->base;
5851f2820922b669af3947fcedd17109524644bb94Benjamin Franzke}
5951f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
6051f2820922b669af3947fcedd17109524644bb94Benjamin Franzkestatic boolean
6151f2820922b669af3947fcedd17109524644bb94Benjamin Franzkei915_sw_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
6251f2820922b669af3947fcedd17109524644bb94Benjamin Franzke				     struct i915_winsys_buffer **buffer,
6393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke				     int num_of_buffers)
6493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
6593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   return TRUE;
6693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
6793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
6893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic int
6993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkei915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
7093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke                          struct i915_winsys_buffer *buffer,
7193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke                          enum i915_winsys_buffer_usage usage,
7293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke                          unsigned pre_add, boolean fenced)
7393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
7493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
7593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   int ret = 0;
7693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
7793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   if (usage == I915_USAGE_SAMPLER) {
7893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
7993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   } else if (usage == I915_USAGE_RENDER) {
8093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
8193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   } else if (usage == I915_USAGE_2D_TARGET) {
8293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
8393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   } else if (usage == I915_USAGE_2D_SOURCE) {
8493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
8593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   } else if (usage == I915_USAGE_VERTEX) {
8693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
8793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   } else {
8893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      assert(0);
8993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      return -1;
9093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   }
9193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
9293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   ((uint32_t*)batch->base.ptr)[0] = 0;
9393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   batch->base.ptr += 4;
9451f2820922b669af3947fcedd17109524644bb94Benjamin Franzke
9593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   if (!ret)
9693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      batch->base.relocs++;
9793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
9893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   return ret;
9993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
10093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
10193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void
10293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkei915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
10393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke                          struct pipe_fence_handle **fence)
10493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
10593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
10693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   unsigned used = 0;
10793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
10893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
10993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
11093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   used = batch->base.ptr - batch->base.map;
11193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   assert((used & 3) == 0);
112c0f8c9911c82c576cdd82dabad4a2370ac53565cKristian Høgsberg
11393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#ifdef INTEL_ALWAYS_FLUSH
11493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   /* MI_FLUSH | FLUSH_MAP_CACHE */
11593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
11693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   used += 4;
11793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke#endif
11893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
11993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   if ((used & 4) == 0) {
12093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      /* MI_NOOP */
12193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
12293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   }
12387dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   /* MI_BATCH_BUFFER_END */
12487dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
12587dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke
12687dde5b1cd596c4008695ff2db9469f88c09f925Benjamin Franzke   used = batch->base.ptr - batch->base.map;
12793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   assert((used & 4) == 0);
12893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
12993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
13093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      i915_dump_batchbuffer(ibatch);
13193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   }
13293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
13393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   if (fence) {
13493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
13593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
13693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke      (*fence) = i915_sw_fence_create();
13793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   }
13893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
13993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   i915_sw_batchbuffer_reset(batch);
14093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
14193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
14293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkestatic void
14393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkei915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
14493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
14593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
14693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
14793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   FREE(batch->base.map);
14893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   FREE(batch);
14993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
15093aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke
15193aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzkevoid i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws)
15293aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke{
15393aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   isws->base.batchbuffer_create = i915_sw_batchbuffer_create;
15493aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   isws->base.validate_buffers = i915_sw_batchbuffer_validate_buffers;
15593aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc;
15693aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush;
15793aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke   isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy;
15893aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke}
15993aea84f472f5f9ff588f7b2d4f7320ec43bc216Benjamin Franzke