diff options
author | Eric Anholt <[email protected]> | 2015-04-06 12:58:51 -0700 |
---|---|---|
committer | Eric Anholt <[email protected]> | 2015-04-13 23:20:45 -0700 |
commit | e214a596352e67c89ce379a1e5a060dbc1ce31e1 (patch) | |
tree | a066aa9566c1bc58442b81b7d2e063f104a5c854 /src/gallium/drivers/vc4/vc4_context.c | |
parent | 44b63cf5c051f7eccfc1d7427247fd58dabb7761 (diff) |
vc4: Separate out a bit of code for submitting jobs to the kernel.
I want to be able to have multiple jobs being set up at the same time (for
example, a render job to do a little fixup blit in the course of doing a
render to the main FBO).
Diffstat (limited to 'src/gallium/drivers/vc4/vc4_context.c')
-rw-r--r-- | src/gallium/drivers/vc4/vc4_context.c | 93 |
1 files changed, 3 insertions, 90 deletions
diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index daa5ba5d4c6..b394c186efb 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -296,40 +296,6 @@ vc4_setup_rcl(struct vc4_context *vc4) ztex->writes++; } -static void -vc4_draw_reset(struct vc4_context *vc4) -{ - struct vc4_bo **referenced_bos = vc4->bo_pointers.base; - for (int i = 0; i < (vc4->bo_handles.next - - vc4->bo_handles.base) / 4; i++) { - vc4_bo_unreference(&referenced_bos[i]); - } - vc4_reset_cl(&vc4->bcl); - vc4_reset_cl(&vc4->rcl); - vc4_reset_cl(&vc4->shader_rec); - vc4_reset_cl(&vc4->uniforms); - vc4_reset_cl(&vc4->bo_handles); - vc4_reset_cl(&vc4->bo_pointers); - vc4->shader_rec_count = 0; - - vc4->needs_flush = false; - vc4->draw_call_queued = false; - - /* We have no hardware context saved between our draw calls, so we - * need to flag the next draw as needing all state emitted. Emitting - * all state at the start of our draws is also what ensures that we - * return to the state we need after a previous tile has finished. - */ - vc4->dirty = ~0; - vc4->resolve = 0; - vc4->cleared = 0; - - vc4->draw_min_x = ~0; - vc4->draw_min_y = ~0; - vc4->draw_max_x = 0; - vc4->draw_max_y = 0; -} - void vc4_flush(struct pipe_context *pctx) { @@ -343,7 +309,7 @@ vc4_flush(struct pipe_context *pctx) */ if (vc4->draw_max_x <= vc4->draw_min_x || vc4->draw_max_y <= vc4->draw_min_y) { - vc4_draw_reset(vc4); + vc4_job_reset(vc4); return; } @@ -358,54 +324,7 @@ vc4_flush(struct pipe_context *pctx) vc4_setup_rcl(vc4); - if (vc4_debug & VC4_DEBUG_CL) { - fprintf(stderr, "BCL:\n"); - vc4_dump_cl(vc4->bcl.base, vc4->bcl.next - vc4->bcl.base, false); - fprintf(stderr, "RCL:\n"); - vc4_dump_cl(vc4->rcl.base, vc4->rcl.next - vc4->rcl.base, true); - } - - struct drm_vc4_submit_cl submit; - memset(&submit, 0, sizeof(submit)); - - submit.bo_handles = (uintptr_t)vc4->bo_handles.base; - submit.bo_handle_count = (vc4->bo_handles.next - - vc4->bo_handles.base) / 4; - submit.bin_cl = (uintptr_t)vc4->bcl.base; - submit.bin_cl_size = vc4->bcl.next - vc4->bcl.base; - submit.render_cl = (uintptr_t)vc4->rcl.base; - submit.render_cl_size = vc4->rcl.next - vc4->rcl.base; - submit.shader_rec = (uintptr_t)vc4->shader_rec.base; - submit.shader_rec_size = vc4->shader_rec.next - vc4->shader_rec.base; - submit.shader_rec_count = vc4->shader_rec_count; - submit.uniforms = (uintptr_t)vc4->uniforms.base; - submit.uniforms_size = vc4->uniforms.next - vc4->uniforms.base; - - if (!(vc4_debug & VC4_DEBUG_NORAST)) { - int ret; - -#ifndef USE_VC4_SIMULATOR - ret = drmIoctl(vc4->fd, DRM_IOCTL_VC4_SUBMIT_CL, &submit); -#else - ret = vc4_simulator_flush(vc4, &submit); -#endif - if (ret) { - fprintf(stderr, "VC4 submit failed\n"); - abort(); - } - } - - vc4->last_emit_seqno = submit.seqno; - - if (vc4_debug & VC4_DEBUG_ALWAYS_SYNC) { - if (!vc4_wait_seqno(vc4->screen, vc4->last_emit_seqno, - PIPE_TIMEOUT_INFINITE)) { - fprintf(stderr, "Wait failed.\n"); - abort(); - } - } - - vc4_draw_reset(vc4); + vc4_job_submit(vc4); } static void @@ -532,13 +451,7 @@ vc4_context_create(struct pipe_screen *pscreen, void *priv) vc4_query_init(pctx); vc4_resource_context_init(pctx); - vc4_init_cl(vc4, &vc4->bcl); - vc4_init_cl(vc4, &vc4->rcl); - vc4_init_cl(vc4, &vc4->shader_rec); - vc4_init_cl(vc4, &vc4->uniforms); - vc4_init_cl(vc4, &vc4->bo_handles); - vc4_init_cl(vc4, &vc4->bo_pointers); - vc4_draw_reset(vc4); + vc4_job_init(vc4); vc4->fd = screen->fd; |