[PATCH vkd3d 1/6] vkd3d: Introduce vkd3d_get_texture_layer_count() helper for UAVs.
Conor McCarthy
cmccarthy at codeweavers.com
Wed Sep 29 00:33:58 CDT 2021
UINT_MAX is valid for specifying all remaining layers in all view types,
although it's only documented for TEXTURE3D RTVs. If unhandled, UINT_MAX
will be passed to vkd3d_compute_workgroup_count() during UAV clears,
leading to nasty results in RADV.
Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
libs/vkd3d/resource.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/libs/vkd3d/resource.c b/libs/vkd3d/resource.c
index 1ca23a90..16dd07db 100644
--- a/libs/vkd3d/resource.c
+++ b/libs/vkd3d/resource.c
@@ -2477,6 +2477,25 @@ static bool init_default_texture_view_desc(struct vkd3d_texture_view_desc *desc,
return true;
}
+static unsigned int vkd3d_get_texture_layer_count(unsigned int layer_idx, unsigned int layer_count,
+ const D3D12_RESOURCE_DESC *desc)
+{
+ if (desc->DepthOrArraySize > layer_idx)
+ {
+ unsigned int max_layer_count = desc->DepthOrArraySize - layer_idx;
+
+ if (layer_count <= max_layer_count)
+ return layer_count;
+
+ if (layer_count != UINT_MAX)
+ WARN("Layer count %u exceeds maximum %u.\n", layer_count, max_layer_count);
+ return max_layer_count;
+ }
+
+ WARN("Layer index %u exceeds maximum available layer %u.\n", layer_idx, desc->DepthOrArraySize - 1);
+ return 1;
+}
+
bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
const struct vkd3d_texture_view_desc *desc, struct vkd3d_view **view)
{
@@ -2758,6 +2777,7 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
}
+ /* Allow a UINT_MAX layer count through as it equals VK_REMAINING_ARRAY_LAYERS. */
}
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
@@ -2931,6 +2951,9 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
}
+ /* Prevent problems with UAV clears where the layer count is UINT_MAX. */
+ vkd3d_desc.layer_count = vkd3d_get_texture_layer_count(vkd3d_desc.layer_idx,
+ vkd3d_desc.layer_count, &resource->desc);
}
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view))
--
2.32.0
More information about the wine-devel
mailing list