2 #include "intel_be_batchbuffer.h"
3 #include "intel_be_context.h"
4 #include "intel_be_device.h"
5 #include "intel_be_fence.h"
8 #include "util/u_memory.h"
10 struct intel_be_batchbuffer
*
11 intel_be_batchbuffer_alloc(struct intel_be_context
*intel
)
13 struct intel_be_batchbuffer
*batch
= CALLOC_STRUCT(intel_be_batchbuffer
);
15 batch
->base
.buffer
= NULL
;
16 batch
->base
.winsys
= &intel
->base
;
17 batch
->base
.map
= NULL
;
18 batch
->base
.ptr
= NULL
;
20 batch
->base
.actual_size
= intel
->device
->max_batch_size
;
21 batch
->base
.relocs
= 0;
22 batch
->base
.max_relocs
= INTEL_DEFAULT_RELOCS
;
24 batch
->base
.map
= malloc(batch
->base
.actual_size
);
25 memset(batch
->base
.map
, 0, batch
->base
.actual_size
);
27 batch
->base
.ptr
= batch
->base
.map
;
29 intel_be_batchbuffer_reset(batch
);
35 intel_be_batchbuffer_reset(struct intel_be_batchbuffer
*batch
)
37 struct intel_be_context
*intel
= intel_be_context(batch
->base
.winsys
);
38 struct intel_be_device
*dev
= intel
->device
;
41 drm_intel_bo_unreference(batch
->bo
);
43 memset(batch
->base
.map
, 0, batch
->base
.actual_size
);
44 batch
->base
.ptr
= batch
->base
.map
;
45 batch
->base
.size
= batch
->base
.actual_size
- BATCH_RESERVED
;
47 batch
->base
.relocs
= 0;
48 batch
->base
.max_relocs
= INTEL_DEFAULT_RELOCS
;
50 batch
->bo
= drm_intel_bo_alloc(dev
->pools
.gem
,
51 "gallium3d_batch_buffer",
52 batch
->base
.actual_size
, 0);
56 intel_be_offset_relocation(struct intel_be_batchbuffer
*batch
,
59 uint32_t read_domains
,
60 uint32_t write_domain
)
65 assert(batch
->base
.relocs
< batch
->base
.max_relocs
);
67 offset
= (unsigned)(batch
->base
.ptr
- batch
->base
.map
);
71 TODO: Enable this when we submit batch buffers to HW
72 ret = drm_intel_bo_emit_reloc(bo, pre_add,
85 intel_be_batchbuffer_flush(struct intel_be_batchbuffer
*batch
,
86 struct intel_be_fence
**fence
)
88 struct i915_batchbuffer
*i915
= &batch
->base
;
90 assert(i915_batchbuffer_space(i915
) >= 0);
92 /* TODO: submit stuff to HW */
94 intel_be_batchbuffer_reset(batch
);
98 intel_be_fence_unreference(*fence
);
100 (*fence
) = CALLOC_STRUCT(intel_be_fence
);
101 (*fence
)->refcount
= 1;
107 intel_be_batchbuffer_finish(struct intel_be_batchbuffer
*batch
)
113 intel_be_batchbuffer_free(struct intel_be_batchbuffer
*batch
)
116 drm_intel_bo_unreference(batch
->bo
);
118 free(batch
->base
.map
);