vc4: Handle resolve skipping at job submit time.

This is done in vc4_flush currently, but I'm going to make the job always
track the surfaces it might be rendering to instead of putting in the
destinations at flush time.
This commit is contained in:
Eric Anholt
2016-09-08 13:02:22 -07:00
parent 9688166bd9
commit f473348468
3 changed files with 37 additions and 31 deletions
+1
View File
@@ -149,6 +149,7 @@ vc4_tile_blit(struct pipe_context *pctx, const struct pipe_blit_info *info)
job->tile_height = tile_height;
job->msaa = msaa;
job->needs_flush = true;
job->resolve |= PIPE_CLEAR_COLOR;
vc4_job_submit(vc4, job);
+2 -7
View File
@@ -52,10 +52,7 @@ vc4_flush(struct pipe_context *pctx)
pipe_surface_reference(&job->color_write, cbuf);
}
if (!(job->cleared & PIPE_CLEAR_COLOR0)) {
pipe_surface_reference(&job->color_read, cbuf);
}
pipe_surface_reference(&job->color_read, cbuf);
}
if (zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
@@ -65,9 +62,7 @@ vc4_flush(struct pipe_context *pctx)
pipe_surface_reference(&job->zs_write, zsbuf);
}
if (!(job->cleared & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
pipe_surface_reference(&job->zs_read, zsbuf);
}
pipe_surface_reference(&job->zs_read, zsbuf);
}
vc4_job_submit(vc4, job);
+34 -24
View File
@@ -81,10 +81,8 @@ vc4_submit_setup_rcl_surface(struct vc4_job *job,
{
struct vc4_surface *surf = vc4_surface(psurf);
if (!surf) {
submit_surf->hindex = ~0;
if (!surf)
return;
}
struct vc4_resource *rsc = vc4_resource(psurf->texture);
submit_surf->hindex = vc4_gem_hindex(job, rsc->bo);
@@ -124,10 +122,8 @@ vc4_submit_setup_rcl_render_config_surface(struct vc4_job *job,
{
struct vc4_surface *surf = vc4_surface(psurf);
if (!surf) {
submit_surf->hindex = ~0;
if (!surf)
return;
}
struct vc4_resource *rsc = vc4_resource(psurf->texture);
submit_surf->hindex = vc4_gem_hindex(job, rsc->bo);
@@ -153,10 +149,8 @@ vc4_submit_setup_rcl_msaa_surface(struct vc4_job *job,
{
struct vc4_surface *surf = vc4_surface(psurf);
if (!surf) {
submit_surf->hindex = ~0;
if (!surf)
return;
}
struct vc4_resource *rsc = vc4_resource(psurf->texture);
submit_surf->hindex = vc4_gem_hindex(job, rsc->bo);
@@ -202,25 +196,41 @@ vc4_job_submit(struct vc4_context *vc4, struct vc4_job *job)
cl_u8(&bcl, VC4_PACKET_FLUSH);
cl_end(&job->bcl, bcl);
}
struct drm_vc4_submit_cl submit;
memset(&submit, 0, sizeof(submit));
struct drm_vc4_submit_cl submit = {
.color_read.hindex = ~0,
.zs_read.hindex = ~0,
.color_write.hindex = ~0,
.msaa_color_write.hindex = ~0,
.zs_write.hindex = ~0,
.msaa_zs_write.hindex = ~0,
};
cl_ensure_space(&job->bo_handles, 6 * sizeof(uint32_t));
cl_ensure_space(&job->bo_pointers, 6 * sizeof(struct vc4_bo *));
vc4_submit_setup_rcl_surface(job, &submit.color_read,
job->color_read, false, false);
vc4_submit_setup_rcl_render_config_surface(job, &submit.color_write,
job->color_write);
vc4_submit_setup_rcl_surface(job, &submit.zs_read,
job->zs_read, true, false);
vc4_submit_setup_rcl_surface(job, &submit.zs_write,
job->zs_write, true, true);
vc4_submit_setup_rcl_msaa_surface(job, &submit.msaa_color_write,
job->msaa_color_write);
vc4_submit_setup_rcl_msaa_surface(job, &submit.msaa_zs_write,
job->msaa_zs_write);
if (job->resolve & PIPE_CLEAR_COLOR) {
if (!(job->cleared & PIPE_CLEAR_COLOR)) {
vc4_submit_setup_rcl_surface(job, &submit.color_read,
job->color_read,
false, false);
}
vc4_submit_setup_rcl_render_config_surface(job,
&submit.color_write,
job->color_write);
vc4_submit_setup_rcl_msaa_surface(job,
&submit.msaa_color_write,
job->msaa_color_write);
}
if (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) {
if (!(job->cleared & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) {
vc4_submit_setup_rcl_surface(job, &submit.zs_read,
job->zs_read, true, false);
}
vc4_submit_setup_rcl_surface(job, &submit.zs_write,
job->zs_write, true, true);
vc4_submit_setup_rcl_msaa_surface(job, &submit.msaa_zs_write,
job->msaa_zs_write);
}
if (job->msaa) {
/* This bit controls how many pixels the general