dzn: Support int border colors
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20614>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user