diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/iris/iris_resolve.c | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c index cff40513073..8555ce67588 100644 --- a/src/gallium/drivers/iris/iris_resolve.c +++ b/src/gallium/drivers/iris/iris_resolve.c @@ -248,50 +248,58 @@ iris_postdraw_update_resolve_tracking(struct iris_context *ice, // XXX: front buffer drawing? - if (ice->state.dirty & (IRIS_DIRTY_DEPTH_BUFFER | - IRIS_DIRTY_WM_DEPTH_STENCIL)) { - struct pipe_surface *zs_surf = cso_fb->zsbuf; - if (zs_surf) { - struct iris_resource *z_res, *s_res; - iris_get_depth_stencil_resources(zs_surf->texture, &z_res, &s_res); - unsigned num_layers = - zs_surf->u.tex.last_layer - zs_surf->u.tex.first_layer + 1; - - if (z_res) { + bool may_have_resolved_depth = + ice->state.dirty & (IRIS_DIRTY_DEPTH_BUFFER | + IRIS_DIRTY_WM_DEPTH_STENCIL); + + struct pipe_surface *zs_surf = cso_fb->zsbuf; + if (zs_surf) { + struct iris_resource *z_res, *s_res; + iris_get_depth_stencil_resources(zs_surf->texture, &z_res, &s_res); + unsigned num_layers = + zs_surf->u.tex.last_layer - zs_surf->u.tex.first_layer + 1; + + if (z_res) { + if (may_have_resolved_depth) { iris_resource_finish_depth(ice, z_res, zs_surf->u.tex.level, zs_surf->u.tex.first_layer, num_layers, ice->state.depth_writes_enabled); - - if (ice->state.depth_writes_enabled) - iris_depth_cache_add_bo(batch, z_res->bo); } - if (s_res) { + if (ice->state.depth_writes_enabled) + iris_depth_cache_add_bo(batch, z_res->bo); + } + + if (s_res) { + if (may_have_resolved_depth) { iris_resource_finish_write(ice, s_res, zs_surf->u.tex.level, zs_surf->u.tex.first_layer, num_layers, ISL_AUX_USAGE_NONE); - - if (ice->state.stencil_writes_enabled) - iris_depth_cache_add_bo(batch, s_res->bo); } + + if (ice->state.stencil_writes_enabled) + iris_depth_cache_add_bo(batch, s_res->bo); } } - if (ice->state.dirty & (IRIS_DIRTY_BINDINGS_FS | IRIS_DIRTY_BLEND_STATE)) { - for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct iris_surface *surf = (void *) cso_fb->cbufs[i]; - if (!surf) - continue; + bool may_have_resolved_color = + ice->state.dirty & (IRIS_DIRTY_BINDINGS_FS | IRIS_DIRTY_BLEND_STATE); - struct iris_resource *res = (void *) surf->base.texture; + for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { + struct iris_surface *surf = (void *) cso_fb->cbufs[i]; + if (!surf) + continue; + + struct iris_resource *res = (void *) surf->base.texture; + enum isl_aux_usage aux_usage = ice->state.draw_aux_usage[i]; + + iris_render_cache_add_bo(batch, res->bo, surf->view.format, + aux_usage); + + if (may_have_resolved_color) { union pipe_surface_desc *desc = &surf->base.u; unsigned num_layers = desc->tex.last_layer - desc->tex.first_layer + 1; - enum isl_aux_usage aux_usage = ice->state.draw_aux_usage[i]; - - iris_render_cache_add_bo(batch, res->bo, surf->view.format, - aux_usage); - iris_resource_finish_render(ice, res, desc->tex.level, desc->tex.first_layer, num_layers, aux_usage); |