[Mesa-dev] [PATCH 15/45] st/nine: Squash indexbuffer9 and vertexbuffer9

Axel Davy axel.davy at ens.fr
Fri Jan 29 08:08:39 PST 2016


From: Patrick Rudolph <siro at das-labor.org>

The indexbuffer9 codebase was lagging behind the one of vertexbuffer9.

Add buffer9 as common code base for indexbuffer9 and vertexbuffer9.

Signed-off-by: Patrick Rudolph <siro at das-labor.org>
Reviewed-by: Axel Davy <axel.davy at ens.fr>
---
 src/gallium/state_trackers/nine/Makefile.sources |   2 +
 src/gallium/state_trackers/nine/buffer9.c        | 189 +++++++++++++++++++++++
 src/gallium/state_trackers/nine/buffer9.h        |  73 +++++++++
 src/gallium/state_trackers/nine/device9.c        |   4 +-
 src/gallium/state_trackers/nine/indexbuffer9.c   | 101 ++----------
 src/gallium/state_trackers/nine/indexbuffer9.h   |   9 +-
 src/gallium/state_trackers/nine/vertexbuffer9.c  | 129 ++--------------
 src/gallium/state_trackers/nine/vertexbuffer9.h  |  13 +-
 8 files changed, 305 insertions(+), 215 deletions(-)
 create mode 100644 src/gallium/state_trackers/nine/buffer9.c
 create mode 100644 src/gallium/state_trackers/nine/buffer9.h

diff --git a/src/gallium/state_trackers/nine/Makefile.sources b/src/gallium/state_trackers/nine/Makefile.sources
index 99b623a..8d178d4 100644
--- a/src/gallium/state_trackers/nine/Makefile.sources
+++ b/src/gallium/state_trackers/nine/Makefile.sources
@@ -5,6 +5,8 @@ C_SOURCES := \
 	authenticatedchannel9.h \
 	basetexture9.c \
 	basetexture9.h \
+	buffer9.c \
+	buffer9.h \
 	cryptosession9.c \
 	cryptosession9.h \
 	cubetexture9.c \
