Henri Verbeet : wined3d: Figure out the index data pointer inside drawPrimitive().

Alexandre Julliard julliard at winehq.org
Wed May 2 14:30:02 CDT 2012


Module: wine
Branch: master
Commit: a8a201cf61b39f79be980c4f193905bf8c0276c4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a8a201cf61b39f79be980c4f193905bf8c0276c4

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue May  1 20:25:28 2012 +0200

wined3d: Figure out the index data pointer inside drawPrimitive().

We want to do this after context_apply_draw_state(), when resource locations
are all setup.

---

 dlls/wined3d/device.c   |    9 ++-------
 dlls/wined3d/drawprim.c |   24 +++++++++++++++++-------
 2 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 030add2..0b0b600 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4008,14 +4008,11 @@ HRESULT CDECL wined3d_device_draw_primitive(struct wined3d_device *device, UINT
 
 HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *device, UINT start_idx, UINT index_count)
 {
-    struct wined3d_buffer *index_buffer;
-    GLuint vbo;
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
 
     TRACE("device %p, start_idx %u, index_count %u.\n", device, start_idx, index_count);
 
-    index_buffer = device->stateBlock->state.index_buffer;
-    if (!index_buffer)
+    if (!device->stateBlock->state.index_buffer)
     {
         /* D3D9 returns D3DERR_INVALIDCALL when DrawIndexedPrimitive is called
          * without an index buffer set. (The first time at least...)
@@ -4036,7 +4033,6 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic
         device_invalidate_state(device, STATE_INDEXBUFFER);
         device->stateBlock->state.user_stream = FALSE;
     }
-    vbo = index_buffer->buffer_object;
 
     if (!gl_info->supported[ARB_DRAW_ELEMENTS_BASE_VERTEX] &&
         device->stateBlock->state.load_base_vertex_index != device->stateBlock->state.base_vertex_index)
@@ -4045,8 +4041,7 @@ HRESULT CDECL wined3d_device_draw_indexed_primitive(struct wined3d_device *devic
         device_invalidate_state(device, STATE_BASEVERTEXINDEX);
     }
 
-    drawPrimitive(device, index_count, start_idx, TRUE,
-            vbo ? NULL : index_buffer->resource.allocatedMemory);
+    drawPrimitive(device, index_count, start_idx, TRUE, NULL);
 
     return WINED3D_OK;
 }
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 136c8f5..18b8f3f 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -669,14 +669,24 @@ void drawPrimitive(struct wined3d_device *device, UINT index_count, UINT StartId
         BOOL emulation = FALSE;
         const struct wined3d_stream_info *stream_info = &device->strided_streams;
         struct wined3d_stream_info stridedlcl;
-        UINT idx_size;
+        UINT idx_size = 0;
 
-        if (!indexed)
-            idx_size = 0;
-        else if (state->index_format == WINED3DFMT_R16_UINT)
-            idx_size = 2;
-        else
-            idx_size = 4;
+        if (indexed)
+        {
+            if (!state->user_stream)
+            {
+                struct wined3d_buffer *index_buffer = state->index_buffer;
+                if (!index_buffer->buffer_object)
+                    idxData = index_buffer->resource.allocatedMemory;
+                else
+                    idxData = NULL;
+            }
+
+            if (state->index_format == WINED3DFMT_R16_UINT)
+                idx_size = 2;
+            else
+                idx_size = 4;
+        }
 
         if (!use_vs(state))
         {




More information about the wine-cvs mailing list