[PATCH 08/11] wined3d: Add support for UAV reads.

Józef Kucia jkucia at codeweavers.com
Wed Nov 23 07:36:09 CST 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---

D3D11 hardware supports the following formats for typed UAV loads:
DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_UINT and DXGI_FORMAT_R32_SINT.

https://msdn.microsoft.com/en-us/library/windows/desktop/ff471325%28v=vs.85%29.aspx

---
 dlls/wined3d/glsl_shader.c     | 14 +++++++++++---
 dlls/wined3d/shader.c          | 15 ++++++++++++++-
 dlls/wined3d/wined3d_private.h |  1 +
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index fa233c7..9a1556d 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2068,7 +2068,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
     /* Declare images */
     for (i = 0; i < ARRAY_SIZE(reg_maps->uav_resource_info); ++i)
     {
-        const char *image_type_prefix, *image_type;
+        const char *image_type_prefix, *image_type, *read_format;
 
         if (!reg_maps->uav_resource_info[i].type)
             continue;
@@ -2079,18 +2079,22 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
             case WINED3D_DATA_UNORM:
             case WINED3D_DATA_SNORM:
                 image_type_prefix = "";
+                read_format = "r32f";
                 break;
 
             case WINED3D_DATA_INT:
                 image_type_prefix = "i";
+                read_format = "r32i";
                 break;
 
             case WINED3D_DATA_UINT:
                 image_type_prefix = "u";
+                read_format = "r32ui";
                 break;
 
             default:
                 image_type_prefix = "";
+                read_format = "";
                 ERR("Unhandled resource data type %#x.\n", reg_maps->uav_resource_info[i].data_type);
                 break;
         }
@@ -2111,8 +2115,12 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
                 break;
         }
 
-        shader_addline(buffer, "writeonly uniform %s%s %s_image%u;\n",
-                image_type_prefix, image_type, prefix, i);
+        if (reg_maps->uav_read_mask & (1u << i))
+            shader_addline(buffer, "layout(%s) uniform %s%s %s_image%u;\n",
+                    read_format, image_type_prefix, image_type, prefix, i);
+        else
+            shader_addline(buffer, "writeonly uniform %s%s %s_image%u;\n",
+                    image_type_prefix, image_type, prefix, i);
     }
 
     /* Declare uniforms for NP2 texcoord fixup:
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ed64e89..e1c097a 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -1228,7 +1228,20 @@ static HRESULT shader_get_registers_used(struct wined3d_shader *shader, const st
                 }
             }
 
-            if (ins.handler_idx == WINED3DSIH_NRM) reg_maps->usesnrm = 1;
+            if (ins.handler_idx == WINED3DSIH_ATOMIC_IADD)
+            {
+                unsigned int reg_idx = ins.dst[0].reg.idx[0].offset;
+                if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS)
+                {
+                    ERR("Invalid UAV index %u.\n", reg_idx);
+                    break;
+                }
+                reg_maps->uav_read_mask |= (1u << reg_idx);
+            }
+            else if (ins.handler_idx == WINED3DSIH_NRM)
+            {
+                reg_maps->usesnrm = 1;
+            }
             else if (ins.handler_idx == WINED3DSIH_DSY
                     || ins.handler_idx == WINED3DSIH_DSY_COARSE
                     || ins.handler_idx == WINED3DSIH_DSY_FINE)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8d2bb75..4fe6dff 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -839,6 +839,7 @@ struct wined3d_shader_reg_maps
     BYTE bumpmat;                                   /* MAX_TEXTURES, 8 */
     BYTE luminanceparams;                           /* MAX_TEXTURES, 8 */
     struct wined3d_shader_resource_info uav_resource_info[MAX_UNORDERED_ACCESS_VIEWS];
+    DWORD uav_read_mask;                            /* MAX_UNORDERED_ACCESS_VIEWS, 8 */
 
     WORD usesnrm        : 1;
     WORD vpos           : 1;
-- 
2.7.3




More information about the wine-patches mailing list