summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexLoader_Normal.h
blob: 0b8c10776522e164baf494fdb769e2f686d8552b (plain)
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
142
143
144
145
146
147
148
149
150
// Copyright 2008 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include "Common/CommonTypes.h"
#include "Common/EnumMap.h"
#include "Common/Inline.h"

#include "VideoCommon/CPMemory.h"
#include "VideoCommon/VertexLoader.h"

class VertexLoader_Normal
{
public:
  static DOLPHIN_FORCE_INLINE u32 GetSize(VertexComponentFormat type, ComponentFormat format,
                                          NormalComponentCount elements, bool index3)
  {
    return s_table_size[type][index3][elements][format];
  }

  static TPipelineFunction GetFunction(VertexComponentFormat type, ComponentFormat format,
                                       NormalComponentCount elements, bool index3);

private:
  template <typename T, auto last_member>
  using EnumMap = typename Common::EnumMap<T, last_member>;

  using SizeTable = EnumMap<
      std::array<EnumMap<EnumMap<u32, ComponentFormat::InvalidFloat7>, NormalComponentCount::NTB>,
                 2>,
      VertexComponentFormat::Index16>;

  static constexpr SizeTable s_table_size = []() consteval
  {
    SizeTable table{};

    using VCF = VertexComponentFormat;
    using NCC = NormalComponentCount;
    using FMT = ComponentFormat;

    table[VCF::Direct][false][NCC::N][FMT::UByte] = 3;
    table[VCF::Direct][false][NCC::N][FMT::Byte] = 3;
    table[VCF::Direct][false][NCC::N][FMT::UShort] = 6;
    table[VCF::Direct][false][NCC::N][FMT::Short] = 6;
    table[VCF::Direct][false][NCC::N][FMT::Float] = 12;
    table[VCF::Direct][false][NCC::N][FMT::InvalidFloat5] = 12;
    table[VCF::Direct][false][NCC::N][FMT::InvalidFloat6] = 12;
    table[VCF::Direct][false][NCC::N][FMT::InvalidFloat7] = 12;
    table[VCF::Direct][false][NCC::NTB][FMT::UByte] = 9;
    table[VCF::Direct][false][NCC::NTB][FMT::Byte] = 9;
    table[VCF::Direct][false][NCC::NTB][FMT::UShort] = 18;
    table[VCF::Direct][false][NCC::NTB][FMT::Short] = 18;
    table[VCF::Direct][false][NCC::NTB][FMT::Float] = 36;
    table[VCF::Direct][false][NCC::NTB][FMT::InvalidFloat5] = 36;
    table[VCF::Direct][false][NCC::NTB][FMT::InvalidFloat6] = 36;
    table[VCF::Direct][false][NCC::NTB][FMT::InvalidFloat7] = 36;

    // Same as above, since there are no indices
    table[VCF::Direct][true][NCC::N][FMT::UByte] = 3;
    table[VCF::Direct][true][NCC::N][FMT::Byte] = 3;
    table[VCF::Direct][true][NCC::N][FMT::UShort] = 6;
    table[VCF::Direct][true][NCC::N][FMT::Short] = 6;
    table[VCF::Direct][true][NCC::N][FMT::Float] = 12;
    table[VCF::Direct][true][NCC::N][FMT::InvalidFloat5] = 12;
    table[VCF::Direct][true][NCC::N][FMT::InvalidFloat6] = 12;
    table[VCF::Direct][true][NCC::N][FMT::InvalidFloat7] = 12;
    table[VCF::Direct][true][NCC::NTB][FMT::UByte] = 9;
    table[VCF::Direct][true][NCC::NTB][FMT::Byte] = 9;
    table[VCF::Direct][true][NCC::NTB][FMT::UShort] = 18;
    table[VCF::Direct][true][NCC::NTB][FMT::Short] = 18;
    table[VCF::Direct][true][NCC::NTB][FMT::Float] = 36;
    table[VCF::Direct][true][NCC::NTB][FMT::InvalidFloat5] = 36;
    table[VCF::Direct][true][NCC::NTB][FMT::InvalidFloat6] = 36;
    table[VCF::Direct][true][NCC::NTB][FMT::InvalidFloat7] = 36;

    table[VCF::Index8][false][NCC::N][FMT::UByte] = 1;
    table[VCF::Index8][false][NCC::N][FMT::Byte] = 1;
    table[VCF::Index8][false][NCC::N][FMT::UShort] = 1;
    table[VCF::Index8][false][NCC::N][FMT::Short] = 1;
    table[VCF::Index8][false][NCC::N][FMT::Float] = 1;
    table[VCF::Index8][false][NCC::N][FMT::InvalidFloat5] = 1;
    table[VCF::Index8][false][NCC::N][FMT::InvalidFloat6] = 1;
    table[VCF::Index8][false][NCC::N][FMT::InvalidFloat7] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::UByte] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::Byte] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::UShort] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::Short] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::Float] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::InvalidFloat5] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::InvalidFloat6] = 1;
    table[VCF::Index8][false][NCC::NTB][FMT::InvalidFloat7] = 1;

    // Same for NormalComponentCount::N; differs for NTB
    table[VCF::Index8][true][NCC::N][FMT::UByte] = 1;
    table[VCF::Index8][true][NCC::N][FMT::Byte] = 1;
    table[VCF::Index8][true][NCC::N][FMT::UShort] = 1;
    table[VCF::Index8][true][NCC::N][FMT::Short] = 1;
    table[VCF::Index8][true][NCC::N][FMT::Float] = 1;
    table[VCF::Index8][true][NCC::N][FMT::InvalidFloat5] = 1;
    table[VCF::Index8][true][NCC::N][FMT::InvalidFloat6] = 1;
    table[VCF::Index8][true][NCC::N][FMT::InvalidFloat7] = 1;
    table[VCF::Index8][true][NCC::NTB][FMT::UByte] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::Byte] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::UShort] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::Short] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::Float] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::InvalidFloat5] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::InvalidFloat6] = 3;
    table[VCF::Index8][true][NCC::NTB][FMT::InvalidFloat7] = 3;

    table[VCF::Index16][false][NCC::N][FMT::UByte] = 2;
    table[VCF::Index16][false][NCC::N][FMT::Byte] = 2;
    table[VCF::Index16][false][NCC::N][FMT::UShort] = 2;
    table[VCF::Index16][false][NCC::N][FMT::Short] = 2;
    table[VCF::Index16][false][NCC::N][FMT::Float] = 2;
    table[VCF::Index16][false][NCC::N][FMT::InvalidFloat5] = 2;
    table[VCF::Index16][false][NCC::N][FMT::InvalidFloat6] = 2;
    table[VCF::Index16][false][NCC::N][FMT::InvalidFloat7] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::UByte] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::Byte] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::UShort] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::Short] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::Float] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::InvalidFloat5] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::InvalidFloat6] = 2;
    table[VCF::Index16][false][NCC::NTB][FMT::InvalidFloat7] = 2;

    // Same for NormalComponentCount::N; differs for NTB
    table[VCF::Index16][true][NCC::N][FMT::UByte] = 2;
    table[VCF::Index16][true][NCC::N][FMT::Byte] = 2;
    table[VCF::Index16][true][NCC::N][FMT::UShort] = 2;
    table[VCF::Index16][true][NCC::N][FMT::Short] = 2;
    table[VCF::Index16][true][NCC::N][FMT::Float] = 2;
    table[VCF::Index16][true][NCC::N][FMT::InvalidFloat5] = 2;
    table[VCF::Index16][true][NCC::N][FMT::InvalidFloat6] = 2;
    table[VCF::Index16][true][NCC::N][FMT::InvalidFloat7] = 2;
    table[VCF::Index16][true][NCC::NTB][FMT::UByte] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::Byte] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::UShort] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::Short] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::Float] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::InvalidFloat5] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::InvalidFloat6] = 6;
    table[VCF::Index16][true][NCC::NTB][FMT::InvalidFloat7] = 6;

    return table;
  }
  ();
};