[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