mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-28 22:06:59 +01:00
graphics: fix Vulkan BC image compatibility checks`
This commit is contained in:
@@ -32,6 +32,7 @@ struct GraphicContext {
|
|||||||
bool compute_subgroup_size_control_enabled = false;
|
bool compute_subgroup_size_control_enabled = false;
|
||||||
bool sample_rate_shading_enabled = false;
|
bool sample_rate_shading_enabled = false;
|
||||||
bool attachment_feedback_loop_enabled = false;
|
bool attachment_feedback_loop_enabled = false;
|
||||||
|
bool supports_block_texel_view = false;
|
||||||
bool mesh_shader_enabled = false;
|
bool mesh_shader_enabled = false;
|
||||||
vk::PhysicalDeviceMeshShaderPropertiesEXT mesh_shader_properties = {};
|
vk::PhysicalDeviceMeshShaderPropertiesEXT mesh_shader_properties = {};
|
||||||
uint32_t subgroup_size = 0;
|
uint32_t subgroup_size = 0;
|
||||||
|
|||||||
@@ -26,12 +26,13 @@ namespace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] vk::ImageCreateFlags ImageCreateFlags(const ImageInfo& info) {
|
[[nodiscard]] vk::ImageCreateFlags ImageCreateFlags(const GraphicContext& graphics,
|
||||||
|
const ImageInfo& info) {
|
||||||
vk::ImageCreateFlags flags {};
|
vk::ImageCreateFlags flags {};
|
||||||
if (DepthAspectTransferFormat(info.pixel_format) == vk::Format::eUndefined) {
|
if (DepthAspectTransferFormat(info.pixel_format) == vk::Format::eUndefined) {
|
||||||
flags |= vk::ImageCreateFlagBits::eMutableFormat;
|
flags |= vk::ImageCreateFlagBits::eMutableFormat;
|
||||||
flags |= vk::ImageCreateFlagBits::eExtendedUsage;
|
flags |= vk::ImageCreateFlagBits::eExtendedUsage;
|
||||||
if (Prospero::BlockCompressedBytesPerBlock(info.guest_format) != 0) {
|
if (info.IsBlock() && graphics.supports_block_texel_view) {
|
||||||
flags |= vk::ImageCreateFlagBits::eBlockTexelViewCompatible;
|
flags |= vk::ImageCreateFlagBits::eBlockTexelViewCompatible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,6 +48,10 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] vk::ImageUsageFlags ImageUsageFlags(GraphicContext& graphics, const ImageInfo& info) {
|
[[nodiscard]] vk::ImageUsageFlags ImageUsageFlags(GraphicContext& graphics, const ImageInfo& info) {
|
||||||
|
if (info.IsBlock()) {
|
||||||
|
return vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst |
|
||||||
|
vk::ImageUsageFlagBits::eSampled;
|
||||||
|
}
|
||||||
const auto properties = graphics.GetFormatProperties(info.pixel_format);
|
const auto properties = graphics.GetFormatProperties(info.pixel_format);
|
||||||
auto usage = vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst;
|
auto usage = vk::ImageUsageFlagBits::eTransferSrc | vk::ImageUsageFlagBits::eTransferDst;
|
||||||
if (HasFormatFeature(properties, vk::FormatFeatureFlagBits::eSampledImage)) {
|
if (HasFormatFeature(properties, vk::FormatFeatureFlagBits::eSampledImage)) {
|
||||||
@@ -662,7 +667,7 @@ Image::Image(GraphicContext& graphics, CommandScheduler& scheduler, const ImageI
|
|||||||
backing.layers = info.IsVolume() ? 1u : info.resources.layers;
|
backing.layers = info.IsVolume() ? 1u : info.resources.layers;
|
||||||
backing.mip_levels = info.resources.levels;
|
backing.mip_levels = info.resources.levels;
|
||||||
backing.samples = info.samples;
|
backing.samples = info.samples;
|
||||||
backing.flags = ImageCreateFlags(info);
|
backing.flags = ImageCreateFlags(graphics, info);
|
||||||
backing.usage = ImageUsageFlags(graphics, info);
|
backing.usage = ImageUsageFlags(graphics, info);
|
||||||
|
|
||||||
vk::ImageCreateInfo create {};
|
vk::ImageCreateInfo create {};
|
||||||
|
|||||||
@@ -1120,6 +1120,18 @@ void WindowContext::CreateVulkan() {
|
|||||||
|
|
||||||
LOGF("Select device: %s\n", device_properties.deviceName.data());
|
LOGF("Select device: %s\n", device_properties.deviceName.data());
|
||||||
|
|
||||||
|
const vk::PhysicalDeviceImageFormatInfo2 block_texel_view_info {
|
||||||
|
.format = vk::Format::eBc1RgbaUnormBlock,
|
||||||
|
.type = vk::ImageType::e2D,
|
||||||
|
.tiling = vk::ImageTiling::eOptimal,
|
||||||
|
.usage = vk::ImageUsageFlagBits::eSampled,
|
||||||
|
.flags = vk::ImageCreateFlagBits::eBlockTexelViewCompatible,
|
||||||
|
};
|
||||||
|
const auto block_texel_view_props =
|
||||||
|
graphic_ctx.physical_device.getImageFormatProperties2(block_texel_view_info);
|
||||||
|
graphic_ctx.supports_block_texel_view = block_texel_view_props.result == vk::Result::eSuccess;
|
||||||
|
LOGF("Block Texel View support: %s\n", graphic_ctx.supports_block_texel_view ? "Yes" : "No");
|
||||||
|
|
||||||
{
|
{
|
||||||
auto available_extensions = EnumerateVulkan<vk::ExtensionProperties>(
|
auto available_extensions = EnumerateVulkan<vk::ExtensionProperties>(
|
||||||
"vkEnumerateDeviceExtensionProperties",
|
"vkEnumerateDeviceExtensionProperties",
|
||||||
|
|||||||
Reference in New Issue
Block a user