ilo: correctly propagate resource renames to hardware
authorChia-I Wu <olvaffe@gmail.com>
Mon, 28 Jul 2014 15:33:47 +0000 (23:33 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Mon, 28 Jul 2014 15:55:55 +0000 (23:55 +0800)
Not only should we mark states dirty when the underlying resource is renamed,
we should also update the CSO bo when available.

src/gallium/drivers/ilo/ilo_state.c
src/gallium/drivers/ilo/ilo_state.h
src/gallium/drivers/ilo/ilo_transfer.c

index 1b97eaa14c6b7851d326e4118f9bb3cc4c2cf738..0cc813c1fd71e99ee05c6ded1e9c560fcec31599 100644 (file)
@@ -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;
       }
index 0509fa042914f1deb87cc0591c522018a166f1f8..588a1b9660a0e19c5aa9639dbca8766fb997572f 100644 (file)
@@ -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);
index 59e06b21a53003a97579d63466fac310baa6c5c2..208e1b0327e1b6746d02a6cd354350000481f05c 100644 (file)
@@ -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 {