dzn: Support int border colors

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20614>
This commit is contained in:
Jesse Natalie
2023-01-05 15:39:16 -08:00
committed by Marge Bot
parent 10282bbd96
commit b948a5db4f
3 changed files with 49 additions and 13 deletions
+20 -3
View File
@@ -794,6 +794,9 @@ dzn_descriptor_heap_finish(struct dzn_descriptor_heap *heap)
if (heap->dev)
ID3D12Device_Release(heap->dev);
if (heap->dev11)
ID3D12Device11_Release(heap->dev11);
}
static VkResult
@@ -803,12 +806,20 @@ dzn_descriptor_heap_init(struct dzn_descriptor_heap *heap,
uint32_t desc_count,
bool shader_visible)
{
struct dzn_physical_device *pdev =
container_of(device->vk.physical, struct dzn_physical_device, vk);
heap->desc_count = desc_count;
heap->type = type;
heap->dev = device->dev;
ID3D12Device1_AddRef(heap->dev);
heap->desc_sz = ID3D12Device1_GetDescriptorHandleIncrementSize(device->dev, type);
if (pdev->options14.AdvancedTextureOpsSupported &&
FAILED(IUnknown_QueryInterface(heap->dev, &IID_ID3D12Device11, (void **)&heap->dev11)))
return vk_error(device,
shader_visible ?
VK_ERROR_OUT_OF_DEVICE_MEMORY : VK_ERROR_OUT_OF_HOST_MEMORY);
D3D12_DESCRIPTOR_HEAP_DESC desc = {
.Type = type,
.NumDescriptors = desc_count,
@@ -832,6 +843,8 @@ dzn_descriptor_heap_init(struct dzn_descriptor_heap *heap,
heap->gpu_base = gpu_handle.ptr;
}
ID3D12Device1_AddRef(heap->dev);
return VK_SUCCESS;
}
@@ -856,8 +869,12 @@ dzn_descriptor_heap_write_sampler_desc(struct dzn_descriptor_heap *heap,
uint32_t desc_offset,
const struct dzn_sampler *sampler)
{
ID3D12Device1_CreateSampler(heap->dev, &sampler->desc,
dzn_descriptor_heap_get_cpu_handle(heap, desc_offset));
if (heap->dev11)
ID3D12Device11_CreateSampler2(heap->dev11, &sampler->desc,
dzn_descriptor_heap_get_cpu_handle(heap, desc_offset));
else
ID3D12Device1_CreateSampler(heap->dev, (D3D12_SAMPLER_DESC *)&sampler->desc,
dzn_descriptor_heap_get_cpu_handle(heap, desc_offset));
}
void
+27 -9
View File
@@ -3085,10 +3085,10 @@ dzn_sampler_create(struct dzn_device *device,
switch (pCreateInfo->borderColor) {
case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
sampler->desc.BorderColor[0] = 0.0f;
sampler->desc.BorderColor[1] = 0.0f;
sampler->desc.BorderColor[2] = 0.0f;
sampler->desc.BorderColor[3] =
sampler->desc.FloatBorderColor[0] = 0.0f;
sampler->desc.FloatBorderColor[1] = 0.0f;
sampler->desc.FloatBorderColor[2] = 0.0f;
sampler->desc.FloatBorderColor[3] =
pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK ? 0.0f : 1.0f;
sampler->static_border_color =
pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK ?
@@ -3096,21 +3096,39 @@ dzn_sampler_create(struct dzn_device *device,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK;
break;
case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
sampler->desc.BorderColor[0] = sampler->desc.BorderColor[1] = 1.0f;
sampler->desc.BorderColor[2] = sampler->desc.BorderColor[3] = 1.0f;
sampler->desc.FloatBorderColor[0] = sampler->desc.FloatBorderColor[1] = 1.0f;
sampler->desc.FloatBorderColor[2] = sampler->desc.FloatBorderColor[3] = 1.0f;
sampler->static_border_color = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE;
break;
case VK_BORDER_COLOR_FLOAT_CUSTOM_EXT:
sampler->static_border_color = (D3D12_STATIC_BORDER_COLOR)-1;
for (unsigned i = 0; i < ARRAY_SIZE(sampler->desc.BorderColor); i++)
sampler->desc.BorderColor[i] = pBorderColor->customBorderColor.float32[i];
for (unsigned i = 0; i < ARRAY_SIZE(sampler->desc.FloatBorderColor); i++)
sampler->desc.FloatBorderColor[i] = pBorderColor->customBorderColor.float32[i];
break;
case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
sampler->desc.UintBorderColor[0] = 0;
sampler->desc.UintBorderColor[1] = 0;
sampler->desc.UintBorderColor[2] = 0;
sampler->desc.UintBorderColor[3] =
pCreateInfo->borderColor == VK_BORDER_COLOR_INT_TRANSPARENT_BLACK ? 0 : 1;
sampler->static_border_color =
pCreateInfo->borderColor == VK_BORDER_COLOR_INT_TRANSPARENT_BLACK ?
D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK :
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK_UINT;
sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
break;
case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
sampler->desc.UintBorderColor[0] = sampler->desc.UintBorderColor[1] = 1;
sampler->desc.UintBorderColor[2] = sampler->desc.UintBorderColor[3] = 1;
sampler->static_border_color = D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE_UINT;
sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
break;
case VK_BORDER_COLOR_INT_CUSTOM_EXT:
/* FIXME: sampling from integer textures is not supported yet. */
sampler->static_border_color = (D3D12_STATIC_BORDER_COLOR)-1;
for (unsigned i = 0; i < ARRAY_SIZE(sampler->desc.UintBorderColor); i++)
sampler->desc.UintBorderColor[i] = pBorderColor->customBorderColor.uint32[i];
sampler->desc.Flags = D3D12_SAMPLER_FLAG_UINT_BORDER_COLOR;
break;
default:
unreachable("Unsupported border color");
+2 -1
View File
@@ -377,6 +377,7 @@ struct dzn_buffer_desc {
struct dzn_descriptor_heap {
ID3D12Device4 *dev;
ID3D12Device11 *dev11;
ID3D12DescriptorHeap *heap;
D3D12_DESCRIPTOR_HEAP_TYPE type;
SIZE_T cpu_base;
@@ -1027,7 +1028,7 @@ struct dzn_buffer_view {
struct dzn_sampler {
struct vk_object_base base;
D3D12_SAMPLER_DESC desc;
D3D12_SAMPLER_DESC2 desc;
D3D12_STATIC_BORDER_COLOR static_border_color;
};