Bladeren bron

added device selection

Nicolas Cannasse 3 jaren geleden
bovenliggende
commit
5e40c699b0
2 gewijzigde bestanden met toevoegingen van 58 en 7 verwijderingen
  1. 31 4
      libs/directx/dx/Dx12.hx
  2. 27 3
      libs/directx/dx12.cpp

+ 31 - 4
libs/directx/dx/Dx12.hx

@@ -372,9 +372,21 @@ enum abstract DsvDimension(Int) {
     var TEXTURE2DMSARRAY = 6;
 }
 
+enum abstract RtvDimension(Int) {
+	var UNKNOWN	= 0;
+	var BUFFER = 1;
+    var TEXTURE1D = 2;
+    var TEXTURE1DARRAY = 3;
+    var TEXTURE2D = 4;
+    var TEXTURE2DARRAY = 5;
+    var TEXTURE2DMS = 6;
+    var TEXTURE2DMSARRAY = 7;
+    var TEXTURE3D = 8;
+}
+
 @:struct class RenderTargetViewDesc {
 	public var format : DxgiFormat;
-	public var viewDimension : DsvDimension;
+	public var viewDimension : RtvDimension;
 
 	var int0 : Int;
 	var int1 : Int;
@@ -1381,8 +1393,8 @@ enum abstract BufferSRVFlags(Int) {
 @:hlNative("dx12")
 class Dx12 {
 
-	public static function create( win : Window, flags : DriverInitFlags ) {
-		return dxCreate(@:privateAccess win.win, flags);
+	public static function create( win : Window, flags : DriverInitFlags, ?deviceName : String ) {
+		return dxCreate(@:privateAccess win.win, flags, deviceName == null ? null : @:privateAccess deviceName.bytes);
 	}
 
 	public static function flushMessages() {
@@ -1447,13 +1459,28 @@ class Dx12 {
 		return @:privateAccess String.fromUCS2(dxGetDeviceName());
 	}
 
+	public static function listDevices() {
+		var arr = dxListDevices();
+		var out = [];
+		for( i in 0...arr.length ) {
+			if( arr[i] == null ) break;
+			out.push(@:privateAccess String.fromUCS2(arr[i]));
+		}
+		return out;
+	}
+
+	@:hlNative("dx12", "list_devices")
+	static function dxListDevices() : hl.NativeArray<hl.Bytes> {
+		return null;
+	}
+
 	@:hlNative("dx12", "get_device_name")
 	static function dxGetDeviceName() : hl.Bytes {
 		return null;
 	}
 
 	@:hlNative("dx12", "create")
-	static function dxCreate( win : hl.Abstract<"dx_window">, flags : DriverInitFlags ) : DriverInstance {
+	static function dxCreate( win : hl.Abstract<"dx_window">, flags : DriverInitFlags, deviceName : hl.Bytes ) : DriverInstance {
 		return null;
 	}
 

+ 27 - 3
libs/directx/dx12.cpp

@@ -43,8 +43,31 @@ void *pContext ) {
 	fflush(stdout);
 }
 
+HL_PRIM varray *HL_NAME(list_devices)() {
+	static int MAX_DEVICES = 64;
+	int index = 0, write = 0;
+	IDXGIAdapter1 *adapter = NULL;
+	IDXGIFactory4 *factory = NULL;
+	varray *arr = hl_alloc_array(&hlt_bytes, MAX_DEVICES);
+	if( static_driver )
+		factory = static_driver->factory;
+	else {
+		CHKERR(CreateDXGIFactory2(0, IID_PPV_ARGS(&factory)));
+	}
+	while( write < MAX_DEVICES && factory->EnumAdapters1(index++,&adapter) != DXGI_ERROR_NOT_FOUND ) {
+		DXGI_ADAPTER_DESC1 desc;
+		adapter->GetDesc1(&desc);
+		if( (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) == 0 )
+			hl_aptr(arr,uchar*)[write++] = ustrdup(desc.Description);
+		adapter->Release();
+	}
+	if( !static_driver )
+		factory->Release();
+	return arr;
+}
+
 
-HL_PRIM dx_driver *HL_NAME(create)( HWND window, int flags ) {
+HL_PRIM dx_driver *HL_NAME(create)( HWND window, int flags, uchar *dev_desc ) {
 	UINT dxgiFlags = 0;
 	dx_driver *drv = (dx_driver*)hl_gc_alloc_raw(sizeof(dx_driver));
 	memset(drv,0,sizeof(dx_driver));
@@ -66,7 +89,7 @@ HL_PRIM dx_driver *HL_NAME(create)( HWND window, int flags ) {
 	while( drv->factory->EnumAdapters1(index++,&adapter) != DXGI_ERROR_NOT_FOUND ) {
 		DXGI_ADAPTER_DESC1 desc;
 		adapter->GetDesc1(&desc);
-		if( desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE ) {
+		if( (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) || (dev_desc && !wcsstr(desc.Description,dev_desc)) ) {
 			adapter->Release();
 			continue;
 		}
@@ -171,7 +194,8 @@ uchar *HL_NAME(get_device_name)() {
 #define _DRIVER _ABSTRACT(dx_driver)
 #define _RES _ABSTRACT(dx_resource)
 
-DEFINE_PRIM(_DRIVER, create, _ABSTRACT(dx_window) _I32);
+DEFINE_PRIM(_ARR, list_devices, _NO_ARG);
+DEFINE_PRIM(_DRIVER, create, _ABSTRACT(dx_window) _I32 _BYTES);
 DEFINE_PRIM(_VOID, resize, _I32 _I32 _I32 _I32);
 DEFINE_PRIM(_VOID, present, _BOOL);
 DEFINE_PRIM(_I32, get_current_back_buffer_index, _NO_ARG);