summaryrefslogtreecommitdiffstats
path: root/src/shader_recompiler/shader_info.h
blob: 253b6eacf5bafc718f2f069b77c54b7870b4bb51 (plain) (blame)
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
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#pragma once

#include <array>

#include "common/common_types.h"
#include "shader_recompiler/frontend/ir/type.h"

#include <boost/container/small_vector.hpp>
#include <boost/container/static_vector.hpp>

namespace Shader {

enum class TextureType : u32 {
    Color1D,
    ColorArray1D,
    Color2D,
    ColorArray2D,
    Color3D,
    ColorCube,
    ColorArrayCube,
    Buffer,
};
constexpr u32 NUM_TEXTURE_TYPES = 8;

enum class ImageFormat : u32 {
    Typeless,
    R8_UINT,
    R8_SINT,
    R16_UINT,
    R16_SINT,
    R32_UINT,
    R32G32_UINT,
    R32G32B32A32_UINT,
};

enum class Interpolation {
    Smooth,
    Flat,
    NoPerspective,
};

struct InputVarying {
    Interpolation interpolation{Interpolation::Smooth};
    bool used{false};
};

struct ConstantBufferDescriptor {
    u32 index;
    u32 count;
};

struct StorageBufferDescriptor {
    u32 cbuf_index;
    u32 cbuf_offset;
    u32 count;
    bool is_written;
};

struct TextureBufferDescriptor {
    u32 cbuf_index;
    u32 cbuf_offset;
    u32 count;
};
using TextureBufferDescriptors = boost::container::small_vector<TextureBufferDescriptor, 6>;

struct TextureDescriptor {
    TextureType type;
    bool is_depth;
    u32 cbuf_index;
    u32 cbuf_offset;
    u32 count;
};
using TextureDescriptors = boost::container::small_vector<TextureDescriptor, 12>;

struct ImageDescriptor {
    TextureType type;
    ImageFormat format;
    bool is_written;
    u32 cbuf_index;
    u32 cbuf_offset;
    u32 count;
};
using ImageDescriptors = boost::container::small_vector<ImageDescriptor, 4>;

struct Info {
    static constexpr size_t MAX_CBUFS{18};
    static constexpr size_t MAX_SSBOS{16};

    bool uses_workgroup_id{};
    bool uses_local_invocation_id{};
    bool uses_subgroup_invocation_id{};

    std::array<InputVarying, 32> input_generics{};
    bool loads_position{};
    bool loads_instance_id{};
    bool loads_vertex_id{};
    bool loads_front_face{};
    bool loads_point_coord{};
    bool loads_indexed_attributes{};

    std::array<bool, 8> stores_frag_color{};
    bool stores_frag_depth{};
    std::array<bool, 32> stores_generics{};
    bool stores_position{};
    bool stores_point_size{};
    bool stores_clip_distance{};
    bool stores_viewport_index{};
    bool stores_indexed_attributes{};

    bool uses_fp16{};
    bool uses_fp64{};
    bool uses_fp16_denorms_flush{};
    bool uses_fp16_denorms_preserve{};
    bool uses_fp32_denorms_flush{};
    bool uses_fp32_denorms_preserve{};
    bool uses_int8{};
    bool uses_int16{};
    bool uses_int64{};
    bool uses_image_1d{};
    bool uses_sampled_1d{};
    bool uses_sparse_residency{};
    bool uses_demote_to_helper_invocation{};
    bool uses_subgroup_vote{};
    bool uses_subgroup_mask{};
    bool uses_fswzadd{};

    IR::Type used_constant_buffer_types{};

    u32 constant_buffer_mask{};

    boost::container::static_vector<ConstantBufferDescriptor, MAX_CBUFS>
        constant_buffer_descriptors;
    boost::container::static_vector<StorageBufferDescriptor, MAX_SSBOS> storage_buffers_descriptors;
    TextureBufferDescriptors texture_buffer_descriptors;
    TextureDescriptors texture_descriptors;
    ImageDescriptors image_descriptors;
};

} // namespace Shader