mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-08-05 17:02:40 +00:00
Speed up LiverpoolToVK::SurfaceFormat
In Bloodborne this shows up as the function with the very highest cumulative "exclusive time". This is true both in scenes that perform poorly, and scenes that perform well. I took (approximately) 10s samples using an 8khz sampling profiler. In the Nightmare Grand Cathedral (looking towards the stairs, at the rest of the level): - Reduced total time from 757.34ms to 82.61ms (out of ~10000ms). - Reduced average frame times by 2ms (though according to the graph, the gap may be as big as 9ms every N frames). In the Hunter's Dream (in the spawn position): - Reduced the total time from 486.50ms to 53.83ms (out of ~10000ms). - Average frame times appear to be roughly the same. These are profiles of the change vs the version currently in the main branch. These improvements also improve things in the `threading` branch. They might improve them even more in that branch, but I didn't bother keeping track of my measurements as well in that branch. I believe this change will still be useful even when that branch is stabilized and merged. It could be there are other bottlenecks in rendering on this branch that are preventing this code from being the critical path in places like the Hunter's Dream, where performance isn't currently as constrained. That might explain why the reduction in call times isn't resulting in a higher frame rate.
This commit is contained in:
parent
dd3f24614b
commit
949171d6ca
@ -666,15 +666,456 @@ std::span<const SurfaceFormatInfo> SurfaceFormats() {
|
||||
}
|
||||
|
||||
vk::Format SurfaceFormat(AmdGpu::DataFormat data_format, AmdGpu::NumberFormat num_format) {
|
||||
const auto& formats = SurfaceFormats();
|
||||
const auto format =
|
||||
std::find_if(formats.begin(), formats.end(), [&](const SurfaceFormatInfo& format_info) {
|
||||
return format_info.data_format == data_format &&
|
||||
format_info.number_format == num_format;
|
||||
});
|
||||
ASSERT_MSG(format != formats.end(), "Unknown data_format={} and num_format={}",
|
||||
bool found = false;
|
||||
vk::Format result = vk::Format::eUndefined;
|
||||
|
||||
switch (data_format) {
|
||||
case AmdGpu::DataFormat::FormatInvalid:
|
||||
result = vk::Format::eUndefined;
|
||||
found = true;
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format8:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR8Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR8Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR8Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR8Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR8Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR8Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eR8Srgb;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format16:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR16Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR16Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR16Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR16Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR16Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR16Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR16Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format8_8:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR8G8Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR8G8Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR8G8Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR8G8Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR8G8Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR8G8Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eR8G8Srgb;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format32:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR32Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR32Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR32Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format16_16:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR16G16Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR16G16Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR16G16Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR16G16Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR16G16Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR16G16Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR16G16Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format10_11_11:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eB10G11R11UfloatPack32;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format11_11_10:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eB10G11R11UfloatPack32;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format2_10_10_10:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eA2B10G10R10UnormPack32;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eA2B10G10R10SnormPack32;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eA2B10G10R10UscaledPack32;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eA2B10G10R10SscaledPack32;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eA2B10G10R10UintPack32;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eA2B10G10R10SintPack32;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format8_8_8_8:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR8G8B8A8Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR8G8B8A8Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR8G8B8A8Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR8G8B8A8Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR8G8B8A8Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR8G8B8A8Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eR8G8B8A8Srgb;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format32_32:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR32G32Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR32G32Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR32G32Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format16_16_16_16:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR16G16B16A16Unorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eR16G16B16A16Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uscaled:
|
||||
result = vk::Format::eR16G16B16A16Uscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sscaled:
|
||||
result = vk::Format::eR16G16B16A16Sscaled;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR16G16B16A16Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR16G16B16A16Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::SnormNz:
|
||||
result = vk::Format::eR16G16B16A16Snorm;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR16G16B16A16Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format32_32_32:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR32G32B32Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR32G32B32Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR32G32B32Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format32_32_32_32:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Uint:
|
||||
result = vk::Format::eR32G32B32A32Uint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Sint:
|
||||
result = vk::Format::eR32G32B32A32Sint;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eR32G32B32A32Sfloat;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format5_6_5:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eB5G6R5UnormPack16;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format1_5_5_5:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR5G5B5A1UnormPack16;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format4_4_4_4:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eR4G4B4A4UnormPack16;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::Format5_9_9_9:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Float:
|
||||
result = vk::Format::eE5B9G9R9UfloatPack32;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc1:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc1RgbaUnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eBc1RgbaSrgbBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc2:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc2UnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eBc2SrgbBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc3:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc3UnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eBc3SrgbBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc4:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc4UnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eBc4SnormBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc5:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc5UnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eBc5SnormBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc6:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc6HUfloatBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Snorm:
|
||||
result = vk::Format::eBc6HSfloatBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case AmdGpu::DataFormat::FormatBc7:
|
||||
found = true;
|
||||
switch (num_format) {
|
||||
case AmdGpu::NumberFormat::Unorm:
|
||||
result = vk::Format::eBc7UnormBlock;
|
||||
break;
|
||||
case AmdGpu::NumberFormat::Srgb:
|
||||
result = vk::Format::eBc7SrgbBlock;
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
found = false;
|
||||
}
|
||||
|
||||
ASSERT_MSG(found, "Unknown data_format={} and num_format={}",
|
||||
static_cast<u32>(data_format), static_cast<u32>(num_format));
|
||||
return format->vk_format;
|
||||
return result;
|
||||
}
|
||||
|
||||
vk::Format AdjustColorBufferFormat(vk::Format base_format,
|
||||
|
Loading…
Reference in New Issue
Block a user