Zebediah Figura : wined3d: Implement zero step rate for instanced attributes.

Alexandre Julliard julliard at winehq.org
Thu Mar 25 16:49:22 CDT 2021


Module: wine
Branch: master
Commit: 4d345a78bf1fad113e73f80a739eadfbc4babe62
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4d345a78bf1fad113e73f80a739eadfbc4babe62

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Mar 23 15:52:50 2021 -0500

wined3d: Implement zero step rate for instanced attributes.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/context.c         | 5 +++--
 dlls/wined3d/context_gl.c      | 6 +++++-
 dlls/wined3d/context_vk.c      | 4 ++--
 dlls/wined3d/wined3d_private.h | 1 +
 4 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 118ac2aad8a..2debf50de7f 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -238,16 +238,17 @@ void wined3d_stream_info_from_declaration(struct wined3d_stream_info *stream_inf
             if (stream->flags & WINED3DSTREAMSOURCE_INSTANCEDATA)
             {
                 stream_info->elements[idx].divisor = 1;
+                stream_info->elements[idx].instanced = true;
             }
             else if (element->input_slot_class == WINED3D_INPUT_PER_INSTANCE_DATA)
             {
                 stream_info->elements[idx].divisor = element->instance_data_step_rate;
-                if (!element->instance_data_step_rate)
-                    FIXME("Instance step rate 0 not implemented.\n");
+                stream_info->elements[idx].instanced = true;
             }
             else
             {
                 stream_info->elements[idx].divisor = 0;
+                stream_info->elements[idx].instanced = false;
             }
 
             if (!d3d_info->vertex_bgra && element->format->id == WINED3DFMT_B8G8R8A8_UNORM)
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index a51e5ec9095..fa61b70f525 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -5378,7 +5378,11 @@ static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *c
 
         if (gl_info->supported[ARB_INSTANCED_ARRAYS])
         {
-            GL_EXTCALL(glVertexAttribDivisor(i, element->divisor));
+            unsigned int divisor = 0;
+
+            if (element->instanced)
+                divisor = element->divisor ? element->divisor : UINT_MAX;
+            GL_EXTCALL(glVertexAttribDivisor(i, divisor));
         }
         else if (element->divisor)
         {
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index eedfed315ce..45133eabb69 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -2061,9 +2061,9 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte
             b = &key->bindings[binding_count++];
             b->binding = binding;
             b->stride = e->stride;
-            b->inputRate = e->divisor ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX;
+            b->inputRate = e->instanced ? VK_VERTEX_INPUT_RATE_INSTANCE : VK_VERTEX_INPUT_RATE_VERTEX;
 
-            if (e->divisor > 1)
+            if (e->instanced)
             {
                 d = &key->divisors[divisor_count++];
                 d->binding = binding;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index ba86cb7ebdb..c15765af0e8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1665,6 +1665,7 @@ struct wined3d_stream_info_element
     GLsizei stride;
     unsigned int stream_idx;
     unsigned int divisor;
+    bool instanced;
 };
 
 struct wined3d_stream_info




More information about the wine-cvs mailing list