diff --git a/src/gallium/state_trackers/nine/buffer9.c b/src/gallium/state_trackers/nine/buffer9.c
new file mode 100644
index 0000000..b4b91ec
--- /dev/null
+++ b/src/gallium/state_trackers/nine/buffer9.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2011 Joakim Sindholt <opensource at zhasha.com>
+ * Copyright 2015 Patrick Rudolph <siro at das-labor.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#include "buffer9.h"
+#include "device9.h"
+#include "nine_helpers.h"
+#include "nine_pipe.h"
+
+#include "pipe/p_screen.h"
+#include "pipe/p_context.h"
+#include "pipe/p_state.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_format.h"
+#include "util/u_box.h"
+
+#define DBG_CHANNEL (DBG_INDEXBUFFER|DBG_VERTEXBUFFER)
+
+HRESULT
+NineBuffer9_ctor( struct NineBuffer9 *This,
+                        struct NineUnknownParams *pParams,
+                        D3DRESOURCETYPE Type,
+                        DWORD Usage,
+                        UINT Size,
+                        D3DPOOL Pool )
+{
+    struct pipe_resource *info = &This->base.info;
+    HRESULT hr;
+
+    DBG("This=%p Size=0x%x Usage=%x Pool=%u\n", This, Size, Usage, Pool);
+
+    user_assert(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->size = Size;
+
+    This->pipe = pParams->device->pipe;
+
+    info->screen = pParams->device->screen;
+    info->target = PIPE_BUFFER;
+    info->format = PIPE_FORMAT_R8_UNORM;
+    info->width0 = Size;
+    info->flags = 0;
+
+    info->bind = PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_TRANSFER_WRITE;
+    if (!(Usage & D3DUSAGE_WRITEONLY))
+        info->bind |= PIPE_BIND_TRANSFER_READ;
+
+    info->usage = PIPE_USAGE_DEFAULT;
+    if (Usage & D3DUSAGE_DYNAMIC)
+        info->usage = PIPE_USAGE_STREAM;
+    else if (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 (Usage & D3DUSAGE_SOFTWAREPROCESSING)
+        DBG("Application asked for Software Vertex Processing, "
+            "but this is unimplemented\n");
+    /* 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, NULL, TRUE,
+                            Type, Pool, Usage);
+    return hr;
+}
+
+void
+NineBuffer9_dtor( struct NineBuffer9 *This )
+{
+    if (This->maps) {
+        while (This->nmaps) {
+            NineBuffer9_Unlock(This);
+        }
+        FREE(This->maps);
+    }
+
+    NineResource9_dtor(&This->base);
+}
+
+struct pipe_resource *
+NineBuffer9_GetResource( struct NineBuffer9 *This )
+{
+    return NineResource9_GetResource(&This->base);
+}
+
+HRESULT WINAPI
+NineBuffer9_Lock( struct NineBuffer9 *This,
+                        UINT OffsetToLock,
+                        UINT SizeToLock,
+                        void **ppbData,
+                        DWORD Flags )
+{
+    struct pipe_box box;
+    void *data;
+    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->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;
+    }
+
+    DBG("returning pointer %p\n", data);
+    This->nmaps++;
+    *ppbData = data;
+
+    return D3D_OK;
+}
+
+HRESULT WINAPI
+NineBuffer9_Unlock( struct NineBuffer9 *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;
+}
diff --git a/src/gallium/state_trackers/nine/buffer9.h b/src/gallium/state_trackers/nine/buffer9.h
new file mode 100644
index 0000000..1afd9a9
--- /dev/null
+++ b/src/gallium/state_trackers/nine/buffer9.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2011 Joakim Sindholt <opensource at zhasha.com>
+ * Copyright 2015 Patrick Rudolph <siro at das-labor.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, and/or sell copies of the Software, and to permit persons to whom
+ * the Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+ * USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+#ifndef _NINE_BUFFER9_H_
+#define _NINE_BUFFER9_H_
+
+#include "resource9.h"
+
+struct pipe_screen;
+struct pipe_context;
+struct pipe_transfer;
+
+struct NineBuffer9
+{
+    struct NineResource9 base;
+
+    /* G3D */
+    struct pipe_context *pipe;
+    struct pipe_transfer **maps;
+    int nmaps, maxmaps;
+    UINT size;
+};
+static inline struct NineBuffer9 *
+NineBuffer9( void *data )
+{
+    return (struct NineBuffer9 *)data;
+}
+
+HRESULT
+NineBuffer9_ctor( struct NineBuffer9 *This,
+                        struct NineUnknownParams *pParams,
+                        D3DRESOURCETYPE Type,
+                        DWORD Usage,
+                        UINT Size,
+                        D3DPOOL Pool );
+
+void
+NineBuffer9_dtor( struct NineBuffer9 *This );
+
+struct pipe_resource *
+NineBuffer9_GetResource( struct NineBuffer9 *This );
+
+HRESULT WINAPI
+NineBuffer9_Lock( struct NineBuffer9 *This,
+                        UINT OffsetToLock,
+                        UINT SizeToLock,
+                        void **ppbData,
+                        DWORD Flags );
+
+HRESULT WINAPI
+NineBuffer9_Unlock( struct NineBuffer9 *This );
+
+#endif /* _NINE_BUFFER9_H_ */
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index 055433a..e54b7ff 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -3123,7 +3123,7 @@ NineDevice9_ProcessVertices( struct NineDevice9 *This,
         buffer_offset = 0;
     } else {
         /* SO matches vertex declaration */
-        resource = dst->base.resource;
+        resource = NineVertexBuffer9_GetResource(dst);
         buffer_offset = DestIndex * vs->so->stride[0];
     }
     target = This->pipe->create_stream_output_target(This->pipe, resource,
@@ -3511,7 +3511,7 @@ NineDevice9_SetStreamSource( struct NineDevice9 *This,
         state->vtxbuf[i].stride = Stride;
         state->vtxbuf[i].buffer_offset = OffsetInBytes;
     }
-    state->vtxbuf[i].buffer = pStreamData ? pVBuf9->base.resource : NULL;
+    state->vtxbuf[i].buffer = pStreamData ? NineVertexBuffer9_GetResource(pVBuf9) : NULL;
 
     return D3D_OK;
 }
diff --git a/src/gallium/state_trackers/nine/indexbuffer9.c b/src/gallium/state_trackers/nine/indexbuffer9.c
index 860313b..401fe75 100644
--- a/src/gallium/state_trackers/nine/indexbuffer9.c
+++ b/src/gallium/state_trackers/nine/indexbuffer9.c
@@ -40,52 +40,17 @@ NineIndexBuffer9_ctor( struct NineIndexBuffer9 *This,
                        struct NineUnknownParams *pParams,
                        D3DINDEXBUFFER_DESC *pDesc )
 {
-    struct pipe_resource *info = &This->base.info;
     HRESULT hr;
     DBG("This=%p pParams=%p pDesc=%p Usage=%s\n",
          This, pParams, pDesc, nine_D3DUSAGE_to_str(pDesc->Usage));
 
-    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_INDEX_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)
-        DBG("Application asked for Software Vertex Processing, "
-            "but this is unimplemented\n");
-
-    info->height0 = 1;
-    info->depth0 = 1;
-    info->array_size = 1;
-    info->last_level = 0;
-    info->nr_samples = 0;
-
-    hr = NineResource9_ctor(&This->base, pParams, NULL, TRUE, D3DRTYPE_INDEXBUFFER,
-                            pDesc->Pool, pDesc->Usage);
+    hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_INDEXBUFFER,
+                          pDesc->Usage, pDesc->Size, pDesc->Pool);
     if (FAILED(hr))
         return hr;
 
-    This->buffer.buffer = This->base.resource;
+    This->buffer.buffer = NineIndexBuffer9_GetResource(This);
     This->buffer.offset = 0;
-    This->map_count = 0;
 
     switch (pDesc->Format) {
     case D3DFMT_INDEX16: This->buffer.index_size = 2; break;
@@ -105,9 +70,7 @@ NineIndexBuffer9_ctor( struct NineIndexBuffer9 *This,
 void
 NineIndexBuffer9_dtor( struct NineIndexBuffer9 *This )
 {
-    if (This->transfer) { NineIndexBuffer9_Unlock(This); }
-
-    NineResource9_dtor(&This->base);
+    NineBuffer9_dtor(&This->base);
 }
 
 const struct pipe_index_buffer *
@@ -116,6 +79,12 @@ NineIndexBuffer9_GetBuffer( struct NineIndexBuffer9 *This )
     return &This->buffer;
 }
 
+struct pipe_resource *
+NineIndexBuffer9_GetResource( struct NineIndexBuffer9 *This )
+{
+    return NineBuffer9_GetResource(&This->base);
+}
+
 HRESULT WINAPI
 NineIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
                        UINT OffsetToLock,
@@ -123,59 +92,13 @@ NineIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
                        void **ppbData,
                        DWORD Flags )
 {
-    struct pipe_box box;
-    void *data;
-    UINT count;
-    const unsigned usage = d3dlock_buffer_to_pipe_transfer_usage(Flags);
-
-    DBG("This=%p OffsetToLock=%u SizeToLock=%u ppbData=%p Flags=%i "
-        "transfer=%p map_count=%u\n", This, OffsetToLock,
-	SizeToLock, ppbData, Flags, This->transfer, This->map_count);
-
-    count = ++This->map_count;
-
-    if (SizeToLock == 0) {
-        SizeToLock = This->desc.Size - OffsetToLock;
-        user_warn(OffsetToLock != 0);
-    }
-
-    u_box_1d(OffsetToLock, SizeToLock, &box);
-
-    if (unlikely(count != 1)) {
-        DBG("Lock has been called on already locked buffer."
-	    "Unmapping before mapping again.");
-        This->pipe->transfer_unmap(This->pipe, This->transfer);
-    }
-    data = This->pipe->transfer_map(This->pipe, This->base.resource, 0,
-                                    usage, &box, &This->transfer);
-    if (!This->transfer) {
-        DBG("pipe::transfer_map failed\n"
-            " usage = %u\n"
-            " box.x = %u\n"
-            " box.width = %u\n",
-            usage, box.x, box.width);
-    }
-    *ppbData = data;
-    DBG("Returning memory at %p at address %p\n", *ppbData, ppbData);
-
-    return D3D_OK;
+    return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
 }
 
 HRESULT WINAPI
 NineIndexBuffer9_Unlock( struct NineIndexBuffer9 *This )
 {
-    DBG("This=%p\n", This);
-    if (!This->map_count) {
-        DBG("Unmap called without a previous map call.\n");
-        return D3D_OK;
-    }
-    if (--This->map_count) {
-        DBG("Ignoring unmap.\n");
-	return D3D_OK;
-    }
-    This->pipe->transfer_unmap(This->pipe, This->transfer);
-    This->transfer = NULL;
-    return D3D_OK;
+    return NineBuffer9_Unlock(&This->base);
 }
 
 HRESULT WINAPI
diff --git a/src/gallium/state_trackers/nine/indexbuffer9.h b/src/gallium/state_trackers/nine/indexbuffer9.h
index f10578f..f3274b7 100644
--- a/src/gallium/state_trackers/nine/indexbuffer9.h
+++ b/src/gallium/state_trackers/nine/indexbuffer9.h
@@ -24,7 +24,7 @@
 #define _NINE_INDEXBUFFER9_H_
 
 #include "resource9.h"
-
+#include "buffer9.h"
 #include "pipe/p_state.h"
 
 struct pipe_screen;
@@ -35,13 +35,10 @@ struct NineDevice9;
 
 struct NineIndexBuffer9
 {
-    struct NineResource9 base;
+    struct NineBuffer9 base;
 
     /* g3d stuff */
-    struct pipe_context *pipe;
     struct pipe_index_buffer buffer;
-    struct pipe_transfer *transfer;
-    UINT map_count;
 
     D3DINDEXBUFFER_DESC desc;
 };
@@ -69,6 +66,8 @@ NineIndexBuffer9_dtor( struct NineIndexBuffer9 *This );
 const struct pipe_index_buffer *
 NineIndexBuffer9_GetBuffer( struct NineIndexBuffer9 *This );
 
+struct pipe_resource *
+NineIndexBuffer9_GetResource( struct NineIndexBuffer9 *This );
 /*** Direct3D public ***/
 
 HRESULT WINAPI
diff --git a/src/gallium/state_trackers/nine/vertexbuffer9.c b/src/gallium/state_trackers/nine/vertexbuffer9.c
index 8e2eaaf..10311b4 100644
--- a/src/gallium/state_trackers/nine/vertexbuffer9.c
+++ b/src/gallium/state_trackers/nine/vertexbuffer9.c
@@ -39,56 +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)
-        DBG("Application asked for Software Vertex Processing, "
-            "but this is unimplemented\n");
-    /* 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, NULL, TRUE,
-                            D3DRTYPE_VERTEXBUFFER, pDesc->Pool, pDesc->Usage);
+    hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_VERTEXBUFFER,
+                          pDesc->Usage, pDesc->Size, pDesc->Pool);
     if (FAILED(hr))
         return hr;
 
@@ -102,85 +59,29 @@ 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);
+}
+
+struct pipe_resource *
+NineVertexBuffer9_GetResource( struct NineVertexBuffer9 *This )
+{
+    return NineBuffer9_GetResource(&This->base);
 }
 
 HRESULT WINAPI
 NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
-                        UINT OffsetToLock,
-                        UINT SizeToLock,
-                        void **ppbData,
-                        DWORD Flags )
+                       UINT OffsetToLock,
+                       UINT SizeToLock,
+                       void **ppbData,
+                       DWORD Flags )
 {
-    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 D3D_OK;
+    return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
 }
 
 HRESULT 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
diff --git a/src/gallium/state_trackers/nine/vertexbuffer9.h b/src/gallium/state_trackers/nine/vertexbuffer9.h
index 6174de4..859402b 100644
--- a/src/gallium/state_trackers/nine/vertexbuffer9.h
+++ b/src/gallium/state_trackers/nine/vertexbuffer9.h
@@ -22,8 +22,8 @@
 
 #ifndef _NINE_VERTEXBUFFER9_H_
 #define _NINE_VERTEXBUFFER9_H_
-
 #include "resource9.h"
+#include "buffer9.h"
 
 struct pipe_screen;
 struct pipe_context;
@@ -31,13 +31,10 @@ struct pipe_transfer;
 
 struct NineVertexBuffer9
 {
-    struct NineResource9 base;
+    struct NineBuffer9 base;
 
     /* G3D */
     struct pipe_context *pipe;
-    struct pipe_transfer **maps;
-    int nmaps, maxmaps;
-
     D3DVERTEXBUFFER_DESC desc;
 };
 static inline struct NineVertexBuffer9 *
@@ -58,6 +55,12 @@ NineVertexBuffer9_ctor( struct NineVertexBuffer9 *This,
 
 void
 NineVertexBuffer9_dtor( struct NineVertexBuffer9 *This );
+/*** Nine private ***/
+
+struct pipe_resource *
+NineVertexBuffer9_GetResource( struct NineVertexBuffer9 *This );
+
+/*** Direct3D public ***/
 
 HRESULT WINAPI
 NineVertexBuffer9_Lock( struct NineVertexBuffer9 *This,
-- 
2.7.0



More information about the mesa-dev mailing list