Lines Matching defs:batch

39 alloc_ring(struct fd_batch *batch, unsigned sz, enum fd_ringbuffer_flags flags)
41 struct fd_context *ctx = batch->ctx;
57 return fd_submit_new_ringbuffer(batch->submit, sz, flags);
61 batch_init(struct fd_batch *batch)
63 struct fd_context *ctx = batch->ctx;
65 batch->submit = fd_submit_new(ctx->pipe);
66 if (batch->nondraw) {
67 batch->gmem = alloc_ring(batch, 0x1000, FD_RINGBUFFER_PRIMARY);
68 batch->draw = alloc_ring(batch, 0x100000, 0);
70 batch->gmem = alloc_ring(batch, 0x100000, FD_RINGBUFFER_PRIMARY);
71 batch->draw = alloc_ring(batch, 0x100000, 0);
75 batch->binning = alloc_ring(batch, 0x100000, 0);
79 batch->in_fence_fd = -1;
80 batch->fence = NULL;
87 batch->fence = fd_fence_create(batch);
89 batch->cleared = 0;
90 batch->fast_cleared = 0;
91 batch->invalidated = 0;
92 batch->restore = batch->resolve = 0;
93 batch->needs_flush = false;
94 batch->flushed = false;
95 batch->gmem_reason = 0;
96 batch->num_draws = 0;
97 batch->num_vertices = 0;
98 batch->num_bins_per_pipe = 0;
99 batch->prim_strm_bits = 0;
100 batch->draw_strm_bits = 0;
102 fd_reset_wfi(batch);
104 util_dynarray_init(&batch->draw_patches, NULL);
105 util_dynarray_init(&batch->fb_read_patches, NULL);
108 util_dynarray_init(&batch->shader_patches, NULL);
109 util_dynarray_init(&batch->gmem_patches, NULL);
113 util_dynarray_init(&batch->rbrc_patches, NULL);
115 assert(batch->resources->entries == 0);
117 util_dynarray_init(&batch->samples, NULL);
119 u_trace_init(&batch->trace, &ctx->trace_context);
120 batch->last_timestamp_cmd = NULL;
126 struct fd_batch *batch = CALLOC_STRUCT(fd_batch);
128 if (!batch)
131 DBG("%p", batch);
133 pipe_reference_init(&batch->reference, 1);
134 batch->ctx = ctx;
135 batch->nondraw = nondraw;
137 simple_mtx_init(&batch->submit_lock, mtx_plain);
139 batch->resources =
142 batch_init(batch);
144 return batch;
148 cleanup_submit(struct fd_batch *batch)
150 if (!batch->submit)
153 fd_ringbuffer_del(batch->draw);
154 fd_ringbuffer_del(batch->gmem);
156 if (batch->binning) {
157 fd_ringbuffer_del(batch->binning);
158 batch->binning = NULL;
161 if (batch->prologue) {
162 fd_ringbuffer_del(batch->prologue);
163 batch->prologue = NULL;
166 if (batch->epilogue) {
167 fd_ringbuffer_del(batch->epilogue);
168 batch->epilogue = NULL;
171 if (batch->tile_setup) {
172 fd_ringbuffer_del(batch->tile_setup);
173 batch->tile_setup = NULL;
176 if (batch->tile_fini) {
177 fd_ringbuffer_del(batch->tile_fini);
178 batch->tile_fini = NULL;
181 fd_submit_del(batch->submit);
182 batch->submit = NULL;
186 batch_fini(struct fd_batch *batch)
188 DBG("%p", batch);
190 pipe_resource_reference(&batch->query_buf, NULL);
192 if (batch->in_fence_fd != -1)
193 close(batch->in_fence_fd);
195 /* in case batch wasn't flushed but fence was created: */
196 if (batch->fence)
197 fd_fence_set_batch(batch->fence, NULL);
199 fd_fence_ref(&batch->fence, NULL);
201 cleanup_submit(batch);
203 util_dynarray_fini(&batch->draw_patches);
204 util_dynarray_fini(&batch->fb_read_patches);
206 if (is_a2xx(batch->ctx->screen)) {
207 util_dynarray_fini(&batch->shader_patches);
208 util_dynarray_fini(&batch->gmem_patches);
211 if (is_a3xx(batch->ctx->screen))
212 util_dynarray_fini(&batch->rbrc_patches);
214 while (batch->samples.size > 0) {
216 util_dynarray_pop(&batch->samples, struct fd_hw_sample *);
217 fd_hw_sample_reference(batch->ctx, &samp, NULL);
219 util_dynarray_fini(&batch->samples);
221 u_trace_fini(&batch->trace);
225 batch_flush_dependencies(struct fd_batch *batch) assert_dt
227 struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
230 foreach_batch (dep, cache, batch->dependents_mask) {
235 batch->dependents_mask = 0;
239 batch_reset_dependencies(struct fd_batch *batch)
241 struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
244 foreach_batch (dep, cache, batch->dependents_mask) {
248 batch->dependents_mask = 0;
252 batch_reset_resources(struct fd_batch *batch)
254 fd_screen_assert_locked(batch->ctx->screen);
256 set_foreach (batch->resources, entry) {
258 _mesa_set_remove(batch->resources, entry);
259 assert(rsc->track->batch_mask & (1 << batch->idx));
260 rsc->track->batch_mask &= ~(1 << batch->idx);
261 if (rsc->track->write_batch == batch)
267 batch_reset(struct fd_batch *batch) assert_dt
269 DBG("%p", batch);
271 batch_reset_dependencies(batch);
273 fd_screen_lock(batch->ctx->screen);
274 batch_reset_resources(batch);
275 fd_screen_unlock(batch->ctx->screen);
277 batch_fini(batch);
278 batch_init(batch);
282 fd_batch_reset(struct fd_batch *batch)
284 if (batch->needs_flush)
285 batch_reset(batch);
289 __fd_batch_destroy(struct fd_batch *batch)
291 struct fd_context *ctx = batch->ctx;
293 DBG("%p", batch);
295 fd_screen_assert_locked(batch->ctx->screen);
297 fd_bc_invalidate_batch(batch, true);
299 batch_reset_resources(batch);
300 assert(batch->resources->entries == 0);
301 _mesa_set_destroy(batch->resources, NULL);
304 batch_reset_dependencies(batch);
305 assert(batch->dependents_mask == 0);
307 util_copy_framebuffer_state(&batch->framebuffer, NULL);
308 batch_fini(batch);
310 simple_mtx_destroy(&batch->submit_lock);
312 free(batch->key);
313 free(batch);
318 __fd_batch_describe(char *buf, const struct fd_batch *batch)
320 sprintf(buf, "fd_batch<%u>", batch->seqno);
323 /* Get per-batch prologue */
325 fd_batch_get_prologue(struct fd_batch *batch)
327 if (!batch->prologue)
328 batch->prologue = alloc_ring(batch, 0x1000, 0);
329 return batch->prologue;
334 batch_flush(struct fd_batch *batch) assert_dt
336 DBG("%p: needs_flush=%d", batch, batch->needs_flush);
338 if (!fd_batch_lock_submit(batch))
341 batch->needs_flush = false;
346 fd_batch_finish_queries(batch);
348 batch_flush_dependencies(batch);
350 fd_screen_lock(batch->ctx->screen);
351 batch_reset_resources(batch);
352 /* NOTE: remove=false removes the batch from the hashtable, so future
353 * lookups won't cache-hit a flushed batch, but leaves the weak reference
354 * to the batch to avoid having multiple batches with same batch->idx, as
357 fd_bc_invalidate_batch(batch, false);
358 batch->flushed = true;
360 if (batch == batch->ctx->batch)
361 fd_batch_reference_locked(&batch->ctx->batch, NULL);
363 fd_screen_unlock(batch->ctx->screen);
365 if (batch->fence)
366 fd_fence_ref(&batch->ctx->last_fence, batch->fence);
368 fd_gmem_render_tiles(batch);
370 assert(batch->reference.count > 0);
372 cleanup_submit(batch);
373 fd_batch_unlock_submit(batch);
376 /* NOTE: could drop the last ref to batch
379 fd_batch_flush(struct fd_batch *batch)
384 * since the last ref to this batch could be dropped when cleaning
387 fd_batch_reference(&tmp, batch);
394 recursive_dependents_mask(struct fd_batch *batch)
396 struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
398 uint32_t dependents_mask = batch->dependents_mask;
400 foreach_batch (dep, cache, batch->dependents_mask)
407 fd_batch_add_dep(struct fd_batch *batch, struct fd_batch *dep)
409 fd_screen_assert_locked(batch->ctx->screen);
411 if (batch->dependents_mask & (1 << dep->idx))
415 assert(!((1 << batch->idx) & recursive_dependents_mask(dep)));
419 batch->dependents_mask |= (1 << dep->idx);
420 DBG("%p: added dependency on %p", batch, dep);
437 fd_batch_add_resource(struct fd_batch *batch, struct fd_resource *rsc)
440 if (likely(fd_batch_references_resource(batch, rsc))) {
441 assert(_mesa_set_search_pre_hashed(batch->resources, rsc->hash, rsc));
445 assert(!_mesa_set_search(batch->resources, rsc));
447 _mesa_set_add_pre_hashed(batch->resources, rsc->hash, rsc);
448 rsc->track->batch_mask |= (1 << batch->idx);
452 fd_batch_resource_write(struct fd_batch *batch, struct fd_resource *rsc)
454 fd_screen_assert_locked(batch->ctx->screen);
456 DBG("%p: write %p", batch, rsc);
463 if (rsc->track->write_batch == batch)
466 fd_batch_write_prep(batch, rsc);
469 fd_batch_resource_write(batch, rsc->stencil);
471 /* note, invalidate write batch, to avoid further writes to rsc
474 /* if we are pending read or write by any other batch: */
475 if (unlikely(rsc->track->batch_mask & ~(1 << batch->idx))) {
476 struct fd_batch_cache *cache = &batch->ctx->screen->batch_cache;
484 if (dep == batch)
491 fd_batch_add_dep(batch, b);
496 fd_batch_reference_locked(&rsc->track->write_batch, batch);
498 fd_batch_add_resource(batch, rsc);
502 fd_batch_resource_read_slowpath(struct fd_batch *batch, struct fd_resource *rsc)
504 fd_screen_assert_locked(batch->ctx->screen);
507 fd_batch_resource_read(batch, rsc->stencil);
509 DBG("%p: read %p", batch, rsc);
513 * flush the current batch in _resource_used()
515 if (unlikely(rsc->track->write_batch && rsc->track->write_batch != batch))
518 fd_batch_add_resource(batch, rsc);
522 fd_batch_check_size(struct fd_batch *batch)
525 fd_batch_flush(batch);
531 if ((batch->prim_strm_bits > limit_bits) ||
532 (batch->draw_strm_bits > limit_bits)) {
533 fd_batch_flush(batch);
537 if (!fd_ringbuffer_check_size(batch->draw))
538 fd_batch_flush(batch);
545 fd_wfi(struct fd_batch *batch, struct fd_ringbuffer *ring)
547 if (batch->needs_wfi) {
548 if (batch->ctx->screen->gen >= 5)
552 batch->needs_wfi = false;