Parcourir la source

added draw instanced

Nicolas Cannasse il y a 3 ans
Parent
commit
562c802c3f
1 fichiers modifiés avec 41 ajouts et 2 suppressions
  1. 41 2
      h3d/impl/DX12Driver.hx

+ 41 - 2
h3d/impl/DX12Driver.hx

@@ -54,6 +54,7 @@ class CachedPipeline {
 class ShaderRegisters {
 	public var globals : Int;
 	public var params : Int;
+	public var buffers : Int;
 	public var textures : Int;
 	public var samplers : Int;
 	public var texturesCount : Int;
@@ -219,6 +220,7 @@ class IndexBufferData extends BufferData {
 class VertexBufferData extends BufferData {
 	public var view : dx.Dx12.VertexBufferView;
 	public var stride : Int;
+	public var size : Int;
 }
 
 class TextureData extends ResourceData {
@@ -277,6 +279,7 @@ class DX12Driver extends h3d.impl.Driver {
 	var currentShader : CompiledShader;
 	var compiledShaders : Map<Int,CompiledShader> = new Map();
 	var compiler : ShaderCompiler;
+	var currentIndex : IndexBuffer;
 
 	var tmp : TempObjects;
 	var currentRenderTargets : Array<h3d.mat.Texture> = [];
@@ -368,6 +371,7 @@ class DX12Driver extends h3d.impl.Driver {
 		renderTargetViews.next();
 		depthStenciViews.next();
 		curStencilRef = -1;
+		currentIndex = null;
 
 		setRenderTarget(null);
 
@@ -789,6 +793,11 @@ class DX12Driver extends h3d.impl.Driver {
 			var regs = new ShaderRegisters();
 			regs.globals = allocConsts(sh.globalsSize, vis, false);
 			regs.params = allocConsts(sh.paramsSize, vis, sh.vertex ? vertexParamsCBV : fragmentParamsCBV);
+			if( sh.bufferCount > 0 ) {
+				regs.buffers = paramsCount;
+				for( i in 0...sh.bufferCount )
+					allocConsts(1, vis, true);
+			}
 			if( sh.texturesCount > 0 ) {
 				regs.texturesCount = sh.texturesCount;
 				regs.textures = paramsCount;
@@ -964,6 +973,7 @@ class DX12Driver extends h3d.impl.Driver {
 		view.strideInBytes = m.stride << 2;
 		buf.view = view;
 		buf.stride = m.stride;
+		buf.size = size;
 		buf.uploaded = m.flags.has(Dynamic);
 		return buf;
 	}
@@ -1297,7 +1307,20 @@ class DX12Driver extends h3d.impl.Driver {
 				frame.commandList.setGraphicsRootDescriptorTable(regs.samplers, frame.samplerViews.toGPU(sampler));
 			}
 		case Buffers:
-			if( buf.buffers != null && buf.buffers.length > 0 ) throw "TODO";
+			if( shader.bufferCount > 0 ) {
+				for( i in 0...shader.bufferCount ) {
+					var srv = frame.shaderResourceViews.alloc(1);
+					var b = buf.buffers[i];
+					var cbv = @:privateAccess b.buffer.vbuf;
+					transition(cbv, shader.vertex ? NON_PIXEL_SHADER_RESOURCE : PIXEL_SHADER_RESOURCE);
+
+					var desc = tmp.cbvDesc;
+					desc.bufferLocation = cbv.res.getGpuVirtualAddress();
+					desc.sizeInBytes = cbv.size;
+					Driver.createConstantBufferView(desc, srv);
+					frame.commandList.setGraphicsRootDescriptorTable(regs.buffers + i, frame.shaderResourceViews.toGPU(srv));
+				}
+			}
 		}
 	}
 
@@ -1494,7 +1517,10 @@ class DX12Driver extends h3d.impl.Driver {
 
 	override function draw( ibuf : IndexBuffer, startIndex : Int, ntriangles : Int ) {
 		flushPipeline();
-		frame.commandList.iaSetIndexBuffer(ibuf.view);
+		if( currentIndex != ibuf ) {
+			currentIndex = ibuf;
+			frame.commandList.iaSetIndexBuffer(ibuf.view);
+		}
 		frame.commandList.drawIndexedInstanced(ntriangles * 3,1,startIndex,0,0);
 		if( frame.shaderResourceViews.available < 128 || frame.samplerViews.available < 64 ) {
 			var arr = tmp.descriptors2;
@@ -1504,6 +1530,19 @@ class DX12Driver extends h3d.impl.Driver {
 		}
 	}
 
+	override function drawInstanced(ibuf:IndexBuffer, commands:InstanceBuffer) {
+		flushPipeline();
+		if( currentIndex != ibuf ) {
+			currentIndex = ibuf;
+			frame.commandList.iaSetIndexBuffer(ibuf.view);
+		}
+		if( commands.data != null ) {
+			throw "TODO:ExecuteIndirect";
+		} else {
+			frame.commandList.drawIndexedInstanced(commands.indexCount, commands.commandCount, commands.startIndex, 0, 0);
+		}
+	}
+
 	function flushFrame() {
 		frame.commandList.close();
 		frame.commandList.execute();