st/nine: Fix volumetexture dtor on ctor failure
[mesa.git] / src / gallium / state_trackers / nine / vertexbuffer9.c
index 6a57349e0dd9e09691c27caa3310143fd976dbcf..df1d17175394b1d93529b6df835f523b31cf5bd9 100644 (file)
@@ -39,54 +39,13 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
                         struct NineUnknownParams *pParams,
                         D3DVERTEXBUFFER_DESC *pDesc )
 {
-    struct pipe_resource *info = &This->base.info;
     HRESULT hr;
 
     DBG("This=%p Size=0x%x Usage=%x Pool=%u\n", This,
         pDesc->Size, pDesc->Usage, pDesc->Pool);
 
-    user_assert(pDesc->Pool != D3DPOOL_SCRATCH, D3DERR_INVALIDCALL);
-
-    This->maps = MALLOC(sizeof(struct pipe_transfer *));
-    if (!This->maps)
-        return E_OUTOFMEMORY;
-    This->nmaps = 0;
-    This->maxmaps = 1;
-
-    This->pipe = pParams->device->pipe;
-
-    info->screen = pParams->device->screen;
-    info->target = PIPE_BUFFER;
-    info->format = PIPE_FORMAT_R8_UNORM;
-    info->width0 = pDesc->Size;
-    info->flags = 0;
-
-    info->bind = PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_TRANSFER_WRITE;
-    if (!(pDesc->Usage & D3DUSAGE_WRITEONLY))
-        info->bind |= PIPE_BIND_TRANSFER_READ;
-
-    info->usage = PIPE_USAGE_DEFAULT;
-    if (pDesc->Usage & D3DUSAGE_DYNAMIC)
-        info->usage = PIPE_USAGE_STREAM;
-    if (pDesc->Pool == D3DPOOL_SYSTEMMEM)
-        info->usage = PIPE_USAGE_STAGING;
-
-    /* if (pDesc->Usage & D3DUSAGE_DONOTCLIP) { } */
-    /* if (pDesc->Usage & D3DUSAGE_NONSECURE) { } */
-    /* if (pDesc->Usage & D3DUSAGE_NPATCHES) { } */
-    /* if (pDesc->Usage & D3DUSAGE_POINTS) { } */
-    /* if (pDesc->Usage & D3DUSAGE_RTPATCHES) { } */
-    /* if (pDesc->Usage & D3DUSAGE_SOFTWAREPROCESSING) { } */
-    /* if (pDesc->Usage & D3DUSAGE_TEXTAPI) { } */
-
-    info->height0 = 1;
-    info->depth0 = 1;
-    info->array_size = 1;
-    info->last_level = 0;
-    info->nr_samples = 0;
-
-    hr = NineResource9_ctor(&This->base, pParams, TRUE, D3DRTYPE_VERTEXBUFFER,
-                            pDesc->Pool);
+    hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_VERTEXBUFFER,
+                          pDesc->Usage, pDesc->Size, pDesc->Pool);
     if (FAILED(hr))
         return hr;
 
@@ -100,88 +59,32 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
 void
 NineVertexBuffer9_dtor( struct NineVertexBuffer9 *This )
 {
-    if (This->maps) {
-        while (This->nmaps) {
-            NineVertexBuffer9_Unlock(This);
-        }
-        FREE(This->maps);
-    }
-
-    NineResource9_dtor(&This->base);
+    NineBuffer9_dtor(&This->base);
 }
 
-HRESULT WINAPI
-NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
-                        UINT OffsetToLock,
-                        UINT SizeToLock,
-                        void **ppbData,
-                        DWORD Flags )
+struct pipe_resource *
+NineVertexBuffer9_GetResource( struct NineVertexBuffer9 *This, unsigned *offset )
 {
-    struct pipe_box box;
-    void *data;
-    const unsigned usage = d3dlock_buffer_to_pipe_transfer_usage(Flags);
-
-    DBG("This=%p(pipe=%p) OffsetToLock=0x%x, SizeToLock=0x%x, Flags=0x%x\n",
-        This, This->base.resource,
-        OffsetToLock, SizeToLock, Flags);
-
-    user_assert(ppbData, E_POINTER);
-    user_assert(!(Flags & ~(D3DLOCK_DISCARD |
-                            D3DLOCK_DONOTWAIT |
-                            D3DLOCK_NO_DIRTY_UPDATE |
-                            D3DLOCK_NOSYSLOCK |
-                            D3DLOCK_READONLY |
-                            D3DLOCK_NOOVERWRITE)), D3DERR_INVALIDCALL);
-
-    if (This->nmaps == This->maxmaps) {
-        struct pipe_transfer **newmaps =
-            REALLOC(This->maps, sizeof(struct pipe_transfer *)*This->maxmaps,
-                    sizeof(struct pipe_transfer *)*(This->maxmaps << 1));
-        if (newmaps == NULL)
-            return E_OUTOFMEMORY;
-
-        This->maxmaps <<= 1;
-        This->maps = newmaps;
-    }
-
-    if (SizeToLock == 0) {
-        SizeToLock = This->desc.Size - OffsetToLock;
-        user_warn(OffsetToLock != 0);
-    }
-
-    u_box_1d(OffsetToLock, SizeToLock, &box);
-
-    data = This->pipe->transfer_map(This->pipe, This->base.resource, 0,
-                                    usage, &box, &This->maps[This->nmaps]);
-    if (!data) {
-        DBG("pipe::transfer_map failed\n"
-            " usage = %x\n"
-            " box.x = %u\n"
-            " box.width = %u\n",
-            usage, box.x, box.width);
-        /* not sure what to return, msdn suggests this */
-        if (Flags & D3DLOCK_DONOTWAIT)
-            return D3DERR_WASSTILLDRAWING;
-        return D3DERR_INVALIDCALL;
-    }
-
-    This->nmaps++;
-    *ppbData = data;
+    return NineBuffer9_GetResource(&This->base, offset);
+}
 
-    return D3D_OK;
+HRESULT NINE_WINAPI
+NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
+                       UINT OffsetToLock,
+                       UINT SizeToLock,
+                       void **ppbData,
+                       DWORD Flags )
+{
+    return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
 }
 
-HRESULT WINAPI
+HRESULT NINE_WINAPI
 NineVertexBuffer9_Unlock( struct NineVertexBuffer9 *This )
 {
-    DBG("This=%p\n", This);
-
-    user_assert(This->nmaps > 0, D3DERR_INVALIDCALL);
-    This->pipe->transfer_unmap(This->pipe, This->maps[--(This->nmaps)]);
-    return D3D_OK;
+    return NineBuffer9_Unlock(&This->base);
 }
 
-HRESULT WINAPI
+HRESULT NINE_WINAPI
 NineVertexBuffer9_GetDesc( struct NineVertexBuffer9 *This,
                            D3DVERTEXBUFFER_DESC *pDesc )
 {
@@ -195,9 +98,9 @@ IDirect3DVertexBuffer9Vtbl NineVertexBuffer9_vtable = {
     (void *)NineUnknown_AddRef,
     (void *)NineUnknown_Release,
     (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
-    (void *)NineResource9_SetPrivateData,
-    (void *)NineResource9_GetPrivateData,
-    (void *)NineResource9_FreePrivateData,
+    (void *)NineUnknown_SetPrivateData,
+    (void *)NineUnknown_GetPrivateData,
+    (void *)NineUnknown_FreePrivateData,
     (void *)NineResource9_SetPriority,
     (void *)NineResource9_GetPriority,
     (void *)NineResource9_PreLoad,