[VK] PR 180 extension (#257)
fyi there is nothing called VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL Co-authored-by: MaranBr <maranbr@eden-emu.dev> Reviewed-on: #257 Reviewed-by: Lizzie <lizzie@eden-emu.dev> Reviewed-by: crueter <crueter@eden-emu.dev> Reviewed-by: Shinmegumi <shinmegumi@eden-emu.dev> Co-authored-by: wildcard <nubieluv@gmail.com> Co-committed-by: wildcard <nubieluv@gmail.com>
This commit is contained in:
parent
bd944b71d5
commit
444b9f361e
2 changed files with 27 additions and 20 deletions
|
@ -1,4 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -518,7 +521,7 @@ void BlitImageHelper::BlitColor(const Framebuffer* dst_framebuffer, VkImageView
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region,
|
scheduler.Record([this, dst_framebuffer, src_image_view, src_image, src_sampler, dst_region,
|
||||||
src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) {
|
src_region, src_size, pipeline, layout](vk::CommandBuffer cmdbuf) {
|
||||||
TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_GENERAL);
|
TransitionImageLayout(cmdbuf, src_image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||||
BeginRenderPass(cmdbuf, dst_framebuffer);
|
BeginRenderPass(cmdbuf, dst_framebuffer);
|
||||||
const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit();
|
const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit();
|
||||||
UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view);
|
UpdateOneTextureDescriptorSet(device, descriptor_set, src_sampler, src_image_view);
|
||||||
|
|
|
@ -270,7 +270,8 @@ void Scheduler::EndPendingOperations() {
|
||||||
EndRenderPass();
|
EndRenderPass();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scheduler::EndRenderPass() {
|
void Scheduler::EndRenderPass()
|
||||||
|
{
|
||||||
if (!state.renderpass) {
|
if (!state.renderpass) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -278,7 +279,8 @@ void Scheduler::EndPendingOperations() {
|
||||||
query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false);
|
query_cache->CounterEnable(VideoCommon::QueryType::ZPassPixelCount64, false);
|
||||||
query_cache->NotifySegment(false);
|
query_cache->NotifySegment(false);
|
||||||
|
|
||||||
Record([num_images = num_renderpass_images, images = renderpass_images,
|
Record([num_images = num_renderpass_images,
|
||||||
|
images = renderpass_images,
|
||||||
ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) {
|
ranges = renderpass_image_ranges](vk::CommandBuffer cmdbuf) {
|
||||||
std::array<VkImageMemoryBarrier, 9> barriers;
|
std::array<VkImageMemoryBarrier, 9> barriers;
|
||||||
VkPipelineStageFlags src_stages = 0;
|
VkPipelineStageFlags src_stages = 0;
|
||||||
|
@ -286,8 +288,9 @@ void Scheduler::EndPendingOperations() {
|
||||||
for (size_t i = 0; i < num_images; ++i) {
|
for (size_t i = 0; i < num_images; ++i) {
|
||||||
const VkImageSubresourceRange& range = ranges[i];
|
const VkImageSubresourceRange& range = ranges[i];
|
||||||
const bool is_color = range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT;
|
const bool is_color = range.aspectMask & VK_IMAGE_ASPECT_COLOR_BIT;
|
||||||
const bool is_depth_stencil = range.aspectMask &
|
const bool is_depth_stencil = range.aspectMask
|
||||||
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT);
|
& (VK_IMAGE_ASPECT_DEPTH_BIT
|
||||||
|
| VK_IMAGE_ASPECT_STENCIL_BIT);
|
||||||
|
|
||||||
VkAccessFlags src_access = 0;
|
VkAccessFlags src_access = 0;
|
||||||
VkPipelineStageFlags this_stage = 0;
|
VkPipelineStageFlags this_stage = 0;
|
||||||
|
@ -299,8 +302,8 @@ void Scheduler::EndPendingOperations() {
|
||||||
|
|
||||||
if (is_depth_stencil) {
|
if (is_depth_stencil) {
|
||||||
src_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
src_access |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
|
||||||
this_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
|
this_stage |= VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
|
||||||
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
|
| VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_stages |= this_stage;
|
src_stages |= this_stage;
|
||||||
|
@ -309,11 +312,11 @@ void Scheduler::EndPendingOperations() {
|
||||||
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
|
||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.srcAccessMask = src_access,
|
.srcAccessMask = src_access,
|
||||||
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT |
|
.dstAccessMask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT
|
||||||
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
|
| VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
|
||||||
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT |
|
| VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
|
||||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
|
| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
|
||||||
VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
| VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||||
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
|
.oldLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
|
.newLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||||
|
@ -325,19 +328,20 @@ void Scheduler::EndPendingOperations() {
|
||||||
|
|
||||||
cmdbuf.EndRenderPass();
|
cmdbuf.EndRenderPass();
|
||||||
|
|
||||||
for (size_t i = 0; i < num_images; ++i) {
|
cmdbuf.PipelineBarrier(src_stages,
|
||||||
cmdbuf.PipelineBarrier(
|
|
||||||
src_stages, // OR compute per-image if needed
|
|
||||||
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
|
||||||
0,
|
0,
|
||||||
barriers[i]);
|
{},
|
||||||
}
|
{},
|
||||||
|
{barriers.data(), num_images} // Batched image barriers
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
state.renderpass = nullptr;
|
state.renderpass = nullptr;
|
||||||
num_renderpass_images = 0;
|
num_renderpass_images = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Scheduler::AcquireNewChunk() {
|
void Scheduler::AcquireNewChunk() {
|
||||||
std::scoped_lock rl{reserve_mutex};
|
std::scoped_lock rl{reserve_mutex};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue