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
;