st/nine: Fix buffer/texture unbinding in nine_state_clear
authorAxel Davy <davyaxel0@gmail.com>
Thu, 4 Apr 2019 21:08:35 +0000 (23:08 +0200)
committerAxel Davy <davyaxel0@gmail.com>
Tue, 30 Apr 2019 17:18:50 +0000 (19:18 +0200)
Previously nine_state_clear was not using
NineBindBufferToDevice and NineBindTextureToDevice
to unbind buffers and textures (but used nine_bind)

This was resulting in an uncorrect bind count for these
resources.

Combined with
0ec4e5f630ed68ece3f176b174cfd66eff023904
Some buffers were scheduled to be uploaded directly
after they were locked (because the bind count incorrectly
assumed they were needed for the next draw call),
which resulted in uploads before the data was written.

To simplify a bit the code (and because I needed to
add a pointer to device),
remove the stateblock usage from nine_state_clear and
rename to nine_device_state_clear.

Fixes:
https://github.com/iXit/Mesa-3D/issues/345

Signed-off-by: Axel Davy <davyaxel0@gmail.com>
src/gallium/state_trackers/nine/device9.c
src/gallium/state_trackers/nine/device9ex.c
src/gallium/state_trackers/nine/nine_state.c
src/gallium/state_trackers/nine/nine_state.h
src/gallium/state_trackers/nine/stateblock9.c

index 0b1fe59cb707a64cc91e1edde020e25e91cf09d2..f165f24ee467611331be4ac83fcadcd3d9bab326 100644 (file)
@@ -531,7 +531,7 @@ NineDevice9_dtor( struct NineDevice9 *This )
 
     nine_ff_fini(This);
     nine_state_destroy_sw(This);
-    nine_state_clear(&This->state, TRUE);
+    nine_device_state_clear(This);
     nine_context_clear(This);
 
     nine_bind(&This->record, NULL);
@@ -907,7 +907,7 @@ NineDevice9_Reset( struct NineDevice9 *This,
     }
 
     nine_csmt_process(This);
-    nine_state_clear(&This->state, TRUE);
+    nine_device_state_clear(This);
     nine_context_clear(This);
 
     NineDevice9_SetDefaultState(This, TRUE);
index 2853a813baace2c3f2e8260bb373a48ddd3184ab..3047657e95f655ec8509c1b28e572ed750a51c83 100644 (file)
@@ -258,7 +258,7 @@ NineDevice9Ex_Reset( struct NineDevice9Ex *This,
     }
 
     nine_csmt_process(&This->base);
-    nine_state_clear(&This->base.state, TRUE);
+    nine_device_state_clear((struct NineDevice9 *)This);
     nine_context_clear(&This->base);
 
     NineDevice9_SetDefaultState((struct NineDevice9 *)This, TRUE);
index 939acb77cb3c529b9bd4e5392856c620993f2c45..21d51c9715d0180e5f804d5ab9f42bc77233f9e3 100644 (file)
@@ -2790,8 +2790,9 @@ nine_state_set_defaults(struct NineDevice9 *device, const D3DCAPS9 *caps,
 }
 
 void
-nine_state_clear(struct nine_state *state, const boolean device)
+nine_device_state_clear(struct NineDevice9 *device)
 {
+    struct nine_state *state = &device->state;
     unsigned i;
 
     for (i = 0; i < ARRAY_SIZE(state->rt); ++i)
@@ -2801,16 +2802,15 @@ nine_state_clear(struct nine_state *state, const boolean device)
     nine_bind(&state->ps, NULL);
     nine_bind(&state->vdecl, NULL);
     for (i = 0; i < PIPE_MAX_ATTRIBS; ++i)
-        nine_bind(&state->stream[i], NULL);
-
-    nine_bind(&state->idxbuf, NULL);
-    for (i = 0; i < NINE_MAX_SAMPLERS; ++i) {
-        if (device &&
-            state->texture[i] &&
-          --state->texture[i]->bind_count == 0)
-            list_delinit(&state->texture[i]->list);
-        nine_bind(&state->texture[i], NULL);
-    }
+        NineBindBufferToDevice(device,
+                               (struct NineBuffer9 **)&state->stream[i],
+                               NULL);
+    NineBindBufferToDevice(device,
+                           (struct NineBuffer9 **)&state->idxbuf,
+                           NULL);
+
+    for (i = 0; i < NINE_MAX_SAMPLERS; ++i)
+        NineBindTextureToDevice(device, &state->texture[i], NULL);
 }
 
 void
index 55960007bfb668d7b75e01033f081a650ccfed1c..d8f7230e5b34e5fdf158161dcb832d201ed1f8dc 100644 (file)
@@ -598,7 +598,7 @@ nine_context_get_query_result(struct NineDevice9 *device, struct pipe_query *que
 void nine_state_restore_non_cso(struct NineDevice9 *device);
 void nine_state_set_defaults(struct NineDevice9 *, const D3DCAPS9 *,
                              boolean is_reset);
-void nine_state_clear(struct nine_state *, const boolean device);
+void nine_device_state_clear(struct NineDevice9 *);
 void nine_context_clear(struct NineDevice9 *);
 
 void nine_state_init_sw(struct NineDevice9 *device);
index 50ed70aec3a3bae2df2710b919674b4d02829145..c7bdc86e9d0bb0197148aa69f1f8ea806ebad84a 100644 (file)
@@ -63,8 +63,20 @@ NineStateBlock9_dtor( struct NineStateBlock9 *This )
     struct nine_state *state = &This->state;
     struct nine_range *r;
     struct nine_range_pool *pool = &This->base.device->range_pool;
+    unsigned i;
 
-    nine_state_clear(state, false);
+    for (i = 0; i < ARRAY_SIZE(state->rt); ++i)
+       nine_bind(&state->rt[i], NULL);
+    nine_bind(&state->ds, NULL);
+    nine_bind(&state->vs, NULL);
+    nine_bind(&state->ps, NULL);
+    nine_bind(&state->vdecl, NULL);
+    for (i = 0; i < PIPE_MAX_ATTRIBS; ++i)
+        nine_bind(&state->stream[i], NULL);
+
+    nine_bind(&state->idxbuf, NULL);
+    for (i = 0; i < NINE_MAX_SAMPLERS; ++i)
+        nine_bind(&state->texture[i], NULL);
 
     FREE(state->vs_const_f);
     FREE(state->ps_const_f);