diff options
author | Chia-I Wu <[email protected]> | 2014-07-28 23:33:47 +0800 |
---|---|---|
committer | Chia-I Wu <[email protected]> | 2014-07-28 23:55:55 +0800 |
commit | cc1e1da24a6c535617d9fb38858d48d8c2999e68 (patch) | |
tree | abfbb2876fe0adb22080fbfc83c74e797cbce3a9 | |
parent | fb1820355b0178f04622201688449cf2154feb42 (diff) |
ilo: correctly propagate resource renames to hardware
Not only should we mark states dirty when the underlying resource is renamed,
we should also update the CSO bo when available.
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.c | 36 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/ilo/ilo_transfer.c | 4 |
3 files changed, 30 insertions, 14 deletions
diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index 1b97eaa14c6..0cc813c1fd7 100644 --- a/src/gallium/drivers/ilo/ilo_state.c +++ b/src/gallium/drivers/ilo/ilo_state.c @@ -1236,9 +1236,10 @@ ilo_cleanup_states(struct ilo_context *ilo) * Mark all states that have the resource dirty. */ void -ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, - const struct pipe_resource *res) +ilo_mark_states_with_resource_renamed(struct ilo_context *ilo, + struct pipe_resource *res) { + struct intel_bo *bo = ilo_resource_get_bo(res); uint32_t states = 0; unsigned sh, i; @@ -1277,15 +1278,16 @@ ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, for (sh = 0; sh < PIPE_SHADER_TYPES; sh++) { for (i = 0; i < ilo->view[sh].count; i++) { - struct pipe_sampler_view *view = ilo->view[sh].states[i]; + struct ilo_view_cso *cso = (struct ilo_view_cso *) ilo->view[sh].states[i]; - if (view->texture == res) { + if (cso->base.texture == res) { static const unsigned view_dirty_bits[PIPE_SHADER_TYPES] = { [PIPE_SHADER_VERTEX] = ILO_DIRTY_VIEW_VS, [PIPE_SHADER_FRAGMENT] = ILO_DIRTY_VIEW_FS, [PIPE_SHADER_GEOMETRY] = ILO_DIRTY_VIEW_GS, [PIPE_SHADER_COMPUTE] = ILO_DIRTY_VIEW_CS, }; + cso->surface.bo = bo; states |= view_dirty_bits[sh]; break; @@ -1297,6 +1299,7 @@ ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, struct ilo_cbuf_cso *cbuf = &ilo->cbuf[sh].cso[i]; if (cbuf->resource == res) { + cbuf->surface.bo = bo; states |= ILO_DIRTY_CBUF; break; } @@ -1305,7 +1308,11 @@ ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, } for (i = 0; i < ilo->resource.count; i++) { - if (ilo->resource.states[i]->texture == res) { + struct ilo_surface_cso *cso = + (struct ilo_surface_cso *) ilo->resource.states[i]; + + if (cso->base.texture == res) { + cso->u.rt.bo = bo; states |= ILO_DIRTY_RESOURCE; break; } @@ -1314,20 +1321,29 @@ ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, /* for now? */ if (res->target != PIPE_BUFFER) { for (i = 0; i < ilo->fb.state.nr_cbufs; i++) { - const struct pipe_surface *surf = ilo->fb.state.cbufs[i]; - if (surf && surf->texture == res) { + struct ilo_surface_cso *cso = + (struct ilo_surface_cso *) ilo->fb.state.cbufs[i]; + if (cso && cso->base.texture == res) { + cso->u.rt.bo = bo; states |= ILO_DIRTY_FB; break; } } - if (ilo->fb.state.zsbuf && ilo->fb.state.zsbuf->texture == res) + if (ilo->fb.state.zsbuf && ilo->fb.state.zsbuf->texture == res) { + struct ilo_surface_cso *cso = + (struct ilo_surface_cso *) ilo->fb.state.zsbuf; + + cso->u.rt.bo = bo; states |= ILO_DIRTY_FB; + } } for (i = 0; i < ilo->cs_resource.count; i++) { - pipe_surface_reference(&ilo->cs_resource.states[i], NULL); - if (ilo->cs_resource.states[i]->texture == res) { + struct ilo_surface_cso *cso = + (struct ilo_surface_cso *) ilo->cs_resource.states[i]; + if (cso->base.texture == res) { + cso->u.rt.bo = bo; states |= ILO_DIRTY_CS_RESOURCE; break; } diff --git a/src/gallium/drivers/ilo/ilo_state.h b/src/gallium/drivers/ilo/ilo_state.h index 0509fa04291..588a1b9660a 100644 --- a/src/gallium/drivers/ilo/ilo_state.h +++ b/src/gallium/drivers/ilo/ilo_state.h @@ -133,8 +133,8 @@ ilo_finalize_3d_states(struct ilo_context *ilo, const struct pipe_draw_info *draw); void -ilo_mark_states_with_resource_dirty(struct ilo_context *ilo, - const struct pipe_resource *res); +ilo_mark_states_with_resource_renamed(struct ilo_context *ilo, + struct pipe_resource *res); void ilo_dump_dirty_flags(uint32_t dirty); diff --git a/src/gallium/drivers/ilo/ilo_transfer.c b/src/gallium/drivers/ilo/ilo_transfer.c index 59e06b21a53..208e1b0327e 100644 --- a/src/gallium/drivers/ilo/ilo_transfer.c +++ b/src/gallium/drivers/ilo/ilo_transfer.c @@ -1100,7 +1100,7 @@ choose_transfer_method(struct ilo_context *ilo, struct ilo_transfer *xfer) } if (resource_renamed) - ilo_mark_states_with_resource_dirty(ilo, res); + ilo_mark_states_with_resource_renamed(ilo, res); } return true; @@ -1118,7 +1118,7 @@ buf_pwrite(struct ilo_context *ilo, struct ilo_buffer *buf, if ((usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) && ilo_buffer_rename_bo(buf)) { - ilo_mark_states_with_resource_dirty(ilo, &buf->base); + ilo_mark_states_with_resource_renamed(ilo, &buf->base); unblocked = true; } else { |