| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | // Copyright 2016 Dolphin Emulator Project
 | 
					
						
							|  |  |  | // Licensed under GPLv2+
 | 
					
						
							|  |  |  | // Refer to the license.txt file included.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 23:07:50 -04:00
										 |  |  | #include <cstddef>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | #include "Common/BitField.h"
 | 
					
						
							| 
									
										
										
										
											2016-09-30 23:07:50 -04:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | #include "VideoBackends/Vulkan/VulkanLoader.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Vulkan | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | // Number of command buffers. Having two allows one buffer to be
 | 
					
						
							|  |  |  | // executed whilst another is being built.
 | 
					
						
							|  |  |  | constexpr size_t NUM_COMMAND_BUFFERS = 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Staging buffer usage - optimize for uploads or readbacks
 | 
					
						
							|  |  |  | enum STAGING_BUFFER_TYPE | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   STAGING_BUFFER_TYPE_UPLOAD, | 
					
						
							|  |  |  |   STAGING_BUFFER_TYPE_READBACK | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 15:38:32 +10:00
										 |  |  | // Descriptor set layouts
 | 
					
						
							|  |  |  | enum DESCRIPTOR_SET_LAYOUT | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-11-13 15:38:32 +10:00
										 |  |  |   DESCRIPTOR_SET_LAYOUT_UNIFORM_BUFFERS, | 
					
						
							|  |  |  |   DESCRIPTOR_SET_LAYOUT_PIXEL_SHADER_SAMPLERS, | 
					
						
							|  |  |  |   DESCRIPTOR_SET_LAYOUT_SHADER_STORAGE_BUFFERS, | 
					
						
							|  |  |  |   DESCRIPTOR_SET_LAYOUT_TEXEL_BUFFERS, | 
					
						
							|  |  |  |   NUM_DESCRIPTOR_SET_LAYOUTS | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Descriptor set bind points
 | 
					
						
							|  |  |  | enum DESCRIPTOR_SET_BIND_POINT | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   DESCRIPTOR_SET_BIND_POINT_UNIFORM_BUFFERS, | 
					
						
							|  |  |  |   DESCRIPTOR_SET_BIND_POINT_PIXEL_SHADER_SAMPLERS, | 
					
						
							|  |  |  |   DESCRIPTOR_SET_BIND_POINT_STORAGE_OR_TEXEL_BUFFER, | 
					
						
							|  |  |  |   NUM_DESCRIPTOR_SET_BIND_POINTS | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 15:24:55 +10:00
										 |  |  | // We use four pipeline layouts:
 | 
					
						
							|  |  |  | //   - Standard
 | 
					
						
							|  |  |  | //       - Per-stage UBO (VS/GS/PS, VS constants accessible from PS)
 | 
					
						
							|  |  |  | //       - 8 combined image samplers (accessible from PS)
 | 
					
						
							|  |  |  | //   - BBox Enabled
 | 
					
						
							|  |  |  | //       - Same as standard, plus a single SSBO accessible from PS
 | 
					
						
							|  |  |  | //   - Push Constant
 | 
					
						
							|  |  |  | //       - Same as standard, plus 128 bytes of push constants, accessible from all stages.
 | 
					
						
							|  |  |  | //   - Texture Decoding
 | 
					
						
							|  |  |  | //       - Same as push constant, plus a single texel buffer accessible from PS.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // All four pipeline layout share the first two descriptor sets (uniform buffers, PS samplers).
 | 
					
						
							|  |  |  | // The third descriptor set (see bind points above) is used for storage or texel buffers.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | enum PIPELINE_LAYOUT | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   PIPELINE_LAYOUT_STANDARD, | 
					
						
							|  |  |  |   PIPELINE_LAYOUT_BBOX, | 
					
						
							|  |  |  |   PIPELINE_LAYOUT_PUSH_CONSTANT, | 
					
						
							|  |  |  |   PIPELINE_LAYOUT_TEXTURE_CONVERSION, | 
					
						
							|  |  |  |   NUM_PIPELINE_LAYOUTS | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | // Uniform buffer bindings within the first descriptor set
 | 
					
						
							|  |  |  | enum UNIFORM_BUFFER_DESCRIPTOR_SET_BINDING | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   UBO_DESCRIPTOR_SET_BINDING_PS, | 
					
						
							|  |  |  |   UBO_DESCRIPTOR_SET_BINDING_VS, | 
					
						
							|  |  |  |   UBO_DESCRIPTOR_SET_BINDING_GS, | 
					
						
							|  |  |  |   NUM_UBO_DESCRIPTOR_SET_BINDINGS | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Maximum number of attributes per vertex (we don't have any more than this?)
 | 
					
						
							|  |  |  | constexpr size_t MAX_VERTEX_ATTRIBUTES = 16; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Number of pixel shader texture slots
 | 
					
						
							|  |  |  | constexpr size_t NUM_PIXEL_SHADER_SAMPLERS = 8; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Total number of binding points in the pipeline layout
 | 
					
						
							|  |  |  | constexpr size_t TOTAL_PIPELINE_BINDING_POINTS = | 
					
						
							|  |  |  |     NUM_UBO_DESCRIPTOR_SET_BINDINGS + NUM_PIXEL_SHADER_SAMPLERS + 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Format of EFB textures
 | 
					
						
							|  |  |  | constexpr VkFormat EFB_COLOR_TEXTURE_FORMAT = VK_FORMAT_R8G8B8A8_UNORM; | 
					
						
							|  |  |  | constexpr VkFormat EFB_DEPTH_TEXTURE_FORMAT = VK_FORMAT_D32_SFLOAT; | 
					
						
							|  |  |  | constexpr VkFormat EFB_DEPTH_AS_COLOR_TEXTURE_FORMAT = VK_FORMAT_R32_SFLOAT; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Format of texturecache textures
 | 
					
						
							|  |  |  | constexpr VkFormat TEXTURECACHE_TEXTURE_FORMAT = VK_FORMAT_R8G8B8A8_UNORM; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Textures that don't fit into this buffer will be uploaded with a separate buffer (see below).
 | 
					
						
							|  |  |  | constexpr size_t INITIAL_TEXTURE_UPLOAD_BUFFER_SIZE = 16 * 1024 * 1024; | 
					
						
							|  |  |  | constexpr size_t MAXIMUM_TEXTURE_UPLOAD_BUFFER_SIZE = 64 * 1024 * 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Textures greater than 1024*1024 will be put in staging textures that are released after
 | 
					
						
							|  |  |  | // execution instead. A 2048x2048 texture is 16MB, and we'd only fit four of these in our
 | 
					
						
							|  |  |  | // streaming buffer and be blocking frequently. Games are unlikely to have textures this
 | 
					
						
							|  |  |  | // large anyway, so it's only really an issue for HD texture packs, and memory is not
 | 
					
						
							|  |  |  | // a limiting factor in these scenarios anyway.
 | 
					
						
							|  |  |  | constexpr size_t STAGING_TEXTURE_UPLOAD_THRESHOLD = 1024 * 1024 * 4; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Streaming uniform buffer size
 | 
					
						
							|  |  |  | constexpr size_t INITIAL_UNIFORM_STREAM_BUFFER_SIZE = 16 * 1024 * 1024; | 
					
						
							|  |  |  | constexpr size_t MAXIMUM_UNIFORM_STREAM_BUFFER_SIZE = 32 * 1024 * 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-20 00:08:24 +10:00
										 |  |  | // Texel buffer size for palette and texture decoding.
 | 
					
						
							|  |  |  | constexpr size_t TEXTURE_CONVERSION_TEXEL_BUFFER_SIZE = 8 * 1024 * 1024; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | // Push constant buffer size for utility shaders
 | 
					
						
							|  |  |  | constexpr u32 PUSH_CONSTANT_BUFFER_SIZE = 128; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-20 02:51:53 +10:00
										 |  |  | // Minimum number of draw calls per command buffer when attempting to preempt a readback operation.
 | 
					
						
							|  |  |  | constexpr u32 MINIMUM_DRAW_CALLS_PER_COMMAND_BUFFER_FOR_READBACK = 10; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | // Rasterization state info
 | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  | union RasterizationState | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |   BitField<0, 2, VkCullModeFlags> cull_mode; | 
					
						
							|  |  |  |   BitField<2, 7, VkSampleCountFlagBits> samples; | 
					
						
							|  |  |  |   BitField<9, 1, VkBool32> per_sample_shading; | 
					
						
							|  |  |  |   BitField<10, 1, VkBool32> depth_clamp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   u32 bits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Depth state info
 | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  | union DepthStencilState | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |   BitField<0, 1, VkBool32> test_enable; | 
					
						
							|  |  |  |   BitField<1, 1, VkBool32> write_enable; | 
					
						
							|  |  |  |   BitField<2, 3, VkCompareOp> compare_op; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   u32 bits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Blend state info
 | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  | union BlendState | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |   struct | 
					
						
							|  |  |  |   { | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  |     union | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |       BitField<0, 1, VkBool32> blend_enable; | 
					
						
							|  |  |  |       BitField<1, 3, VkBlendOp> blend_op; | 
					
						
							|  |  |  |       BitField<4, 5, VkBlendFactor> src_blend; | 
					
						
							|  |  |  |       BitField<9, 5, VkBlendFactor> dst_blend; | 
					
						
							|  |  |  |       BitField<14, 3, VkBlendOp> alpha_blend_op; | 
					
						
							|  |  |  |       BitField<17, 5, VkBlendFactor> src_alpha_blend; | 
					
						
							|  |  |  |       BitField<22, 5, VkBlendFactor> dst_alpha_blend; | 
					
						
							|  |  |  |       BitField<27, 4, VkColorComponentFlags> write_mask; | 
					
						
							|  |  |  |       u32 low_bits; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  |     union | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |       BitField<0, 1, VkBool32> logic_op_enable; | 
					
						
							|  |  |  |       BitField<1, 4, VkLogicOp> logic_op; | 
					
						
							|  |  |  |       u32 high_bits; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   u64 bits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sampler info
 | 
					
						
							| 
									
										
										
										
											2017-01-04 12:45:40 +01:00
										 |  |  | union SamplerState | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  |   BitField<0, 1, VkFilter> min_filter; | 
					
						
							|  |  |  |   BitField<1, 1, VkFilter> mag_filter; | 
					
						
							|  |  |  |   BitField<2, 1, VkSamplerMipmapMode> mipmap_mode; | 
					
						
							|  |  |  |   BitField<3, 2, VkSamplerAddressMode> wrap_u; | 
					
						
							|  |  |  |   BitField<5, 2, VkSamplerAddressMode> wrap_v; | 
					
						
							|  |  |  |   BitField<7, 8, u32> min_lod; | 
					
						
							|  |  |  |   BitField<15, 8, u32> max_lod; | 
					
						
							| 
									
										
										
										
											2016-10-02 23:53:09 +10:00
										 |  |  |   BitField<23, 8, s32> lod_bias; | 
					
						
							|  |  |  |   BitField<31, 1, u32> enable_anisotropic_filtering; | 
					
						
							| 
									
										
										
										
											2016-08-13 22:57:50 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |   u32 bits; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace Vulkan
 |