From 396db593ab28e42f22ab47d38a2906416bef2192 Mon Sep 17 00:00:00 2001 From: Solessfir <34831419+Solessfir@users.noreply.github.com> Date: Sat, 12 Sep 2026 11:57:10 +0200 Subject: [PATCH 1/2] Registered Vulkan graphics accesses before flushing render-pass barriers Keep the render-pass state while flushing so dependencies are emitted in the preceding command-buffer chunk, before the consuming draws. Reported and isolated by neocromicon on a Pixel 7 Pro (Mali-G710), where ambient lighting flickered white. --- Engine/gapi/vulkan/vcommandbuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/gapi/vulkan/vcommandbuffer.cpp b/Engine/gapi/vulkan/vcommandbuffer.cpp index e892e138..c13c9434 100644 --- a/Engine/gapi/vulkan/vcommandbuffer.cpp +++ b/Engine/gapi/vulkan/vcommandbuffer.cpp @@ -352,11 +352,11 @@ void VCommandBuffer::beginRendering(const FrameBufferDesc& fbo, size_t fboSize, void VCommandBuffer::endRendering() { vkCmdEndRenderingKHR(impl); + resState.onUavUsage(bindings.read, bindings.write, PipelineStage::S_Graphics); resState.flush(*this); resState.endRendering(*this); state = PostRenderPass; - resState.onUavUsage(bindings.read, bindings.write, PipelineStage::S_Graphics); } void VCommandBuffer::setPipeline(AbstractGraphicsApi::Pipeline& p) { From 1e6b7f76a47efbdcd9289e6c1278cf999c71f43e Mon Sep 17 00:00:00 2001 From: Solessfir <34831419+Solessfir@users.noreply.github.com> Date: Sat, 12 Sep 2026 17:41:47 +0200 Subject: [PATCH 2/2] Tested render-pass dependencies and aligned DirectX resource tracking --- Engine/gapi/directx12/dxcommandbuffer.cpp | 2 +- Tests/shader/comp_test.frag | 2 +- Tests/tests/gapi/gapi_test_sync.h | 9 +++ Tests/tests/resourcestate_test.cpp | 90 +++++++++++++++++++++++ 4 files changed, 101 insertions(+), 2 deletions(-) diff --git a/Engine/gapi/directx12/dxcommandbuffer.cpp b/Engine/gapi/directx12/dxcommandbuffer.cpp index c6826769..90c2e308 100644 --- a/Engine/gapi/directx12/dxcommandbuffer.cpp +++ b/Engine/gapi/directx12/dxcommandbuffer.cpp @@ -419,8 +419,8 @@ void DxCommandBuffer::beginRendering(const FrameBufferDesc& fbo, size_t fboSize, } void DxCommandBuffer::endRendering() { - resState.endRendering(*this); resState.onUavUsage(bindings.read, bindings.write, PipelineStage::S_Graphics); + resState.endRendering(*this); impl->EndRenderPass(); } diff --git a/Tests/shader/comp_test.frag b/Tests/shader/comp_test.frag index 155099b1..916fe654 100644 --- a/Tests/shader/comp_test.frag +++ b/Tests/shader/comp_test.frag @@ -9,5 +9,5 @@ layout(binding = 0, std140) readonly buffer Input { } ssbo; void main() { - outColor = vec4(0.25,0.5,0.75,1.0);//ssbo.val[int(gl_FragCoord.x)]; + outColor = ssbo.val[int(gl_FragCoord.x)]; } diff --git a/Tests/tests/gapi/gapi_test_sync.h b/Tests/tests/gapi/gapi_test_sync.h index 5ea67851..22a4eafa 100644 --- a/Tests/tests/gapi/gapi_test_sync.h +++ b/Tests/tests/gapi/gapi_test_sync.h @@ -63,6 +63,15 @@ void DispathToDraw(const char* outImage) { auto pm = device.readPixels(tex); pm.save(outImage); + + ImageValidator val(pm); + const float color[4] = {0.25f, 0.5f, 0.75f, 1.f}; + for(uint32_t y=0; y images; + }; + std::vector barriers; + void beginRendering(const FrameBufferDesc& fbo, size_t fboSize, uint32_t width, uint32_t height) override {} void endRendering() override {} @@ -110,6 +116,7 @@ struct TestCommandBuffer : Tempest::AbstractGraphicsApi::CommandBuffer { }; void TestCommandBuffer::barrier(const AbstractGraphicsApi::SyncDesc& d, const AbstractGraphicsApi::BarrierDesc* desc, size_t cnt) { + barriers.push_back({d, {desc, desc+cnt}}); Log::d("---"); for(size_t i=0; i