summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2020-04-06 09:21:11 -0400
committerGravatar GitHub2020-04-06 09:21:11 -0400
commit588a20be3fca40746c965ea7831177f5c894ebee (patch)
tree42848be537f341aba483d13e44a637a01e3e4e09 /src/video_core/renderer_vulkan
parentMerge pull request #3592 from ReinUsesLisp/ipa (diff)
parentgl_texture_cache: Fix software ASTC fallback (diff)
downloadyuzu-588a20be3fca40746c965ea7831177f5c894ebee.tar.gz
yuzu-588a20be3fca40746c965ea7831177f5c894ebee.tar.xz
yuzu-588a20be3fca40746c965ea7831177f5c894ebee.zip
Merge pull request #3513 from ReinUsesLisp/native-astc
video_core: Use native ASTC when available
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_device.cpp45
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp34
2 files changed, 46 insertions, 33 deletions
diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp
index 28d2fbc4f..7aafb5e59 100644
--- a/src/video_core/renderer_vulkan/vk_device.cpp
+++ b/src/video_core/renderer_vulkan/vk_device.cpp
@@ -237,18 +237,21 @@ void VKDevice::ReportLoss() const {
237 237
238bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features, 238bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features,
239 const vk::DispatchLoaderDynamic& dldi) const { 239 const vk::DispatchLoaderDynamic& dldi) const {
240 // Disable for now to avoid converting ASTC twice.
241 return false;
242 static constexpr std::array astc_formats = { 240 static constexpr std::array astc_formats = {
243 vk::Format::eAstc4x4SrgbBlock, vk::Format::eAstc8x8SrgbBlock, 241 vk::Format::eAstc4x4UnormBlock, vk::Format::eAstc4x4SrgbBlock,
244 vk::Format::eAstc8x5SrgbBlock, vk::Format::eAstc5x4SrgbBlock, 242 vk::Format::eAstc5x4UnormBlock, vk::Format::eAstc5x4SrgbBlock,
245 vk::Format::eAstc5x5UnormBlock, vk::Format::eAstc5x5SrgbBlock, 243 vk::Format::eAstc5x5UnormBlock, vk::Format::eAstc5x5SrgbBlock,
246 vk::Format::eAstc10x8UnormBlock, vk::Format::eAstc10x8SrgbBlock, 244 vk::Format::eAstc6x5UnormBlock, vk::Format::eAstc6x5SrgbBlock,
247 vk::Format::eAstc6x6UnormBlock, vk::Format::eAstc6x6SrgbBlock, 245 vk::Format::eAstc6x6UnormBlock, vk::Format::eAstc6x6SrgbBlock,
248 vk::Format::eAstc10x10UnormBlock, vk::Format::eAstc10x10SrgbBlock, 246 vk::Format::eAstc8x5UnormBlock, vk::Format::eAstc8x5SrgbBlock,
249 vk::Format::eAstc12x12UnormBlock, vk::Format::eAstc12x12SrgbBlock,
250 vk::Format::eAstc8x6UnormBlock, vk::Format::eAstc8x6SrgbBlock, 247 vk::Format::eAstc8x6UnormBlock, vk::Format::eAstc8x6SrgbBlock,
251 vk::Format::eAstc6x5UnormBlock, vk::Format::eAstc6x5SrgbBlock}; 248 vk::Format::eAstc8x8UnormBlock, vk::Format::eAstc8x8SrgbBlock,
249 vk::Format::eAstc10x5UnormBlock, vk::Format::eAstc10x5SrgbBlock,
250 vk::Format::eAstc10x6UnormBlock, vk::Format::eAstc10x6SrgbBlock,
251 vk::Format::eAstc10x8UnormBlock, vk::Format::eAstc10x8SrgbBlock,
252 vk::Format::eAstc10x10UnormBlock, vk::Format::eAstc10x10SrgbBlock,
253 vk::Format::eAstc12x10UnormBlock, vk::Format::eAstc12x10SrgbBlock,
254 vk::Format::eAstc12x12UnormBlock, vk::Format::eAstc12x12SrgbBlock};
252 if (!features.textureCompressionASTC_LDR) { 255 if (!features.textureCompressionASTC_LDR) {
253 return false; 256 return false;
254 } 257 }
@@ -572,24 +575,34 @@ std::unordered_map<vk::Format, vk::FormatProperties> VKDevice::GetFormatProperti
572 vk::Format::eBc2SrgbBlock, 575 vk::Format::eBc2SrgbBlock,
573 vk::Format::eBc3SrgbBlock, 576 vk::Format::eBc3SrgbBlock,
574 vk::Format::eBc7SrgbBlock, 577 vk::Format::eBc7SrgbBlock,
578 vk::Format::eAstc4x4UnormBlock,
575 vk::Format::eAstc4x4SrgbBlock, 579 vk::Format::eAstc4x4SrgbBlock,
576 vk::Format::eAstc8x8SrgbBlock, 580 vk::Format::eAstc5x4UnormBlock,
577 vk::Format::eAstc8x5SrgbBlock,
578 vk::Format::eAstc5x4SrgbBlock, 581 vk::Format::eAstc5x4SrgbBlock,
579 vk::Format::eAstc5x5UnormBlock, 582 vk::Format::eAstc5x5UnormBlock,
580 vk::Format::eAstc5x5SrgbBlock, 583 vk::Format::eAstc5x5SrgbBlock,
581 vk::Format::eAstc10x8UnormBlock, 584 vk::Format::eAstc6x5UnormBlock,
582 vk::Format::eAstc10x8SrgbBlock, 585 vk::Format::eAstc6x5SrgbBlock,
583 vk::Format::eAstc6x6UnormBlock, 586 vk::Format::eAstc6x6UnormBlock,
584 vk::Format::eAstc6x6SrgbBlock, 587 vk::Format::eAstc6x6SrgbBlock,
588 vk::Format::eAstc8x5UnormBlock,
589 vk::Format::eAstc8x5SrgbBlock,
590 vk::Format::eAstc8x6UnormBlock,
591 vk::Format::eAstc8x6SrgbBlock,
592 vk::Format::eAstc8x8UnormBlock,
593 vk::Format::eAstc8x8SrgbBlock,
594 vk::Format::eAstc10x5UnormBlock,
595 vk::Format::eAstc10x5SrgbBlock,
596 vk::Format::eAstc10x6UnormBlock,
597 vk::Format::eAstc10x6SrgbBlock,
598 vk::Format::eAstc10x8UnormBlock,
599 vk::Format::eAstc10x8SrgbBlock,
585 vk::Format::eAstc10x10UnormBlock, 600 vk::Format::eAstc10x10UnormBlock,
586 vk::Format::eAstc10x10SrgbBlock, 601 vk::Format::eAstc10x10SrgbBlock,
602 vk::Format::eAstc12x10UnormBlock,
603 vk::Format::eAstc12x10SrgbBlock,
587 vk::Format::eAstc12x12UnormBlock, 604 vk::Format::eAstc12x12UnormBlock,
588 vk::Format::eAstc12x12SrgbBlock, 605 vk::Format::eAstc12x12SrgbBlock,
589 vk::Format::eAstc8x6UnormBlock,
590 vk::Format::eAstc8x6SrgbBlock,
591 vk::Format::eAstc6x5UnormBlock,
592 vk::Format::eAstc6x5SrgbBlock,
593 vk::Format::eE5B9G9R9UfloatPack32}; 606 vk::Format::eE5B9G9R9UfloatPack32};
594 std::unordered_map<vk::Format, vk::FormatProperties> format_properties; 607 std::unordered_map<vk::Format, vk::FormatProperties> format_properties;
595 for (const auto format : formats) { 608 for (const auto format : formats) {
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 26175921b..5b9b39670 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -35,7 +35,6 @@ using VideoCore::MortonSwizzleMode;
35 35
36using Tegra::Texture::SwizzleSource; 36using Tegra::Texture::SwizzleSource;
37using VideoCore::Surface::PixelFormat; 37using VideoCore::Surface::PixelFormat;
38using VideoCore::Surface::SurfaceCompression;
39using VideoCore::Surface::SurfaceTarget; 38using VideoCore::Surface::SurfaceTarget;
40 39
41namespace { 40namespace {
@@ -96,9 +95,10 @@ vk::ImageViewType GetImageViewType(SurfaceTarget target) {
96 return {}; 95 return {};
97} 96}
98 97
99UniqueBuffer CreateBuffer(const VKDevice& device, const SurfaceParams& params) { 98UniqueBuffer CreateBuffer(const VKDevice& device, const SurfaceParams& params,
99 std::size_t host_memory_size) {
100 // TODO(Rodrigo): Move texture buffer creation to the buffer cache 100 // TODO(Rodrigo): Move texture buffer creation to the buffer cache
101 const vk::BufferCreateInfo buffer_ci({}, params.GetHostSizeInBytes(), 101 const vk::BufferCreateInfo buffer_ci({}, host_memory_size,
102 vk::BufferUsageFlagBits::eUniformTexelBuffer | 102 vk::BufferUsageFlagBits::eUniformTexelBuffer |
103 vk::BufferUsageFlagBits::eTransferSrc | 103 vk::BufferUsageFlagBits::eTransferSrc |
104 vk::BufferUsageFlagBits::eTransferDst, 104 vk::BufferUsageFlagBits::eTransferDst,
@@ -110,12 +110,13 @@ UniqueBuffer CreateBuffer(const VKDevice& device, const SurfaceParams& params) {
110 110
111vk::BufferViewCreateInfo GenerateBufferViewCreateInfo(const VKDevice& device, 111vk::BufferViewCreateInfo GenerateBufferViewCreateInfo(const VKDevice& device,
112 const SurfaceParams& params, 112 const SurfaceParams& params,
113 vk::Buffer buffer) { 113 vk::Buffer buffer,
114 std::size_t host_memory_size) {
114 ASSERT(params.IsBuffer()); 115 ASSERT(params.IsBuffer());
115 116
116 const auto format = 117 const auto format =
117 MaxwellToVK::SurfaceFormat(device, FormatType::Buffer, params.pixel_format).format; 118 MaxwellToVK::SurfaceFormat(device, FormatType::Buffer, params.pixel_format).format;
118 return vk::BufferViewCreateInfo({}, buffer, format, 0, params.GetHostSizeInBytes()); 119 return vk::BufferViewCreateInfo({}, buffer, format, 0, host_memory_size);
119} 120}
120 121
121vk::ImageCreateInfo GenerateImageCreateInfo(const VKDevice& device, const SurfaceParams& params) { 122vk::ImageCreateInfo GenerateImageCreateInfo(const VKDevice& device, const SurfaceParams& params) {
@@ -169,14 +170,15 @@ CachedSurface::CachedSurface(Core::System& system, const VKDevice& device,
169 VKResourceManager& resource_manager, VKMemoryManager& memory_manager, 170 VKResourceManager& resource_manager, VKMemoryManager& memory_manager,
170 VKScheduler& scheduler, VKStagingBufferPool& staging_pool, 171 VKScheduler& scheduler, VKStagingBufferPool& staging_pool,
171 GPUVAddr gpu_addr, const SurfaceParams& params) 172 GPUVAddr gpu_addr, const SurfaceParams& params)
172 : SurfaceBase<View>{gpu_addr, params}, system{system}, device{device}, 173 : SurfaceBase<View>{gpu_addr, params, device.IsOptimalAstcSupported()}, system{system},
173 resource_manager{resource_manager}, memory_manager{memory_manager}, scheduler{scheduler}, 174 device{device}, resource_manager{resource_manager},
174 staging_pool{staging_pool} { 175 memory_manager{memory_manager}, scheduler{scheduler}, staging_pool{staging_pool} {
175 if (params.IsBuffer()) { 176 if (params.IsBuffer()) {
176 buffer = CreateBuffer(device, params); 177 buffer = CreateBuffer(device, params, host_memory_size);
177 commit = memory_manager.Commit(*buffer, false); 178 commit = memory_manager.Commit(*buffer, false);
178 179
179 const auto buffer_view_ci = GenerateBufferViewCreateInfo(device, params, *buffer); 180 const auto buffer_view_ci =
181 GenerateBufferViewCreateInfo(device, params, *buffer, host_memory_size);
180 format = buffer_view_ci.format; 182 format = buffer_view_ci.format;
181 183
182 const auto dev = device.GetLogical(); 184 const auto dev = device.GetLogical();
@@ -255,7 +257,7 @@ void CachedSurface::UploadBuffer(const std::vector<u8>& staging_buffer) {
255 std::memcpy(src_buffer.commit->Map(host_memory_size), staging_buffer.data(), host_memory_size); 257 std::memcpy(src_buffer.commit->Map(host_memory_size), staging_buffer.data(), host_memory_size);
256 258
257 scheduler.Record([src_buffer = *src_buffer.handle, dst_buffer = *buffer, 259 scheduler.Record([src_buffer = *src_buffer.handle, dst_buffer = *buffer,
258 size = params.GetHostSizeInBytes()](auto cmdbuf, auto& dld) { 260 size = host_memory_size](auto cmdbuf, auto& dld) {
259 const vk::BufferCopy copy(0, 0, size); 261 const vk::BufferCopy copy(0, 0, size);
260 cmdbuf.copyBuffer(src_buffer, dst_buffer, {copy}, dld); 262 cmdbuf.copyBuffer(src_buffer, dst_buffer, {copy}, dld);
261 263
@@ -299,10 +301,7 @@ void CachedSurface::UploadImage(const std::vector<u8>& staging_buffer) {
299 301
300vk::BufferImageCopy CachedSurface::GetBufferImageCopy(u32 level) const { 302vk::BufferImageCopy CachedSurface::GetBufferImageCopy(u32 level) const {
301 const u32 vk_depth = params.target == SurfaceTarget::Texture3D ? params.GetMipDepth(level) : 1; 303 const u32 vk_depth = params.target == SurfaceTarget::Texture3D ? params.GetMipDepth(level) : 1;
302 const auto compression_type = params.GetCompressionType(); 304 const std::size_t mip_offset = params.GetHostMipmapLevelOffset(level, is_converted);
303 const std::size_t mip_offset = compression_type == SurfaceCompression::Converted
304 ? params.GetConvertedMipmapOffset(level)
305 : params.GetHostMipmapLevelOffset(level);
306 305
307 return vk::BufferImageCopy( 306 return vk::BufferImageCopy(
308 mip_offset, 0, 0, 307 mip_offset, 0, 0,
@@ -390,8 +389,9 @@ VKTextureCache::VKTextureCache(Core::System& system, VideoCore::RasterizerInterf
390 const VKDevice& device, VKResourceManager& resource_manager, 389 const VKDevice& device, VKResourceManager& resource_manager,
391 VKMemoryManager& memory_manager, VKScheduler& scheduler, 390 VKMemoryManager& memory_manager, VKScheduler& scheduler,
392 VKStagingBufferPool& staging_pool) 391 VKStagingBufferPool& staging_pool)
393 : TextureCache(system, rasterizer), device{device}, resource_manager{resource_manager}, 392 : TextureCache(system, rasterizer, device.IsOptimalAstcSupported()), device{device},
394 memory_manager{memory_manager}, scheduler{scheduler}, staging_pool{staging_pool} {} 393 resource_manager{resource_manager}, memory_manager{memory_manager}, scheduler{scheduler},
394 staging_pool{staging_pool} {}
395 395
396VKTextureCache::~VKTextureCache() = default; 396VKTextureCache::~VKTextureCache() = default;
397 397