diff --git a/gui/cfg_edit.lfm b/gui/cfg_edit.lfm index 1baff65e..84e981f2 100644 --- a/gui/cfg_edit.lfm +++ b/gui/cfg_edit.lfm @@ -1,16 +1,16 @@ object frmCfgEditor: TfrmCfgEditor - Left = 494 - Height = 323 - Top = 90 + Left = 430 + Height = 319 + Top = 204 Width = 400 Caption = 'Config Editor' - ClientHeight = 323 + ClientHeight = 319 ClientWidth = 400 Position = poMainFormCenter LCLVersion = '3.6.0.0' object EditPages: TPageControl Left = 0 - Height = 274 + Height = 270 Top = 0 Width = 397 ActivePage = Tab_Vulkan @@ -21,7 +21,7 @@ object frmCfgEditor: TfrmCfgEditor TabOrder = 0 object Tab_MainInfo: TTabSheet Caption = 'Main' - ClientHeight = 246 + ClientHeight = 242 ClientWidth = 389 object Label1: TLabel AnchorSideLeft.Control = Tab_MainInfo @@ -195,7 +195,7 @@ object frmCfgEditor: TfrmCfgEditor end object Tab_BootparamInfo: TTabSheet Caption = 'Bootparam' - ClientHeight = 246 + ClientHeight = 242 ClientWidth = 389 object Edt_BootparamInfo_neo: TCheckBox AnchorSideLeft.Control = Tab_BootparamInfo @@ -318,7 +318,7 @@ object frmCfgEditor: TfrmCfgEditor end object Tab_JIT: TTabSheet Caption = 'JIT' - ClientHeight = 246 + ClientHeight = 242 ClientWidth = 389 object Edt_JITInfo_print_asm: TCheckBox AnchorSideLeft.Control = Tab_JIT @@ -390,7 +390,7 @@ object frmCfgEditor: TfrmCfgEditor end object Tab_Misc: TTabSheet Caption = 'Misc' - ClientHeight = 246 + ClientHeight = 242 ClientWidth = 389 object Edt_MiscInfo_strict_ps4_freq: TCheckBox AnchorSideLeft.Control = Tab_Misc @@ -428,7 +428,7 @@ object frmCfgEditor: TfrmCfgEditor end object Tab_Vulkan: TTabSheet Caption = 'Vulkan' - ClientHeight = 246 + ClientHeight = 242 ClientWidth = 389 object Edt_VulkanInfo_device_cmb: TComboBox AnchorSideLeft.Control = Tab_Vulkan @@ -463,6 +463,56 @@ object frmCfgEditor: TfrmCfgEditor BorderSpacing.Right = 10 Caption = 'GPU:' end + object GrAppFlags: TCheckGroup + AnchorSideLeft.Control = Tab_Vulkan + AnchorSideTop.Control = Edt_VulkanInfo_device_cmb + AnchorSideTop.Side = asrBottom + AnchorSideRight.Control = Tab_Vulkan + AnchorSideRight.Side = asrBottom + Left = 10 + Height = 165 + Top = 68 + Width = 369 + Anchors = [akTop, akLeft, akRight] + AutoFill = True + AutoSize = True + BorderSpacing.Left = 10 + BorderSpacing.Top = 10 + BorderSpacing.Right = 10 + Caption = 'Vulkan app flags' + ChildSizing.LeftRightSpacing = 6 + ChildSizing.TopBottomSpacing = 6 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclTopToBottomThenLeftToRight + ChildSizing.ControlsPerLine = 7 + ClientHeight = 145 + ClientWidth = 365 + ColumnLayout = clVerticalThenHorizontal + Columns = 2 + Items.Strings = ( + 'debug utils' + 'validation layer' + 'enable gpu assisted' + 'enable gpu assisted reserve' + 'enable best practices' + 'enable debug printf' + 'enable sync validation' + 'disable shaders' + 'disable thread safety' + 'disable api params' + 'disable obj lifetimes' + 'disable core checks' + 'disable unique handles' + 'disable shader validation' + ) + TabOrder = 1 + Data = { + 0E0000000202020202020202020202020202 + } + end end end object BtnCancel: TButton @@ -473,7 +523,7 @@ object frmCfgEditor: TfrmCfgEditor AnchorSideBottom.Side = asrBottom Left = 315 Height = 25 - Top = 288 + Top = 284 Width = 75 Anchors = [akRight, akBottom] BorderSpacing.Right = 10 @@ -488,7 +538,7 @@ object frmCfgEditor: TfrmCfgEditor AnchorSideBottom.Side = asrBottom Left = 10 Height = 25 - Top = 288 + Top = 284 Width = 75 Anchors = [akLeft, akBottom] BorderSpacing.Left = 10 diff --git a/gui/cfg_edit.pas b/gui/cfg_edit.pas index f8ed3db9..0801e2bf 100644 --- a/gui/cfg_edit.pas +++ b/gui/cfg_edit.pas @@ -16,10 +16,18 @@ uses type TVulkanDevGuid=class(TComponent) src: TComboBox; + // Function GetText:RawByteString; procedure SetText(const s:RawByteString); end; + TVulkanAppFlags=class(TComponent) + src: TCheckGroup; + // + Function GetInteger:Integer; + procedure SetInteger(v:Integer); + end; + { TfrmCfgEditor } TfrmCfgEditor = class(TForm) @@ -28,6 +36,7 @@ type BtnOk: TButton; BtnLogOpen: TButton; BtnDataOpen: TButton; + GrAppFlags: TCheckGroup; Edt_VulkanInfo_device_cmb: TComboBox; Edt_BootparamInfo_halt_on_exit: TCheckBox; Edt_BootparamInfo_print_gpu_ops: TCheckBox; @@ -69,7 +78,9 @@ type private public - Edt_VulkanInfo_device:TVulkanDevGuid; + VulkanInfo_device :TVulkanDevGuid; + VulkanInfo_app_flags:TVulkanAppFlags; + // OnSave :TNotifyEvent; FConfigInfo:TConfigInfo; end; @@ -223,6 +234,36 @@ begin end; +// + +Function TVulkanAppFlags.GetInteger:Integer; +var + i:Integer; +begin + Result:=0; + if (src=nil) then Exit; + + For i:=0 to src.Items.Count-1 do + if src.Checked[i] then + begin + Result:=Result or (1 shl i); + end; +end; + +procedure TVulkanAppFlags.SetInteger(v:Integer); +var + i:Integer; +begin + if (src=nil) then Exit; + + For i:=0 to src.Items.Count-1 do + begin + src.Checked[i]:=(v and (1 shl i))<>0; + end; +end; + +// + procedure SetText(control:TComponent;const Text:RawByteString); begin if control.InheritsFrom(TControl) then @@ -248,6 +289,27 @@ begin end; end; +// + +procedure SetInteger(control:TComponent;i:Integer); +begin + if (control is TVulkanAppFlags) then + begin + TVulkanAppFlags(control).SetInteger(i); + end; +end; + +function GetInteger(control:TComponent):Integer; +begin + Result:=0; + if (control is TVulkanAppFlags) then + begin + Result:=TVulkanAppFlags(control).GetInteger; + end; +end; + +// + procedure SetBool(control:TComponent;B:Boolean); begin if control.InheritsFrom(TButtonControl) then @@ -265,11 +327,15 @@ begin end; end; +// + procedure TfrmCfgEditor.PageInit(const TabName:RawByteString;obj:TAbstractObject); var i:TRttiPropertyIterator; p:TRttiProperty; + TypeKind:TTypeKind; + cname:RawByteString; control:TComponent; begin @@ -280,10 +346,13 @@ begin p:=i.GetProperty; - control:=FindComponent('Edt_'+TabName+'_'+p.Name); - Assert(control<>nil,'Edt_'+TabName+'_'+p.Name); + cname:='Edt_'+TabName+'_'+p.Name; + control:=FindComponent(cname); + Assert(control<>nil,cname); + if (control=nil) then Exit; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, @@ -292,6 +361,11 @@ begin SetText(control,p.GetValue(obj).AsString); end; + tkInteger: + begin + SetInteger(control,p.GetValue(obj).AsInteger); + end; + tkBool: begin SetBool(control,p.GetValue(obj).AsBoolean); @@ -312,7 +386,9 @@ procedure TfrmCfgEditor.PageSave(const TabName:RawByteString;obj:TAbstractObject var i:TRttiPropertyIterator; p:TRttiProperty; + TypeKind:TTypeKind; + cname:RawByteString; control:TComponent; begin @@ -323,10 +399,13 @@ begin p:=i.GetProperty; - control:=FindComponent('Edt_'+TabName+'_'+p.Name); - Assert(control<>nil,'Edt_'+TabName+'_'+p.Name); + cname:='Edt_'+TabName+'_'+p.Name; + control:=FindComponent(cname); + Assert(control<>nil,cname); + if (control=nil) then Exit; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, @@ -335,6 +414,11 @@ begin p.SetValue(obj,GetText(control)); end; + tkInteger: + begin + p.SetValue(obj,GetInteger(control)); + end; + tkBool: begin p.SetValue(obj,GetBool(control)); @@ -358,9 +442,7 @@ begin IntToStr(VK_API_VERSION_PATCH(apiVersion)); end; -Function GetDriverVerson(driverVersion,vendorID:TVkUInt32):RawByteString; -const - osname='windows'; +Function GetDrvVersionStr(driverVersion,vendorID:TVkUInt32):RawByteString; begin case vendorid of // NVIDIA @@ -373,13 +455,15 @@ begin Exit; end; // Intel + {$IFDEF WINDOWS} $8086: - if (osname='windows') then begin Result:=IntToStr((driverVersion shr 14) )+'.'+ IntToStr((driverVersion ) and $3fff); Exit; end; + {$ENDIF} + else; end; // Use Vulkan version conventions if vendor mapping is not available @@ -395,11 +479,19 @@ var begin InitVulkanDeviceList; - if (Edt_VulkanInfo_device=nil) then + if (VulkanInfo_device=nil) then begin - Edt_VulkanInfo_device:=TVulkanDevGuid.Create(Self); - Edt_VulkanInfo_device.Name:='Edt_VulkanInfo_device'; //FindComponent - Edt_VulkanInfo_device.src :=Edt_VulkanInfo_device_cmb; + VulkanInfo_device:=TVulkanDevGuid.Create(Self); + VulkanInfo_device.Name:='Edt_VulkanInfo_device'; //FindComponent + VulkanInfo_device.src :=Edt_VulkanInfo_device_cmb; + end; + + if (VulkanInfo_app_flags=nil) then + begin + VulkanInfo_app_flags:=TVulkanAppFlags.Create(Self); + VulkanInfo_app_flags.Name:='Edt_VulkanInfo_app_flags'; //FindComponent + VulkanInfo_app_flags.src :=GrAppFlags; + ////// end; Edt_VulkanInfo_device_cmb.Clear; @@ -417,8 +509,8 @@ begin deviceName:=deviceName+' ('+GetApiVersionStr(FVulkanDeviceList[i].apiVersion)+')'; - deviceName:=deviceName+' ('+GetDriverVerson(FVulkanDeviceList[i].driverVersion, - FVulkanDeviceList[i].vendorID)+')'; + deviceName:=deviceName+' ('+GetDrvVersionStr(FVulkanDeviceList[i].driverVersion, + FVulkanDeviceList[i].vendorID)+')'; Edt_VulkanInfo_device_cmb.AddItem(deviceName,TObject(@FVulkanDeviceList[i])); end; diff --git a/gui/game_info.pas b/gui/game_info.pas index 3343e081..81f0fd76 100644 --- a/gui/game_info.pas +++ b/gui/game_info.pas @@ -160,8 +160,10 @@ type TVulkanInfo=class(TAbstractObject) private Fdevice:RawByteString; + Fapp_flags:DWORD; published property device:RawByteString read Fdevice write Fdevice; + property app_flags:DWORD read Fapp_flags write Fapp_flags; end; TConfigInfo=class(TAbstractObject) @@ -380,6 +382,8 @@ begin tkLString, tkAString:S:=S+'"'+StringToJSONString(value.AsString,False)+'"'; + tkInteger:S:=S+IntToStr(value.AsInteger); + tkBool:S:=S+BoolToStr(value.AsBoolean,'true','false'); else @@ -612,6 +616,7 @@ var i:TRttiPropertyIterator; p:TRttiProperty; obj:TObject; + TypeKind:TTypeKind; begin i:=GetPropertyIterator; try @@ -620,12 +625,15 @@ begin p:=i.GetProperty; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, tkAString:Stream.WriteAnsiString(p.GetValue(Self).AsString); + tkInteger:Stream.WriteDWord(p.GetValue(Self).AsInteger); + tkBool:Stream.WriteByte(Byte(p.GetValue(Self).AsBoolean)); tkClass: @@ -655,6 +663,7 @@ var i:TRttiPropertyIterator; p:TRttiProperty; obj:TObject; + TypeKind:TTypeKind; begin i:=GetPropertyIterator; try @@ -662,11 +671,14 @@ begin begin p:=i.GetProperty; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, tkAString:p.SetValue(Self,Stream.ReadAnsiString); + tkInteger:p.SetValue(Self,Integer(Stream.ReadDWord)); + tkBool:p.SetValue(Self,Boolean(Stream.ReadByte)); tkClass: @@ -697,6 +709,7 @@ var p:TRttiProperty; obj_src:TObject; obj_dst:TObject; + TypeKind:TTypeKind; begin if (dst=nil) then Exit; if (not dst.InheritsFrom(Self.ClassType)) then Exit; @@ -708,10 +721,12 @@ begin p:=i.GetProperty; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, tkAString, + tkInteger, tkBool :p.SetValue(dst,p.GetValue(Self)); tkClass: @@ -822,6 +837,7 @@ var i:TRttiPropertyIterator; p:TRttiProperty; obj:TObject; + TypeKind:TTypeKind; begin Stream.WriteStartObject(Name); // @@ -832,11 +848,13 @@ begin p:=i.GetProperty; - case p.PropertyType.TypeKind of + TypeKind:=p.PropertyType.TypeKind; + case TypeKind of tkSString, tkLString, tkAString, + tkInteger, tkBool :Stream.WriteValue(p.Name,p.GetValue(Self)); tkClass: @@ -897,6 +915,7 @@ begin tkSString, tkLString, tkAString, + tkInteger, tkBool :Stream.WriteValue('',V); tkClass: diff --git a/gui/game_run.pas b/gui/game_run.pas index 05f48b19..628336a4 100644 --- a/gui/game_run.pas +++ b/gui/game_run.pas @@ -148,6 +148,8 @@ begin vDevice.VulkanDeviceGuid:=Default(TGUID); TryStringToGUID(ConfInfo.VulkanInfo.device,vDevice.VulkanDeviceGuid); + + vDevice.VulkanAppFlags:=t_vulkan_app_flags(ConfInfo.VulkanInfo.app_flags); end; procedure prepare(GameStartupInfo:TGameStartupInfo); SysV_ABI_CDecl; diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index 80ad8808..487d7673 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -23,7 +23,6 @@ uses errno, kern_mtx, sys_event, - sys_eventvar, kern_event, sched_ule, kern_authinfo, diff --git a/sys/kern/kern_event.pas b/sys/kern/kern_event.pas index a2f1e0f5..9889b07e 100644 --- a/sys/kern/kern_event.pas +++ b/sys/kern/kern_event.pas @@ -1205,7 +1205,7 @@ var error:Integer; begin error:=0; - if (filt > 0) or (filt + EVFILT_SYSCOUNT < 0) then + if (filt >= 0) or (filt + EVFILT_SYSCOUNT < 0) then begin Writeln('trying to add a filterop that is out of range: ',(not filt),' is beyond ',EVFILT_SYSCOUNT); Exit(EINVAL); @@ -1230,7 +1230,7 @@ var error:Integer; begin error:=0; - if (filt > 0) or (filt + EVFILT_SYSCOUNT < 0) then + if (filt >= 0) or (filt + EVFILT_SYSCOUNT < 0) then begin Exit(EINVAL); end; @@ -1256,7 +1256,7 @@ end; function kqueue_fo_find(filt:Integer):p_filterops; begin - if (filt > 0) or (filt + EVFILT_SYSCOUNT < 0) then + if (filt >= 0) or (filt + EVFILT_SYSCOUNT < 0) then begin Exit(nil); end; @@ -1281,7 +1281,7 @@ end; procedure kqueue_fo_release(filt:Integer); begin - if (filt > 0) or (filt + EVFILT_SYSCOUNT < 0) then + if (filt >= 0) or (filt + EVFILT_SYSCOUNT < 0) then begin Exit; end; diff --git a/vulkan/vDevice.pas b/vulkan/vDevice.pas index 83b0e401..367d36db 100644 --- a/vulkan/vDevice.pas +++ b/vulkan/vDevice.pas @@ -13,6 +13,25 @@ type TExtensionNames=array of PChar; APhysicalDeviceProperties=array of TVkPhysicalDeviceProperties; + t_vulkan_app_flags=Set of + (va_debug_utils, //VK_EXT_debug_utils + va_validation_layer, //VK_LAYER_KHRONOS_validation + // + va_enable_gpu_assisted, //VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT + va_enable_gpu_assisted_reserve, //VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT + va_enable_best_practices, //VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT + va_enable_debug_printf, //VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT + va_enable_sync_validation, //VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT + // + va_disable_shaders, //VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT + va_disable_thread_safety, //VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT + va_disable_api_params, //VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT + va_disable_obj_lifetimes, //VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT + va_disable_core_checks, //VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT + va_disable_unique_handles, //VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT + va_disable_shader_validation //VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT + ); + TVulkanApp=class FInstance:TVkInstance; FPhysicalDevice:TVkPhysicalDevice; @@ -25,7 +44,7 @@ type FCFamilyCount:TVkUInt32; FTFamilyCount:TVkUInt32; // - Constructor Create(debug,printf,validate:Boolean); + Constructor Create(flags:t_vulkan_app_flags); Destructor Destroy; override; Procedure LoadFamily; virtual; function InstanceLayersIsExist(P:PChar):Boolean; @@ -222,6 +241,7 @@ procedure vkCmdWaitEvent(commandBuffer:TVkCommandBuffer; var VulkanDeviceGuid:TGUID; + VulkanAppFlags :t_vulkan_app_flags=[]; VulkanApp:TVulkanApp; DebugReport:TVDebugReport; @@ -927,24 +947,52 @@ begin begin vkDestroyInstance(FInstance,nil); end; + end; -Constructor TVulkanApp.Create(debug,printf,validate:Boolean); +type + AVkValidationFeatureEnable =array of TVkValidationFeatureEnableEXT; + AVkValidationFeatureDisable=array of TVkValidationFeatureDisableEXT; + +function GetEnabledFeatures(flags:t_vulkan_app_flags):AVkValidationFeatureEnable; +begin + Result:=nil; + if (va_enable_gpu_assisted in flags) then Insert(VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT ,Result,Length(Result)); + if (va_enable_gpu_assisted_reserve in flags) then Insert(VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT,Result,Length(Result)); + if (va_enable_best_practices in flags) then Insert(VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT ,Result,Length(Result)); + if (va_enable_debug_printf in flags) then Insert(VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT ,Result,Length(Result)); + if (va_enable_sync_validation in flags) then Insert(VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT ,Result,Length(Result)); +end; + +function GetDisabledFeatures(flags:t_vulkan_app_flags):AVkValidationFeatureDisable; +begin + Result:=nil; + if (va_disable_shaders in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT ,Result,Length(Result)); + if (va_disable_thread_safety in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT ,Result,Length(Result)); + if (va_disable_api_params in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT ,Result,Length(Result)); + if (va_disable_obj_lifetimes in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT ,Result,Length(Result)); + if (va_disable_core_checks in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT ,Result,Length(Result)); + if (va_disable_unique_handles in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT ,Result,Length(Result)); + if (va_disable_shader_validation in flags) then Insert(VK_VALIDATION_FEATURE_DISABLE_SHADER_VALIDATION_CACHE_EXT,Result,Length(Result)); +end; + +Constructor TVulkanApp.Create(flags:t_vulkan_app_flags); const dlayer='VK_LAYER_KHRONOS_validation'; var - vkApp :TVkApplicationInfo; - vkExtList:TExtensionNames; - vkLayer :array[0..0] of PChar; - vkCInfo :TVkInstanceCreateInfo; - vkPrintf :TVkValidationFeaturesEXT; - vkFeature:array[0..4] of TVkValidationFeatureEnableEXT; - Features2:TVkPhysicalDeviceFeatures2; - F16_8 :TVkPhysicalDeviceShaderFloat16Int8Features; - FSF_8 :TVkPhysicalDevice8BitStorageFeatures; - FSF16 :TVkPhysicalDevice16BitStorageFeatures; - FRF :TVkPhysicalDeviceRobustness2FeaturesEXT; - FDI :TVkPhysicalDeviceDescriptorIndexingFeatures; + vkApp :TVkApplicationInfo; + vkExtList :TExtensionNames; + vkLayer :array[0..0] of PChar; + vkCInfo :TVkInstanceCreateInfo; + vkEnabled :AVkValidationFeatureEnable; + vkDisabled:AVkValidationFeatureDisable; + vkFeatures:TVkValidationFeaturesEXT; + Features2 :TVkPhysicalDeviceFeatures2; + F16_8 :TVkPhysicalDeviceShaderFloat16Int8Features; + FSF_8 :TVkPhysicalDevice8BitStorageFeatures; + FSF16 :TVkPhysicalDevice16BitStorageFeatures; + FRF :TVkPhysicalDeviceRobustness2FeaturesEXT; + FDI :TVkPhysicalDeviceDescriptorIndexingFeatures; r:TVkResult; begin vkApp:=GetVkApplicationInfo; @@ -955,12 +1003,12 @@ begin vkCInfo.sType:=VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; vkCInfo.pApplicationInfo:=@vkApp; - if debug then + if (va_debug_utils in flags) then begin //VK_EXT_debug_utils Insert(VK_EXT_DEBUG_UTILS_EXTENSION_NAME,vkExtList,Length(vkExtList)); - if validate and InstanceLayersIsExist(dlayer) then + if (va_validation_layer in flags) and InstanceLayersIsExist(dlayer) then begin vkLayer[0]:=dlayer; vkCInfo.enabledLayerCount :=1; @@ -971,20 +1019,24 @@ begin vkCInfo.enabledExtensionCount :=Length(vkExtList); vkCInfo.ppEnabledExtensionNames:=@vkExtList[0]; - if debug and printf then + if (va_debug_utils in flags) then begin - vkFeature[0]:=VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT; - vkFeature[1]:=VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT; - //vkFeature[]:=VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT; - //vkFeature[1]:=VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT; - vkFeature[2]:=VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT; + vkEnabled :=GetEnabledFeatures (flags); + vkDisabled:=GetDisabledFeatures(flags); - vkPrintf:=Default(TVkValidationFeaturesEXT); - vkPrintf.sType:=VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; - vkPrintf.enabledValidationFeatureCount:=3; - vkPrintf.pEnabledValidationFeatures :=@vkFeature[0]; + if (Length(vkEnabled)<>0) or + (Length(vkDisabled)<>0) then + begin + vkFeatures:=Default(TVkValidationFeaturesEXT); + vkFeatures.sType:=VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT; - vkCInfo.pNext:=@vkPrintf; + vkFeatures.enabledValidationFeatureCount :=Length(vkEnabled); + vkFeatures.pEnabledValidationFeatures :=@vkEnabled[0]; + vkFeatures.disabledValidationFeatureCount:=Length(vkDisabled); + vkFeatures.pDisabledValidationFeatures :=@vkDisabled[0]; + + vkCInfo.pNext:=@vkFeatures; + end; end; Writeln('vkCreateInstance->'); @@ -1882,7 +1934,7 @@ begin Exit; end; - VulkanApp:=TVulkanApp.Create(true,true,true); + VulkanApp:=TVulkanApp.Create(VulkanAppFlags); DebugReport:=TVDebugReport.Create;