vkd3d: Fix clear color swizzle for various UAV formats.
Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
4000397570
commit
a99914b6ea
|
@ -8084,18 +8084,45 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vkd3d_fixup_clear_uav_uint_color(struct d3d12_device *device,
|
static VkClearColorValue vkd3d_fixup_clear_uav_swizzle(struct d3d12_device *device,
|
||||||
DXGI_FORMAT dxgi_format, VkClearColorValue *color)
|
DXGI_FORMAT dxgi_format, VkClearColorValue color)
|
||||||
{
|
{
|
||||||
|
VkClearColorValue result;
|
||||||
|
|
||||||
|
switch (dxgi_format)
|
||||||
|
{
|
||||||
|
case DXGI_FORMAT_A8_UNORM:
|
||||||
|
result.uint32[0] = color.uint32[3];
|
||||||
|
return result;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static VkClearColorValue vkd3d_fixup_clear_uav_uint_color(struct d3d12_device *device,
|
||||||
|
DXGI_FORMAT dxgi_format, VkClearColorValue color)
|
||||||
|
{
|
||||||
|
VkClearColorValue result;
|
||||||
|
|
||||||
switch (dxgi_format)
|
switch (dxgi_format)
|
||||||
{
|
{
|
||||||
case DXGI_FORMAT_R11G11B10_FLOAT:
|
case DXGI_FORMAT_R11G11B10_FLOAT:
|
||||||
color->uint32[0] = (color->uint32[0] & 0x7FF)
|
result.uint32[0] = (color.uint32[0] & 0x7FF)
|
||||||
| ((color->uint32[1] & 0x7FF) << 11)
|
| ((color.uint32[1] & 0x7FF) << 11)
|
||||||
| ((color->uint32[2] & 0x3FF) << 22);
|
| ((color.uint32[2] & 0x3FF) << 22);
|
||||||
break;
|
return result;
|
||||||
|
|
||||||
default: ;
|
case DXGI_FORMAT_B8G8R8A8_UNORM:
|
||||||
|
case DXGI_FORMAT_B8G8R8X8_UNORM:
|
||||||
|
result.uint32[0] = color.uint32[2];
|
||||||
|
result.uint32[1] = color.uint32[1];
|
||||||
|
result.uint32[2] = color.uint32[0];
|
||||||
|
result.uint32[3] = color.uint32[3];
|
||||||
|
return result;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8185,6 +8212,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
|
||||||
if (!vkd3d_clear_uav_info_from_desc(&args, desc))
|
if (!vkd3d_clear_uav_info_from_desc(&args, desc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (args.has_view)
|
||||||
|
color = vkd3d_fixup_clear_uav_swizzle(list->device, desc->info.view->format->dxgi_format, color);
|
||||||
|
|
||||||
if (args.has_view && desc->info.view->format->type != VKD3D_FORMAT_TYPE_UINT)
|
if (args.has_view && desc->info.view->format->type != VKD3D_FORMAT_TYPE_UINT)
|
||||||
{
|
{
|
||||||
const struct vkd3d_view *base_view = desc->info.view;
|
const struct vkd3d_view *base_view = desc->info.view;
|
||||||
|
@ -8196,8 +8226,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
color = vkd3d_fixup_clear_uav_uint_color(list->device, base_view->format->dxgi_format, color);
|
||||||
vkd3d_fixup_clear_uav_uint_color(list->device, base_view->format->dxgi_format, &color);
|
|
||||||
vkd3d_mask_uint_clear_color(color.uint32, uint_format->vk_format);
|
vkd3d_mask_uint_clear_color(color.uint32, uint_format->vk_format);
|
||||||
|
|
||||||
if (d3d12_resource_is_texture(resource_impl))
|
if (d3d12_resource_is_texture(resource_impl))
|
||||||
|
@ -8268,11 +8297,14 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d
|
||||||
iface, gpu_handle.ptr, cpu_handle.ptr, resource, values, rect_count, rects);
|
iface, gpu_handle.ptr, cpu_handle.ptr, resource, values, rect_count, rects);
|
||||||
|
|
||||||
memcpy(color.float32, values, sizeof(color.float32));
|
memcpy(color.float32, values, sizeof(color.float32));
|
||||||
|
|
||||||
resource_impl = impl_from_ID3D12Resource(resource);
|
resource_impl = impl_from_ID3D12Resource(resource);
|
||||||
|
|
||||||
if (!vkd3d_clear_uav_info_from_desc(&args, desc))
|
if (!vkd3d_clear_uav_info_from_desc(&args, desc))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (args.has_view)
|
||||||
|
color = vkd3d_fixup_clear_uav_swizzle(list->device, desc->info.view->format->dxgi_format, color);
|
||||||
|
|
||||||
d3d12_command_list_clear_uav(list, desc, resource_impl, &args, &color, rect_count, rects);
|
d3d12_command_list_clear_uav(list, desc, resource_impl, &args, &color, rect_count, rects);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue