diff options
author | Chia-I Wu <olvaffe@gmail.com> | 2014-07-28 23:33:47 +0800 |
---|---|---|
committer | Chia-I Wu <olvaffe@gmail.com> | 2014-07-28 23:55:55 +0800 |
commit | cc1e1da24a6c535617d9fb38858d48d8c2999e68 (patch) | |
tree | abfbb2876fe0adb22080fbfc83c74e797cbce3a9 /src/gallium/drivers/ilo/ilo_state.c | |
parent | fb1820355b0178f04622201688449cf2154feb42 (diff) | |
download | external_mesa3d-cc1e1da24a6c535617d9fb38858d48d8c2999e68.zip external_mesa3d-cc1e1da24a6c535617d9fb38858d48d8c2999e68.tar.gz external_mesa3d-cc1e1da24a6c535617d9fb38858d48d8c2999e68.tar.bz2 |
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.
Diffstat (limited to 'src/gallium/drivers/ilo/ilo_state.c')
-rw-r--r-- | src/gallium/drivers/ilo/ilo_state.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/src/gallium/drivers/ilo/ilo_state.c b/src/gallium/drivers/ilo/ilo_state.c index 1b97eaa..0cc813c 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; } |