浏览代码

force vulkan with heaps-vulkan (different buffer defs), indexes alloc

Nicolas Cannasse 3 年之前
父节点
当前提交
10713968d8
共有 4 个文件被更改,包括 39 次插入18 次删除
  1. 2 5
      h3d/Engine.hx
  2. 6 0
      h3d/impl/Driver.hx
  3. 30 9
      h3d/impl/VulkanDriver.hx
  4. 1 4
      hxd/Window.hl.hx

+ 2 - 5
h3d/Engine.hx

@@ -69,12 +69,9 @@ class Engine {
 		window.addResizeEvent(onWindowResize);
 		#if macro
 		driver = new h3d.impl.NullDriver();
+		#elseif (hlsdl && heaps_vulkan)
+		driver = new h3d.impl.VulkanDriver();
 		#elseif (js || hlsdl || usegl)
-		#if (hlsdl && heaps_vulkan)
-		if( hxd.Window.USE_VULKAN )
-			driver = new h3d.impl.VulkanDriver();
-		else
-		#end
 		driver = new h3d.impl.GlDriver(antiAlias);
 		#elseif flash
 		driver = new h3d.impl.Stage3dDriver(antiAlias);

+ 6 - 0
h3d/impl/Driver.hx

@@ -18,6 +18,12 @@ typedef VertexBuffer = { b : js.html.webgl.Buffer, stride : Int #if multidriver,
 typedef Texture = { t : js.html.webgl.Texture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, bits : Int, bias : Float, bind : Int #if multidriver, driver : Driver #end };
 typedef DepthBuffer = { r : js.html.webgl.Renderbuffer #if multidriver, driver : Driver #end };
 typedef Query = {};
+#elseif (hlsdl && heaps_vulkan)
+typedef IndexBuffer = { b : sdl.Vulkan.VkBuffer, is32 : Bool };
+typedef VertexBuffer = { b : sdl.Vulkan.VkBuffer };
+typedef Texture = {};
+typedef DepthBuffer = {};
+typedef Query = {};
 #elseif hlsdl
 typedef IndexBuffer = { b : sdl.GL.Buffer, is32 : Bool };
 typedef VertexBuffer = { b : sdl.GL.Buffer, stride : Int };

+ 30 - 9
h3d/impl/VulkanDriver.hx

@@ -1,4 +1,5 @@
 package h3d.impl;
+#if (hlsdl && heaps_vulkan)
 import h3d.impl.Driver;
 import sdl.Vulkan;
 
@@ -14,8 +15,6 @@ class CompiledShader {
 	}
 }
 
-#if (hlsdl && heaps_vulkan)
-
 class VulkanDriver extends Driver {
 
 	var ctx : VkContext;
@@ -26,12 +25,13 @@ class VulkanDriver extends Driver {
 	var defaultMultisample : VkPipelineMultisample;
 	var defaultLayout : VkPipelineLayout;
 	var currentImage : VkImage;
+	var command : VkCommandBuffer;
 	var savedPointers : Array<Dynamic> = [];
 
 	public function new() {
 		var win = hxd.Window.getInstance();
 		ctx = @:privateAccess win.window.vkctx;
-		currentImage = ctx.setCurrent();
+		beginFrame();
 		initViewport(win.width, win.height);
 		if( !ctx.beginFrame() ) throw "assert";
 		defaultInput = new VkPipelineInputAssembly();
@@ -63,6 +63,11 @@ class VulkanDriver extends Driver {
 		defaultLayout = ctx.createPipelineLayout(inf);
 	}
 
+	function beginFrame() {
+		currentImage = ctx.getCurrentImage();
+		command = ctx.getCurrentCommandBuffer();
+	}
+
 	function initViewport(width:Int,height:Int) {
 		var vp = new VkPipelineViewport();
 
@@ -108,7 +113,7 @@ class VulkanDriver extends Driver {
 
 	override function present() {
 		ctx.endFrame();
-		currentImage = ctx.setCurrent();
+		beginFrame();
 		if( !ctx.beginFrame() ) {
 			var win = hxd.Window.getInstance();
 			if( !ctx.initSwapchain(win.width, win.height) )
@@ -218,11 +223,11 @@ class VulkanDriver extends Driver {
 
 	override function clear(?color:Vector, ?depth:Float, ?stencil:Int) {
 		if( color != null )
-			currentImage.clearColor(color.r, color.g, color.b, color.a);
+			command.clearColorImage(currentImage, color.r, color.g, color.b, color.a);
 		if( depth != null || stencil != null ) {
 			if( depth == null || stencil == null ) throw "Can't clear depth without clearing stencil";
 			// *** TODO *** setup depth buffer
-			// currentImage.clearDepthStencil(depth, stencil);
+			// command.clearDepthStencilImage(currentImage, depth, stencil);
 		}
 	}
 
@@ -231,7 +236,22 @@ class VulkanDriver extends Driver {
 	}
 
 	override function allocIndexes( count : Int, is32 : Bool ) : IndexBuffer {
-		return cast {};
+		var inf = new VkBufferCreateInfo();
+		inf.usage.set(TRANSFER_DST);
+		inf.usage.set(INDEX_BUFFER);
+		inf.size = count * (is32?4:2);
+		var b = ctx.createBuffer(inf);
+		if( b == null ) return null;
+
+		var memReq = new VkMemoryRequirements();
+		ctx.getBufferMemoryRequirements(b, memReq);
+		var allocInfo = new VkMemoryAllocateInfo();
+		allocInfo.size = memReq.size;
+		//allocInfo.memoryTypeIndex =  findMemoryType(memRequirements.memoryTypeBits, properties);
+		var mem = ctx.allocateMemory(allocInfo);
+		if( !ctx.bindBufferMemory(b, mem, 0) ) throw "assert";
+
+		return { b : b, is32 : is32 };
 	}
 
 	override function allocVertexes( m : ManagedBuffer ) : VertexBuffer {
@@ -296,11 +316,12 @@ class VulkanDriver extends Driver {
 
 		var pipe = ctx.createGraphicsPipeline(inf);
 		if( pipe == null ) throw "Failed to create pipeline";
-		Vulkan.bindPipeline(GRAPHICS, pipe);
+		command.bindPipeline(GRAPHICS, pipe);
 	}
 
 	override function draw(ibuf:IndexBuffer, startIndex:Int, ntriangles:Int) {
-		Vulkan.drawIndexed(ntriangles * 3, 1, startIndex, 0, 0);
+		command.bindIndexBuffer(ibuf.b, 0, ibuf.is32?1:0);
+		command.drawIndexed(ntriangles * 3, 1, startIndex, 0, 0);
 		Sys.exit(0);
 	}
 

+ 1 - 4
hxd/Window.hl.hx

@@ -48,9 +48,6 @@ class Window {
 	static var CODEMAP = [for( i in 0...2048 ) i];
 	#if hlsdl
 	static inline var TOUCH_SCALE = #if (hl_ver >= version("1.12.0")) 10000 #else 100 #end;
-	#if heaps_vulkan
-	public static var USE_VULKAN = false;
-	#end
 	#end
 
 	function new(title:String, width:Int, height:Int, fixed:Bool = false) {
@@ -61,7 +58,7 @@ class Window {
 		#if hlsdl
 		var sdlFlags = if (!fixed) sdl.Window.SDL_WINDOW_SHOWN | sdl.Window.SDL_WINDOW_RESIZABLE else sdl.Window.SDL_WINDOW_SHOWN;
 		#if heaps_vulkan
-		if( USE_VULKAN ) sdlFlags |= sdl.Window.SDL_WINDOW_VULKAN;
+		sdlFlags |= sdl.Window.SDL_WINDOW_VULKAN;
 		#end
 		window = new sdl.Window(title, width, height, sdl.Window.SDL_WINDOWPOS_CENTERED, sdl.Window.SDL_WINDOWPOS_CENTERED, sdlFlags);
 		#elseif hldx