Lines Matching refs:job

54 lima_get_fb_info(struct lima_job *job)
56 struct lima_context *ctx = job->ctx;
57 struct lima_job_fb_info *fb = &job->fb;
58 struct lima_surface *surf = lima_surface(job->key.cbuf);
61 surf = lima_surface(job->key.zsbuf);
140 lima_job_free(struct lima_job *job)
142 struct lima_context *ctx = job->ctx;
144 _mesa_hash_table_remove_key(ctx->jobs, &job->key);
146 if (job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0))
147 _mesa_hash_table_remove_key(ctx->write_jobs, job->key.cbuf->texture);
148 if (job->key.zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
149 _mesa_hash_table_remove_key(ctx->write_jobs, job->key.zsbuf->texture);
151 pipe_surface_reference(&job->key.cbuf, NULL);
152 pipe_surface_reference(&job->key.zsbuf, NULL);
154 lima_dump_free(job->dump);
155 job->dump = NULL;
157 /* TODO: do we need a cache for job? */
158 ralloc_free(job);
175 struct lima_job *job = lima_job_create(ctx, cbuf, zsbuf);
176 if (!job)
179 _mesa_hash_table_insert(ctx->jobs, &job->key, job);
181 return job;
199 if (ctx->job)
200 return ctx->job;
202 ctx->job = _lima_job_get(ctx);
203 return ctx->job;
206 bool lima_job_add_bo(struct lima_job *job, int pipe,
209 util_dynarray_foreach(job->gem_bos + pipe, struct drm_lima_gem_submit_bo, gem_bo) {
217 util_dynarray_grow(job->gem_bos + pipe, struct drm_lima_gem_submit_bo, 1);
221 struct lima_bo **jbo = util_dynarray_grow(job->bos + pipe, struct lima_bo *, 1);
224 /* prevent bo from being freed when job start */
231 lima_job_start(struct lima_job *job, int pipe, void *frame, uint32_t size)
233 struct lima_context *ctx = job->ctx;
237 .nr_bos = job->gem_bos[pipe].size / sizeof(struct drm_lima_gem_submit_bo),
238 .bos = VOID2U64(util_dynarray_begin(job->gem_bos + pipe)),
245 int err = drmSyncobjImportSyncFile(job->fd, ctx->in_sync[pipe],
255 bool ret = drmIoctl(job->fd, DRM_IOCTL_LIMA_GEM_SUBMIT, &req) == 0;
257 util_dynarray_foreach(job->bos + pipe, struct lima_bo *, bo) {
265 lima_job_wait(struct lima_job *job, int pipe, uint64_t timeout_ns)
271 struct lima_context *ctx = job->ctx;
272 return !drmSyncobjWait(job->fd, ctx->out_sync + pipe, 1, abs_timeout, 0, NULL);
276 lima_job_has_bo(struct lima_job *job, struct lima_bo *bo, bool all)
279 util_dynarray_foreach(job->gem_bos + i, struct drm_lima_gem_submit_bo, gem_bo) {
293 lima_job_create_stream_bo(struct lima_job *job, int pipe,
296 struct lima_context *ctx = job->ctx;
306 lima_job_add_bo(job, pipe, res->bo, LIMA_SUBMIT_BO_READ);
314 lima_job_get_damage(struct lima_job *job)
316 if (!(job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0)))
319 struct lima_surface *surf = lima_surface(job->key.cbuf);
325 lima_fb_cbuf_needs_reload(struct lima_job *job)
327 if (!job->key.cbuf)
330 struct lima_surface *surf = lima_surface(job->key.cbuf);
347 lima_fb_zsbuf_needs_reload(struct lima_job *job)
349 if (!job->key.zsbuf)
352 struct lima_surface *surf = lima_surface(job->key.zsbuf);
360 lima_pack_reload_plbu_cmd(struct lima_job *job, struct pipe_surface *psurf)
362 struct lima_job_fb_info *fb = &job->fb;
363 struct lima_context *ctx = job->ctx;
380 lima_pack_blit_cmd(job, &job->plbu_cmd_head,
386 lima_pack_blit_cmd(job, &job->plbu_cmd_head,
394 lima_pack_head_plbu_cmd(struct lima_job *job)
396 struct lima_context *ctx = job->ctx;
397 struct lima_job_fb_info *fb = &job->fb;
399 PLBU_CMD_BEGIN(&job->plbu_cmd_head, 10);
412 if (lima_fb_cbuf_needs_reload(job)) {
413 lima_pack_reload_plbu_cmd(job, job->key.cbuf);
416 if (lima_fb_zsbuf_needs_reload(job))
417 lima_pack_reload_plbu_cmd(job, job->key.zsbuf);
485 lima_generate_pp_stream(struct lima_job *job, int off_x, int off_y,
488 struct lima_context *ctx = job->ctx;
490 struct lima_job_fb_info *fb = &job->fb;
546 job->dump, stream[i], si[i] * 4,
574 lima_update_damage_pp_stream(struct lima_job *job)
576 struct lima_context *ctx = job->ctx;
577 struct lima_damage_region *ds = lima_job_get_damage(job);
578 struct lima_job_fb_info *fb = &job->fb;
580 struct pipe_scissor_state *dr = &job->damage_rect;
625 lima_job_add_bo(job, LIMA_PIPE_PP, s->bo, LIMA_SUBMIT_BO_READ);
658 lima_generate_pp_stream(job, bound.minx, bound.miny, tiled_w, tiled_h);
664 lima_job_add_bo(job, LIMA_PIPE_PP, s->bo, LIMA_SUBMIT_BO_READ);
668 lima_damage_fullscreen(struct lima_job *job)
670 struct pipe_scissor_state *dr = &job->damage_rect;
674 dr->maxx == job->fb.width &&
675 dr->maxy == job->fb.height;
679 lima_update_pp_stream(struct lima_job *job)
681 struct lima_context *ctx = job->ctx;
683 struct lima_damage_region *damage = lima_job_get_damage(job);
685 (damage && damage->region) || !lima_damage_fullscreen(job))
686 lima_update_damage_pp_stream(job);
693 lima_update_job_bo(struct lima_job *job)
695 struct lima_context *ctx = job->ctx;
697 lima_job_add_bo(job, LIMA_PIPE_GP, ctx->plb_gp_stream,
699 lima_job_add_bo(job, LIMA_PIPE_GP, ctx->plb[ctx->plb_index],
701 lima_job_add_bo(job, LIMA_PIPE_GP, ctx->gp_tile_heap[ctx->plb_index],
705 job->dump, ctx->plb_gp_stream->map + ctx->plb_index * ctx->plb_gp_size,
709 lima_job_add_bo(job, LIMA_PIPE_PP, ctx->plb[ctx->plb_index],
711 lima_job_add_bo(job, LIMA_PIPE_PP, ctx->gp_tile_heap[ctx->plb_index],
715 lima_job_add_bo(job, LIMA_PIPE_PP, screen->pp_buffer, LIMA_SUBMIT_BO_READ);
731 lima_pack_wb_zsbuf_reg(struct lima_job *job, uint32_t *wb_reg, int wb_idx)
733 struct lima_job_fb_info *fb = &job->fb;
734 struct pipe_surface *zsbuf = job->key.zsbuf;
760 lima_pack_wb_cbuf_reg(struct lima_job *job, uint32_t *frame_reg,
763 struct lima_job_fb_info *fb = &job->fb;
764 struct pipe_surface *cbuf = job->key.cbuf;
795 lima_pack_pp_frame_reg(struct lima_job *job, uint32_t *frame_reg,
798 struct lima_context *ctx = job->ctx;
799 struct lima_job_fb_info *fb = &job->fb;
800 struct pipe_surface *cbuf = job->key.cbuf;
809 frame->clear_value_color = (uint32_t)(job->clear.color_16pc & 0xffffffffUL);
810 frame->clear_value_color_1 = (uint32_t)(job->clear.color_16pc >> 32);
815 frame->clear_value_color = job->clear.color_8pc;
816 frame->clear_value_color_1 = job->clear.color_8pc;
817 frame->clear_value_color_2 = job->clear.color_8pc;
818 frame->clear_value_color_3 = job->clear.color_8pc;
821 frame->clear_value_depth = job->clear.depth;
822 frame->clear_value_stencil = job->clear.stencil;
833 frame->fragment_stack_size = job->pp_max_stack_size << 16 | job->pp_max_stack_size;
846 if (cbuf && (job->resolve & PIPE_CLEAR_COLOR0))
847 lima_pack_wb_cbuf_reg(job, frame_reg, wb_reg, wb_idx++);
849 if (job->key.zsbuf &&
850 (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))
851 lima_pack_wb_zsbuf_reg(job, wb_reg, wb_idx++);
855 lima_do_job(struct lima_job *job)
859 struct lima_context *ctx = job->ctx;
861 lima_pack_head_plbu_cmd(job);
862 lima_finish_plbu_cmd(&job->plbu_cmd_array);
864 lima_update_job_bo(job);
866 int vs_cmd_size = job->vs_cmd_array.size;
871 job, LIMA_PIPE_GP, vs_cmd_size, &vs_cmd_va);
872 memcpy(vs_cmd, util_dynarray_begin(&job->vs_cmd_array), vs_cmd_size);
875 job->dump, vs_cmd, vs_cmd_size, false, "flush vs cmd at va %x\n", vs_cmd_va);
876 lima_dump_vs_command_stream_print(job->dump, vs_cmd, vs_cmd_size, vs_cmd_va);
880 int plbu_cmd_size = job->plbu_cmd_array.size + job->plbu_cmd_head.size;
882 job, LIMA_PIPE_GP, plbu_cmd_size, &plbu_cmd_va);
884 util_dynarray_begin(&job->plbu_cmd_head),
885 job->plbu_cmd_head.size);
886 memcpy(plbu_cmd + job->plbu_cmd_head.size,
887 util_dynarray_begin(&job->plbu_cmd_array),
888 job->plbu_cmd_array.size);
891 job->dump, plbu_cmd, plbu_cmd_size, false, "flush plbu cmd at va %x\n", plbu_cmd_va);
892 lima_dump_plbu_command_stream_print(job->dump, plbu_cmd, plbu_cmd_size, plbu_cmd_va);
905 job->dump, &gp_frame, sizeof(gp_frame), false, "add gp frame\n");
907 if (!lima_job_start(job, LIMA_PIPE_GP, &gp_frame, sizeof(gp_frame)))
908 fprintf(stderr, "gp job error\n");
910 if (job->dump) {
911 if (lima_job_wait(job, LIMA_PIPE_GP, PIPE_TIMEOUT_INFINITE)) {
915 job->dump, pos, 4 * 4 * 16, true, "gl_pos dump at va %x\n",
921 job->dump, plb, LIMA_CTX_PLB_BLK_SIZE, false, "plb dump at va %x\n",
925 fprintf(stderr, "gp job wait error\n");
931 if (job->pp_max_stack_size) {
933 job, LIMA_PIPE_PP,
934 screen->num_pp * job->pp_max_stack_size * pp_stack_pp_size,
938 lima_update_pp_stream(job);
943 lima_pack_pp_frame_reg(job, pp_frame.frame, pp_frame.wb);
948 if (job->pp_max_stack_size)
950 job->pp_max_stack_size * pp_stack_pp_size * i;
954 job->dump, &pp_frame, sizeof(pp_frame), false, "add pp frame\n");
956 if (!lima_job_start(job, LIMA_PIPE_PP, &pp_frame, sizeof(pp_frame)))
957 fprintf(stderr, "pp job error\n");
961 lima_pack_pp_frame_reg(job, pp_frame.frame, pp_frame.wb);
964 if (job->pp_max_stack_size)
967 job->pp_max_stack_size * pp_stack_pp_size * i;
976 struct lima_job_fb_info *fb = &job->fb;
985 job->dump, &pp_frame, sizeof(pp_frame), false, "add pp frame\n");
987 if (!lima_job_start(job, LIMA_PIPE_PP, &pp_frame, sizeof(pp_frame)))
988 fprintf(stderr, "pp job error\n");
991 if (job->dump) {
992 if (!lima_job_wait(job, LIMA_PIPE_PP, PIPE_TIMEOUT_INFINITE)) {
1001 if (job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0)) {
1002 struct lima_surface *surf = lima_surface(job->key.cbuf);
1006 if (job->key.zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
1007 struct lima_surface *surf = lima_surface(job->key.zsbuf);
1008 surf->reload = (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL));
1011 if (ctx->job == job)
1012 ctx->job = NULL;
1014 lima_job_free(job);
1021 struct lima_job *job = entry->data;
1022 lima_do_job(job);
1031 struct lima_job *job = entry->data;
1032 if (lima_job_has_bo(job, bo, write))
1033 lima_do_job(job);
1038 * This is for current job flush previous job which write to the resource it wants
1048 struct lima_job *job = entry->data;
1050 /* do not flush current job */
1051 if (job != ctx->job)
1052 lima_do_job(job);