diff options
| author | 2023-05-20 17:15:36 -0400 | |
|---|---|---|
| committer | 2023-05-23 12:54:40 -0400 | |
| commit | 415c78b87c008f0d963679ea9bc06c8aa566b506 (patch) | |
| tree | 11e6a5d2211a99660a48678059c703e849c06da3 /src/video_core/renderer_vulkan | |
| parent | Merge pull request #10392 from danilaml/update-cubeb-again (diff) | |
| download | yuzu-415c78b87c008f0d963679ea9bc06c8aa566b506.tar.gz yuzu-415c78b87c008f0d963679ea9bc06c8aa566b506.tar.xz yuzu-415c78b87c008f0d963679ea9bc06c8aa566b506.zip | |
textures: add BC1 and BC3 compressors and recompression setting
Diffstat (limited to 'src/video_core/renderer_vulkan')
| -rw-r--r-- | src/video_core/renderer_vulkan/maxwell_to_vk.cpp | 24 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 8 |
2 files changed, 24 insertions, 8 deletions
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 8853cf0f7..b75d7220d 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "common/common_types.h" | 7 | #include "common/common_types.h" |
| 8 | #include "common/logging/log.h" | 8 | #include "common/logging/log.h" |
| 9 | #include "common/settings.h" | ||
| 9 | #include "video_core/engines/maxwell_3d.h" | 10 | #include "video_core/engines/maxwell_3d.h" |
| 10 | #include "video_core/renderer_vulkan/maxwell_to_vk.h" | 11 | #include "video_core/renderer_vulkan/maxwell_to_vk.h" |
| 11 | #include "video_core/surface.h" | 12 | #include "video_core/surface.h" |
| @@ -237,14 +238,25 @@ FormatInfo SurfaceFormat(const Device& device, FormatType format_type, bool with | |||
| 237 | PixelFormat pixel_format) { | 238 | PixelFormat pixel_format) { |
| 238 | ASSERT(static_cast<size_t>(pixel_format) < std::size(tex_format_tuples)); | 239 | ASSERT(static_cast<size_t>(pixel_format) < std::size(tex_format_tuples)); |
| 239 | FormatTuple tuple = tex_format_tuples[static_cast<size_t>(pixel_format)]; | 240 | FormatTuple tuple = tex_format_tuples[static_cast<size_t>(pixel_format)]; |
| 240 | // Use A8B8G8R8_UNORM on hardware that doesn't support ASTC natively | 241 | // Transcode on hardware that doesn't support ASTC natively |
| 241 | if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) { | 242 | if (!device.IsOptimalAstcSupported() && VideoCore::Surface::IsPixelFormatASTC(pixel_format)) { |
| 242 | const bool is_srgb = with_srgb && VideoCore::Surface::IsPixelFormatSRGB(pixel_format); | 243 | const bool is_srgb = with_srgb && VideoCore::Surface::IsPixelFormatSRGB(pixel_format); |
| 243 | if (is_srgb) { | 244 | |
| 244 | tuple.format = VK_FORMAT_A8B8G8R8_SRGB_PACK32; | 245 | switch (Settings::values.astc_recompression.GetValue()) { |
| 245 | } else { | 246 | case Settings::AstcRecompression::Uncompressed: |
| 246 | tuple.format = VK_FORMAT_A8B8G8R8_UNORM_PACK32; | 247 | if (is_srgb) { |
| 247 | tuple.usage |= Storage; | 248 | tuple.format = VK_FORMAT_A8B8G8R8_SRGB_PACK32; |
| 249 | } else { | ||
| 250 | tuple.format = VK_FORMAT_A8B8G8R8_UNORM_PACK32; | ||
| 251 | tuple.usage |= Storage; | ||
| 252 | } | ||
| 253 | break; | ||
| 254 | case Settings::AstcRecompression::Bc1: | ||
| 255 | tuple.format = is_srgb ? VK_FORMAT_BC1_RGBA_SRGB_BLOCK : VK_FORMAT_BC1_RGBA_UNORM_BLOCK; | ||
| 256 | break; | ||
| 257 | case Settings::AstcRecompression::Bc3: | ||
| 258 | tuple.format = is_srgb ? VK_FORMAT_BC3_SRGB_BLOCK : VK_FORMAT_BC3_UNORM_BLOCK; | ||
| 259 | break; | ||
| 248 | } | 260 | } |
| 249 | } | 261 | } |
| 250 | const bool attachable = (tuple.usage & Attachable) != 0; | 262 | const bool attachable = (tuple.usage & Attachable) != 0; |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 4d0481f2a..77d72697e 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -1268,7 +1268,9 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu | |||
| 1268 | if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) { | 1268 | if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) { |
| 1269 | if (Settings::values.async_astc.GetValue()) { | 1269 | if (Settings::values.async_astc.GetValue()) { |
| 1270 | flags |= VideoCommon::ImageFlagBits::AsynchronousDecode; | 1270 | flags |= VideoCommon::ImageFlagBits::AsynchronousDecode; |
| 1271 | } else if (Settings::values.accelerate_astc.GetValue() && info.size.depth == 1) { | 1271 | } else if (Settings::values.astc_recompression.GetValue() == |
| 1272 | Settings::AstcRecompression::Uncompressed && | ||
| 1273 | Settings::values.accelerate_astc.GetValue() && info.size.depth == 1) { | ||
| 1272 | flags |= VideoCommon::ImageFlagBits::AcceleratedUpload; | 1274 | flags |= VideoCommon::ImageFlagBits::AcceleratedUpload; |
| 1273 | } | 1275 | } |
| 1274 | flags |= VideoCommon::ImageFlagBits::Converted; | 1276 | flags |= VideoCommon::ImageFlagBits::Converted; |
| @@ -1283,7 +1285,9 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu | |||
| 1283 | .usage = VK_IMAGE_USAGE_STORAGE_BIT, | 1285 | .usage = VK_IMAGE_USAGE_STORAGE_BIT, |
| 1284 | }; | 1286 | }; |
| 1285 | current_image = *original_image; | 1287 | current_image = *original_image; |
| 1286 | if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) { | 1288 | if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported() && |
| 1289 | Settings::values.astc_recompression.GetValue() == | ||
| 1290 | Settings::AstcRecompression::Uncompressed) { | ||
| 1287 | const auto& device = runtime->device.GetLogical(); | 1291 | const auto& device = runtime->device.GetLogical(); |
| 1288 | storage_image_views.reserve(info.resources.levels); | 1292 | storage_image_views.reserve(info.resources.levels); |
| 1289 | for (s32 level = 0; level < info.resources.levels; ++level) { | 1293 | for (s32 level = 0; level < info.resources.levels; ++level) { |