浏览代码

various fixes

Nicolas Cannasse 3 年之前
父节点
当前提交
4085ab2ca3
共有 1 个文件被更改,包括 38 次插入5 次删除
  1. 38 5
      h3d/impl/DX12Driver.hx

+ 38 - 5
h3d/impl/DX12Driver.hx

@@ -76,6 +76,7 @@ class CompiledShader {
 	@:packed public var bufferSRV(default,null) : BufferSRV;
 	@:packed public var samplerDesc(default,null) : SamplerDesc;
 	@:packed public var cbvDesc(default,null) : ConstantBufferViewDesc;
+	@:packed public var rtvDesc(default,null) : RenderTargetViewDesc;
 
 	public var pass : h3d.mat.Pass;
 
@@ -259,6 +260,7 @@ class DX12Driver extends h3d.impl.Driver {
 
 	var tmp : TempObjects;
 	var currentRenderTargets : Array<h3d.mat.Texture> = [];
+	var defaultDepth : h3d.mat.DepthBuffer;
 	var depthEnabled = true;
 	var curStencilRef : Int = -1;
 
@@ -269,6 +271,14 @@ class DX12Driver extends h3d.impl.Driver {
 		reset();
 	}
 
+	override function hasFeature(f:Feature):Bool {
+		return true;
+	}
+
+	override function isSupportedFormat(fmt:h3d.mat.Data.TextureFormat):Bool {
+		return true;
+	}
+
 	function reset() {
 		var flags = new DriverInitFlags();
 		flags.set(DEBUG);
@@ -292,6 +302,7 @@ class DX12Driver extends h3d.impl.Driver {
 		depthStenciViews = new ManagedHeap(DSV);
 		renderTargetViews.onFree = function(prev) frame.toRelease.push(prev);
 		depthStenciViews.onFree = function(prev) frame.toRelease.push(prev);
+		defaultDepth = new h3d.mat.DepthBuffer(0,0, Depth24Stencil8);
 
 		compiler = new ShaderCompiler();
 		resize(window.width, window.height);
@@ -468,27 +479,49 @@ class DX12Driver extends h3d.impl.Driver {
 			return null;
 		}
 		var depthView = depthStenciViews.alloc(1);
-		Driver.createDepthStencilView(tex == null ? frame.depthBuffer : @:privateAccess tex.depthBuffer.b.res, null, depthView);
+		Driver.createDepthStencilView(tex == null || tex.depthBuffer == defaultDepth ? frame.depthBuffer : @:privateAccess tex.depthBuffer.b.res, null, depthView);
 		var depths = tmp.depthStencils;
 		depths[0] = depthView;
 		depthEnabled = true;
 		return depths;
 	}
 
+	override function getDefaultDepthBuffer():h3d.mat.DepthBuffer {
+		return defaultDepth;
+	}
+
 	override function setRenderTarget(tex:Null<h3d.mat.Texture>, layer:Int = 0, mipLevel:Int = 0) {
 
 		if( tex != null ) transition(tex.t, RENDER_TARGET);
 
 		var texView = renderTargetViews.alloc(1);
-		Driver.createRenderTargetView(tex == null ? frame.backBuffer.res : tex.t.res, null, texView);
+		var desc = null;
+		if( layer != 0 || mipLevel != 0 ) {
+			desc = tmp.rtvDesc;
+			desc.format = tex.t.format;
+			if( tex.flags.has(IsArray) || tex.flags.has(Cube) ) {
+				desc.viewDimension = TEXTURE2DARRAY;
+				desc.mipSlice = mipLevel;
+				desc.firstArraySlice = layer;
+				desc.arraySize = 1;
+				desc.planeSlice = 0;
+			} else {
+				desc.viewDimension = TEXTURE2D;
+				desc.mipSlice = mipLevel;
+				desc.planeSlice = 0;
+			}
+		}
+		Driver.createRenderTargetView(tex == null ? frame.backBuffer.res : tex.t.res, desc, texView);
 		tmp.renderTargets[0] = texView;
 		frame.commandList.omSetRenderTargets(1, tmp.renderTargets, true, getDepthView(tex));
 
 		while( currentRenderTargets.length > 0 ) currentRenderTargets.pop();
 		if( tex != null ) currentRenderTargets.push(tex);
 
-		var w = tex == null ? currentWidth : tex.width;
-		var h = tex == null ? currentHeight : tex.height;
+		var w = tex == null ? currentWidth : tex.width >> mipLevel;
+		var h = tex == null ? currentHeight : tex.height >> mipLevel;
+		if( w == 0 ) w = 1;
+		if( h == 0 ) h = 1;
 		tmp.viewport.width = w;
 		tmp.viewport.height = h;
 		tmp.viewport.maxDepth = 1;
@@ -1363,7 +1396,7 @@ class DX12Driver extends h3d.impl.Driver {
 	override function draw( ibuf : IndexBuffer, startIndex : Int, ntriangles : Int ) {
 		flushPipeline();
 		frame.commandList.iaSetIndexBuffer(ibuf.view);
-		frame.commandList.drawIndexedInstanced(ibuf.count,1,0,0,0);
+		frame.commandList.drawIndexedInstanced(ntriangles * 3,1,startIndex,0,0);
 		if( frame.shaderResourceViews.available < 128 || frame.samplerViews.available < 64 ) {
 			var arr = tmp.descriptors2;
 			arr[0] = frame.shaderResourceViews.grow(function(prev) frame.toRelease.push(prev));