summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp')
-rw-r--r--Source/Core/VideoBackends/D3D/D3DNativeVertexFormat.cpp118
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);