@ -95,20 +95,12 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
}
}
[[nodiscard]] VkImageCreateInfo MakeImageCreateInfo ( const Device & device , const ImageInfo & info ) {
const auto format_info = MaxwellToVK : : SurfaceFormat ( device , FormatType : : Optimal , info . format ) ;
VkImageCreateFlags flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT ;
if ( info . type = = ImageType : : e2D & & info . resources . layers > = 6 & &
info . size . width = = info . size . height ) {
flags | = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT ;
}
if ( info . type = = ImageType : : e3D ) {
flags | = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT ;
}
[[nodiscard]] VkImageUsageFlags ImageUsageFlags ( const MaxwellToVK : : FormatInfo & info ,
PixelFormat format ) {
VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
VK_IMAGE_USAGE_SAMPLED_BIT ;
if ( format_ info. attachable ) {
switch ( VideoCore : : Surface : : GetFormatType ( info. format) ) {
if ( info . attachable ) {
switch ( VideoCore : : Surface : : GetFormatType ( format ) ) {
case VideoCore : : Surface : : SurfaceType : : ColorTexture :
usage | = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT ;
break ;
@ -120,9 +112,33 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
UNREACHABLE_MSG ( " Invalid surface type " ) ;
}
}
if ( format_ info. storage ) {
if ( info. storage ) {
usage | = VK_IMAGE_USAGE_STORAGE_BIT ;
}
return usage ;
}
/// Returns the preferred format for a VkImage
[[nodiscard]] PixelFormat StorageFormat ( PixelFormat format ) {
switch ( format ) {
case PixelFormat : : A8B8G8R8_SRGB :
return PixelFormat : : A8B8G8R8_UNORM ;
default :
return format ;
}
}
[[nodiscard]] VkImageCreateInfo MakeImageCreateInfo ( const Device & device , const ImageInfo & info ) {
const PixelFormat format = StorageFormat ( info . format ) ;
const auto format_info = MaxwellToVK : : SurfaceFormat ( device , FormatType : : Optimal , false , format ) ;
VkImageCreateFlags flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT ;
if ( info . type = = ImageType : : e2D & & info . resources . layers > = 6 & &
info . size . width = = info . size . height ) {
flags | = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT ;
}
if ( info . type = = ImageType : : e3D ) {
flags | = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT ;
}
const auto [ samples_x , samples_y ] = VideoCommon : : SamplesLog2 ( info . num_samples ) ;
return VkImageCreateInfo {
. sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO ,
@ -130,17 +146,16 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
. flags = flags ,
. imageType = ConvertImageType ( info . type ) ,
. format = format_info . format ,
. extent =
{
. width = info . size . width > > samples_x ,
. height = info . size . height > > samples_y ,
. depth = info . size . depth ,
} ,
. extent {
. width = info . size . width > > samples_x ,
. height = info . size . height > > samples_y ,
. depth = info . size . depth ,
} ,
. mipLevels = static_cast < u32 > ( info . resources . levels ) ,
. arrayLayers = static_cast < u32 > ( info . resources . layers ) ,
. samples = ConvertSampleCount ( info . num_samples ) ,
. tiling = VK_IMAGE_TILING_OPTIMAL ,
. usage = usage ,
. usage = ImageUsageFlags( format_info , format ) ,
. sharingMode = VK_SHARING_MODE_EXCLUSIVE ,
. queueFamilyIndexCount = 0 ,
. pQueueFamilyIndices = nullptr ,
@ -209,10 +224,11 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) {
[[nodiscard]] VkAttachmentDescription AttachmentDescription ( const Device & device ,
const ImageView * image_view ) {
const auto pixel_format = image_view - > format ;
using MaxwellToVK : : SurfaceFormat ;
const PixelFormat pixel_format = image_view - > format ;
return VkAttachmentDescription {
. flags = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT ,
. format = MaxwellToVK: : SurfaceFormat( device , FormatType : : Optimal , pixel_format ) . format ,
. format = SurfaceFormat( device , FormatType : : Optimal , true , pixel_format ) . format ,
. samples = image_view - > Samples ( ) ,
. loadOp = VK_ATTACHMENT_LOAD_OP_LOAD ,
. storeOp = VK_ATTACHMENT_STORE_OP_STORE ,
@ -860,11 +876,16 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI
std : : ranges : : transform ( swizzle , swizzle . begin ( ) , ConvertGreenRed ) ;
}
}
const VkFormat vk_format =
MaxwellToVK : : SurfaceFormat ( * device , FormatType : : Optimal , format ) . format ;
const auto format_info = MaxwellToVK : : SurfaceFormat ( * device , FormatType : : Optimal , true , format ) ;
const VkFormat vk_format = format_info . format ;
const VkImageViewUsageCreateInfo image_view_usage {
. sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO ,
. pNext = nullptr ,
. usage = ImageUsageFlags ( format_info , format ) ,
} ;
const VkImageViewCreateInfo create_info {
. sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO ,
. pNext = nullptr ,
. pNext = & image_view_usage ,
. flags = 0 ,
. image = image . Handle ( ) ,
. viewType = VkImageViewType { } ,
@ -954,7 +975,7 @@ vk::ImageView ImageView::MakeDepthStencilView(VkImageAspectFlags aspect_mask) {
. flags = 0 ,
. image = image_handle ,
. viewType = ImageViewType ( type ) ,
. format = MaxwellToVK : : SurfaceFormat ( * device , FormatType : : Optimal , format ) . format ,
. format = MaxwellToVK : : SurfaceFormat ( * device , FormatType : : Optimal , true , format ) . format ,
. components {
. r = VK_COMPONENT_SWIZZLE_IDENTITY ,
. g = VK_COMPONENT_SWIZZLE_IDENTITY ,