forked from doitsujin/dxvk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathd3d11_util.cpp
141 lines (109 loc) · 4.9 KB
/
d3d11_util.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include "d3d11_util.h"
namespace dxvk {
HRESULT DecodeSampleCount(UINT Count, VkSampleCountFlagBits* pCount) {
VkSampleCountFlagBits flag;
switch (Count) {
case 1: flag = VK_SAMPLE_COUNT_1_BIT; break;
case 2: flag = VK_SAMPLE_COUNT_2_BIT; break;
case 4: flag = VK_SAMPLE_COUNT_4_BIT; break;
case 8: flag = VK_SAMPLE_COUNT_8_BIT; break;
case 16: flag = VK_SAMPLE_COUNT_16_BIT; break;
default: return E_INVALIDARG;
}
if (pCount != nullptr) {
*pCount = flag;
return S_OK;
} return S_FALSE;
}
VkSamplerAddressMode DecodeAddressMode(
D3D11_TEXTURE_ADDRESS_MODE mode) {
switch (mode) {
case D3D11_TEXTURE_ADDRESS_WRAP:
return VK_SAMPLER_ADDRESS_MODE_REPEAT;
case D3D11_TEXTURE_ADDRESS_MIRROR:
return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
case D3D11_TEXTURE_ADDRESS_CLAMP:
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
case D3D11_TEXTURE_ADDRESS_BORDER:
return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
case D3D11_TEXTURE_ADDRESS_MIRROR_ONCE:
return VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE;
default:
Logger::err(str::format("D3D11: Unsupported address mode: ", mode));
return VK_SAMPLER_ADDRESS_MODE_REPEAT;
}
}
VkCompareOp DecodeCompareOp(D3D11_COMPARISON_FUNC Mode) {
switch (Mode) {
case D3D11_COMPARISON_NEVER: return VK_COMPARE_OP_NEVER;
case D3D11_COMPARISON_LESS: return VK_COMPARE_OP_LESS;
case D3D11_COMPARISON_EQUAL: return VK_COMPARE_OP_EQUAL;
case D3D11_COMPARISON_LESS_EQUAL: return VK_COMPARE_OP_LESS_OR_EQUAL;
case D3D11_COMPARISON_GREATER: return VK_COMPARE_OP_GREATER;
case D3D11_COMPARISON_NOT_EQUAL: return VK_COMPARE_OP_NOT_EQUAL;
case D3D11_COMPARISON_GREATER_EQUAL: return VK_COMPARE_OP_GREATER_OR_EQUAL;
case D3D11_COMPARISON_ALWAYS: return VK_COMPARE_OP_ALWAYS;
}
if (Mode != 0) // prevent log spamming when apps use ZeroMemory
Logger::err(str::format("D3D11: Unsupported compare op: ", Mode));
return VK_COMPARE_OP_NEVER;
}
VkConservativeRasterizationModeEXT DecodeConservativeRasterizationMode(
D3D11_CONSERVATIVE_RASTERIZATION_MODE Mode) {
switch (Mode) {
case D3D11_CONSERVATIVE_RASTERIZATION_MODE_OFF:
return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
case D3D11_CONSERVATIVE_RASTERIZATION_MODE_ON:
return VK_CONSERVATIVE_RASTERIZATION_MODE_OVERESTIMATE_EXT;
}
Logger::err(str::format("D3D11: Unsupported conservative raster mode: ", Mode));
return VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT;
}
VkShaderStageFlagBits GetShaderStage(DxbcProgramType ProgramType) {
switch (ProgramType) {
case DxbcProgramType::VertexShader: return VK_SHADER_STAGE_VERTEX_BIT;
case DxbcProgramType::HullShader: return VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
case DxbcProgramType::DomainShader: return VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
case DxbcProgramType::GeometryShader: return VK_SHADER_STAGE_GEOMETRY_BIT;
case DxbcProgramType::PixelShader: return VK_SHADER_STAGE_FRAGMENT_BIT;
case DxbcProgramType::ComputeShader: return VK_SHADER_STAGE_COMPUTE_BIT;
default: return VkShaderStageFlagBits(0);
}
}
VkFormatFeatureFlags GetBufferFormatFeatures(UINT BindFlags) {
VkFormatFeatureFlags features = 0;
if (BindFlags & D3D11_BIND_SHADER_RESOURCE)
features |= VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT;
if (BindFlags & D3D11_BIND_UNORDERED_ACCESS)
features |= VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT;
return features;
}
VkFormatFeatureFlags GetImageFormatFeatures(UINT BindFlags) {
VkFormatFeatureFlags features = 0;
if (BindFlags & D3D11_BIND_DEPTH_STENCIL)
features |= VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
if (BindFlags & D3D11_BIND_RENDER_TARGET)
features |= VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT;
if (BindFlags & D3D11_BIND_SHADER_RESOURCE)
features |= VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
if (BindFlags & D3D11_BIND_UNORDERED_ACCESS)
features |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
return features;
}
VkFormat GetPackedDepthStencilFormat(DXGI_FORMAT Format) {
switch (Format) {
case DXGI_FORMAT_R24G8_TYPELESS:
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
case DXGI_FORMAT_D24_UNORM_S8_UINT:
return VK_FORMAT_D24_UNORM_S8_UINT;
case DXGI_FORMAT_R32G8X24_TYPELESS:
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
return VK_FORMAT_D32_SFLOAT_S8_UINT;
default:
return VK_FORMAT_UNDEFINED;
}
}
}