i915_sw_batchbuffer.c revision 135b083461f8a5a220d86f57af018f6f0316d2bb
1 2#include "i915_sw_winsys.h" 3#include "i915/i915_batchbuffer.h" 4#include "util/u_memory.h" 5 6#define BATCH_RESERVED 16 7 8#define INTEL_DEFAULT_RELOCS 100 9#define INTEL_MAX_RELOCS 400 10 11#define INTEL_BATCH_NO_CLIPRECTS 0x1 12#define INTEL_BATCH_CLIPRECTS 0x2 13 14#define INTEL_ALWAYS_FLUSH 15 16struct i915_sw_batchbuffer 17{ 18 struct i915_winsys_batchbuffer base; 19 20 size_t actual_size; 21}; 22 23static INLINE struct i915_sw_batchbuffer * 24i915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch) 25{ 26 return (struct i915_sw_batchbuffer *)batch; 27} 28 29static void 30i915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch) 31{ 32 memset(batch->base.map, 0, batch->actual_size); 33 batch->base.ptr = batch->base.map; 34 batch->base.size = batch->actual_size - BATCH_RESERVED; 35 batch->base.relocs = 0; 36} 37 38static struct i915_winsys_batchbuffer * 39i915_sw_batchbuffer_create(struct i915_winsys *iws) 40{ 41 struct i915_sw_winsys *isws = i915_sw_winsys(iws); 42 struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer); 43 44 batch->actual_size = isws->max_batch_size; 45 46 batch->base.map = MALLOC(batch->actual_size); 47 batch->base.ptr = NULL; 48 batch->base.size = 0; 49 50 batch->base.relocs = 0; 51 batch->base.max_relocs = 300;/*INTEL_DEFAULT_RELOCS;*/ 52 53 batch->base.iws = iws; 54 55 i915_sw_batchbuffer_reset(batch); 56 57 return &batch->base; 58} 59 60static int 61i915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch, 62 struct i915_winsys_buffer *buffer, 63 enum i915_winsys_buffer_usage usage, 64 unsigned pre_add, bool fenced) 65{ 66 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch); 67 int ret = 0; 68 69 assert(batch->base.relocs < batch->base.max_relocs); 70 71 if (usage == I915_USAGE_SAMPLER) { 72 73 } else if (usage == I915_USAGE_RENDER) { 74 75 } else if (usage == I915_USAGE_2D_TARGET) { 76 77 } else if (usage == I915_USAGE_2D_SOURCE) { 78 79 } else if (usage == I915_USAGE_VERTEX) { 80 81 } else { 82 assert(0); 83 return -1; 84 } 85 86 ((uint32_t*)batch->base.ptr)[0] = 0; 87 batch->base.ptr += 4; 88 89 if (!ret) 90 batch->base.relocs++; 91 92 return ret; 93} 94 95static void 96i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch, 97 struct pipe_fence_handle **fence) 98{ 99 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch); 100 unsigned used = 0; 101 int i; 102 103 assert(i915_winsys_batchbuffer_space(ibatch) >= 0); 104 105 used = batch->base.ptr - batch->base.map; 106 assert((used & 3) == 0); 107 108#ifdef INTEL_ALWAYS_FLUSH 109 /* MI_FLUSH | FLUSH_MAP_CACHE */ 110 i915_winsys_batchbuffer_dword(ibatch, (0x4<<23)|(1<<0)); 111 used += 4; 112#endif 113 114 if ((used & 4) == 0) { 115 /* MI_NOOP */ 116 i915_winsys_batchbuffer_dword(ibatch, 0); 117 } 118 /* MI_BATCH_BUFFER_END */ 119 i915_winsys_batchbuffer_dword(ibatch, (0xA<<23)); 120 121 used = batch->base.ptr - batch->base.map; 122 assert((used & 4) == 0); 123 124 if (i915_sw_winsys(ibatch->iws)->dump_cmd) { 125 unsigned *ptr = (unsigned *)batch->base.map; 126 127 debug_printf("%s:\n", __func__); 128 for (i = 0; i < used / 4; i++, ptr++) { 129 debug_printf("\t%08x: %08x\n", i*4, *ptr); 130 } 131 } 132 133 if (fence) { 134 ibatch->iws->fence_reference(ibatch->iws, fence, NULL); 135 136 (*fence) = i915_sw_fence_create(); 137 } 138 139 i915_sw_batchbuffer_reset(batch); 140} 141 142static void 143i915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch) 144{ 145 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch); 146 147 FREE(batch->base.map); 148 FREE(batch); 149} 150 151void i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws) 152{ 153 isws->base.batchbuffer_create = i915_sw_batchbuffer_create; 154 isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc; 155 isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush; 156 isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy; 157} 158