Explorar o código

properly allocate uniform buffers are ConstantBuffer and update them using CPU Map

Nicolas Cannasse %!s(int64=4) %!d(string=hai) anos
pai
achega
0bb346c79f
Modificáronse 2 ficheiros con 23 adicións e 4 borrados
  1. 22 3
      h3d/impl/DirectXDriver.hx
  2. 1 1
      h3d/impl/Driver.hx

+ 22 - 3
h3d/impl/DirectXDriver.hx

@@ -309,9 +309,11 @@ class DirectXDriver extends h3d.impl.Driver {
 	}
 	}
 
 
 	override function allocVertexes(m:ManagedBuffer):VertexBuffer {
 	override function allocVertexes(m:ManagedBuffer):VertexBuffer {
-		var res = dx.Driver.createBuffer(m.size * m.stride * 4, Default, VertexBuffer, None, None, 0, null);
+		var size = m.size * m.stride * 4;
+		var uniform = m.flags.has(UniformBuffer);
+		var res = uniform ? dx.Driver.createBuffer(size, Dynamic, ConstantBuffer, CpuWrite, None, 0, null) : dx.Driver.createBuffer(size, Default, VertexBuffer, None, None, 0, null);
 		if( res == null ) return null;
 		if( res == null ) return null;
-		return { res : res, count : m.size, stride : m.stride };
+		return { res : res, count : m.size, stride : m.stride, uniform : uniform };
 	}
 	}
 
 
 	override function allocIndexes( count : Int, is32 : Bool ) : IndexBuffer {
 	override function allocIndexes( count : Int, is32 : Bool ) : IndexBuffer {
@@ -484,11 +486,28 @@ class DirectXDriver extends h3d.impl.Driver {
 
 
 	override function uploadVertexBuffer(v:VertexBuffer, startVertex:Int, vertexCount:Int, buf:hxd.FloatBuffer, bufPos:Int) {
 	override function uploadVertexBuffer(v:VertexBuffer, startVertex:Int, vertexCount:Int, buf:hxd.FloatBuffer, bufPos:Int) {
 		if( hasDeviceError ) return;
 		if( hasDeviceError ) return;
-		updateBuffer(v.res, hl.Bytes.getArray(buf.getNative()).offset(bufPos<<2), startVertex * v.stride << 2, vertexCount * v.stride << 2);
+		var data = hl.Bytes.getArray(buf.getNative()).offset(bufPos<<2);
+		if( v.uniform ) {
+			if( startVertex != 0 ) throw "assert";
+			var ptr = v.res.map(0, WriteDiscard, true, null);
+			if( ptr == null ) throw "Can't map buffer";
+			ptr.blit(0, data, 0, vertexCount * v.stride << 2);
+			v.res.unmap(0);
+			return;
+		}
+		updateBuffer(v.res, data, startVertex * v.stride << 2, vertexCount * v.stride << 2);
 	}
 	}
 
 
 	override function uploadVertexBytes(v:VertexBuffer, startVertex:Int, vertexCount:Int, buf:haxe.io.Bytes, bufPos:Int) {
 	override function uploadVertexBytes(v:VertexBuffer, startVertex:Int, vertexCount:Int, buf:haxe.io.Bytes, bufPos:Int) {
 		if( hasDeviceError ) return;
 		if( hasDeviceError ) return;
+		if( v.uniform ) {
+			if( startVertex != 0 ) throw "assert";
+			var ptr = v.res.map(0, WriteDiscard, true, null);
+			if( ptr == null ) throw "Can't map buffer";
+			ptr.blit(0, buf, 0, vertexCount * v.stride << 2);
+			v.res.unmap(0);
+			return;
+		}
 		updateBuffer(v.res, @:privateAccess buf.b.offset(bufPos << 2), startVertex * v.stride << 2, vertexCount * v.stride << 2);
 		updateBuffer(v.res, @:privateAccess buf.b.offset(bufPos << 2), startVertex * v.stride << 2, vertexCount * v.stride << 2);
 	}
 	}
 
 

+ 1 - 1
h3d/impl/Driver.hx

@@ -32,7 +32,7 @@ typedef DepthBuffer = { r : haxe.GLTypes.Renderbuffer };
 typedef Query = { q : haxe.GLTypes.Query, kind : QueryKind };
 typedef Query = { q : haxe.GLTypes.Query, kind : QueryKind };
 #elseif hldx
 #elseif hldx
 typedef IndexBuffer = { res : dx.Resource, count : Int, bits : Int };
 typedef IndexBuffer = { res : dx.Resource, count : Int, bits : Int };
-typedef VertexBuffer = { res : dx.Resource, count : Int, stride : Int };
+typedef VertexBuffer = { res : dx.Resource, count : Int, stride : Int, uniform : Bool };
 typedef Texture = { res : dx.Resource, view : dx.Driver.ShaderResourceView, rt : Array<dx.Driver.RenderTargetView>, mips : Int };
 typedef Texture = { res : dx.Resource, view : dx.Driver.ShaderResourceView, rt : Array<dx.Driver.RenderTargetView>, mips : Int };
 typedef DepthBuffer = { res : dx.Resource, view : dx.Driver.DepthStencilView };
 typedef DepthBuffer = { res : dx.Resource, view : dx.Driver.DepthStencilView };
 typedef Query = {};
 typedef Query = {};