[PATCH] wined3d: Check the d3d buffer to find converted attributes.

Stefan Dösinger stefan at codeweavers.com
Fri Feb 6 03:46:48 CST 2015


This fixes some tests with ARB shaders that were broken since
1360af6adcbc5c77a7b3c5e32f3c886e450456f5. When buffer_internal_preload
is called by context_update_stream_info, si->elements[i].data is not yet
set.

There are still some broken tests with ARB shaders: The fogstart ==
fogend tests are broken on Nvidia 340+, just like in GLSL, and for the
same reason as GLSL. The negative vertex fog test is broken since we
don't have an ARB pipeline replacement that can do the abs(). Similarly,
the table fog .z fog is broken because opengl fixed function behaves
differently.
---
 dlls/wined3d/buffer.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index 2fba83b..f2a22b0 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -266,7 +266,7 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
 #define WINED3D_BUFFER_FIXUP_XYZRHW     0x02
 
 static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct wined3d_stream_info *si,
-        UINT attrib_idx, DWORD fixup_flags, DWORD *stride_this_run)
+        const struct wined3d_state *state, UINT attrib_idx, DWORD fixup_flags, DWORD *stride_this_run)
 {
     const struct wined3d_stream_info_element *attrib = &si->elements[attrib_idx];
     enum wined3d_format_id format;
@@ -276,7 +276,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win
      * there, on nonexistent attribs the vbo is 0.
      */
     if (!(si->use_map & (1 << attrib_idx))
-            || attrib->data.buffer_object != This->buffer_object)
+            || state->streams[attrib->stream_idx].buffer != This)
         return FALSE;
 
     format = attrib->format->id;
@@ -304,7 +304,7 @@ static BOOL buffer_check_attribute(struct wined3d_buffer *This, const struct win
 }
 
 static BOOL buffer_find_decl(struct wined3d_buffer *This, const struct wined3d_stream_info *si,
-        DWORD fixup_flags)
+        const struct wined3d_state *state, DWORD fixup_flags)
 {
     UINT stride_this_run = 0;
     BOOL ret = FALSE;
@@ -378,31 +378,31 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This, const struct wined3d_s
      * texcoord needs no conversion while a FLOAT4 positiont needs one
      */
 
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_POSITION,
             fixup_flags, &stride_this_run) || ret;
     fixup_flags &= ~WINED3D_BUFFER_FIXUP_XYZRHW;
 
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_NORMAL,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_DIFFUSE,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_DIFFUSE,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_SPECULAR,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_SPECULAR,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD0,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD0,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD1,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD1,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD2,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD2,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD3,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD3,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD4,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD4,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD5,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD5,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD6,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD6,
             fixup_flags, &stride_this_run) || ret;
-    ret = buffer_check_attribute(This, si, WINED3D_FFP_TEXCOORD7,
+    ret = buffer_check_attribute(This, si, state, WINED3D_FFP_TEXCOORD7,
             fixup_flags, &stride_this_run) || ret;
 
     if (!stride_this_run && This->conversion_map)
@@ -767,7 +767,7 @@ void buffer_internal_preload(struct wined3d_buffer *buffer, struct wined3d_conte
                 fixup_flags |= WINED3D_BUFFER_FIXUP_XYZRHW;
         }
 
-        decl_changed = buffer_find_decl(buffer, &context->stream_info, fixup_flags);
+        decl_changed = buffer_find_decl(buffer, &context->stream_info, state, fixup_flags);
         buffer->flags |= WINED3D_BUFFER_HASDESC;
     }
 
-- 
2.0.5




More information about the wine-patches mailing list