Index: Include/NsRender/D3D12Factory.h
===================================================================
--- Include/NsRender/D3D12Factory.h	(revision 14871)
+++ Include/NsRender/D3D12Factory.h	(working copy)
@@ -47,6 +47,8 @@
         const void* hlsl, uint32_t size);
     static void ClearPixelShaders(Noesis::RenderDevice* device);
 
+    static void EndPendingSplitBarriers(Noesis::RenderDevice* device);
+
     static ID3D12Resource* GetNativePtr(Noesis::Texture* texture);
     static D3D12_RESOURCE_STATES GetTextureState(Noesis::Texture* texture);
     static void SetTextureState(Noesis::Texture* texture, D3D12_RESOURCE_STATES state);
Index: Src/D3D12RenderDevice.cpp
===================================================================
--- Src/D3D12RenderDevice.cpp	(revision 14871)
+++ Src/D3D12RenderDevice.cpp	(working copy)
@@ -911,6 +911,7 @@
     mCommands = commands;
     mSafeFenceValue = safeFenceValue;
     InvalidateStateCache();
+    mPendingSplitBarriers.Clear();
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -919,6 +920,7 @@
     D3D12Texture* texture = (D3D12Texture*)texture_;
     PendingRelease p = { texture->srv, 0xFFFF, 0xFFFF, mSafeFenceValue, texture->obj };
     mPendingReleases.PushBack(p);
+    mPendingSplitBarriers.EraseIf([&](Texture* _) { return _ == texture; });
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -941,6 +943,41 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
+static void EnsureShaderResourceState(ID3D12GraphicsCommandList* commands, D3D12Texture* texture)
+{
+    if (texture->state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)
+    {
+        D3D12_RESOURCE_BARRIER barrier;
+        barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
+        barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
+        barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
+        barrier.Transition.pResource = texture->obj;
+        barrier.Transition.StateBefore = texture->state;
+        barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+
+        if (texture->pendingBarrierToSRV)
+        {
+            barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_END_ONLY;
+            texture->pendingBarrierToSRV = false;
+        }
+
+        commands->ResourceBarrier(1, &barrier);
+        texture->state = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+void D3D12RenderDevice::EndPendingSplitBarriers()
+{
+    for (Texture* texture : mPendingSplitBarriers)
+    {
+        EnsureShaderResourceState(mCommands, (D3D12Texture*)texture);
+    }
+
+    mPendingSplitBarriers.Clear();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
 ID3D12Resource* D3D12RenderDevice::GetNativePtr(Noesis::Texture* texture)
 {
     return ((D3D12Texture*)texture)->obj;
@@ -1288,30 +1325,6 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
-static void EnsureShaderResourceState(ID3D12GraphicsCommandList* commands, D3D12Texture* texture)
-{
-    if (texture->state != D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)
-    {
-        D3D12_RESOURCE_BARRIER barrier;
-        barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
-        barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
-        barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
-        barrier.Transition.pResource = texture->obj;
-        barrier.Transition.StateBefore = texture->state;
-        barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-
-        if (texture->pendingBarrierToSRV)
-        {
-            barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_END_ONLY;
-            texture->pendingBarrierToSRV = false;
-        }
-
-        commands->ResourceBarrier(1, &barrier);
-        texture->state = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
 void D3D12RenderDevice::SetRenderTarget(RenderTarget* surface_)
 {
     D3D12RenderTarget* surface = (D3D12RenderTarget*)surface_;
@@ -1440,6 +1453,7 @@
 
         mCommands->ResourceBarrier(1, &barrier);
         surface->texture->pendingBarrierToSRV = true;
+        mPendingSplitBarriers.PushBack(surface->texture);
 
         DX_RELEASE(commands1);
         DX_END_EVENT();
@@ -1456,6 +1470,7 @@
 
         mCommands->ResourceBarrier(1, &barrier);
         surface->texture->pendingBarrierToSRV = true;
+        mPendingSplitBarriers.PushBack(surface->texture);
     }
 
     if (surface->stencil)
Index: Src/D3D12RenderDevice.h
===================================================================
--- Src/D3D12RenderDevice.h	(revision 14871)
+++ Src/D3D12RenderDevice.h	(working copy)
@@ -54,6 +54,8 @@
     void SafeReleaseRenderTarget(Noesis::RenderTarget* surface);
     void SafeReleaseResource(ID3D12Resource* resource);
 
+    void EndPendingSplitBarriers();
+
     static ID3D12Resource* GetNativePtr(Noesis::Texture* texture);
     static D3D12_RESOURCE_STATES GetTextureState(Noesis::Texture* texture);
     static void SetTextureState(Noesis::Texture* texture, D3D12_RESOURCE_STATES state);
@@ -250,6 +252,7 @@
     };
 
     Noesis::Vector<PendingRelease> mPendingReleases;
+    Noesis::Vector<Noesis::Texture*> mPendingSplitBarriers;
 
     ID3D12RootSignature* mCachedRootSignature;
     ID3D12PipelineState* mCachedPipelineState;
Index: Src/Render.D3D12RenderDevice.cpp
===================================================================
--- Src/Render.D3D12RenderDevice.cpp	(revision 14871)
+++ Src/Render.D3D12RenderDevice.cpp	(working copy)
@@ -54,6 +54,13 @@
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
+void D3D12Factory::EndPendingSplitBarriers(RenderDevice* device_)
+{
+    D3D12RenderDevice* device = (D3D12RenderDevice*)device_;
+    device->EndPendingSplitBarriers();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
 ID3D12Resource* D3D12Factory::GetNativePtr(Texture* texture)
 {
     return D3D12RenderDevice::GetNativePtr(texture);
