[PATCH 2/5] wined3d: Add stream offsets in device_stream_info_from_declaration().

Henri Verbeet hverbeet at codeweavers.com
Thu Jul 14 18:14:50 CDT 2011


They're not going to change until the next time the stream info is updated.
This would of course mainly be useful if we managed to do more than one or two
draws with the same stream info.
---
 dlls/wined3d/buffer.c   |    3 +-
 dlls/wined3d/device.c   |    7 ++++-
 dlls/wined3d/drawprim.c |   17 ++++++--------
 dlls/wined3d/state.c    |   53 ++++++++++++++++++----------------------------
 4 files changed, 34 insertions(+), 46 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 74864bb..807579e 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -228,7 +228,6 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
         const enum wined3d_buffer_conversion_type conversion_type,
         const struct wined3d_stream_info_element *attrib, DWORD *stride_this_run)
 {
-    DWORD offset = This->resource.device->stateBlock->state.streams[attrib->stream_idx].offset;
     DWORD attrib_size;
     BOOL ret = FALSE;
     unsigned int i;
@@ -265,7 +264,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
         }
     }
 
-    data = (((DWORD_PTR)attrib->data.addr) + offset) % This->stride;
+    data = ((DWORD_PTR)attrib->data.addr) % This->stride;
     attrib_size = attrib->format->component_count * attrib->format->component_size;
     for (i = 0; i < attrib_size; ++i)
     {
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 4f7ab3b..2dd2f01 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -189,7 +189,8 @@ void device_stream_info_from_declaration(struct wined3d_device *device,
     for (i = 0; i < declaration->element_count; ++i)
     {
         const struct wined3d_vertex_declaration_element *element = &declaration->elements[i];
-        struct wined3d_buffer *buffer = device->stateBlock->state.streams[element->input_slot].buffer;
+        const struct wined3d_stream_state *stream = &device->stateBlock->state.streams[element->input_slot];
+        struct wined3d_buffer *buffer = stream->buffer;
         struct wined3d_bo_address data;
         BOOL stride_used;
         unsigned int idx;
@@ -203,7 +204,7 @@ void device_stream_info_from_declaration(struct wined3d_device *device,
         data.buffer_object = 0;
         data.addr = NULL;
 
-        stride = device->stateBlock->state.streams[element->input_slot].stride;
+        stride = stream->stride;
         if (device->stateBlock->state.user_stream)
         {
             TRACE("Stream %u is UP, %p\n", element->input_slot, buffer);
@@ -292,6 +293,8 @@ void device_stream_info_from_declaration(struct wined3d_device *device,
                     debug_d3ddeclusage(element->usage), element->usage_idx, element->input_slot,
                     element->offset, stride, debug_d3dformat(element->format->id), data.buffer_object);
 
+            data.addr += stream->offset;
+
             stream_info->elements[idx].format = element->format;
             stream_info->elements[idx].data = data;
             stream_info->elements[idx].stride = stride;
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index d4693d8..3179343 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -74,7 +74,6 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
     const DWORD               *pIdxBufL     = NULL;
     UINT vx_index;
     const struct wined3d_state *state = &device->stateBlock->state;
-    const struct wined3d_stream_state *streams = state->streams;
     LONG SkipnStrides = startIdx;
     BOOL pixelShader = use_ps(state);
     BOOL specular_fog = FALSE;
@@ -111,13 +110,13 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
     if (si->use_map & (1 << WINED3D_FFP_POSITION))
     {
         element = &si->elements[WINED3D_FFP_POSITION];
-        position = element->data.addr + streams[element->stream_idx].offset;
+        position = element->data.addr;
     }
 
     if (si->use_map & (1 << WINED3D_FFP_NORMAL))
     {
         element = &si->elements[WINED3D_FFP_NORMAL];
-        normal = element->data.addr + streams[element->stream_idx].offset;
+        normal = element->data.addr;
     }
     else
     {
@@ -128,7 +127,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
     if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
     {
         element = &si->elements[WINED3D_FFP_DIFFUSE];
-        diffuse = element->data.addr + streams[element->stream_idx].offset;
+        diffuse = element->data.addr;
 
         if (num_untracked_materials && element->format->id != WINED3DFMT_B8G8R8A8_UNORM)
             FIXME("Implement diffuse color tracking from %s\n", debug_d3dformat(element->format->id));
@@ -141,7 +140,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
     if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
     {
         element = &si->elements[WINED3D_FFP_SPECULAR];
-        specular = element->data.addr + streams[element->stream_idx].offset;
+        specular = element->data.addr;
 
         /* special case where the fog density is stored in the specular alpha channel */
         if (state->render_states[WINED3DRS_FOGENABLE]
@@ -201,7 +200,7 @@ static void drawStridedSlow(struct wined3d_device *device, const struct wined3d_
         if (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx)))
         {
             element = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
-            texCoords[coordIdx] = element->data.addr + streams[element->stream_idx].offset;
+            texCoords[coordIdx] = element->data.addr;
             tex_mask |= (1 << textureNo);
         }
         else
@@ -465,8 +464,7 @@ static void drawStridedSlowVs(const struct wined3d_gl_info *gl_info, const struc
         {
             if (!(si->use_map & (1 << i))) continue;
 
-            ptr = si->elements[i].data.addr + si->elements[i].stride * SkipnStrides
-                    + state->streams[si->elements[i].stream_idx].offset;
+            ptr = si->elements[i].data.addr + si->elements[i].stride * SkipnStrides;
 
             send_attribute(gl_info, si->elements[i].format->id, i, ptr);
         }
@@ -530,8 +528,7 @@ static void drawStridedInstanced(const struct wined3d_gl_info *gl_info, const st
         /* Specify the instanced attributes using immediate mode calls */
         for(j = 0; j < numInstancedAttribs; j++) {
             const BYTE *ptr = si->elements[instancedData[j]].data.addr
-                    + si->elements[instancedData[j]].stride * i
-                    + state->streams[si->elements[instancedData[j]].stream_idx].offset;
+                    + si->elements[instancedData[j]].stride * i;
             if (si->elements[instancedData[j]].data.buffer_object)
             {
                 struct wined3d_buffer *vb = state->streams[si->elements[instancedData[j]].stream_idx].buffer;
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 89aae51..cb3fb2e 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3270,7 +3270,6 @@ static void load_tex_coords(const struct wined3d_context *context, const struct
         if (coordIdx < MAX_TEXTURES && (si->use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))))
         {
             const struct wined3d_stream_info_element *e = &si->elements[WINED3D_FFP_TEXCOORD0 + coordIdx];
-            const struct wined3d_stream_state *stream = &state->streams[e->stream_idx];
 
             TRACE("Setting up texture %u, idx %d, coordindx %u, data {%#x:%p}.\n",
                     textureNo, mapped_stage, coordIdx, e->data.buffer_object, e->data.addr);
@@ -3287,7 +3286,7 @@ static void load_tex_coords(const struct wined3d_context *context, const struct
 
             /* The coords to supply depend completely on the fvf / vertex shader */
             glTexCoordPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
             glEnableClientState(GL_TEXTURE_COORD_ARRAY);
         }
         else
@@ -4046,7 +4045,6 @@ static void load_numbered_arrays(struct wined3d_context *context,
     const struct wined3d_gl_info *gl_info = context->gl_info;
     GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
     int i;
-    struct wined3d_buffer *vb;
 
     /* Default to no instancing */
     device->instancedDraw = FALSE;
@@ -4085,13 +4083,11 @@ static void load_numbered_arrays(struct wined3d_context *context,
              * pointer. vb can point to a user pointer data blob. In that case
              * curVBO will be 0. If there is a vertex buffer but no vbo we
              * won't be load converted attributes anyway. */
-            vb = stream->buffer;
             GL_EXTCALL(glVertexAttribPointerARB(i, stream_info->elements[i].format->gl_vtx_format,
                     stream_info->elements[i].format->gl_vtx_type,
                     stream_info->elements[i].format->gl_normalized,
                     stream_info->elements[i].stride, stream_info->elements[i].data.addr
-                    + state->load_base_vertex_index * stream_info->elements[i].stride
-                    + stream->offset));
+                    + state->load_base_vertex_index * stream_info->elements[i].stride));
 
             if (!(context->numbered_array_mask & (1 << i)))
             {
@@ -4105,11 +4101,10 @@ static void load_numbered_arrays(struct wined3d_context *context,
              * glVertexAttribPointerARB doesn't do that. Instead disable the
              * pointer and set up the attribute statically. But we have to
              * figure out the system memory address. */
-            const BYTE *ptr = stream_info->elements[i].data.addr + stream->offset;
+            const BYTE *ptr = stream_info->elements[i].data.addr;
             if (stream_info->elements[i].data.buffer_object)
             {
-                vb = stream->buffer;
-                ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info);
+                ptr += (ULONG_PTR)buffer_get_sysmem(stream->buffer, gl_info);
             }
 
             if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
@@ -4209,7 +4204,6 @@ static void load_vertex_data(const struct wined3d_context *context,
     const struct wined3d_gl_info *gl_info = context->gl_info;
     GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
     const struct wined3d_stream_info_element *e;
-    const struct wined3d_stream_state *stream;
 
     TRACE("Using fast vertex array code\n");
 
@@ -4221,12 +4215,11 @@ static void load_vertex_data(const struct wined3d_context *context,
             || si->use_map & (1 << WINED3D_FFP_BLENDINDICES))
     {
         e = &si->elements[WINED3D_FFP_BLENDWEIGHT];
-        stream = &state->streams[e->stream_idx];
 
         if (gl_info->supported[ARB_VERTEX_BLEND])
         {
             TRACE("Blend %u %p %u\n", e->format->component_count,
-                    e->data.addr + state->load_base_vertex_index * e->stride, e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride, e->stride);
 
             glEnableClientState(GL_WEIGHT_ARRAY_ARB);
             checkGLcall("glEnableClientState(GL_WEIGHT_ARRAY_ARB)");
@@ -4244,9 +4237,9 @@ static void load_vertex_data(const struct wined3d_context *context,
                     e->format->gl_vtx_format,
                     e->format->gl_vtx_type,
                     e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
             GL_EXTCALL(glWeightPointerARB(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset));
+                    e->data.addr + state->load_base_vertex_index * e->stride));
 
             checkGLcall("glWeightPointerARB");
 
@@ -4288,7 +4281,6 @@ static void load_vertex_data(const struct wined3d_context *context,
     if (si->use_map & (1 << WINED3D_FFP_POSITION))
     {
         e = &si->elements[WINED3D_FFP_POSITION];
-        stream = &state->streams[e->stream_idx];
 
         if (curVBO != e->data.buffer_object)
         {
@@ -4308,17 +4300,17 @@ static void load_vertex_data(const struct wined3d_context *context,
         if (!e->data.buffer_object)
         {
             TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
             glVertexPointer(3 /* min(e->format->gl_vtx_format, 3) */, e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
         }
         else
         {
             TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n",
                     e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
             glVertexPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                    e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                    e->data.addr + state->load_base_vertex_index * e->stride);
         }
         checkGLcall("glVertexPointer(...)");
         glEnableClientState(GL_VERTEX_ARRAY);
@@ -4329,7 +4321,6 @@ static void load_vertex_data(const struct wined3d_context *context,
     if (si->use_map & (1 << WINED3D_FFP_NORMAL))
     {
         e = &si->elements[WINED3D_FFP_NORMAL];
-        stream = &state->streams[e->stream_idx];
 
         if (curVBO != e->data.buffer_object)
         {
@@ -4339,9 +4330,9 @@ static void load_vertex_data(const struct wined3d_context *context,
         }
 
         TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format->gl_vtx_type, e->stride,
-                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                e->data.addr + state->load_base_vertex_index * e->stride);
         glNormalPointer(e->format->gl_vtx_type, e->stride,
-                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                e->data.addr + state->load_base_vertex_index * e->stride);
         checkGLcall("glNormalPointer(...)");
         glEnableClientState(GL_NORMAL_ARRAY);
         checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)");
@@ -4363,7 +4354,6 @@ static void load_vertex_data(const struct wined3d_context *context,
     if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
     {
         e = &si->elements[WINED3D_FFP_DIFFUSE];
-        stream = &state->streams[e->stream_idx];
 
         if (curVBO != e->data.buffer_object)
         {
@@ -4374,9 +4364,9 @@ static void load_vertex_data(const struct wined3d_context *context,
 
         TRACE("glColorPointer(%#x, %#x %#x, %p);\n",
                 e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                e->data.addr + state->load_base_vertex_index * e->stride);
         glColorPointer(e->format->gl_vtx_format, e->format->gl_vtx_type, e->stride,
-                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                e->data.addr + state->load_base_vertex_index * e->stride);
         checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)");
         glEnableClientState(GL_COLOR_ARRAY);
         checkGLcall("glEnableClientState(GL_COLOR_ARRAY)");
@@ -4392,7 +4382,6 @@ static void load_vertex_data(const struct wined3d_context *context,
         TRACE("setting specular colour\n");
 
         e = &si->elements[WINED3D_FFP_SPECULAR];
-        stream = &state->streams[e->stream_idx];
 
         if (gl_info->supported[EXT_SECONDARY_COLOR])
         {
@@ -4414,9 +4403,9 @@ static void load_vertex_data(const struct wined3d_context *context,
                  * 4 component secondary colors use it
                  */
                 TRACE("glSecondaryColorPointer(%#x, %#x, %#x, %p);\n", format, type, e->stride,
-                        e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                        e->data.addr + state->load_base_vertex_index * e->stride);
                 GL_EXTCALL(glSecondaryColorPointerEXT(format, type, e->stride,
-                        e->data.addr + state->load_base_vertex_index * e->stride + stream->offset));
+                        e->data.addr + state->load_base_vertex_index * e->stride));
                 checkGLcall("glSecondaryColorPointerEXT(format, type, ...)");
             }
             else
@@ -4425,9 +4414,9 @@ static void load_vertex_data(const struct wined3d_context *context,
                 {
                     case GL_UNSIGNED_BYTE:
                         TRACE("glSecondaryColorPointer(3, GL_UNSIGNED_BYTE, %#x, %p);\n", e->stride,
-                                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                                e->data.addr + state->load_base_vertex_index * e->stride);
                         GL_EXTCALL(glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, e->stride,
-                                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset));
+                                e->data.addr + state->load_base_vertex_index * e->stride));
                         checkGLcall("glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, ...)");
                         break;
 
@@ -4435,9 +4424,9 @@ static void load_vertex_data(const struct wined3d_context *context,
                         FIXME("Add 4 component specular color pointers for type %x\n", type);
                         /* Make sure that the right color component is dropped */
                         TRACE("glSecondaryColorPointer(3, %#x, %#x, %p);\n", type, e->stride,
-                                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset);
+                                e->data.addr + state->load_base_vertex_index * e->stride);
                         GL_EXTCALL(glSecondaryColorPointerEXT(3, type, e->stride,
-                                e->data.addr + state->load_base_vertex_index * e->stride + stream->offset));
+                                e->data.addr + state->load_base_vertex_index * e->stride));
                         checkGLcall("glSecondaryColorPointerEXT(3, type, ...)");
                 }
             }
-- 
1.7.3.4




More information about the wine-patches mailing list