summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2019-01-22 20:14:43 +0100
committerAxel Davy <[email protected]>2019-01-26 19:53:00 +0100
commitd7433c22e6c9624ca5275a3cd35be79caed9fffc (patch)
tree854b978b1635596ac4fc0be459719e456845f0fd
parenta7d629a59021cb1a013a8a58acd9187ca0b6c9ce (diff)
st/nine: Immediately upload user provided textures
Fixes regression caused by 42d672fa6a766363e5703f119607f7c7975918aa st/nine: Bind src not dst in nine_context_box_upload Before that patch, for user provided textures, when the texture was destroyed, the safety check for pending uploads, which according to the code "Following condition cannot happen currently", was flushing the queue and thus triggering the upload. After the patch, the texture destruction was delayed after the upload. However the user frees the texture buffer, as it thinks the texture released. Instead of reverting the faulty patch, this patch instead flushes the csmt queue right away after queuing the upload for this type of textures. This is more future-proof, as we may want to bind the surface for other reasons in the future. Signed-off-by: Axel Davy <[email protected]> Cc: 18.3 <[email protected]>
-rw-r--r--src/gallium/state_trackers/nine/surface9.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/nine/surface9.c b/src/gallium/state_trackers/nine/surface9.c
index 10518219a0a..ebb2f9d0c46 100644
--- a/src/gallium/state_trackers/nine/surface9.c
+++ b/src/gallium/state_trackers/nine/surface9.c
@@ -668,6 +668,19 @@ NineSurface9_CopyMemToDefault( struct NineSurface9 *This,
From->data, From->stride,
0, /* depth = 1 */
&src_box);
+ if (From->texture == D3DRTYPE_TEXTURE) {
+ struct NineTexture9 *tex =
+ NineTexture9(From->base.base.container);
+ /* D3DPOOL_SYSTEMMEM with buffer content passed
+ * from the user: execute the upload right now.
+ * It is possible it is enough to delay upload
+ * until the surface refcount is 0, but the
+ * bind refcount may not be 0, and thus the dtor
+ * is not executed (and doesn't trigger the
+ * pending_uploads_counter check). */
+ if (!tex->managed_buffer)
+ nine_csmt_process(This->base.base.device);
+ }
if (This->data_conversion)
(void) util_format_translate(This->format_conversion,