diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 3458494b16..f6e9b90953 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -71,7 +71,7 @@ namespace vk //VkAllocationCallbacks default_callbacks(); - enum driver_vendor + enum class driver_vendor { unknown, AMD, @@ -95,6 +95,12 @@ namespace vk NV_turing }; + enum // special remap_encoding enums + { + VK_REMAP_IDENTITY = 0xCAFEBABE, // Special view encoding to return an identity image view + VK_REMAP_VIEW_MULTISAMPLED = 0xDEADBEEF // Special encoding for multisampled images; returns a multisampled image view + }; + class context; class render_device; class swap_chain_image; @@ -1407,6 +1413,17 @@ private: virtual image_view* get_view(u32 remap_encoding, const std::pair, std::array>& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) { + if (remap_encoding == VK_REMAP_IDENTITY) + { + if (native_component_map.a == VK_COMPONENT_SWIZZLE_A && + native_component_map.r == VK_COMPONENT_SWIZZLE_R && + native_component_map.g == VK_COMPONENT_SWIZZLE_G && + native_component_map.b == VK_COMPONENT_SWIZZLE_B) + { + remap_encoding = 0xAAE4; + } + } + auto found = views.equal_range(remap_encoding); for (auto It = found.first; It != found.second; ++It) { @@ -1417,17 +1434,21 @@ private: } VkComponentMapping real_mapping; - if (remap_encoding == 0xAAE4) + switch (remap_encoding) { + case VK_REMAP_IDENTITY: + real_mapping = { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY }; + break; + case 0xAAE4: real_mapping = native_component_map; - } - else - { + break; + default: real_mapping = vk::apply_swizzle_remap ( { native_component_map.a, native_component_map.r, native_component_map.g, native_component_map.b }, remap ); + break; } const auto range = vk::get_image_subresource_range(0, 0, info.arrayLayers, info.mipLevels, aspect() & mask); diff --git a/rpcs3/Emu/RSX/VK/VKOverlays.h b/rpcs3/Emu/RSX/VK/VKOverlays.h index 112cd70830..2399689b35 100644 --- a/rpcs3/Emu/RSX/VK/VKOverlays.h +++ b/rpcs3/Emu/RSX/VK/VKOverlays.h @@ -1056,7 +1056,7 @@ namespace vk config.gamma = gamma; config.limit_range = limited_rgb? 1 : 0; - overlay_pass::run(cmd, viewport, target, { src->get_view(0xAAE4, rsx::default_remap_vector) }, render_pass); + overlay_pass::run(cmd, viewport, target, { src->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector) }, render_pass); } }; } diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 58308b5927..c3da1301df 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -350,19 +350,19 @@ namespace vk image_view* get_view(u32 remap_encoding, const std::pair, std::array>& remap, VkImageAspectFlags mask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT) override { - if (remap_encoding != 0xDEADBEEF && resolve_surface) + if (remap_encoding == VK_REMAP_VIEW_MULTISAMPLED) { - return resolve_surface->get_view(remap_encoding, remap, mask); + // Special remap flag, intercept here + return vk::viewable_image::get_view(VK_REMAP_IDENTITY, remap, mask); + } + + if (LIKELY(!resolve_surface)) + { + return vk::viewable_image::get_view(remap_encoding, remap, mask); } else { - if (remap_encoding == 0xDEADBEEF) - { - // Special encoding to skip the resolve target fetch - remap_encoding = 0xAAE4; - } - - return vk::viewable_image::get_view(remap_encoding, remap, mask); + return resolve_surface->get_view(remap_encoding, remap, mask); } } diff --git a/rpcs3/Emu/RSX/VK/VKResolveHelper.h b/rpcs3/Emu/RSX/VK/VKResolveHelper.h index 9951593307..0b0997e6b8 100644 --- a/rpcs3/Emu/RSX/VK/VKResolveHelper.h +++ b/rpcs3/Emu/RSX/VK/VKResolveHelper.h @@ -117,8 +117,8 @@ namespace vk void bind_resources() override { - auto msaa_view = multisampled->get_view(0xDEADBEEF, rsx::default_remap_vector); - auto resolved_view = resolve->get_view(0xAAE4, rsx::default_remap_vector); + auto msaa_view = multisampled->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector); + auto resolved_view = resolve->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector); m_program->bind_uniform({ VK_NULL_HANDLE, msaa_view->value, multisampled->current_layout }, "multisampled", VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, m_descriptor_set); m_program->bind_uniform({ VK_NULL_HANDLE, resolved_view->value, resolve->current_layout }, "resolve", VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, m_descriptor_set); } @@ -270,7 +270,7 @@ namespace vk void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass) { update_sample_configuration(msaa_image); - auto src_view = msaa_image->get_view(0xDEADBEEF, rsx::default_remap_vector); + auto src_view = msaa_image->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector); overlay_pass::run( cmd, @@ -301,7 +301,7 @@ namespace vk renderpass_config.set_multisample_shading_rate(1.f); update_sample_configuration(msaa_image); - auto src_view = resolve_image->get_view(0xAAE4, rsx::default_remap_vector); + auto src_view = resolve_image->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector); overlay_pass::run( cmd, @@ -363,7 +363,7 @@ namespace vk void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass) { update_sample_configuration(msaa_image); - auto stencil_view = msaa_image->get_view(0xDEADBEEF, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); + auto stencil_view = msaa_image->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); region.rect.extent.width = resolve_image->width(); region.rect.extent.height = resolve_image->height(); @@ -431,7 +431,7 @@ namespace vk renderpass_config.set_multisample_shading_rate(1.f); update_sample_configuration(msaa_image); - auto stencil_view = resolve_image->get_view(0xAAE4, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); + auto stencil_view = resolve_image->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); region.rect.extent.width = resolve_image->width(); region.rect.extent.height = resolve_image->height(); @@ -475,8 +475,8 @@ namespace vk void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass) { update_sample_configuration(msaa_image); - auto depth_view = msaa_image->get_view(0xDEADBEEF, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_BIT); - auto stencil_view = msaa_image->get_view(0xDEADBEEF, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); + auto depth_view = msaa_image->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_BIT); + auto stencil_view = msaa_image->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); overlay_pass::run( cmd, @@ -520,8 +520,8 @@ namespace vk renderpass_config.set_multisample_shading_rate(1.f); update_sample_configuration(msaa_image); - auto depth_view = resolve_image->get_view(0xAAE4, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_BIT); - auto stencil_view = resolve_image->get_view(0xAAE4, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); + auto depth_view = resolve_image->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_BIT); + auto stencil_view = resolve_image->get_view(VK_REMAP_IDENTITY, rsx::default_remap_vector, VK_IMAGE_ASPECT_STENCIL_BIT); overlay_pass::run( cmd,