early-access version 2343
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 2342. | ||||
| This is the source code for early-access 2343. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
| @@ -518,53 +518,6 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb | ||||
|     scheduler.InvalidateState(); | ||||
| } | ||||
|  | ||||
| void BlitImageHelper::ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | ||||
|                                    ImageView& src_image_view, u32 up_scale, u32 down_shift) { | ||||
|     const VkPipelineLayout layout = *one_texture_pipeline_layout; | ||||
|     const VkImageView src_view = src_image_view.ColorView(); | ||||
|     const VkSampler sampler = *nearest_sampler; | ||||
|     const VkExtent2D extent{ | ||||
|         .width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U), | ||||
|         .height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U), | ||||
|     }; | ||||
|     scheduler.RequestRenderpass(dst_framebuffer); | ||||
|     scheduler.Record([pipeline, layout, sampler, src_view, extent, up_scale, down_shift, | ||||
|                       this](vk::CommandBuffer cmdbuf) { | ||||
|         const VkOffset2D offset{ | ||||
|             .x = 0, | ||||
|             .y = 0, | ||||
|         }; | ||||
|         const VkViewport viewport{ | ||||
|             .x = 0.0f, | ||||
|             .y = 0.0f, | ||||
|             .width = static_cast<float>(extent.width), | ||||
|             .height = static_cast<float>(extent.height), | ||||
|             .minDepth = 0.0f, | ||||
|             .maxDepth = 0.0f, | ||||
|         }; | ||||
|         const VkRect2D scissor{ | ||||
|             .offset = offset, | ||||
|             .extent = extent, | ||||
|         }; | ||||
|         const PushConstants push_constants{ | ||||
|             .tex_scale = {viewport.width, viewport.height}, | ||||
|             .tex_offset = {0.0f, 0.0f}, | ||||
|         }; | ||||
|         const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit(); | ||||
|         UpdateOneTextureDescriptorSet(device, descriptor_set, sampler, src_view); | ||||
|  | ||||
|         // TODO: Barriers | ||||
|         cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); | ||||
|         cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set, | ||||
|                                   nullptr); | ||||
|         cmdbuf.SetViewport(0, viewport); | ||||
|         cmdbuf.SetScissor(0, scissor); | ||||
|         cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants); | ||||
|         cmdbuf.Draw(3, 1, 0, 0); | ||||
|     }); | ||||
|     scheduler.InvalidateState(); | ||||
| } | ||||
|  | ||||
| void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | ||||
|                                           ImageView& src_image_view) { | ||||
|     const VkPipelineLayout layout = *two_textures_pipeline_layout; | ||||
|   | ||||
| @@ -60,9 +60,6 @@ private: | ||||
|     void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | ||||
|                  const ImageView& src_image_view); | ||||
|  | ||||
|     void ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | ||||
|                       ImageView& src_image_view, u32 up_scale, u32 down_shift); | ||||
|  | ||||
|     void ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer, | ||||
|                              ImageView& src_image_view); | ||||
|  | ||||
|   | ||||
| @@ -1344,7 +1344,6 @@ bool Image::ScaleUp(bool ignore) { | ||||
|         return false; | ||||
|     } | ||||
|     has_scaled = true; | ||||
|     const auto& device = runtime->device; | ||||
|     if (!scaled_image) { | ||||
|         const bool is_2d = info.type == ImageType::e2D; | ||||
|         const u32 scaled_width = resolution.ScaleUp(info.size.width); | ||||
| @@ -1352,7 +1351,7 @@ bool Image::ScaleUp(bool ignore) { | ||||
|         auto scaled_info = info; | ||||
|         scaled_info.size.width = scaled_width; | ||||
|         scaled_info.size.height = scaled_height; | ||||
|         scaled_image = MakeImage(device, scaled_info); | ||||
|         scaled_image = MakeImage(runtime->device, scaled_info); | ||||
|         auto& allocator = runtime->memory_allocator; | ||||
|         scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal)); | ||||
|         ignore = false; | ||||
| @@ -1361,18 +1360,13 @@ bool Image::ScaleUp(bool ignore) { | ||||
|     if (ignore) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     if (aspect_mask == 0) { | ||||
|         aspect_mask = ImageAspectMask(info.format); | ||||
|     } | ||||
|     static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal; | ||||
|     const PixelFormat format = StorageFormat(info.format); | ||||
|     const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format; | ||||
|     const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; | ||||
|     if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) { | ||||
|         BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution); | ||||
|     } else { | ||||
|     if (NeedsScaleHelper()) { | ||||
|         return BlitScaleHelper(true); | ||||
|     } else { | ||||
|         BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| @@ -1394,15 +1388,10 @@ bool Image::ScaleDown(bool ignore) { | ||||
|     if (aspect_mask == 0) { | ||||
|         aspect_mask = ImageAspectMask(info.format); | ||||
|     } | ||||
|     static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal; | ||||
|     const PixelFormat format = StorageFormat(info.format); | ||||
|     const auto& device = runtime->device; | ||||
|     const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format; | ||||
|     const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; | ||||
|     if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) { | ||||
|         BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false); | ||||
|     } else { | ||||
|     if (NeedsScaleHelper()) { | ||||
|         return BlitScaleHelper(false); | ||||
|     } else { | ||||
|         BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false); | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| @@ -1470,6 +1459,20 @@ bool Image::BlitScaleHelper(bool scale_up) { | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool Image::NeedsScaleHelper() const { | ||||
|     const auto& device = runtime->device; | ||||
|     const bool needs_msaa_helper = info.num_samples > 1 && device.CantBlitMSAA(); | ||||
|     if (needs_msaa_helper) { | ||||
|         return true; | ||||
|     } | ||||
|     static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal; | ||||
|     const PixelFormat format = StorageFormat(info.format); | ||||
|     const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format; | ||||
|     const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; | ||||
|     const bool needs_blit_helper = !device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT); | ||||
|     return needs_blit_helper; | ||||
| } | ||||
|  | ||||
| ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, | ||||
|                      ImageId image_id_, Image& image) | ||||
|     : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, | ||||
|   | ||||
| @@ -149,6 +149,8 @@ public: | ||||
| private: | ||||
|     bool BlitScaleHelper(bool scale_up); | ||||
|  | ||||
|     bool NeedsScaleHelper() const; | ||||
|  | ||||
|     VKScheduler* scheduler{}; | ||||
|     TextureCacheRuntime* runtime{}; | ||||
|  | ||||
|   | ||||
| @@ -638,15 +638,20 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     if (ext_vertex_input_dynamic_state && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { | ||||
|     const bool is_intel_windows = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS; | ||||
|     if (ext_vertex_input_dynamic_state && is_intel_windows) { | ||||
|         LOG_WARNING(Render_Vulkan, "Blacklisting Intel for VK_EXT_vertex_input_dynamic_state"); | ||||
|         ext_vertex_input_dynamic_state = false; | ||||
|     } | ||||
|     if (is_float16_supported && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { | ||||
|     if (is_float16_supported && is_intel_windows) { | ||||
|         // Intel's compiler crashes when using fp16 on Astral Chain, disable it for the time being. | ||||
|         LOG_WARNING(Render_Vulkan, "Blacklisting Intel proprietary from float16 math"); | ||||
|         is_float16_supported = false; | ||||
|     } | ||||
|     if (is_intel_windows) { | ||||
|         LOG_WARNING(Render_Vulkan, "Intel proprietary drivers do not support MSAA image blits"); | ||||
|         cant_blit_msaa = true; | ||||
|     } | ||||
|  | ||||
|     supports_d24_depth = | ||||
|         IsFormatSupported(VK_FORMAT_D24_UNORM_S8_UINT, | ||||
|   | ||||
| @@ -350,6 +350,10 @@ public: | ||||
|         return supports_d24_depth; | ||||
|     } | ||||
|  | ||||
|     bool CantBlitMSAA() const { | ||||
|         return cant_blit_msaa; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     /// Checks if the physical device is suitable. | ||||
|     void CheckSuitability(bool requires_swapchain) const; | ||||
| @@ -443,6 +447,7 @@ private: | ||||
|     bool has_renderdoc{};                   ///< Has RenderDoc attached | ||||
|     bool has_nsight_graphics{};             ///< Has Nsight Graphics attached | ||||
|     bool supports_d24_depth{};              ///< Supports D24 depth buffers. | ||||
|     bool cant_blit_msaa{};                  ///< Does not support MSAA<->MSAA blitting. | ||||
|  | ||||
|     // Telemetry parameters | ||||
|     std::string vendor_name;                       ///< Device's driver name. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user