diff options
| author | 2020-03-14 20:24:54 -0300 | |
|---|---|---|
| committer | 2020-04-01 01:14:04 -0300 | |
| commit | b6571ca9f0be7799856cce76363ab752f478fb4b (patch) | |
| tree | 2f4de71c3540eb1d8d159b0233bebb3fa04d2e6e /src/video_core/renderer_vulkan | |
| parent | gl_device: Detect if ASTC is reported and expose it (diff) | |
| download | yuzu-b6571ca9f0be7799856cce76363ab752f478fb4b.tar.gz yuzu-b6571ca9f0be7799856cce76363ab752f478fb4b.tar.xz yuzu-b6571ca9f0be7799856cce76363ab752f478fb4b.zip | |
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.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 34 |
2 files changed, 17 insertions, 19 deletions
diff --git a/src/video_core/renderer_vulkan/vk_device.cpp b/src/video_core/renderer_vulkan/vk_device.cpp index 28d2fbc4f..0f6f68a49 100644 --- a/src/video_core/renderer_vulkan/vk_device.cpp +++ b/src/video_core/renderer_vulkan/vk_device.cpp | |||
| @@ -237,8 +237,6 @@ void VKDevice::ReportLoss() const { | |||
| 237 | 237 | ||
| 238 | bool VKDevice::IsOptimalAstcSupported(const vk::PhysicalDeviceFeatures& features, | 238 | bool 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::eAstc4x4SrgbBlock, vk::Format::eAstc8x8SrgbBlock, |
| 244 | vk::Format::eAstc8x5SrgbBlock, vk::Format::eAstc5x4SrgbBlock, | 242 | vk::Format::eAstc8x5SrgbBlock, vk::Format::eAstc5x4SrgbBlock, |
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 | ||
| 36 | using Tegra::Texture::SwizzleSource; | 36 | using Tegra::Texture::SwizzleSource; |
| 37 | using VideoCore::Surface::PixelFormat; | 37 | using VideoCore::Surface::PixelFormat; |
| 38 | using VideoCore::Surface::SurfaceCompression; | ||
| 39 | using VideoCore::Surface::SurfaceTarget; | 38 | using VideoCore::Surface::SurfaceTarget; |
| 40 | 39 | ||
| 41 | namespace { | 40 | namespace { |
| @@ -96,9 +95,10 @@ vk::ImageViewType GetImageViewType(SurfaceTarget target) { | |||
| 96 | return {}; | 95 | return {}; |
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | UniqueBuffer CreateBuffer(const VKDevice& device, const SurfaceParams& params) { | 98 | UniqueBuffer 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 | ||
| 111 | vk::BufferViewCreateInfo GenerateBufferViewCreateInfo(const VKDevice& device, | 111 | vk::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 | ||
| 121 | vk::ImageCreateInfo GenerateImageCreateInfo(const VKDevice& device, const SurfaceParams& params) { | 122 | vk::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 | ||
| 300 | vk::BufferImageCopy CachedSurface::GetBufferImageCopy(u32 level) const { | 302 | vk::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 | ||
| 396 | VKTextureCache::~VKTextureCache() = default; | 396 | VKTextureCache::~VKTextureCache() = default; |
| 397 | 397 | ||