Переглянути джерело

[DX12] Fix wrong RTV used after clear with unoptimized clear color value.

TothBenoit 1 рік тому
батько
коміт
af7e021253
1 змінених файлів з 9 додано та 1 видалено
  1. 9 1
      h3d/impl/DX12Driver.hx

+ 9 - 1
h3d/impl/DX12Driver.hx

@@ -351,6 +351,7 @@ class DX12Driver extends h3d.impl.Driver {
 	var defaultDepth : h3d.mat.Texture;
 	var depthEnabled = true;
 	var curStencilRef : Int = -1;
+	var lastRtvDesc : RenderTargetViewDesc;
 	var rtWidth : Int;
 	var rtHeight : Int;
 	var frameCount : Int;
@@ -494,19 +495,23 @@ class DX12Driver extends h3d.impl.Driver {
 			clear.b = color.b;
 			clear.a = color.a;
 			var count = currentRenderTargets.length;
+			var needRebind = false;
 			for( i in 0...count ) {
 				var tex = currentRenderTargets[i];
 				if( tex != null && tex.t.setClearColor(color) ) {
+					needRebind = true;
 					// update texture to use another clear value
 					var prev = tex.t;
 					tex.t = allocTexture(tex);
 					@:privateAccess tex.t.clearColorChanges = prev.clearColorChanges;
 					frame.toRelease.push(prev.res);
-					Driver.createRenderTargetView(tex.t.res, null, tmp.renderTargets[i]);
+					Driver.createRenderTargetView(tex.t.res, lastRtvDesc, tmp.renderTargets[i]);
 				}
 				tex.flags.set(WasCleared);
 				frame.commandList.clearRenderTargetView(tmp.renderTargets[i], clear);
 			}
+			if ( needRebind )
+				frame.commandList.omSetRenderTargets(count, tmp.renderTargets, true, depthEnabled ? getDepthViewFromTexture(currentRenderTargets[0], currentRenderTargets[0].depthBuffer.t.state & DEPTH_WRITE == COMMON ) : null);
 			// clear backbuffer
 			if( count == 0 )
 				frame.commandList.clearRenderTargetView(frame.backBufferView, clear);
@@ -767,6 +772,7 @@ class DX12Driver extends h3d.impl.Driver {
 				desc.planeSlice = 0;
 			}
 		}
+		lastRtvDesc = desc;
 		if (tex != null) {
 			var texView = renderTargetViews.alloc(1);
 			Driver.createRenderTargetView(tex.t.res, desc, texView);
@@ -825,6 +831,8 @@ class DX12Driver extends h3d.impl.Driver {
 
 		depthEnabled = depthBinding != NotBound;
 
+		lastRtvDesc = null;
+
 		var t0 = textures[0];
 		var texViews = renderTargetViews.alloc(textures.length);
 		var bits = 0;