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