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