diff --git a/src/microsoft/vulkan/dzn_descriptor_set.c b/src/microsoft/vulkan/dzn_descriptor_set.c index 15d7d3448e5..b3a7620d40a 100644 --- a/src/microsoft/vulkan/dzn_descriptor_set.c +++ b/src/microsoft/vulkan/dzn_descriptor_set.c @@ -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 diff --git a/src/microsoft/vulkan/dzn_device.c b/src/microsoft/vulkan/dzn_device.c index 4af397bb668..58bb1c73f15 100644 --- a/src/microsoft/vulkan/dzn_device.c +++ b/src/microsoft/vulkan/dzn_device.c @@ -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"); diff --git a/src/microsoft/vulkan/dzn_private.h b/src/microsoft/vulkan/dzn_private.h index 070014b3c1f..428aa127bf2 100644 --- a/src/microsoft/vulkan/dzn_private.h +++ b/src/microsoft/vulkan/dzn_private.h @@ -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; };