Lines Matching refs:job

41 v3d_job_free(struct v3d_context *v3d, struct v3d_job *job)
43 set_foreach(job->bos, entry) {
48 _mesa_hash_table_remove_key(v3d->jobs, &job->key);
50 if (job->write_prscs) {
51 set_foreach(job->write_prscs, entry) {
58 for (int i = 0; i < job->nr_cbufs; i++) {
59 if (job->cbufs[i]) {
61 job->cbufs[i]->texture);
62 pipe_surface_reference(&job->cbufs[i], NULL);
65 if (job->zsbuf) {
66 struct v3d_resource *rsc = v3d_resource(job->zsbuf->texture);
72 job->zsbuf->texture);
73 pipe_surface_reference(&job->zsbuf, NULL);
75 if (job->bbuf)
76 pipe_surface_reference(&job->bbuf, NULL);
78 if (v3d->job == job)
79 v3d->job = NULL;
81 v3d_destroy_cl(&job->bcl);
82 v3d_destroy_cl(&job->rcl);
83 v3d_destroy_cl(&job->indirect);
84 v3d_bo_unreference(&job->tile_alloc);
85 v3d_bo_unreference(&job->tile_state);
87 ralloc_free(job);
93 struct v3d_job *job = rzalloc(v3d, struct v3d_job);
95 job->v3d = v3d;
97 v3d_init_cl(job, &job->bcl);
98 v3d_init_cl(job, &job->rcl);
99 v3d_init_cl(job, &job->indirect);
101 job->draw_min_x = ~0;
102 job->draw_min_y = ~0;
103 job->draw_max_x = 0;
104 job->draw_max_y = 0;
106 job->bos = _mesa_set_create(job,
109 return job;
113 v3d_job_add_bo(struct v3d_job *job, struct v3d_bo *bo)
118 if (_mesa_set_search(job->bos, bo))
122 _mesa_set_add(job->bos, bo);
123 job->referenced_size += bo->size;
125 uint32_t *bo_handles = (void *)(uintptr_t)job->submit.bo_handles;
127 if (job->submit.bo_handle_count >= job->bo_handles_size) {
128 job->bo_handles_size = MAX2(4, job->bo_handles_size * 2);
129 bo_handles = reralloc(job, bo_handles,
130 uint32_t, job->bo_handles_size);
131 job->submit.bo_handles = (uintptr_t)(void *)bo_handles;
133 bo_handles[job->submit.bo_handle_count++] = bo->handle;
137 v3d_job_add_write_resource(struct v3d_job *job, struct pipe_resource *prsc)
139 struct v3d_context *v3d = job->v3d;
141 if (!job->write_prscs) {
142 job->write_prscs = _mesa_set_create(job,
147 _mesa_set_add(job->write_prscs, prsc);
148 _mesa_hash_table_insert(v3d->write_jobs, prsc, job);
155 struct v3d_job *job = entry->data;
157 if (_mesa_set_search(job->bos, bo))
158 v3d_job_submit(v3d, job);
163 v3d_job_add_tf_write_resource(struct v3d_job *job, struct pipe_resource *prsc)
165 v3d_job_add_write_resource(job, prsc);
167 if (!job->tf_write_prscs)
168 job->tf_write_prscs = _mesa_pointer_set_create(job);
170 _mesa_set_add(job->tf_write_prscs, prsc);
174 v3d_job_writes_resource_from_tf(struct v3d_job *job,
177 if (!job->tf_enabled)
180 if (!job->tf_write_prscs)
183 return _mesa_set_search(job->tf_write_prscs, prsc) != NULL;
199 * are serialized with the previous submitted job.
209 struct v3d_job *job = entry->data;
217 needs_flush = !v3d->job || v3d->job != job;
221 /* For writes from TF in the same job we use the "Wait for TF"
228 needs_flush = !v3d_job_writes_resource_from_tf(job, prsc);
232 v3d_job_submit(v3d, job);
253 struct v3d_job *job = entry->data;
255 if (!_mesa_set_search(job->bos, rsc->bo))
261 needs_flush = !v3d->job || v3d->job != job;
270 v3d_job_submit(v3d, job);
282 * If we've already started rendering to this FBO, then return the same job,
294 /* Return the existing job for this FBO if we have one */
310 /* Creating a new job. Make sure that any previous jobs reading or
313 struct v3d_job *job = v3d_job_create(v3d);
314 job->nr_cbufs = nr_cbufs;
316 for (int i = 0; i < job->nr_cbufs; i++) {
321 pipe_surface_reference(&job->cbufs[i], cbufs[i]);
324 job->msaa = true;
331 pipe_surface_reference(&job->zsbuf, zsbuf);
333 job->msaa = true;
336 pipe_surface_reference(&job->bbuf, bbuf);
338 job->msaa = true;
341 for (int i = 0; i < job->nr_cbufs; i++) {
344 cbufs[i]->texture, job);
347 _mesa_hash_table_insert(v3d->write_jobs, zsbuf->texture, job);
357 job);
361 job->double_buffer =
362 unlikely(V3D_DEBUG & V3D_DEBUG_DOUBLE_BUFFER) && !job->msaa;
364 memcpy(&job->key, &local_key, sizeof(local_key));
365 _mesa_hash_table_insert(v3d->jobs, &job->key, job);
367 return job;
373 if (v3d->job)
374 return v3d->job;
379 struct v3d_job *job = v3d_get_job(v3d, nr_cbufs, cbufs, zsbuf, NULL);
382 job->msaa = true;
383 job->double_buffer = false;
386 v3d_get_tile_buffer_size(job->msaa, job->double_buffer,
387 job->nr_cbufs, job->cbufs, job->bbuf,
388 &job->tile_width, &job->tile_height,
389 &job->internal_bpp);
391 /* The dirty flags are tracking what's been updated while v3d->job has
404 job->clear |= PIPE_CLEAR_COLOR0 << i;
411 job->clear |= PIPE_CLEAR_DEPTH;
417 job->clear |= PIPE_CLEAR_STENCIL;
420 job->draw_tiles_x = DIV_ROUND_UP(v3d->framebuffer.width,
421 job->tile_width);
422 job->draw_tiles_y = DIV_ROUND_UP(v3d->framebuffer.height,
423 job->tile_height);
425 v3d->job = job;
427 return job;
431 v3d_clif_dump(struct v3d_context *v3d, struct v3d_job *job)
444 set_foreach(job->bos, entry) {
455 clif_dump(clif, &job->submit);
479 * Submits the job to the kernel and then reinitializes it.
482 v3d_job_submit(struct v3d_context *v3d, struct v3d_job *job)
486 if (!job->needs_flush)
492 job->needs_primitives_generated =
496 if (job->needs_primitives_generated)
500 v3d41_emit_rcl(job);
502 v3d33_emit_rcl(job);
504 if (cl_offset(&job->bcl) > 0) {
506 v3d41_bcl_epilogue(v3d, job);
508 v3d33_bcl_epilogue(v3d, job);
512 * finished, we also need to block on any previous TFU job we may have
515 job->submit.in_sync_rcl = v3d->out_sync;
518 job->submit.out_sync = v3d->out_sync;
520 job->submit.bcl_end = job->bcl.bo->offset + cl_offset(&job->bcl);
521 job->submit.rcl_end = job->rcl.bo->offset + cl_offset(&job->rcl);
525 job->submit.perfmon_id = v3d->active_perfmon->kperfmon_id;
528 /* If we are submitting a job with a different perfmon, we need to
534 job->submit.in_sync_bcl = v3d->out_sync;
537 job->submit.flags = 0;
538 if (job->tmu_dirty_rcl && screen->has_cache_flush)
539 job->submit.flags |= DRM_V3D_SUBMIT_CL_FLUSH_CACHE;
545 v3d_job_add_bo(job, job->tile_alloc);
546 job->submit.qma = job->tile_alloc->offset;
547 job->submit.qms = job->tile_alloc->size;
549 v3d_job_add_bo(job, job->tile_state);
550 job->submit.qts = job->tile_state->offset;
553 v3d_clif_dump(v3d, job);
558 ret = v3d_ioctl(v3d->fd, DRM_IOCTL_V3D_SUBMIT_CL, &job->submit);
569 /* If we are submitting a job in the middle of transform
576 * If the job doesn't have any TF draw calls, then we know
584 if (job->needs_primitives_generated ||
586 job->tf_draw_calls_queued > 0))
591 v3d_job_free(v3d, job);