1bf215546Sopenharmony_ci/* 2bf215546Sopenharmony_ci * Copyright © Microsoft Corporation 3bf215546Sopenharmony_ci * 4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 5bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 6bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation 7bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 9bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 10bf215546Sopenharmony_ci * 11bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the next 12bf215546Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 13bf215546Sopenharmony_ci * Software. 14bf215546Sopenharmony_ci * 15bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20bf215546Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21bf215546Sopenharmony_ci * IN THE SOFTWARE. 22bf215546Sopenharmony_ci */ 23bf215546Sopenharmony_ci 24bf215546Sopenharmony_ci#include "dzn_private.h" 25bf215546Sopenharmony_ci 26bf215546Sopenharmony_ci#define D3D12_IGNORE_SDK_LAYERS 27bf215546Sopenharmony_ci#define COBJMACROS 28bf215546Sopenharmony_ci#include <directx/d3d12.h> 29bf215546Sopenharmony_ci 30bf215546Sopenharmony_ci#include <vulkan/vulkan.h> 31bf215546Sopenharmony_ci 32bf215546Sopenharmony_ci#include "util/format/u_format.h" 33bf215546Sopenharmony_ci#include "util/log.h" 34bf215546Sopenharmony_ci 35bf215546Sopenharmony_ci#include <directx/d3d12sdklayers.h> 36bf215546Sopenharmony_ci#include <util/u_dl.h> 37bf215546Sopenharmony_ci 38bf215546Sopenharmony_cistatic const DXGI_FORMAT formats[PIPE_FORMAT_COUNT] = { 39bf215546Sopenharmony_ci#define MAP_FORMAT_NORM(FMT) \ 40bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _UNORM] = DXGI_FORMAT_ ## FMT ## _UNORM, \ 41bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _SNORM] = DXGI_FORMAT_ ## FMT ## _SNORM, 42bf215546Sopenharmony_ci 43bf215546Sopenharmony_ci#define MAP_FORMAT_INT(FMT) \ 44bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _UINT] = DXGI_FORMAT_ ## FMT ## _UINT, \ 45bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _SINT] = DXGI_FORMAT_ ## FMT ## _SINT, 46bf215546Sopenharmony_ci 47bf215546Sopenharmony_ci#define MAP_FORMAT_SRGB(FMT) \ 48bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _SRGB] = DXGI_FORMAT_ ## FMT ## _UNORM_SRGB, 49bf215546Sopenharmony_ci 50bf215546Sopenharmony_ci#define MAP_FORMAT_FLOAT(FMT) \ 51bf215546Sopenharmony_ci [PIPE_FORMAT_ ## FMT ## _FLOAT] = DXGI_FORMAT_ ## FMT ## _FLOAT, 52bf215546Sopenharmony_ci 53bf215546Sopenharmony_ci#define MAP_EMU_FORMAT_NO_ALPHA(BITS, TYPE) \ 54bf215546Sopenharmony_ci [PIPE_FORMAT_L ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \ 55bf215546Sopenharmony_ci [PIPE_FORMAT_I ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \ 56bf215546Sopenharmony_ci [PIPE_FORMAT_L ## BITS ## A ## BITS ## _ ## TYPE] = \ 57bf215546Sopenharmony_ci DXGI_FORMAT_R ## BITS ## G ## BITS ## _ ## TYPE, 58bf215546Sopenharmony_ci 59bf215546Sopenharmony_ci#define MAP_EMU_FORMAT(BITS, TYPE) \ 60bf215546Sopenharmony_ci [PIPE_FORMAT_A ## BITS ## _ ## TYPE] = DXGI_FORMAT_R ## BITS ## _ ## TYPE, \ 61bf215546Sopenharmony_ci MAP_EMU_FORMAT_NO_ALPHA(BITS, TYPE) 62bf215546Sopenharmony_ci 63bf215546Sopenharmony_ci MAP_FORMAT_NORM(R8) 64bf215546Sopenharmony_ci MAP_FORMAT_INT(R8) 65bf215546Sopenharmony_ci 66bf215546Sopenharmony_ci MAP_FORMAT_NORM(R8G8) 67bf215546Sopenharmony_ci MAP_FORMAT_INT(R8G8) 68bf215546Sopenharmony_ci 69bf215546Sopenharmony_ci MAP_FORMAT_NORM(R8G8B8A8) 70bf215546Sopenharmony_ci MAP_FORMAT_INT(R8G8B8A8) 71bf215546Sopenharmony_ci MAP_FORMAT_SRGB(R8G8B8A8) 72bf215546Sopenharmony_ci 73bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8X8_UNORM] = DXGI_FORMAT_B8G8R8X8_UNORM, 74bf215546Sopenharmony_ci [PIPE_FORMAT_B8G8R8A8_UNORM] = DXGI_FORMAT_B8G8R8A8_UNORM, 75bf215546Sopenharmony_ci [PIPE_FORMAT_B4G4R4A4_UNORM] = DXGI_FORMAT_B4G4R4A4_UNORM, 76bf215546Sopenharmony_ci [PIPE_FORMAT_A4R4G4B4_UNORM] = DXGI_FORMAT_B4G4R4A4_UNORM, 77bf215546Sopenharmony_ci [PIPE_FORMAT_B5G6R5_UNORM] = DXGI_FORMAT_B5G6R5_UNORM, 78bf215546Sopenharmony_ci [PIPE_FORMAT_B5G5R5A1_UNORM] = DXGI_FORMAT_B5G5R5A1_UNORM, 79bf215546Sopenharmony_ci 80bf215546Sopenharmony_ci MAP_FORMAT_SRGB(B8G8R8A8) 81bf215546Sopenharmony_ci 82bf215546Sopenharmony_ci MAP_FORMAT_INT(R32) 83bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R32) 84bf215546Sopenharmony_ci MAP_FORMAT_INT(R32G32) 85bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R32G32) 86bf215546Sopenharmony_ci MAP_FORMAT_INT(R32G32B32) 87bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R32G32B32) 88bf215546Sopenharmony_ci MAP_FORMAT_INT(R32G32B32A32) 89bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R32G32B32A32) 90bf215546Sopenharmony_ci 91bf215546Sopenharmony_ci MAP_FORMAT_NORM(R16) 92bf215546Sopenharmony_ci MAP_FORMAT_INT(R16) 93bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R16) 94bf215546Sopenharmony_ci 95bf215546Sopenharmony_ci MAP_FORMAT_NORM(R16G16) 96bf215546Sopenharmony_ci MAP_FORMAT_INT(R16G16) 97bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R16G16) 98bf215546Sopenharmony_ci 99bf215546Sopenharmony_ci MAP_FORMAT_NORM(R16G16B16A16) 100bf215546Sopenharmony_ci MAP_FORMAT_INT(R16G16B16A16) 101bf215546Sopenharmony_ci MAP_FORMAT_FLOAT(R16G16B16A16) 102bf215546Sopenharmony_ci 103bf215546Sopenharmony_ci [PIPE_FORMAT_A8_UNORM] = DXGI_FORMAT_A8_UNORM, 104bf215546Sopenharmony_ci MAP_EMU_FORMAT_NO_ALPHA(8, UNORM) 105bf215546Sopenharmony_ci MAP_EMU_FORMAT(8, SNORM) 106bf215546Sopenharmony_ci MAP_EMU_FORMAT(8, SINT) 107bf215546Sopenharmony_ci MAP_EMU_FORMAT(8, UINT) 108bf215546Sopenharmony_ci MAP_EMU_FORMAT(16, UNORM) 109bf215546Sopenharmony_ci MAP_EMU_FORMAT(16, SNORM) 110bf215546Sopenharmony_ci MAP_EMU_FORMAT(16, SINT) 111bf215546Sopenharmony_ci MAP_EMU_FORMAT(16, UINT) 112bf215546Sopenharmony_ci MAP_EMU_FORMAT(16, FLOAT) 113bf215546Sopenharmony_ci MAP_EMU_FORMAT(32, SINT) 114bf215546Sopenharmony_ci MAP_EMU_FORMAT(32, UINT) 115bf215546Sopenharmony_ci MAP_EMU_FORMAT(32, FLOAT) 116bf215546Sopenharmony_ci 117bf215546Sopenharmony_ci [PIPE_FORMAT_R9G9B9E5_FLOAT] = DXGI_FORMAT_R9G9B9E5_SHAREDEXP, 118bf215546Sopenharmony_ci [PIPE_FORMAT_R11G11B10_FLOAT] = DXGI_FORMAT_R11G11B10_FLOAT, 119bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_UINT] = DXGI_FORMAT_R10G10B10A2_UINT, 120bf215546Sopenharmony_ci [PIPE_FORMAT_R10G10B10A2_UNORM] = DXGI_FORMAT_R10G10B10A2_UNORM, 121bf215546Sopenharmony_ci 122bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_RGB] = DXGI_FORMAT_BC1_UNORM, 123bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_RGBA] = DXGI_FORMAT_BC1_UNORM, 124bf215546Sopenharmony_ci [PIPE_FORMAT_DXT3_RGBA] = DXGI_FORMAT_BC2_UNORM, 125bf215546Sopenharmony_ci [PIPE_FORMAT_DXT5_RGBA] = DXGI_FORMAT_BC3_UNORM, 126bf215546Sopenharmony_ci 127bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_SRGB] = DXGI_FORMAT_BC1_UNORM_SRGB, 128bf215546Sopenharmony_ci [PIPE_FORMAT_DXT1_SRGBA] = DXGI_FORMAT_BC1_UNORM_SRGB, 129bf215546Sopenharmony_ci [PIPE_FORMAT_DXT3_SRGBA] = DXGI_FORMAT_BC2_UNORM_SRGB, 130bf215546Sopenharmony_ci [PIPE_FORMAT_DXT5_SRGBA] = DXGI_FORMAT_BC3_UNORM_SRGB, 131bf215546Sopenharmony_ci 132bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC1_UNORM] = DXGI_FORMAT_BC4_UNORM, 133bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC1_SNORM] = DXGI_FORMAT_BC4_SNORM, 134bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC2_UNORM] = DXGI_FORMAT_BC5_UNORM, 135bf215546Sopenharmony_ci [PIPE_FORMAT_RGTC2_SNORM] = DXGI_FORMAT_BC5_SNORM, 136bf215546Sopenharmony_ci 137bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGB_UFLOAT] = DXGI_FORMAT_BC6H_UF16, 138bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGB_FLOAT] = DXGI_FORMAT_BC6H_SF16, 139bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_RGBA_UNORM] = DXGI_FORMAT_BC7_UNORM, 140bf215546Sopenharmony_ci [PIPE_FORMAT_BPTC_SRGBA] = DXGI_FORMAT_BC7_UNORM_SRGB, 141bf215546Sopenharmony_ci 142bf215546Sopenharmony_ci [PIPE_FORMAT_Z32_FLOAT] = DXGI_FORMAT_R32_TYPELESS, 143bf215546Sopenharmony_ci [PIPE_FORMAT_Z16_UNORM] = DXGI_FORMAT_R16_TYPELESS, 144bf215546Sopenharmony_ci [PIPE_FORMAT_Z24X8_UNORM] = DXGI_FORMAT_R24G8_TYPELESS, 145bf215546Sopenharmony_ci [PIPE_FORMAT_X24S8_UINT] = DXGI_FORMAT_R24G8_TYPELESS, 146bf215546Sopenharmony_ci 147bf215546Sopenharmony_ci [PIPE_FORMAT_Z24_UNORM_S8_UINT] = DXGI_FORMAT_R24G8_TYPELESS, 148bf215546Sopenharmony_ci [PIPE_FORMAT_Z32_FLOAT_S8X24_UINT] = DXGI_FORMAT_R32G8X24_TYPELESS, 149bf215546Sopenharmony_ci [PIPE_FORMAT_X32_S8X24_UINT] = DXGI_FORMAT_R32G8X24_TYPELESS, 150bf215546Sopenharmony_ci}; 151bf215546Sopenharmony_ci 152bf215546Sopenharmony_ciDXGI_FORMAT 153bf215546Sopenharmony_cidzn_pipe_to_dxgi_format(enum pipe_format in) 154bf215546Sopenharmony_ci{ 155bf215546Sopenharmony_ci return formats[in]; 156bf215546Sopenharmony_ci} 157bf215546Sopenharmony_ci 158bf215546Sopenharmony_ciDXGI_FORMAT 159bf215546Sopenharmony_cidzn_get_typeless_dxgi_format(DXGI_FORMAT in) 160bf215546Sopenharmony_ci{ 161bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R32G32B32A32_TYPELESS && in <= DXGI_FORMAT_R32G32B32A32_SINT) 162bf215546Sopenharmony_ci return DXGI_FORMAT_R32G32B32A32_TYPELESS; 163bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R32G32B32_TYPELESS && in <= DXGI_FORMAT_R32G32B32_SINT) 164bf215546Sopenharmony_ci return DXGI_FORMAT_R32G32B32_TYPELESS; 165bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R16G16B16A16_TYPELESS && in <= DXGI_FORMAT_R16G16B16A16_SINT) 166bf215546Sopenharmony_ci return DXGI_FORMAT_R16G16B16A16_TYPELESS; 167bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R32G32_TYPELESS && in <= DXGI_FORMAT_R32G32_SINT) 168bf215546Sopenharmony_ci return DXGI_FORMAT_R32G32_TYPELESS; 169bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R32G8X24_TYPELESS && in <= DXGI_FORMAT_X32_TYPELESS_G8X24_UINT) 170bf215546Sopenharmony_ci return DXGI_FORMAT_R32G8X24_TYPELESS; 171bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R10G10B10A2_TYPELESS && in <= DXGI_FORMAT_R10G10B10A2_UINT) 172bf215546Sopenharmony_ci return DXGI_FORMAT_R10G10B10A2_TYPELESS; 173bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R8G8B8A8_TYPELESS && in <= DXGI_FORMAT_R8G8B8A8_SINT) 174bf215546Sopenharmony_ci return DXGI_FORMAT_R8G8B8A8_TYPELESS; 175bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R16G16_TYPELESS && in <= DXGI_FORMAT_R16G16_SINT) 176bf215546Sopenharmony_ci return DXGI_FORMAT_R16G16_TYPELESS; 177bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R32_TYPELESS && in <= DXGI_FORMAT_R32_SINT) 178bf215546Sopenharmony_ci return DXGI_FORMAT_R32_TYPELESS; 179bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R24G8_TYPELESS && in <= DXGI_FORMAT_X24_TYPELESS_G8_UINT) 180bf215546Sopenharmony_ci return DXGI_FORMAT_R24G8_TYPELESS; 181bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R8G8_TYPELESS && in <= DXGI_FORMAT_R8G8_SINT) 182bf215546Sopenharmony_ci return DXGI_FORMAT_R8G8_TYPELESS; 183bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R16_TYPELESS && in <= DXGI_FORMAT_R16_SINT) 184bf215546Sopenharmony_ci return DXGI_FORMAT_R16_TYPELESS; 185bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_R8_TYPELESS && in <= DXGI_FORMAT_R8_SINT) 186bf215546Sopenharmony_ci return DXGI_FORMAT_R8_TYPELESS; 187bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC1_TYPELESS && in <= DXGI_FORMAT_BC1_UNORM_SRGB) 188bf215546Sopenharmony_ci return DXGI_FORMAT_BC1_TYPELESS; 189bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC2_TYPELESS && in <= DXGI_FORMAT_BC2_UNORM_SRGB) 190bf215546Sopenharmony_ci return DXGI_FORMAT_BC2_TYPELESS; 191bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC3_TYPELESS && in <= DXGI_FORMAT_BC3_UNORM_SRGB) 192bf215546Sopenharmony_ci return DXGI_FORMAT_BC3_TYPELESS; 193bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC4_TYPELESS && in <= DXGI_FORMAT_BC4_SNORM) 194bf215546Sopenharmony_ci return DXGI_FORMAT_BC4_TYPELESS; 195bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC5_TYPELESS && in <= DXGI_FORMAT_BC5_SNORM) 196bf215546Sopenharmony_ci return DXGI_FORMAT_BC5_TYPELESS; 197bf215546Sopenharmony_ci if (in == DXGI_FORMAT_B8G8R8A8_UNORM || 198bf215546Sopenharmony_ci (in >= DXGI_FORMAT_B8G8R8A8_TYPELESS && in <= DXGI_FORMAT_B8G8R8A8_UNORM_SRGB)) 199bf215546Sopenharmony_ci return DXGI_FORMAT_B8G8R8A8_TYPELESS; 200bf215546Sopenharmony_ci if (in == DXGI_FORMAT_B8G8R8X8_UNORM || 201bf215546Sopenharmony_ci (in >= DXGI_FORMAT_B8G8R8X8_TYPELESS && in <= DXGI_FORMAT_B8G8R8X8_UNORM_SRGB)) 202bf215546Sopenharmony_ci return DXGI_FORMAT_B8G8R8X8_TYPELESS; 203bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC6H_TYPELESS && in <= DXGI_FORMAT_BC6H_SF16) 204bf215546Sopenharmony_ci return DXGI_FORMAT_BC6H_TYPELESS; 205bf215546Sopenharmony_ci if (in >= DXGI_FORMAT_BC7_TYPELESS && in <= DXGI_FORMAT_BC7_UNORM_SRGB) 206bf215546Sopenharmony_ci return DXGI_FORMAT_BC7_TYPELESS; 207bf215546Sopenharmony_ci 208bf215546Sopenharmony_ci return in; 209bf215546Sopenharmony_ci} 210bf215546Sopenharmony_ci 211bf215546Sopenharmony_cistruct dzn_sampler_filter_info { 212bf215546Sopenharmony_ci VkFilter min, mag; 213bf215546Sopenharmony_ci VkSamplerMipmapMode mipmap; 214bf215546Sopenharmony_ci}; 215bf215546Sopenharmony_ci 216bf215546Sopenharmony_ci#define FILTER(__min, __mag, __mipmap) \ 217bf215546Sopenharmony_ci{ \ 218bf215546Sopenharmony_ci .min = VK_FILTER_ ## __min, \ 219bf215546Sopenharmony_ci .mag = VK_FILTER_ ## __mag, \ 220bf215546Sopenharmony_ci .mipmap = VK_SAMPLER_MIPMAP_MODE_ ## __mipmap, \ 221bf215546Sopenharmony_ci} 222bf215546Sopenharmony_ci 223bf215546Sopenharmony_cistatic const struct dzn_sampler_filter_info filter_table[] = { 224bf215546Sopenharmony_ci [D3D12_FILTER_MIN_MAG_MIP_POINT] = FILTER(NEAREST, NEAREST, NEAREST), 225bf215546Sopenharmony_ci [D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR] = FILTER(NEAREST, NEAREST, LINEAR), 226bf215546Sopenharmony_ci [D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT] = FILTER(NEAREST, LINEAR, NEAREST), 227bf215546Sopenharmony_ci [D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR] = FILTER(NEAREST, LINEAR, LINEAR), 228bf215546Sopenharmony_ci [D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT] = FILTER(LINEAR, NEAREST, NEAREST), 229bf215546Sopenharmony_ci [D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR] = FILTER(LINEAR, NEAREST, LINEAR), 230bf215546Sopenharmony_ci [D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT] = FILTER(LINEAR, LINEAR, NEAREST), 231bf215546Sopenharmony_ci [D3D12_FILTER_MIN_MAG_MIP_LINEAR] = FILTER(LINEAR, LINEAR, LINEAR), 232bf215546Sopenharmony_ci}; 233bf215546Sopenharmony_ci 234bf215546Sopenharmony_ciD3D12_FILTER 235bf215546Sopenharmony_cidzn_translate_sampler_filter(const VkSamplerCreateInfo *create_info) 236bf215546Sopenharmony_ci{ 237bf215546Sopenharmony_ci D3D12_FILTER filter = (D3D12_FILTER)0; 238bf215546Sopenharmony_ci 239bf215546Sopenharmony_ci if (!create_info->anisotropyEnable) { 240bf215546Sopenharmony_ci unsigned i; 241bf215546Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(filter_table); i++) { 242bf215546Sopenharmony_ci if (create_info->minFilter == filter_table[i].min && 243bf215546Sopenharmony_ci create_info->magFilter == filter_table[i].mag && 244bf215546Sopenharmony_ci create_info->mipmapMode == filter_table[i].mipmap) { 245bf215546Sopenharmony_ci filter = (D3D12_FILTER)i; 246bf215546Sopenharmony_ci break; 247bf215546Sopenharmony_ci } 248bf215546Sopenharmony_ci } 249bf215546Sopenharmony_ci 250bf215546Sopenharmony_ci assert(i < ARRAY_SIZE(filter_table)); 251bf215546Sopenharmony_ci } else { 252bf215546Sopenharmony_ci filter = D3D12_FILTER_ANISOTROPIC; 253bf215546Sopenharmony_ci } 254bf215546Sopenharmony_ci 255bf215546Sopenharmony_ci if (create_info->compareEnable) 256bf215546Sopenharmony_ci filter = (D3D12_FILTER)(filter + D3D12_FILTER_COMPARISON_MIN_MAG_MIP_POINT); 257bf215546Sopenharmony_ci 258bf215546Sopenharmony_ci return filter; 259bf215546Sopenharmony_ci} 260bf215546Sopenharmony_ci 261bf215546Sopenharmony_ciD3D12_COMPARISON_FUNC 262bf215546Sopenharmony_cidzn_translate_compare_op(VkCompareOp in) 263bf215546Sopenharmony_ci{ 264bf215546Sopenharmony_ci switch (in) { 265bf215546Sopenharmony_ci case VK_COMPARE_OP_NEVER: return D3D12_COMPARISON_FUNC_NEVER; 266bf215546Sopenharmony_ci case VK_COMPARE_OP_LESS: return D3D12_COMPARISON_FUNC_LESS; 267bf215546Sopenharmony_ci case VK_COMPARE_OP_EQUAL: return D3D12_COMPARISON_FUNC_EQUAL; 268bf215546Sopenharmony_ci case VK_COMPARE_OP_LESS_OR_EQUAL: return D3D12_COMPARISON_FUNC_LESS_EQUAL; 269bf215546Sopenharmony_ci case VK_COMPARE_OP_GREATER: return D3D12_COMPARISON_FUNC_GREATER; 270bf215546Sopenharmony_ci case VK_COMPARE_OP_NOT_EQUAL: return D3D12_COMPARISON_FUNC_NOT_EQUAL; 271bf215546Sopenharmony_ci case VK_COMPARE_OP_GREATER_OR_EQUAL: return D3D12_COMPARISON_FUNC_GREATER_EQUAL; 272bf215546Sopenharmony_ci case VK_COMPARE_OP_ALWAYS: return D3D12_COMPARISON_FUNC_ALWAYS; 273bf215546Sopenharmony_ci default: unreachable("Invalid compare op"); 274bf215546Sopenharmony_ci } 275bf215546Sopenharmony_ci} 276bf215546Sopenharmony_ci 277bf215546Sopenharmony_civoid 278bf215546Sopenharmony_cidzn_translate_viewport(D3D12_VIEWPORT *out, 279bf215546Sopenharmony_ci const VkViewport *in) 280bf215546Sopenharmony_ci{ 281bf215546Sopenharmony_ci out->TopLeftX = in->x; 282bf215546Sopenharmony_ci out->TopLeftY = in->height < 0 ? in->height + in->y : in->y; 283bf215546Sopenharmony_ci out->Width = in->width; 284bf215546Sopenharmony_ci out->Height = fabs(in->height); 285bf215546Sopenharmony_ci out->MinDepth = MIN2(in->minDepth, in->maxDepth); 286bf215546Sopenharmony_ci out->MaxDepth = MAX2(in->maxDepth, in->minDepth); 287bf215546Sopenharmony_ci} 288bf215546Sopenharmony_ci 289bf215546Sopenharmony_civoid 290bf215546Sopenharmony_cidzn_translate_rect(D3D12_RECT *out, 291bf215546Sopenharmony_ci const VkRect2D *in) 292bf215546Sopenharmony_ci{ 293bf215546Sopenharmony_ci out->left = in->offset.x; 294bf215546Sopenharmony_ci out->top = in->offset.y; 295bf215546Sopenharmony_ci out->right = in->offset.x + in->extent.width; 296bf215546Sopenharmony_ci out->bottom = in->offset.y + in->extent.height; 297bf215546Sopenharmony_ci} 298bf215546Sopenharmony_ci 299bf215546Sopenharmony_cistatic ID3D12Debug * 300bf215546Sopenharmony_ciget_debug_interface() 301bf215546Sopenharmony_ci{ 302bf215546Sopenharmony_ci typedef HRESULT(WINAPI *PFN_D3D12_GET_DEBUG_INTERFACE)(REFIID riid, void **ppFactory); 303bf215546Sopenharmony_ci PFN_D3D12_GET_DEBUG_INTERFACE D3D12GetDebugInterface; 304bf215546Sopenharmony_ci 305bf215546Sopenharmony_ci struct util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); 306bf215546Sopenharmony_ci if (!d3d12_mod) { 307bf215546Sopenharmony_ci mesa_loge("failed to load D3D12\n"); 308bf215546Sopenharmony_ci return NULL; 309bf215546Sopenharmony_ci } 310bf215546Sopenharmony_ci 311bf215546Sopenharmony_ci D3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)util_dl_get_proc_address(d3d12_mod, "D3D12GetDebugInterface"); 312bf215546Sopenharmony_ci if (!D3D12GetDebugInterface) { 313bf215546Sopenharmony_ci mesa_loge("failed to load D3D12GetDebugInterface from D3D12.DLL\n"); 314bf215546Sopenharmony_ci return NULL; 315bf215546Sopenharmony_ci } 316bf215546Sopenharmony_ci 317bf215546Sopenharmony_ci ID3D12Debug *debug; 318bf215546Sopenharmony_ci if (FAILED(D3D12GetDebugInterface(&IID_ID3D12Debug, (void **)&debug))) { 319bf215546Sopenharmony_ci mesa_loge("D3D12GetDebugInterface failed\n"); 320bf215546Sopenharmony_ci return NULL; 321bf215546Sopenharmony_ci } 322bf215546Sopenharmony_ci 323bf215546Sopenharmony_ci return debug; 324bf215546Sopenharmony_ci} 325bf215546Sopenharmony_ci 326bf215546Sopenharmony_civoid 327bf215546Sopenharmony_cid3d12_enable_debug_layer(void) 328bf215546Sopenharmony_ci{ 329bf215546Sopenharmony_ci ID3D12Debug *debug = get_debug_interface(); 330bf215546Sopenharmony_ci if (debug) { 331bf215546Sopenharmony_ci ID3D12Debug_EnableDebugLayer(debug); 332bf215546Sopenharmony_ci ID3D12Debug_Release(debug); 333bf215546Sopenharmony_ci } 334bf215546Sopenharmony_ci} 335bf215546Sopenharmony_ci 336bf215546Sopenharmony_civoid 337bf215546Sopenharmony_cid3d12_enable_gpu_validation(void) 338bf215546Sopenharmony_ci{ 339bf215546Sopenharmony_ci ID3D12Debug *debug = get_debug_interface(); 340bf215546Sopenharmony_ci if (debug) { 341bf215546Sopenharmony_ci ID3D12Debug3 *debug3; 342bf215546Sopenharmony_ci if (SUCCEEDED(ID3D12Debug_QueryInterface(debug, 343bf215546Sopenharmony_ci &IID_ID3D12Debug3, 344bf215546Sopenharmony_ci (void **)&debug3))) { 345bf215546Sopenharmony_ci ID3D12Debug3_SetEnableGPUBasedValidation(debug3, true); 346bf215546Sopenharmony_ci ID3D12Debug3_Release(debug3); 347bf215546Sopenharmony_ci } 348bf215546Sopenharmony_ci ID3D12Debug_Release(debug); 349bf215546Sopenharmony_ci } 350bf215546Sopenharmony_ci} 351bf215546Sopenharmony_ci 352bf215546Sopenharmony_ciID3D12Device2 * 353bf215546Sopenharmony_cid3d12_create_device(IUnknown *adapter, bool experimental_features) 354bf215546Sopenharmony_ci{ 355bf215546Sopenharmony_ci typedef HRESULT(WINAPI *PFN_D3D12CREATEDEVICE)(IUnknown *, D3D_FEATURE_LEVEL, REFIID, void **); 356bf215546Sopenharmony_ci PFN_D3D12CREATEDEVICE D3D12CreateDevice; 357bf215546Sopenharmony_ci 358bf215546Sopenharmony_ci struct util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); 359bf215546Sopenharmony_ci if (!d3d12_mod) { 360bf215546Sopenharmony_ci mesa_loge("failed to load D3D12\n"); 361bf215546Sopenharmony_ci return NULL; 362bf215546Sopenharmony_ci } 363bf215546Sopenharmony_ci 364bf215546Sopenharmony_ci#ifdef _WIN32 365bf215546Sopenharmony_ci if (experimental_features) 366bf215546Sopenharmony_ci#endif 367bf215546Sopenharmony_ci { 368bf215546Sopenharmony_ci typedef HRESULT(WINAPI *PFN_D3D12ENABLEEXPERIMENTALFEATURES)(UINT, const IID *, void *, UINT *); 369bf215546Sopenharmony_ci PFN_D3D12ENABLEEXPERIMENTALFEATURES D3D12EnableExperimentalFeatures = 370bf215546Sopenharmony_ci (PFN_D3D12ENABLEEXPERIMENTALFEATURES)util_dl_get_proc_address(d3d12_mod, "D3D12EnableExperimentalFeatures"); 371bf215546Sopenharmony_ci if (FAILED(D3D12EnableExperimentalFeatures(1, &D3D12ExperimentalShaderModels, NULL, NULL))) { 372bf215546Sopenharmony_ci mesa_loge("failed to enable experimental shader models\n"); 373bf215546Sopenharmony_ci return NULL; 374bf215546Sopenharmony_ci } 375bf215546Sopenharmony_ci } 376bf215546Sopenharmony_ci 377bf215546Sopenharmony_ci D3D12CreateDevice = (PFN_D3D12CREATEDEVICE)util_dl_get_proc_address(d3d12_mod, "D3D12CreateDevice"); 378bf215546Sopenharmony_ci if (!D3D12CreateDevice) { 379bf215546Sopenharmony_ci mesa_loge("failed to load D3D12CreateDevice from D3D12\n"); 380bf215546Sopenharmony_ci return NULL; 381bf215546Sopenharmony_ci } 382bf215546Sopenharmony_ci 383bf215546Sopenharmony_ci ID3D12Device2 *dev; 384bf215546Sopenharmony_ci if (SUCCEEDED(D3D12CreateDevice(adapter, D3D_FEATURE_LEVEL_11_0, 385bf215546Sopenharmony_ci &IID_ID3D12Device2, 386bf215546Sopenharmony_ci (void **)&dev))) 387bf215546Sopenharmony_ci return dev; 388bf215546Sopenharmony_ci 389bf215546Sopenharmony_ci mesa_loge("D3D12CreateDevice failed\n"); 390bf215546Sopenharmony_ci return NULL; 391bf215546Sopenharmony_ci} 392bf215546Sopenharmony_ci 393bf215546Sopenharmony_ciPFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE 394bf215546Sopenharmony_cid3d12_get_serialize_root_sig(void) 395bf215546Sopenharmony_ci{ 396bf215546Sopenharmony_ci struct util_dl_library *d3d12_mod = util_dl_open(UTIL_DL_PREFIX "d3d12" UTIL_DL_EXT); 397bf215546Sopenharmony_ci if (!d3d12_mod) { 398bf215546Sopenharmony_ci mesa_loge("failed to load D3D12\n"); 399bf215546Sopenharmony_ci return NULL; 400bf215546Sopenharmony_ci } 401bf215546Sopenharmony_ci 402bf215546Sopenharmony_ci return (PFN_D3D12_SERIALIZE_VERSIONED_ROOT_SIGNATURE) 403bf215546Sopenharmony_ci util_dl_get_proc_address(d3d12_mod, "D3D12SerializeVersionedRootSignature"); 404bf215546Sopenharmony_ci} 405