2 #include "i915_sw_winsys.h"
3 #include "i915/i915_batchbuffer.h"
4 #include "i915/i915_debug.h"
5 #include "util/u_memory.h"
7 #define BATCH_RESERVED 16
9 #define INTEL_DEFAULT_RELOCS 100
10 #define INTEL_MAX_RELOCS 400
12 #define INTEL_BATCH_NO_CLIPRECTS 0x1
13 #define INTEL_BATCH_CLIPRECTS 0x2
15 #define INTEL_ALWAYS_FLUSH
17 struct i915_sw_batchbuffer
19 struct i915_winsys_batchbuffer base;
24 static INLINE struct i915_sw_batchbuffer *
25 i915_sw_batchbuffer(struct i915_winsys_batchbuffer *batch)
27 return (struct i915_sw_batchbuffer *)batch;
31 i915_sw_batchbuffer_reset(struct i915_sw_batchbuffer *batch)
33 memset(batch->base.map, 0, batch->actual_size);
34 batch->base.ptr = batch->base.map;
35 batch->base.size = batch->actual_size - BATCH_RESERVED;
36 batch->base.relocs = 0;
39 static struct i915_winsys_batchbuffer *
40 i915_sw_batchbuffer_create(struct i915_winsys *iws)
42 struct i915_sw_winsys *isws = i915_sw_winsys(iws);
43 struct i915_sw_batchbuffer *batch = CALLOC_STRUCT(i915_sw_batchbuffer);
45 batch->actual_size = isws->max_batch_size;
47 batch->base.map = MALLOC(batch->actual_size);
48 batch->base.ptr = NULL;
51 batch->base.relocs = 0;
53 batch->base.iws = iws;
55 i915_sw_batchbuffer_reset(batch);
61 i915_sw_batchbuffer_validate_buffers(struct i915_winsys_batchbuffer *batch,
62 struct i915_winsys_buffer **buffer,
69 i915_sw_batchbuffer_reloc(struct i915_winsys_batchbuffer *ibatch,
70 struct i915_winsys_buffer *buffer,
71 enum i915_winsys_buffer_usage usage,
72 unsigned pre_add, boolean fenced)
74 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
77 if (usage == I915_USAGE_SAMPLER) {
79 } else if (usage == I915_USAGE_RENDER) {
81 } else if (usage == I915_USAGE_2D_TARGET) {
83 } else if (usage == I915_USAGE_2D_SOURCE) {
85 } else if (usage == I915_USAGE_VERTEX) {
92 ((uint32_t*)batch->base.ptr)[0] = 0;
102 i915_sw_batchbuffer_flush(struct i915_winsys_batchbuffer *ibatch,
103 struct pipe_fence_handle **fence)
105 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
108 assert(i915_winsys_batchbuffer_space(ibatch) >= 0);
110 used = batch->base.ptr - batch->base.map;
111 assert((used & 3) == 0);
113 #ifdef INTEL_ALWAYS_FLUSH
114 /* MI_FLUSH | FLUSH_MAP_CACHE */
115 i915_winsys_batchbuffer_dword_unchecked(ibatch, (0x4<<23)|(1<<0));
119 if ((used & 4) == 0) {
121 i915_winsys_batchbuffer_dword_unchecked(ibatch, 0);
123 /* MI_BATCH_BUFFER_END */
124 i915_winsys_batchbuffer_dword_unchecked(ibatch, (0xA<<23));
126 used = batch->base.ptr - batch->base.map;
127 assert((used & 4) == 0);
129 if (i915_sw_winsys(ibatch->iws)->dump_cmd) {
130 i915_dump_batchbuffer(ibatch);
134 ibatch->iws->fence_reference(ibatch->iws, fence, NULL);
136 (*fence) = i915_sw_fence_create();
139 i915_sw_batchbuffer_reset(batch);
143 i915_sw_batchbuffer_destroy(struct i915_winsys_batchbuffer *ibatch)
145 struct i915_sw_batchbuffer *batch = i915_sw_batchbuffer(ibatch);
147 FREE(batch->base.map);
151 void i915_sw_winsys_init_batchbuffer_functions(struct i915_sw_winsys *isws)
153 isws->base.batchbuffer_create = i915_sw_batchbuffer_create;
154 isws->base.validate_buffers = i915_sw_batchbuffer_validate_buffers;
155 isws->base.batchbuffer_reloc = i915_sw_batchbuffer_reloc;
156 isws->base.batchbuffer_flush = i915_sw_batchbuffer_flush;
157 isws->base.batchbuffer_destroy = i915_sw_batchbuffer_destroy;