137 lines
4.2 KiB
C
137 lines
4.2 KiB
C
|
// Copyright 2016 Dolphin Emulator Project
|
||
|
// Licensed under GPLv2+
|
||
|
// Refer to the license.txt file included.
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "Common/BitField.h"
|
||
|
#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
|
||
|
};
|
||
|
|
||
|
// Descriptor sets
|
||
|
enum DESCRIPTOR_SET
|
||
|
{
|
||
|
DESCRIPTOR_SET_UNIFORM_BUFFERS,
|
||
|
DESCRIPTOR_SET_PIXEL_SHADER_SAMPLERS,
|
||
|
DESCRIPTOR_SET_SHADER_STORAGE_BUFFERS,
|
||
|
NUM_DESCRIPTOR_SETS
|
||
|
};
|
||
|
|
||
|
// 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;
|
||
|
|
||
|
// Push constant buffer size for utility shaders
|
||
|
constexpr u32 PUSH_CONSTANT_BUFFER_SIZE = 128;
|
||
|
|
||
|
// Rasterization state info
|
||
|
union RasterizationState {
|
||
|
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
|
||
|
union DepthStencilState {
|
||
|
BitField<0, 1, VkBool32> test_enable;
|
||
|
BitField<1, 1, VkBool32> write_enable;
|
||
|
BitField<2, 3, VkCompareOp> compare_op;
|
||
|
|
||
|
u32 bits;
|
||
|
};
|
||
|
|
||
|
// Blend state info
|
||
|
union BlendState {
|
||
|
struct
|
||
|
{
|
||
|
union {
|
||
|
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;
|
||
|
};
|
||
|
union {
|
||
|
BitField<0, 1, VkBool32> logic_op_enable;
|
||
|
BitField<1, 4, VkLogicOp> logic_op;
|
||
|
u32 high_bits;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
u64 bits;
|
||
|
};
|
||
|
|
||
|
// Sampler info
|
||
|
union SamplerState {
|
||
|
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;
|
||
|
BitField<23, 6, s32> lod_bias; // tm0.lod_bias (8 bits) / 32 gives us 0-7.
|
||
|
BitField<29, 3, u32> anisotropy; // max_anisotropy = 1 << anisotropy, max of 16, so range 0-4.
|
||
|
|
||
|
u32 bits;
|
||
|
};
|
||
|
|
||
|
} // namespace Vulkan
|