mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 22:41:25 +12: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();
|
//VkAllocationCallbacks default_callbacks();
|
||||||
|
|
||||||
enum driver_vendor
|
enum class driver_vendor
|
||||||
{
|
{
|
||||||
unknown,
|
unknown,
|
||||||
AMD,
|
AMD,
|
||||||
|
@ -95,6 +95,12 @@ namespace vk
|
||||||
NV_turing
|
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 context;
|
||||||
class render_device;
|
class render_device;
|
||||||
class swap_chain_image;
|
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,
|
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)
|
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);
|
auto found = views.equal_range(remap_encoding);
|
||||||
for (auto It = found.first; It != found.second; ++It)
|
for (auto It = found.first; It != found.second; ++It)
|
||||||
{
|
{
|
||||||
|
@ -1417,17 +1434,21 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
VkComponentMapping real_mapping;
|
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;
|
real_mapping = native_component_map;
|
||||||
}
|
break;
|
||||||
else
|
default:
|
||||||
{
|
|
||||||
real_mapping = vk::apply_swizzle_remap
|
real_mapping = vk::apply_swizzle_remap
|
||||||
(
|
(
|
||||||
{ native_component_map.a, native_component_map.r, native_component_map.g, native_component_map.b },
|
{ native_component_map.a, native_component_map.r, native_component_map.g, native_component_map.b },
|
||||||
remap
|
remap
|
||||||
);
|
);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto range = vk::get_image_subresource_range(0, 0, info.arrayLayers, info.mipLevels, aspect() & mask);
|
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.gamma = gamma;
|
||||||
config.limit_range = limited_rgb? 1 : 0;
|
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,
|
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
|
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
|
else
|
||||||
{
|
{
|
||||||
if (remap_encoding == 0xDEADBEEF)
|
return resolve_surface->get_view(remap_encoding, remap, mask);
|
||||||
{
|
|
||||||
// Special encoding to skip the resolve target fetch
|
|
||||||
remap_encoding = 0xAAE4;
|
|
||||||
}
|
|
||||||
|
|
||||||
return vk::viewable_image::get_view(remap_encoding, remap, mask);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,8 +117,8 @@ namespace vk
|
||||||
|
|
||||||
void bind_resources() override
|
void bind_resources() override
|
||||||
{
|
{
|
||||||
auto msaa_view = multisampled->get_view(0xDEADBEEF, rsx::default_remap_vector);
|
auto msaa_view = multisampled->get_view(VK_REMAP_VIEW_MULTISAMPLED, rsx::default_remap_vector);
|
||||||
auto resolved_view = resolve->get_view(0xAAE4, 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, 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);
|
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)
|
void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass)
|
||||||
{
|
{
|
||||||
update_sample_configuration(msaa_image);
|
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(
|
overlay_pass::run(
|
||||||
cmd,
|
cmd,
|
||||||
|
@ -301,7 +301,7 @@ namespace vk
|
||||||
renderpass_config.set_multisample_shading_rate(1.f);
|
renderpass_config.set_multisample_shading_rate(1.f);
|
||||||
update_sample_configuration(msaa_image);
|
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(
|
overlay_pass::run(
|
||||||
cmd,
|
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)
|
void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass)
|
||||||
{
|
{
|
||||||
update_sample_configuration(msaa_image);
|
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.width = resolve_image->width();
|
||||||
region.rect.extent.height = resolve_image->height();
|
region.rect.extent.height = resolve_image->height();
|
||||||
|
@ -431,7 +431,7 @@ namespace vk
|
||||||
renderpass_config.set_multisample_shading_rate(1.f);
|
renderpass_config.set_multisample_shading_rate(1.f);
|
||||||
update_sample_configuration(msaa_image);
|
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.width = resolve_image->width();
|
||||||
region.rect.extent.height = resolve_image->height();
|
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)
|
void run(vk::command_buffer& cmd, vk::viewable_image* msaa_image, vk::viewable_image* resolve_image, VkRenderPass render_pass)
|
||||||
{
|
{
|
||||||
update_sample_configuration(msaa_image);
|
update_sample_configuration(msaa_image);
|
||||||
auto depth_view = msaa_image->get_view(0xDEADBEEF, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_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(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);
|
||||||
|
|
||||||
overlay_pass::run(
|
overlay_pass::run(
|
||||||
cmd,
|
cmd,
|
||||||
|
@ -520,8 +520,8 @@ namespace vk
|
||||||
renderpass_config.set_multisample_shading_rate(1.f);
|
renderpass_config.set_multisample_shading_rate(1.f);
|
||||||
update_sample_configuration(msaa_image);
|
update_sample_configuration(msaa_image);
|
||||||
|
|
||||||
auto depth_view = resolve_image->get_view(0xAAE4, rsx::default_remap_vector, VK_IMAGE_ASPECT_DEPTH_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(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);
|
||||||
|
|
||||||
overlay_pass::run(
|
overlay_pass::run(
|
||||||
cmd,
|
cmd,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue