diff options
| author | JMC47 <JMC4789@gmail.com> | 2021-12-20 14:27:14 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-20 14:27:14 -0500 |
| commit | 32fed91b0d35f06c46281f55c9f0fa4694c5334a (patch) | |
| tree | 6e47451f525329e5ba57fc615c491b0ca06088d8 /Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp | |
| parent | 1714dc64bb1cc01aee9d9b52763f20aa6a44a674 (diff) | |
| parent | ffa512f5e7d24d9d9e93366bb596b9473d26d61b (diff) | |
Merge pull request #9718 from Pokechu22/better-fifo-analyzer-part-3
Fifo analyzer improvements, part 3
Diffstat (limited to 'Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp | 118 |
1 files changed, 70 insertions, 48 deletions
diff --git a/Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp b/Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp index 80a59b57b3..8f7d9cad12 100644 --- a/Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp +++ b/Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp @@ -3,6 +3,8 @@ #include <array> +#include "Common/EnumMap.h" + #include "VideoBackends/D3D/D3DBase.h" #include "VideoBackends/D3D/D3DRender.h" #include "VideoBackends/D3D/D3DState.h" @@ -20,55 +22,75 @@ Renderer::CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl) return std::make_unique<D3DVertexFormat>(vtx_decl); } -static const DXGI_FORMAT d3d_format_lookup[5 * 4 * 2] = { - // float formats - DXGI_FORMAT_R8_UNORM, - DXGI_FORMAT_R8_SNORM, - DXGI_FORMAT_R16_UNORM, - DXGI_FORMAT_R16_SNORM, - DXGI_FORMAT_R32_FLOAT, - DXGI_FORMAT_R8G8_UNORM, - DXGI_FORMAT_R8G8_SNORM, - DXGI_FORMAT_R16G16_UNORM, - DXGI_FORMAT_R16G16_SNORM, - DXGI_FORMAT_R32G32_FLOAT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R32G32B32_FLOAT, - DXGI_FORMAT_R8G8B8A8_UNORM, - DXGI_FORMAT_R8G8B8A8_SNORM, - DXGI_FORMAT_R16G16B16A16_UNORM, - DXGI_FORMAT_R16G16B16A16_SNORM, - DXGI_FORMAT_R32G32B32A32_FLOAT, - - // integer formats - DXGI_FORMAT_R8_UINT, - DXGI_FORMAT_R8_SINT, - DXGI_FORMAT_R16_UINT, - DXGI_FORMAT_R16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8_UINT, - DXGI_FORMAT_R8G8_SINT, - DXGI_FORMAT_R16G16_UINT, - DXGI_FORMAT_R16G16_SINT, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_UNKNOWN, - DXGI_FORMAT_R8G8B8A8_UINT, - DXGI_FORMAT_R8G8B8A8_SINT, - DXGI_FORMAT_R16G16B16A16_UINT, - DXGI_FORMAT_R16G16B16A16_SINT, - DXGI_FORMAT_UNKNOWN, -}; - -DXGI_FORMAT VarToD3D(VarType t, int size, bool integer) +DXGI_FORMAT VarToD3D(ComponentFormat t, int size, bool integer) { - DXGI_FORMAT retval = d3d_format_lookup[(int)t + 5 * (size - 1) + 5 * 4 * (int)integer]; + using FormatMap = Common::EnumMap<DXGI_FORMAT, ComponentFormat::Float>; + static constexpr auto f = [](FormatMap a) { return a; }; // Deduction helper + + static constexpr std::array<FormatMap, 4> d3d_float_format_lookup = { + f({ + DXGI_FORMAT_R8_UNORM, + DXGI_FORMAT_R8_SNORM, + DXGI_FORMAT_R16_UNORM, + DXGI_FORMAT_R16_SNORM, + DXGI_FORMAT_R32_FLOAT, + }), + f({ + DXGI_FORMAT_R8G8_UNORM, + DXGI_FORMAT_R8G8_SNORM, + DXGI_FORMAT_R16G16_UNORM, + DXGI_FORMAT_R16G16_SNORM, + DXGI_FORMAT_R32G32_FLOAT, + }), + f({ + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_R32G32B32_FLOAT, + }), + f({ + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_FORMAT_R8G8B8A8_SNORM, + DXGI_FORMAT_R16G16B16A16_UNORM, + DXGI_FORMAT_R16G16B16A16_SNORM, + DXGI_FORMAT_R32G32B32A32_FLOAT, + }), + }; + + static constexpr std::array<FormatMap, 4> d3d_integer_format_lookup = { + f({ + DXGI_FORMAT_R8_UINT, + DXGI_FORMAT_R8_SINT, + DXGI_FORMAT_R16_UINT, + DXGI_FORMAT_R16_SINT, + DXGI_FORMAT_UNKNOWN, + }), + f({ + DXGI_FORMAT_R8G8_UINT, + DXGI_FORMAT_R8G8_SINT, + DXGI_FORMAT_R16G16_UINT, + DXGI_FORMAT_R16G16_SINT, + DXGI_FORMAT_UNKNOWN, + }), + f({ + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + DXGI_FORMAT_UNKNOWN, + }), + f({ + DXGI_FORMAT_R8G8B8A8_UINT, + DXGI_FORMAT_R8G8B8A8_SINT, + DXGI_FORMAT_R16G16B16A16_UINT, + DXGI_FORMAT_R16G16B16A16_SINT, + DXGI_FORMAT_UNKNOWN, + }), + }; + + DXGI_FORMAT retval = + integer ? d3d_integer_format_lookup[size - 1][t] : d3d_float_format_lookup[size - 1][t]; if (retval == DXGI_FORMAT_UNKNOWN) { PanicAlertFmt("VarToD3D: Invalid type/size combo {}, {}, {}", t, size, integer); |
