summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorquou <quou@disroot.org>2024-12-29 14:42:31 +1100
committerquou <quou@disroot.org>2024-12-29 14:42:31 +1100
commit09d6ea353e1ed9502967c1406061613272eafb63 (patch)
tree374fefa9d13b5af1bf9984d3031426f812b89da9
parent6a933181de99b7834f9cc7c1a8945b3afbbab223 (diff)
fix depth target layout
-rw-r--r--video.cpp34
1 files changed, 33 insertions, 1 deletions
diff --git a/video.cpp b/video.cpp
index ceb8e81..9cd4874 100644
--- a/video.cpp
+++ b/video.cpp
@@ -1527,7 +1527,7 @@ void Renderpass_Vk::init(
ad.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
ad.stencilLoadOp = ad.loadOp;
ad.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
- if (rpk.is_first || rp.depth.mode == Clear_Mode::clear)
+ if (rp.depth.mode != Clear_Mode::restore)
ad.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
else
ad.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
@@ -2097,6 +2097,7 @@ void Context::transition(Texture_Id id, Resource_State state) {
VkImageLayout src_layout = state_to_image_layout(tex.state);
VkImageLayout dst_layout = state_to_image_layout(state);
VkPipelineStageFlags src_stage, dst_stage;
+ if (tex.state == state) return;
tex.state = state;
b.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
b.oldLayout = src_layout;
@@ -2110,6 +2111,21 @@ void Context::transition(Texture_Id id, Resource_State state) {
b.subresourceRange.baseArrayLayer = 0;
b.subresourceRange.layerCount = 1;
if (
+ tex.fmt == texture_format_d16 ||
+ tex.fmt == texture_format_d24s8 ||
+ tex.fmt == texture_format_d32
+ ) {
+ if (src_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
+ src_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ if (dst_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
+ dst_layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ b.subresourceRange.aspectMask =
+ VK_IMAGE_ASPECT_DEPTH_BIT |
+ VK_IMAGE_ASPECT_STENCIL_BIT;
+ b.oldLayout = src_layout;
+ b.newLayout = dst_layout;
+ }
+ if (
src_layout == VK_IMAGE_LAYOUT_UNDEFINED &&
dst_layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
) {
@@ -2157,6 +2173,20 @@ void Context::transition(Texture_Id id, Resource_State state) {
b.dstAccessMask = 0;
src_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
dst_stage = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
+ } else if (
+ src_layout == VK_IMAGE_LAYOUT_UNDEFINED &&
+ dst_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
+ ) {
+ b.srcAccessMask = 0;
+ b.dstAccessMask =
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
+ src_stage =
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
+ dst_stage =
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
} else {
print_err("Bad resource transition.\n");
pbreak(389);
@@ -2205,6 +2235,8 @@ std::pair<Renderpass_Vk&, Framebuffer_Vk&> Context_Vk::begin_rp(
dc.depthStencil.depth = rp.depth.clear.depth;
dc.depthStencil.stencil = 0; /* todo */
clears[clear_count++] = dc;
+ if (rp.depth.mode == Clear_Mode::restore)
+ transition(rp.depth.id, Resource_State::render_target);
}
rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
rpbi.renderPass = rpo.rpo;