mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-20 19:45:20 +00:00
vk: Add explicit support for identity image views
- Allows bypassing all remap shenanigans to make some operations that rely on the raw image to work correctly.
This commit is contained in:
parent
03a2d36c7e
commit
bbed791ee0
4 changed files with 46 additions and 25 deletions
|
@ -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<u8, 4>, std::array<u8, 4>>& 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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -350,19 +350,19 @@ namespace vk
|
|||
image_view* get_view(u32 remap_encoding, const std::pair<std::array<u8, 4>, std::array<u8, 4>>& 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue