mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-21 00:39:53 +00:00
vk: Fix some spec violations
This commit is contained in:
parent
88c20afd3a
commit
1c439f6198
@ -32,8 +32,8 @@ namespace vk
|
||||
{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_MAX_COMPUTE_TASKS }
|
||||
};
|
||||
|
||||
//Reserve descriptor pools
|
||||
m_descriptor_pool.create(*get_current_renderer(), descriptor_pool_sizes, 1);
|
||||
// Reserve descriptor pools
|
||||
m_descriptor_pool.create(*get_current_renderer(), descriptor_pool_sizes, 2);
|
||||
|
||||
std::vector<VkDescriptorSetLayoutBinding> bindings(2);
|
||||
|
||||
|
@ -150,7 +150,7 @@ namespace vk
|
||||
void copy_image_to_buffer(VkCommandBuffer cmd, const vk::image* src, const vk::buffer* dst, const VkBufferImageCopy& region);
|
||||
void copy_buffer_to_image(VkCommandBuffer cmd, const vk::buffer* src, const vk::image* dst, const VkBufferImageCopy& region);
|
||||
|
||||
void copy_image_typeless(const command_buffer &cmd, const image *src, const image *dst, const areai& src_rect, const areai& dst_rect,
|
||||
void copy_image_typeless(const command_buffer &cmd, image *src, image *dst, const areai& src_rect, const areai& dst_rect,
|
||||
u32 mipmaps, VkImageAspectFlags src_aspect, VkImageAspectFlags dst_aspect,
|
||||
VkImageAspectFlags src_transfer_mask = 0xFF, VkImageAspectFlags dst_transfer_mask = 0xFF);
|
||||
|
||||
@ -1067,13 +1067,13 @@ namespace vk
|
||||
return m_storage_aspect;
|
||||
}
|
||||
|
||||
void push_layout(command_buffer& cmd, VkImageLayout layout)
|
||||
void push_layout(VkCommandBuffer cmd, VkImageLayout layout)
|
||||
{
|
||||
m_layout_stack.push(current_layout);
|
||||
change_image_layout(cmd, this, layout);
|
||||
}
|
||||
|
||||
void pop_layout(command_buffer& cmd)
|
||||
void pop_layout(VkCommandBuffer cmd)
|
||||
{
|
||||
verify(HERE), !m_layout_stack.empty();
|
||||
|
||||
|
@ -19,9 +19,6 @@ namespace vk
|
||||
u16 surface_width = 0;
|
||||
u16 surface_height = 0;
|
||||
|
||||
VkImageAspectFlags attachment_aspect_flag = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
std::unordered_multimap<u32, std::unique_ptr<vk::image_view>> views;
|
||||
|
||||
u64 frame_tag = 0; // frame id when invalidated, 0 if not invalid
|
||||
|
||||
using viewable_image::viewable_image;
|
||||
@ -53,7 +50,7 @@ namespace vk
|
||||
|
||||
bool is_depth_surface() const override
|
||||
{
|
||||
return !!(attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
return !!(aspect() & VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
}
|
||||
|
||||
bool matches_dimensions(u16 _width, u16 _height) const
|
||||
@ -72,12 +69,12 @@ namespace vk
|
||||
// Initialize memory contents if we did not find anything usable
|
||||
// TODO: Properly sync with Cell
|
||||
|
||||
VkImageSubresourceRange range{ attachment_aspect_flag, 0, 1, 0, 1 };
|
||||
VkImageSubresourceRange range{ aspect(), 0, 1, 0, 1 };
|
||||
const auto old_layout = current_layout;
|
||||
|
||||
change_image_layout(cmd, this, VK_IMAGE_LAYOUT_GENERAL, range);
|
||||
|
||||
if (attachment_aspect_flag & VK_IMAGE_ASPECT_COLOR_BIT)
|
||||
if (aspect() & VK_IMAGE_ASPECT_COLOR_BIT)
|
||||
{
|
||||
VkClearColorValue color{};
|
||||
vkCmdClearColorImage(cmd, value, VK_IMAGE_LAYOUT_GENERAL, &color, 1, &range);
|
||||
@ -117,12 +114,12 @@ namespace vk
|
||||
else
|
||||
{
|
||||
if (!formats_are_bitcast_compatible(format(), src_texture->format()) ||
|
||||
src_texture->attachment_aspect_flag != attachment_aspect_flag)
|
||||
src_texture->aspect() != aspect())
|
||||
{
|
||||
typeless_info.src_is_typeless = true;
|
||||
typeless_info.src_context = rsx::texture_upload_context::framebuffer_storage;
|
||||
typeless_info.src_native_format_override = (u32)info.format;
|
||||
typeless_info.src_is_depth = !!(src_texture->attachment_aspect_flag & VK_IMAGE_ASPECT_DEPTH_BIT);
|
||||
typeless_info.src_is_depth = src_texture->is_depth_surface();
|
||||
typeless_info.src_scaling_hint = f32(src_bpp) / dst_bpp;
|
||||
}
|
||||
}
|
||||
@ -236,7 +233,6 @@ namespace rsx
|
||||
if (format == rsx::surface_depth_format::z24s8)
|
||||
ds->native_pitch *= 2;
|
||||
|
||||
ds->attachment_aspect_flag = range.aspectMask;
|
||||
ds->rsx_pitch = (u16)pitch;
|
||||
ds->surface_width = (u16)width;
|
||||
ds->surface_height = (u16)height;
|
||||
@ -303,8 +299,7 @@ namespace rsx
|
||||
|
||||
static void prepare_rtt_for_drawing(vk::command_buffer& cmd, vk::render_target *surface)
|
||||
{
|
||||
VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag);
|
||||
change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, range);
|
||||
surface->change_layout(cmd, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
|
||||
|
||||
//Reset deref count
|
||||
surface->deref_count = 0;
|
||||
@ -313,14 +308,12 @@ namespace rsx
|
||||
|
||||
static void prepare_rtt_for_sampling(vk::command_buffer& cmd, vk::render_target *surface)
|
||||
{
|
||||
VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag);
|
||||
change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range);
|
||||
surface->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
}
|
||||
|
||||
static void prepare_ds_for_drawing(vk::command_buffer& cmd, vk::render_target *surface)
|
||||
{
|
||||
VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag);
|
||||
change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, range);
|
||||
surface->change_layout(cmd, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
||||
|
||||
//Reset deref count
|
||||
surface->deref_count = 0;
|
||||
@ -329,8 +322,7 @@ namespace rsx
|
||||
|
||||
static void prepare_ds_for_sampling(vk::command_buffer& cmd, vk::render_target *surface)
|
||||
{
|
||||
VkImageSubresourceRange range = vk::get_image_subresource_range(0, 0, 1, 1, surface->attachment_aspect_flag);
|
||||
change_image_layout(cmd, surface, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, range);
|
||||
surface->change_layout(cmd, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
}
|
||||
|
||||
static bool surface_is_pitch_compatible(const std::unique_ptr<vk::render_target> &surface, size_t pitch)
|
||||
|
@ -58,6 +58,10 @@ namespace vk
|
||||
|
||||
void copy_image_to_buffer(VkCommandBuffer cmd, const vk::image* src, const vk::buffer* dst, const VkBufferImageCopy& region)
|
||||
{
|
||||
// Always validate
|
||||
verify("Invalid image layout!" HERE),
|
||||
src->current_layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL || src->current_layout == VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
switch (src->format())
|
||||
{
|
||||
default:
|
||||
@ -118,6 +122,10 @@ namespace vk
|
||||
|
||||
void copy_buffer_to_image(VkCommandBuffer cmd, const vk::buffer* src, const vk::image* dst, const VkBufferImageCopy& region)
|
||||
{
|
||||
// Always validate
|
||||
verify("Invalid image layout!" HERE),
|
||||
dst->current_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || dst->current_layout == VK_IMAGE_LAYOUT_GENERAL;
|
||||
|
||||
switch (dst->format())
|
||||
{
|
||||
default:
|
||||
@ -177,7 +185,7 @@ namespace vk
|
||||
}
|
||||
}
|
||||
|
||||
void copy_image_typeless(const vk::command_buffer& cmd, const vk::image* src, const vk::image* dst, const areai& src_rect, const areai& dst_rect,
|
||||
void copy_image_typeless(const vk::command_buffer& cmd, vk::image* src, vk::image* dst, const areai& src_rect, const areai& dst_rect,
|
||||
u32 mipmaps, VkImageAspectFlags src_aspect, VkImageAspectFlags dst_aspect, VkImageAspectFlags src_transfer_mask, VkImageAspectFlags dst_transfer_mask)
|
||||
{
|
||||
if (src->info.format == dst->info.format)
|
||||
@ -186,16 +194,15 @@ namespace vk
|
||||
return;
|
||||
}
|
||||
|
||||
auto preferred_src_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
|
||||
auto preferred_dst_format = (src == dst) ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
|
||||
const auto src_layout = src->current_layout;
|
||||
const auto dst_layout = dst->current_layout;
|
||||
|
||||
if (src->current_layout != preferred_src_format)
|
||||
change_image_layout(cmd, src->value, src_layout, preferred_src_format, vk::get_image_subresource_range(0, 0, 1, 1, src_aspect));
|
||||
|
||||
if (dst->current_layout != preferred_dst_format && src != dst)
|
||||
change_image_layout(cmd, dst->value, dst_layout, preferred_dst_format, vk::get_image_subresource_range(0, 0, 1, 1, dst_aspect));
|
||||
if (LIKELY(src != dst))
|
||||
{
|
||||
src->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||
dst->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
src->push_layout(cmd, VK_IMAGE_LAYOUT_GENERAL);
|
||||
}
|
||||
|
||||
auto scratch_buf = vk::get_scratch_buffer();
|
||||
VkBufferImageCopy src_copy{}, dst_copy{};
|
||||
@ -264,11 +271,8 @@ namespace vk
|
||||
dst_copy.imageSubresource.mipLevel++;
|
||||
}
|
||||
|
||||
if (src_layout != preferred_src_format)
|
||||
change_image_layout(cmd, src->value, preferred_src_format, src_layout, vk::get_image_subresource_range(0, 0, 1, 1, src_aspect));
|
||||
|
||||
if (dst_layout != preferred_dst_format && src != dst)
|
||||
change_image_layout(cmd, dst->value, preferred_dst_format, dst_layout, vk::get_image_subresource_range(0, 0, 1, 1, dst_aspect));
|
||||
src->pop_layout(cmd);
|
||||
if (src != dst) dst->pop_layout(cmd);
|
||||
}
|
||||
|
||||
void copy_image(VkCommandBuffer cmd, VkImage src, VkImage dst, VkImageLayout srcLayout, VkImageLayout dstLayout,
|
||||
@ -651,10 +655,9 @@ namespace vk
|
||||
const auto scratch_buf = vk::get_scratch_buffer();
|
||||
const auto data_length = src->info.extent.width * src->info.extent.height * 4;
|
||||
|
||||
const auto current_layout = src->current_layout;
|
||||
vk::change_image_layout(cmd, real_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 });
|
||||
src->push_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
|
||||
vkCmdCopyImageToBuffer(cmd, src->value, src->current_layout, scratch_buf->value, 1, ©);
|
||||
vk::change_image_layout(cmd, real_src, current_layout, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 });
|
||||
src->pop_layout(cmd);
|
||||
|
||||
vk::insert_buffer_memory_barrier(cmd, scratch_buf->value, 0, data_length,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
|
||||
@ -667,8 +670,7 @@ namespace vk
|
||||
VK_ACCESS_SHADER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
|
||||
|
||||
real_src = vk::get_typeless_helper(src->info.format, src->width(), src->height());
|
||||
vk::change_image_layout(cmd, real_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 });
|
||||
|
||||
real_src->change_layout(cmd, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
vkCmdCopyBufferToImage(cmd, scratch_buf->value, real_src->value, real_src->current_layout, 1, ©);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user