diff options
| author | 2021-03-19 19:28:31 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:23 -0400 | |
| commit | 260743f371236f7c57b01334b1c3474b15a47c39 (patch) | |
| tree | 312d89fa8215199ef5f7ec1fc84b025df526e107 /src/shader_recompiler/program_header.h | |
| parent | shader: Implement DADD (diff) | |
| download | yuzu-260743f371236f7c57b01334b1c3474b15a47c39.tar.gz yuzu-260743f371236f7c57b01334b1c3474b15a47c39.tar.xz yuzu-260743f371236f7c57b01334b1c3474b15a47c39.zip | |
shader: Add partial rasterizer integration
Diffstat (limited to 'src/shader_recompiler/program_header.h')
| -rw-r--r-- | src/shader_recompiler/program_header.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/shader_recompiler/program_header.h b/src/shader_recompiler/program_header.h new file mode 100644 index 000000000..1544bfa42 --- /dev/null +++ b/src/shader_recompiler/program_header.h | |||
| @@ -0,0 +1,143 @@ | |||
| 1 | // Copyright 2018 yuzu Emulator Project | ||
| 2 | // Licensed under GPLv2 or any later version | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | #include <array> | ||
| 8 | #include <optional> | ||
| 9 | |||
| 10 | #include "common/bit_field.h" | ||
| 11 | #include "common/common_funcs.h" | ||
| 12 | #include "common/common_types.h" | ||
| 13 | |||
| 14 | namespace Shader { | ||
| 15 | |||
| 16 | enum class OutputTopology : u32 { | ||
| 17 | PointList = 1, | ||
| 18 | LineStrip = 6, | ||
| 19 | TriangleStrip = 7, | ||
| 20 | }; | ||
| 21 | |||
| 22 | enum class PixelImap : u8 { | ||
| 23 | Unused = 0, | ||
| 24 | Constant = 1, | ||
| 25 | Perspective = 2, | ||
| 26 | ScreenLinear = 3, | ||
| 27 | }; | ||
| 28 | |||
| 29 | // Documentation in: | ||
| 30 | // http://download.nvidia.com/open-gpu-doc/Shader-Program-Header/1/Shader-Program-Header.html | ||
| 31 | struct ProgramHeader { | ||
| 32 | union { | ||
| 33 | BitField<0, 5, u32> sph_type; | ||
| 34 | BitField<5, 5, u32> version; | ||
| 35 | BitField<10, 4, u32> shader_type; | ||
| 36 | BitField<14, 1, u32> mrt_enable; | ||
| 37 | BitField<15, 1, u32> kills_pixels; | ||
| 38 | BitField<16, 1, u32> does_global_store; | ||
| 39 | BitField<17, 4, u32> sass_version; | ||
| 40 | BitField<21, 5, u32> reserved; | ||
| 41 | BitField<26, 1, u32> does_load_or_store; | ||
| 42 | BitField<27, 1, u32> does_fp64; | ||
| 43 | BitField<28, 4, u32> stream_out_mask; | ||
| 44 | } common0; | ||
| 45 | |||
| 46 | union { | ||
| 47 | BitField<0, 24, u32> shader_local_memory_low_size; | ||
| 48 | BitField<24, 8, u32> per_patch_attribute_count; | ||
| 49 | } common1; | ||
| 50 | |||
| 51 | union { | ||
| 52 | BitField<0, 24, u32> shader_local_memory_high_size; | ||
| 53 | BitField<24, 8, u32> threads_per_input_primitive; | ||
| 54 | } common2; | ||
| 55 | |||
| 56 | union { | ||
| 57 | BitField<0, 24, u32> shader_local_memory_crs_size; | ||
| 58 | BitField<24, 4, OutputTopology> output_topology; | ||
| 59 | BitField<28, 4, u32> reserved; | ||
| 60 | } common3; | ||
| 61 | |||
| 62 | union { | ||
| 63 | BitField<0, 12, u32> max_output_vertices; | ||
| 64 | BitField<12, 8, u32> store_req_start; // NOTE: not used by geometry shaders. | ||
| 65 | BitField<20, 4, u32> reserved; | ||
| 66 | BitField<24, 8, u32> store_req_end; // NOTE: not used by geometry shaders. | ||
| 67 | } common4; | ||
| 68 | |||
| 69 | union { | ||
| 70 | struct { | ||
| 71 | INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA | ||
| 72 | INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB | ||
| 73 | INSERT_PADDING_BYTES_NOINIT(16); // ImapGenericVector[32] | ||
| 74 | INSERT_PADDING_BYTES_NOINIT(2); // ImapColor | ||
| 75 | union { | ||
| 76 | BitField<0, 8, u16> clip_distances; | ||
| 77 | BitField<8, 1, u16> point_sprite_s; | ||
| 78 | BitField<9, 1, u16> point_sprite_t; | ||
| 79 | BitField<10, 1, u16> fog_coordinate; | ||
| 80 | BitField<12, 1, u16> tessellation_eval_point_u; | ||
| 81 | BitField<13, 1, u16> tessellation_eval_point_v; | ||
| 82 | BitField<14, 1, u16> instance_id; | ||
| 83 | BitField<15, 1, u16> vertex_id; | ||
| 84 | }; | ||
| 85 | INSERT_PADDING_BYTES_NOINIT(5); // ImapFixedFncTexture[10] | ||
| 86 | INSERT_PADDING_BYTES_NOINIT(1); // ImapReserved | ||
| 87 | INSERT_PADDING_BYTES_NOINIT(3); // OmapSystemValuesA | ||
| 88 | INSERT_PADDING_BYTES_NOINIT(1); // OmapSystemValuesB | ||
| 89 | INSERT_PADDING_BYTES_NOINIT(16); // OmapGenericVector[32] | ||
| 90 | INSERT_PADDING_BYTES_NOINIT(2); // OmapColor | ||
| 91 | INSERT_PADDING_BYTES_NOINIT(2); // OmapSystemValuesC | ||
| 92 | INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10] | ||
| 93 | INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved | ||
| 94 | } vtg; | ||
| 95 | |||
| 96 | struct { | ||
| 97 | INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA | ||
| 98 | INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB | ||
| 99 | |||
| 100 | union { | ||
| 101 | BitField<0, 2, PixelImap> x; | ||
| 102 | BitField<2, 2, PixelImap> y; | ||
| 103 | BitField<4, 2, PixelImap> z; | ||
| 104 | BitField<6, 2, PixelImap> w; | ||
| 105 | u8 raw; | ||
| 106 | } imap_generic_vector[32]; | ||
| 107 | |||
| 108 | INSERT_PADDING_BYTES_NOINIT(2); // ImapColor | ||
| 109 | INSERT_PADDING_BYTES_NOINIT(2); // ImapSystemValuesC | ||
| 110 | INSERT_PADDING_BYTES_NOINIT(10); // ImapFixedFncTexture[10] | ||
| 111 | INSERT_PADDING_BYTES_NOINIT(2); // ImapReserved | ||
| 112 | |||
| 113 | struct { | ||
| 114 | u32 target; | ||
| 115 | union { | ||
| 116 | BitField<0, 1, u32> sample_mask; | ||
| 117 | BitField<1, 1, u32> depth; | ||
| 118 | BitField<2, 30, u32> reserved; | ||
| 119 | }; | ||
| 120 | } omap; | ||
| 121 | |||
| 122 | [[nodiscard]] std::array<bool, 4> EnabledOutputComponents(u32 rt) const noexcept { | ||
| 123 | const u32 bits{omap.target >> (rt * 4)}; | ||
| 124 | return {(bits & 1) != 0, (bits & 2) != 0, (bits & 4) != 0, (bits & 8) != 0}; | ||
| 125 | } | ||
| 126 | |||
| 127 | [[nodiscard]] std::array<PixelImap, 4> GenericInputMap(u32 attribute) const { | ||
| 128 | const auto& vector{imap_generic_vector[attribute]}; | ||
| 129 | return {vector.x, vector.y, vector.z, vector.w}; | ||
| 130 | } | ||
| 131 | } ps; | ||
| 132 | |||
| 133 | std::array<u32, 0xf> raw; | ||
| 134 | }; | ||
| 135 | |||
| 136 | [[nodiscard]] u64 LocalMemorySize() const noexcept { | ||
| 137 | return (common1.shader_local_memory_low_size | | ||
| 138 | (common2.shader_local_memory_high_size << 24)); | ||
| 139 | } | ||
| 140 | }; | ||
| 141 | static_assert(sizeof(ProgramHeader) == 0x50, "Incorrect structure size"); | ||
| 142 | |||
| 143 | } // namespace Shader | ||