st/nine: Fix volumetexture dtor on ctor failure
[mesa.git] / src / gallium / state_trackers / nine / buffer9.c
index b22713b35178b77f10deaf16e442e65b2d5f6bc6..5880ee3c1a27b7a13551e8a02faa1adab5e5b710 100644 (file)
@@ -121,6 +121,7 @@ NineBuffer9_ctor( struct NineBuffer9 *This,
     info->array_size = 1;
     info->last_level = 0;
     info->nr_samples = 0;
+    info->nr_storage_samples = 0;
 
     hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE,
                             Type, Pool, Usage);
@@ -230,6 +231,14 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
         user_warn(OffsetToLock != 0);
     }
 
+    /* Write out of bound seems to have to be taken into account for these.
+     * TODO: Do more tests (is it only at buffer first lock ? etc).
+     * Since these buffers are supposed to be locked once and never
+     * writen again (MANAGED or DYNAMIC is used for the other uses cases),
+     * performance should be unaffected. */
+    if (!(This->base.usage & D3DUSAGE_DYNAMIC) && This->base.pool != D3DPOOL_MANAGED)
+        SizeToLock = This->size - OffsetToLock;
+
     u_box_1d(OffsetToLock, SizeToLock, &box);
 
     if (This->base.pool == D3DPOOL_MANAGED) {
@@ -244,6 +253,9 @@ NineBuffer9_Lock( struct NineBuffer9 *This,
                     nine_csmt_process(This->base.base.device);
             } else
                 u_box_union_2d(&This->managed.dirty_box, &This->managed.dirty_box, &box);
+            /* Tests trying to draw while the buffer is locked show that
+             * MANAGED buffers are made dirty at Lock time */
+            BASEBUF_REGISTER_UPDATE(This);
         }
         *ppbData = (char *)This->managed.data + OffsetToLock;
         DBG("returning pointer %p\n", *ppbData);
@@ -412,8 +424,6 @@ NineBuffer9_Unlock( struct NineBuffer9 *This )
                 nine_context_get_pipe_release(device);
         } else if (This->maps[This->nmaps].should_destroy_buf)
             nine_upload_release_buffer(device->buffer_upload, This->maps[This->nmaps].buf);
-    } else {
-        BASEBUF_REGISTER_UPDATE(This);
     }
     return D3D_OK;
 }