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:
kd-11 2019-11-01 17:52:08 +03:00 committed by kd-11
parent 03a2d36c7e
commit bbed791ee0
4 changed files with 46 additions and 25 deletions

View file

@ -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);

View file

@ -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);
}
};
}

View file

@ -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);
}
}

View file

@ -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,