浏览代码

DX12 : Use atomic for SRV ring buffer

TothBenoit 5 天之前
父节点
当前提交
a67e6d0c1f
共有 1 个文件被更改,包括 7 次插入7 次删除
  1. 7 7
      h3d/impl/DX12Driver.hx

+ 7 - 7
h3d/impl/DX12Driver.hx

@@ -1863,20 +1863,20 @@ class DX12Driver extends h3d.impl.Driver {
 	}
 
 	var srvRingBuf : hl.CArray<SrvArgs>;
-	var srvHead : Int = 1;
-	var srvTail : Int = 0;
+	var srvHead : haxe.atomic.AtomicInt = new haxe.atomic.AtomicInt(1);
+	var srvTail : haxe.atomic.AtomicInt = new haxe.atomic.AtomicInt(0);
 	var srvThreadLaunched : Bool = false;
 
 	inline function computeSRVBufferDistance() : Int {
-		return (srvHead + (~(srvTail - 1 ) & 0xFF)) & 0xFF;
+		return (srvHead.load() + (~(srvTail.load() - 1 ) & 0xFF)) & 0xFF;
 	}
 
 	inline function processSRV() {
-		var index = (srvTail + 1) & 0xFF;
+		var index = (srvTail.load() + 1) & 0xFF;
 		var args = srvRingBuf[index];
 		Driver.createShaderResourceView(args.res, args.resourceDesc, args.srvAddr);
 		Driver.createSampler(args.samplerDesc, args.samplerAddr);
-		srvTail = index;
+		srvTail.store(index);
 	}
 
 	function runThread() {
@@ -1916,7 +1916,7 @@ class DX12Driver extends h3d.impl.Driver {
 		// Check if ring buffer is full
 		while ( computeSRVBufferDistance() == 0 ) {};
 
-		var srvArgs = srvRingBuf[srvHead];
+		var srvArgs = srvRingBuf[srvHead.load()];
 
 		if( t.flags.has(Cube) ) {
 			var desc = unsafeCastTo(srvArgs.resourceDesc, TexCubeSRV);
@@ -1974,7 +1974,7 @@ class DX12Driver extends h3d.impl.Driver {
 		srvArgs.res = t.t.res;
 		srvArgs.srvAddr = srvAddr;
 		srvArgs.samplerAddr = samplerAddr;
-		srvHead = (srvHead + 1) & 0xFF;
+		srvHead.store((srvHead.load() + 1) & 0xFF);
 
 		#if console
 		processSRV();