浏览代码

[DX12] Track current pipeline to avoid culling redundant SetPipelineState

TothBenoit 9 月之前
父节点
当前提交
53ff3272a5
共有 1 个文件被更改,包括 10 次插入2 次删除
  1. 10 2
      h3d/impl/DX12Driver.hx

+ 10 - 2
h3d/impl/DX12Driver.hx

@@ -403,6 +403,7 @@ class DX12Driver extends h3d.impl.Driver {
 	var frameCount : Int;
 	var tsFreq : haxe.Int64;
 	var heapCount : Int;
+	var currentPipelineState : PipelineState;
 
 	public static var INITIAL_RT_COUNT = 1024;
 	public static var INITIAL_BUMP_ALLOCATOR_SIZE = 2 * 1024 * 1024;
@@ -2094,7 +2095,10 @@ class DX12Driver extends h3d.impl.Driver {
 		pipelineBuilder.setShader(shader);
 		if( sh.isCompute ) {
 			frame.commandList.setComputeRootSignature(currentShader.rootSignature);
-			frame.commandList.setPipelineState(currentShader.computePipeline);
+			if ( currentPipelineState != currentShader.computePipeline ) {
+				frame.commandList.setPipelineState(currentShader.computePipeline);
+				currentPipelineState = currentShader.computePipeline;
+			}
 		} else {
 			frame.commandList.setGraphicsRootSignature(currentShader.rootSignature);
 		}
@@ -2250,7 +2254,10 @@ class DX12Driver extends h3d.impl.Driver {
 		var cache = pipelineBuilder.lookup(currentShader.pipelines, currentShader.inputCount);
 		if( cache.pipeline == null )
 			cache.pipeline = makePipeline(currentShader);
-		frame.commandList.setPipelineState(cache.pipeline);
+		if ( currentPipelineState != cache.pipeline ) {
+			frame.commandList.setPipelineState(cache.pipeline);
+			currentPipelineState = cache.pipeline;
+		}
 	}
 
 	// QUERIES
@@ -2387,6 +2394,7 @@ class DX12Driver extends h3d.impl.Driver {
 		frame.commandList.close();
 		flushSRV();
 		frame.commandList.execute();
+		currentPipelineState = null;
 		currentShader = null;
 		Driver.flushMessages();
 		frame.fenceValue = fenceValue++;