Pārlūkot izejas kodu

minimal vulkan driver init (wip, require hlsdl git)

Nicolas Cannasse 4 gadi atpakaļ
vecāks
revīzija
e78046c4c4
3 mainītis faili ar 94 papildinājumiem un 1 dzēšanām
  1. 5 0
      h3d/Engine.hx
  2. 82 0
      h3d/impl/VulkanDriver.hx
  3. 7 1
      hxd/Window.hl.hx

+ 5 - 0
h3d/Engine.hx

@@ -70,6 +70,11 @@ class Engine {
 		#if macro
 		driver = new h3d.impl.NullDriver();
 		#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);

+ 82 - 0
h3d/impl/VulkanDriver.hx

@@ -0,0 +1,82 @@
+package h3d.impl;
+import h3d.impl.Driver;
+
+class VulkanDriver extends Driver {
+
+	var ctx : sdl.Vulkan.VKContext;
+	var cur : hxsl.RuntimeShader;
+
+	public function new() {
+		ctx = @:privateAccess hxd.Window.getInstance().window.vkctx;
+		if( !ctx.beginFrame() ) throw "assert";
+	}
+
+	override function hasFeature( f : Feature ) {
+		return true;
+	}
+
+	override function isSupportedFormat( fmt : h3d.mat.Data.TextureFormat ) {
+		return true;
+	}
+
+	override function logImpl(str:String) {
+		#if sys
+		Sys.println(str);
+		#else
+		trace(str);
+		#end
+	}
+
+	override function isDisposed() {
+		return false;
+	}
+
+	override function getDriverName( details : Bool ) {
+		return "Vulkan";
+	}
+
+	override function present() {
+		ctx.endFrame();
+		if( !ctx.beginFrame() ) {
+			var win = hxd.Window.getInstance();
+			ctx.initSwapchain(win.width, win.height);
+			if( !ctx.beginFrame() )
+				throw "assert";
+		}
+	}
+
+	override function init( onCreate : Bool -> Void, forceSoftware = false ) {
+		onCreate(false);
+	}
+
+	override function selectShader( shader : hxsl.RuntimeShader ) {
+		if( cur == shader ) return false;
+		cur = shader;
+		return true;
+	}
+
+	override function getShaderInputNames() : InputNames {
+		var names = [];
+		for( v in cur.vertex.data.vars )
+			if( v.kind == Input )
+				names.push(v.name);
+		return InputNames.get(names);
+	}
+
+	override function begin(frame:Int) {
+		sdl.Vulkan.clearColorImage(0, Math.random(), 0, 1);
+	}
+
+	override function allocTexture( t : h3d.mat.Texture ) : Texture {
+		return cast {};
+	}
+
+	override function allocIndexes( count : Int, is32 : Bool ) : IndexBuffer {
+		return cast {};
+	}
+
+	override function allocVertexes( m : ManagedBuffer ) : VertexBuffer {
+		return cast {};
+	}
+
+}

+ 7 - 1
hxd/Window.hl.hx

@@ -48,6 +48,9 @@ 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) {
@@ -56,7 +59,10 @@ class Window {
 		eventTargets = new List();
 		resizeEvents = new List();
 		#if hlsdl
-		final sdlFlags = if (!fixed) sdl.Window.SDL_WINDOW_SHOWN | sdl.Window.SDL_WINDOW_RESIZABLE else sdl.Window.SDL_WINDOW_SHOWN;
+		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;
+		#end
 		window = new sdl.Window(title, width, height, sdl.Window.SDL_WINDOWPOS_CENTERED, sdl.Window.SDL_WINDOWPOS_CENTERED, sdlFlags);
 		#elseif hldx
 		final dxFlags = if (!fixed) dx.Window.RESIZABLE else 0;