summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChia-I Wu <[email protected]>2014-07-28 23:33:47 +0800
committerChia-I Wu <[email protected]>2014-07-28 23:55:55 +0800
commitcc1e1da24a6c535617d9fb38858d48d8c2999e68 (patch)
treeabfbb2876fe0adb22080fbfc83c74e797cbce3a9
parentfb1820355b0178f04622201688449cf2154feb42 (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.c36
-rw-r--r--src/gallium/drivers/ilo/ilo_state.h4
-rw-r--r--src/gallium/drivers/ilo/ilo_transfer.c4
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 {