| 
									
										
										
										
											2022-04-23 04:59:50 -04:00
										 |  |  | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
 | 
					
						
							|  |  |  | // SPDX-License-Identifier: GPL-2.0-or-later
 | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <array>
 | 
					
						
							| 
									
										
										
										
											2021-05-02 01:50:27 +02:00
										 |  |  | #include <bitset>
 | 
					
						
							| 
									
										
										
										
											2022-09-10 17:09:45 +08:00
										 |  |  | #include <map>
 | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  | #include "common/common_types.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-09 17:14:57 -03:00
										 |  |  | #include "shader_recompiler/frontend/ir/type.h"
 | 
					
						
							| 
									
										
										
										
											2021-06-24 02:41:09 -03:00
										 |  |  | #include "shader_recompiler/varying_state.h"
 | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | #include <boost/container/small_vector.hpp>
 | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | #include <boost/container/static_vector.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Shader { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | enum class TextureType : u32 { | 
					
						
							|  |  |  |     Color1D, | 
					
						
							|  |  |  |     ColorArray1D, | 
					
						
							|  |  |  |     Color2D, | 
					
						
							|  |  |  |     ColorArray2D, | 
					
						
							|  |  |  |     Color3D, | 
					
						
							|  |  |  |     ColorCube, | 
					
						
							|  |  |  |     ColorArrayCube, | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  |     Buffer, | 
					
						
							| 
									
										
										
										
											2022-08-10 10:10:32 +08:00
										 |  |  |     Color2DRect, | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2022-08-10 10:10:32 +08:00
										 |  |  | constexpr u32 NUM_TEXTURE_TYPES = 9; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-04 14:39:42 +08:00
										 |  |  | enum class TexturePixelFormat : u32 { | 
					
						
							|  |  |  |     A8B8G8R8_SNORM, | 
					
						
							|  |  |  |     R8_SNORM, | 
					
						
							|  |  |  |     R8G8_SNORM, | 
					
						
							|  |  |  |     R16G16B16A16_SNORM, | 
					
						
							|  |  |  |     R16G16_SNORM, | 
					
						
							|  |  |  |     R16_SNORM, | 
					
						
							|  |  |  |     OTHER | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | enum class ImageFormat : u32 { | 
					
						
							|  |  |  |     Typeless, | 
					
						
							|  |  |  |     R8_UINT, | 
					
						
							|  |  |  |     R8_SINT, | 
					
						
							|  |  |  |     R16_UINT, | 
					
						
							|  |  |  |     R16_SINT, | 
					
						
							|  |  |  |     R32_UINT, | 
					
						
							|  |  |  |     R32G32_UINT, | 
					
						
							|  |  |  |     R32G32B32A32_UINT, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-27 04:59:58 -03:00
										 |  |  | enum class Interpolation { | 
					
						
							|  |  |  |     Smooth, | 
					
						
							|  |  |  |     Flat, | 
					
						
							|  |  |  |     NoPerspective, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | struct ConstantBufferDescriptor { | 
					
						
							|  |  |  |     u32 index; | 
					
						
							|  |  |  |     u32 count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct StorageBufferDescriptor { | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  |     u32 cbuf_index; | 
					
						
							|  |  |  |     u32 cbuf_offset; | 
					
						
							|  |  |  |     u32 count; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  |     bool is_written; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  | struct TextureBufferDescriptor { | 
					
						
							| 
									
										
										
										
											2021-04-20 19:48:45 -03:00
										 |  |  |     bool has_secondary; | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  |     u32 cbuf_index; | 
					
						
							|  |  |  |     u32 cbuf_offset; | 
					
						
							| 
									
										
										
										
											2022-03-06 19:54:40 +01:00
										 |  |  |     u32 shift_left; | 
					
						
							| 
									
										
										
										
											2021-04-20 19:48:45 -03:00
										 |  |  |     u32 secondary_cbuf_index; | 
					
						
							|  |  |  |     u32 secondary_cbuf_offset; | 
					
						
							| 
									
										
										
										
											2022-03-06 19:54:40 +01:00
										 |  |  |     u32 secondary_shift_left; | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  |     u32 count; | 
					
						
							| 
									
										
										
										
											2021-04-22 16:17:59 -03:00
										 |  |  |     u32 size_shift; | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | using TextureBufferDescriptors = boost::container::small_vector<TextureBufferDescriptor, 6>; | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-14 21:36:36 -03:00
										 |  |  | struct ImageBufferDescriptor { | 
					
						
							|  |  |  |     ImageFormat format; | 
					
						
							|  |  |  |     bool is_written; | 
					
						
							| 
									
										
										
										
											2021-06-15 17:23:57 -04:00
										 |  |  |     bool is_read; | 
					
						
							| 
									
										
										
										
											2021-04-14 21:36:36 -03:00
										 |  |  |     u32 cbuf_index; | 
					
						
							|  |  |  |     u32 cbuf_offset; | 
					
						
							|  |  |  |     u32 count; | 
					
						
							| 
									
										
										
										
											2021-04-22 16:17:59 -03:00
										 |  |  |     u32 size_shift; | 
					
						
							| 
									
										
										
										
											2021-04-14 21:36:36 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | using ImageBufferDescriptors = boost::container::small_vector<ImageBufferDescriptor, 2>; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | struct TextureDescriptor { | 
					
						
							|  |  |  |     TextureType type; | 
					
						
							|  |  |  |     bool is_depth; | 
					
						
							| 
									
										
										
										
											2021-04-20 19:48:45 -03:00
										 |  |  |     bool has_secondary; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  |     u32 cbuf_index; | 
					
						
							|  |  |  |     u32 cbuf_offset; | 
					
						
							| 
									
										
										
										
											2022-03-06 19:54:40 +01:00
										 |  |  |     u32 shift_left; | 
					
						
							| 
									
										
										
										
											2021-04-20 19:48:45 -03:00
										 |  |  |     u32 secondary_cbuf_index; | 
					
						
							|  |  |  |     u32 secondary_cbuf_offset; | 
					
						
							| 
									
										
										
										
											2022-03-06 19:54:40 +01:00
										 |  |  |     u32 secondary_shift_left; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  |     u32 count; | 
					
						
							| 
									
										
										
										
											2021-04-22 16:17:59 -03:00
										 |  |  |     u32 size_shift; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | using TextureDescriptors = boost::container::small_vector<TextureDescriptor, 12>; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | struct ImageDescriptor { | 
					
						
							|  |  |  |     TextureType type; | 
					
						
							|  |  |  |     ImageFormat format; | 
					
						
							|  |  |  |     bool is_written; | 
					
						
							| 
									
										
										
										
											2021-06-15 17:23:57 -04:00
										 |  |  |     bool is_read; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  |     u32 cbuf_index; | 
					
						
							|  |  |  |     u32 cbuf_offset; | 
					
						
							|  |  |  |     u32 count; | 
					
						
							| 
									
										
										
										
											2021-04-22 16:17:59 -03:00
										 |  |  |     u32 size_shift; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  | using ImageDescriptors = boost::container::small_vector<ImageDescriptor, 4>; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | struct Info { | 
					
						
							| 
									
										
										
										
											2022-04-04 16:44:01 -04:00
										 |  |  |     static constexpr size_t MAX_INDIRECT_CBUFS{14}; | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  |     static constexpr size_t MAX_CBUFS{18}; | 
					
						
							| 
									
										
										
										
											2021-04-22 20:32:38 -03:00
										 |  |  |     static constexpr size_t MAX_SSBOS{32}; | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool uses_workgroup_id{}; | 
					
						
							|  |  |  |     bool uses_local_invocation_id{}; | 
					
						
							| 
									
										
										
										
											2021-04-15 22:46:11 -03:00
										 |  |  |     bool uses_invocation_id{}; | 
					
						
							| 
									
										
										
										
											2021-04-16 17:22:59 -03:00
										 |  |  |     bool uses_sample_id{}; | 
					
						
							| 
									
										
										
										
											2021-04-11 19:16:12 -03:00
										 |  |  |     bool uses_is_helper_invocation{}; | 
					
						
							| 
									
										
										
										
											2021-03-25 11:31:37 -04:00
										 |  |  |     bool uses_subgroup_invocation_id{}; | 
					
						
							| 
									
										
										
										
											2021-05-10 18:21:28 -03:00
										 |  |  |     bool uses_subgroup_shuffles{}; | 
					
						
							| 
									
										
										
										
											2021-04-15 22:46:11 -03:00
										 |  |  |     std::array<bool, 30> uses_patches{}; | 
					
						
							| 
									
										
										
										
											2021-03-19 19:28:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-24 02:41:09 -03:00
										 |  |  |     std::array<Interpolation, 32> interpolation{}; | 
					
						
							|  |  |  |     VaryingState loads; | 
					
						
							|  |  |  |     VaryingState stores; | 
					
						
							|  |  |  |     VaryingState passthrough; | 
					
						
							| 
									
										
										
										
											2021-05-31 04:19:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-10 17:09:45 +08:00
										 |  |  |     std::map<IR::Attribute, IR::Attribute> legacy_stores_mapping; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 06:47:14 +02:00
										 |  |  |     bool loads_indexed_attributes{}; | 
					
						
							| 
									
										
										
										
											2021-03-19 19:28:31 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     std::array<bool, 8> stores_frag_color{}; | 
					
						
							| 
									
										
										
										
											2021-04-16 18:47:26 -03:00
										 |  |  |     bool stores_sample_mask{}; | 
					
						
							| 
									
										
										
										
											2021-03-19 19:28:31 -03:00
										 |  |  |     bool stores_frag_depth{}; | 
					
						
							| 
									
										
										
										
											2021-05-31 04:19:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-15 22:46:11 -03:00
										 |  |  |     bool stores_tess_level_outer{}; | 
					
						
							|  |  |  |     bool stores_tess_level_inner{}; | 
					
						
							| 
									
										
										
										
											2021-05-31 04:19:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 06:47:14 +02:00
										 |  |  |     bool stores_indexed_attributes{}; | 
					
						
							| 
									
										
										
										
											2021-05-31 04:19:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-02 01:50:27 +02:00
										 |  |  |     bool stores_global_memory{}; | 
					
						
							| 
									
										
										
										
											2021-03-19 19:28:31 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  |     bool uses_fp16{}; | 
					
						
							|  |  |  |     bool uses_fp64{}; | 
					
						
							| 
									
										
										
										
											2021-02-20 03:30:13 -03:00
										 |  |  |     bool uses_fp16_denorms_flush{}; | 
					
						
							|  |  |  |     bool uses_fp16_denorms_preserve{}; | 
					
						
							|  |  |  |     bool uses_fp32_denorms_flush{}; | 
					
						
							|  |  |  |     bool uses_fp32_denorms_preserve{}; | 
					
						
							| 
									
										
										
										
											2021-03-09 17:14:57 -03:00
										 |  |  |     bool uses_int8{}; | 
					
						
							|  |  |  |     bool uses_int16{}; | 
					
						
							|  |  |  |     bool uses_int64{}; | 
					
						
							| 
									
										
										
										
											2021-03-08 18:31:53 -03:00
										 |  |  |     bool uses_image_1d{}; | 
					
						
							|  |  |  |     bool uses_sampled_1d{}; | 
					
						
							|  |  |  |     bool uses_sparse_residency{}; | 
					
						
							| 
									
										
										
										
											2021-03-19 19:28:31 -03:00
										 |  |  |     bool uses_demote_to_helper_invocation{}; | 
					
						
							| 
									
										
										
										
											2021-03-23 20:27:17 -04:00
										 |  |  |     bool uses_subgroup_vote{}; | 
					
						
							| 
									
										
										
										
											2021-04-04 05:17:17 -03:00
										 |  |  |     bool uses_subgroup_mask{}; | 
					
						
							| 
									
										
										
										
											2021-03-28 22:23:45 -04:00
										 |  |  |     bool uses_fswzadd{}; | 
					
						
							| 
									
										
										
										
											2021-04-18 09:07:48 +02:00
										 |  |  |     bool uses_derivatives{}; | 
					
						
							| 
									
										
										
										
											2021-04-11 02:37:03 -03:00
										 |  |  |     bool uses_typeless_image_reads{}; | 
					
						
							| 
									
										
										
										
											2021-04-11 21:02:44 -03:00
										 |  |  |     bool uses_typeless_image_writes{}; | 
					
						
							| 
									
										
										
										
											2021-04-23 17:47:54 -04:00
										 |  |  |     bool uses_image_buffers{}; | 
					
						
							| 
									
										
										
										
											2021-04-11 02:07:02 -04:00
										 |  |  |     bool uses_shared_increment{}; | 
					
						
							|  |  |  |     bool uses_shared_decrement{}; | 
					
						
							|  |  |  |     bool uses_global_increment{}; | 
					
						
							|  |  |  |     bool uses_global_decrement{}; | 
					
						
							|  |  |  |     bool uses_atomic_f32_add{}; | 
					
						
							|  |  |  |     bool uses_atomic_f16x2_add{}; | 
					
						
							|  |  |  |     bool uses_atomic_f16x2_min{}; | 
					
						
							|  |  |  |     bool uses_atomic_f16x2_max{}; | 
					
						
							|  |  |  |     bool uses_atomic_f32x2_add{}; | 
					
						
							|  |  |  |     bool uses_atomic_f32x2_min{}; | 
					
						
							|  |  |  |     bool uses_atomic_f32x2_max{}; | 
					
						
							| 
									
										
										
										
											2021-05-25 22:13:50 -04:00
										 |  |  |     bool uses_atomic_s32_min{}; | 
					
						
							|  |  |  |     bool uses_atomic_s32_max{}; | 
					
						
							| 
									
										
										
										
											2021-04-13 05:32:21 -03:00
										 |  |  |     bool uses_int64_bit_atomics{}; | 
					
						
							| 
									
										
										
										
											2021-04-19 16:33:23 -03:00
										 |  |  |     bool uses_global_memory{}; | 
					
						
							| 
									
										
										
										
											2021-04-23 17:47:54 -04:00
										 |  |  |     bool uses_atomic_image_u32{}; | 
					
						
							| 
									
										
										
										
											2021-06-13 19:12:03 -04:00
										 |  |  |     bool uses_shadow_lod{}; | 
					
						
							| 
									
										
										
										
											2021-07-21 22:25:34 -03:00
										 |  |  |     bool uses_rescaling_uniform{}; | 
					
						
							| 
									
										
										
										
											2022-03-17 13:30:21 -04:00
										 |  |  |     bool uses_cbuf_indirect{}; | 
					
						
							| 
									
										
										
										
											2022-09-01 22:05:11 +08:00
										 |  |  |     bool uses_render_area{}; | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-09 17:14:57 -03:00
										 |  |  |     IR::Type used_constant_buffer_types{}; | 
					
						
							| 
									
										
										
										
											2021-04-13 05:32:21 -03:00
										 |  |  |     IR::Type used_storage_buffer_types{}; | 
					
						
							| 
									
										
										
										
											2022-03-17 14:45:38 -04:00
										 |  |  |     IR::Type used_indirect_cbuf_types{}; | 
					
						
							| 
									
										
										
										
											2021-03-09 17:14:57 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  |     u32 constant_buffer_mask{}; | 
					
						
							| 
									
										
										
										
											2021-06-02 02:15:07 -03:00
										 |  |  |     std::array<u32, MAX_CBUFS> constant_buffer_used_sizes{}; | 
					
						
							| 
									
										
										
										
											2021-05-02 01:50:27 +02:00
										 |  |  |     u32 nvn_buffer_base{}; | 
					
						
							|  |  |  |     std::bitset<16> nvn_buffer_used{}; | 
					
						
							| 
									
										
										
										
											2021-02-16 04:10:22 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     boost::container::static_vector<ConstantBufferDescriptor, MAX_CBUFS> | 
					
						
							|  |  |  |         constant_buffer_descriptors; | 
					
						
							|  |  |  |     boost::container::static_vector<StorageBufferDescriptor, MAX_SSBOS> storage_buffers_descriptors; | 
					
						
							| 
									
										
										
										
											2021-04-06 02:56:15 -03:00
										 |  |  |     TextureBufferDescriptors texture_buffer_descriptors; | 
					
						
							| 
									
										
										
										
											2021-04-14 21:36:36 -03:00
										 |  |  |     ImageBufferDescriptors image_buffer_descriptors; | 
					
						
							| 
									
										
										
										
											2021-04-06 20:14:55 -03:00
										 |  |  |     TextureDescriptors texture_descriptors; | 
					
						
							| 
									
										
										
										
											2021-04-09 01:45:39 -03:00
										 |  |  |     ImageDescriptors image_descriptors; | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-25 22:26:23 -03:00
										 |  |  | template <typename Descriptors> | 
					
						
							|  |  |  | u32 NumDescriptors(const Descriptors& descriptors) { | 
					
						
							|  |  |  |     u32 num{}; | 
					
						
							|  |  |  |     for (const auto& desc : descriptors) { | 
					
						
							|  |  |  |         num += desc.count; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return num; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-11 16:39:06 -03:00
										 |  |  | } // namespace Shader
 |