blob: 3eadbfd65c497d88923bba72d28b3c900fd217b6 [file] [log] [blame]
# Copyright (c) 2015-2016 The Khronos Group Inc.
# Copyright (c) 2015-2016 Valve Corporation
# Copyright (c) 2015-2016 LunarG, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Author: David Pinedo <david@LunarG.com>
# Author: Mark Young <mark@LunarG.com>
#
# This Powershell script is used by the Vulkan Run Time Installer/Uninstaller to:
# - Copy the most recent vulkan-<majorabi>-*.dll in C:\Windows\System32
# to vulkan-<majorabi>.dll
# - Copy the most recent version of vulkaninfo-<abimajor>-*.exe in
# C:\Windows\System32 to vulkaninfo.exe
# - The same thing is done for those files in C:\Windows\SysWOW64 on a 64-bit
# target.
# - Set the layer registry entries to point to the layer json files
# in the Vulkan SDK associated with the most recent vulkan*dll.
#
# This script can be called with the following two parameters:
# $majorabi : a single string number specifying the major abi version.
# $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS.
#
# majorabi and ossize are either prepended to this script or specificied as args
Param(
[string]$majorabiarg,
[int]$ossizearg
)
if ($majorabi -eq $null) {
$majorabi=$majorabiarg
}
if ($ossize -eq $null) {
$ossize=$ossizearg
}
function WriteToLog ($x) {
echo $x | Out-File -encoding ascii -append -filepath $script:log
}
function notNumeric ($x) {
try {
0 + $x | Out-Null
return $false
} catch {
return $true
}
}
function setScriptReturnValue($rvalue) {
if ($script:scriptReturnValue -eq 0) {
$script:scriptReturnValue = $rvalue
}
}
# Clear any pre-existing errors and set default return value
$Error.Clear();
$script:scriptReturnValue=0
# Start logging
$script:log=$Env:Temp+"\ConfigLayersAndVulkanDLL.log"
Remove-Item $script:log
# Ignore errors related to log file
$Error.Clear();
WriteToLog "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize"
$startTime=Get-Date
WriteToLog "Start time : $startTime"
WriteToLog "Poweshell Version information:"
WriteToLog $PsVersionTable
$vulkandll = "vulkan-"+$majorabi+".dll"
$windrive = $env:SYSTEMDRIVE
$winfolder = $env:SYSTEMROOT
$script:VulkanDllList=@()
# The name of the versioned vulkan dll file is one of the following:
#
# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>-<prebuildno>
# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>
# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prebuildno>
# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
#
# <major>, <minor>, <patch>, <buildno> and <prebuildno> are 1 to 10 numeric digits.
# <prerelease> is any combination of alpha and numeric characters.
# If <prerelease> and/or <prebuildno> are present, this identifies a prerelease,
# and the vulkan dll file will be considered less recent than one with the same
# <major>, <minor>, <patch>, <buildno> numbers without the <prerelease> and/or
# <prebuildno>.
# We first create an array, with one array element for each vulkan-*dll in
# C:\Windows\System32 (and C:\Windows\SysWOW64 on 64-bit systems), with each element
# containing:
# <major>=<minor>=<patch>=<buildno>=<prebuildno>=<prerelease>=
# filename
# @<major>@<minor>@<patch>@<buildno>@<prerelease>@<prebuildno>@
# [Note that the above three lines are one element in the array.]
# The build identifiers separated by "=" are suitable for sorting, i.e.
# expanded to 10 digits with leading 0s. If <prerelease> or <prebuildno> are
# not specified, "zzzzzzzzzz" is substituted for them, so that they sort
# to a position after those that do specify them. Note that <prerelease>
# is "less significant" in the sort than <prebuildno>, and that <prerelease> is
# always treated as an alpha string, even though it may contain numeric characters.
# The build identifiers separated by "@" are the original values extracted
# from the file name. They are used later to find the path to the SDK
# install directory for the given filename.
function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
{
WriteToLog "UpdateVulkanSysFolder $dir $writeSdkName"
# Push the current path on the stack and go to $dir
Push-Location -Path $dir
# Create a list for all the DLLs in the folder.
# First Initialize the list to empty
$script:VulkanDllList = @()
# Find all vulkan dll files in this directory
dir -name vulkan-$majorabi-*.dll |
ForEach-Object {
WriteToLog "File $_"
if ($_ -match "=" -or
$_ -match "@" -or
$_ -match " " -or
($_.Split('-').count -lt 6) -or
($_.Split('-').count -gt 8) -or
!$?)
{
# If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than
# 7 dashes, it wasn't installed by the Vulkan Run Time.
# Note that we need to use return inside of ForEach-Object is to continue with iteration.
WriteToLog "Ignoring $_ - bad format"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
# If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time
$vulkaninfo=$_ -replace ".dll",".exe"
$vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"
if (-not (Test-Path $vulkaninfo) -or
!$?) {
WriteToLog "Rejected $_ - $vulkaninfo not present"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
$major=$_.Split('-')[2]
$majorOrig=$major
$minor=$_.Split('-')[3]
$minorOrig=$minor
$patch=$_.Split('-')[4]
$patchOrig=$patch
$buildno=$_.Split('-')[5]
if ($buildno -match ".dll") {
# prerelease and prebuildno are not in the name
# Extract buildno, and set prerelease and prebuildno to "z"s
$buildno=$buildno -replace ".dll",""
$buildnoOrig=$buildno
$prerelease="z"*10
$prereleaseOrig=""
$prebuildno="z"*10
$prebuildnoOrig=""
} else {
# Extract buildno, prerelease, and prebuildno
$f=$_ -replace ".dll",""
$buildno=$f.Split('-')[5]
$buildnoOrig=$buildno
$prerelease=$f.Split('-')[6]
$prebuildno=$f.Split('-')[7]
if ($prebuildno.Length -eq 0) {
if ($prerelease -match "^[0-9]") {
# prerelease starts with a digit, it must be the prebuildno
$prebuildno=$prerelease
$prerelease=""
}
}
$prereleaseOrig=$prerelease
$prebuildnoOrig=$prebuildno
if ($prerelease.Length -eq 0) {
$prerelease="z"*10
}
if ($prebuildno.Length -eq 0) {
$prebuildno="z"*10
}
}
WriteToLog "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"
if (!$?) {
WriteToLog "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
# Make sure fields that are supposed to be numbers are numbers
if (notNumeric($major)) {
WriteToLog "Ignoring $_ - bad major"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
if (notNumeric($minor)) {
WriteToLog "Ignoring $_ - bad minor"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
if (notNumeric($patch)) {
WriteToLog "Ignoring $_ - bad patch"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
if (notNumeric($buildno)) {
WriteToLog "Ignoring $_ - bad buildno"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
if (notNumeric($prebuildno)) {
if ($prebuildno -ne "z"*10) {
WriteToLog "Ignoring $_ - bad prebuildno"
# Not a real error, so just clear it for now.
$Error.Clear();
# NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop
return
}
}
$major = $major.padleft(10,'0')
$minor = $minor.padleft(10,'0')
$patch = $patch.padleft(10,'0')
$buildno = $buildno.padleft(10,'0')
$prerelease = $prerelease.padright(10,'z')
$prebuildno = $prebuildno.padleft(10,'0')
# Add a new element to the $VulkanDllList array
WriteToLog "Adding $_ to Vulkan dll list "
$script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder adding DLL $_ to list"
setScriptReturnValue(10)
}
}
# If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file.
# Copy the most recent vulkan*.dll (named in the last element of $VulkanDllList) to vulkan-$majorabi.dll.
if ($script:VulkanDllList.Length -gt 0) {
# Sort the list. The most recent vulkan-*.dll will be in the last element of the list.
[array]::sort($script:VulkanDllList)
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder sorting DLL list"
setScriptReturnValue(20)
}
# Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.
# The most recent vulkanDLL is the second word in the last element of the
# sorted $VulkanDllList. Copy it to $vulkandll.
$mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]
WriteToLog "Copying $mrVulkanDll $vulkandll"
Copy-Item $mrVulkanDll $vulkandll -force
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll"
setScriptReturnValue(30)
}
# Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.
# We create the source file name for the copy from $mrVulkanDll.
$mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"
$mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"
WriteToLog "Copying $mrVulkaninfo vulkaninfo.exe"
Copy-Item $mrVulkaninfo vulkaninfo.exe -force
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe"
setScriptReturnValue(40)
}
# Create the name used in the registry for the SDK associated with $mrVulkanDll.
$major=$script:VulkanDllList[-1].Split('@')[1]
$minor=$script:VulkanDllList[-1].Split('@')[2]
$patch=$script:VulkanDllList[-1].Split('@')[3]
$buildno=$script:VulkanDllList[-1].Split('@')[4]
$prerelease=$script:VulkanDllList[-1].Split('@')[5]
$prebuildno=$script:VulkanDllList[-1].Split('@')[6]
$sdktempname="VulkanSDK"+$major + "." + $minor + "." + $patch + "." + $buildno
if ($prerelease -ne "") {
$sdktempname=$sdktempname + "." + $prerelease
}
if ($prebuildno -ne "") {
$sdktempname=$sdktempname + "." + $prebuildno
}
WriteToLog "sdkname = $sdktempname"
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder encountered error generating SDK name"
setScriptReturnValue(50)
}
}
# Return to our previous folder
Pop-Location
if (!$?) {
WriteToLog "Error: UpdateVulkanSysFolder popping location"
setScriptReturnValue(60)
}
# Only update the overall script-scope SDK name if we're told to
if ($writeSdkName -ne 0) {
$script:sdkname = $sdktempname
}
return
}
# We only care about SYSWOW64 if we're targeting a 64-bit OS
if ($ossize -eq 64) {
# Update the SYSWOW64 Vulkan DLLS/EXEs
WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0"
UpdateVulkanSysFolder $winfolder\SYSWOW64 0
if (!$?) {
WriteToLog "Error: Calling UpdateVulkanSysFolder for 64-bit OS"
setScriptReturnValue(70)
}
}
# If this is a 64 bit OS and a 32 bit powershell
if (($ossize -eq 64 ) -and ([IntPtr]::size -eq 4)) {
# Update the SYSTEM32 Vulkan DLLS/EXEs
WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1"
UpdateVulkanSysFolder $winfolder\SYSNATIVE 1
if (!$?) {
WriteToLog "Error: Calling UpdateVulkanSysFolder for all OS"
setScriptReturnValue(80)
}
} else {
# Update the SYSTEM32 Vulkan DLLS/EXEs
WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1"
UpdateVulkanSysFolder $winfolder\SYSTEM32 1
if (!$?) {
WriteToLog "Error: Calling UpdateVulkanSysFolder for all OS"
setScriptReturnValue(81)
}
}
# Create an array of vulkan sdk install dirs
WriteToLog "Creating array of of Vulkan SDK Install dirs"
$mrVulkanDllInstallDir=""
$VulkanSdkDirs=@()
$installSDKRegs = @(Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall)
if ($installSDKRegs -ne $null) {
ForEach ($curSDKReg in $installSDKRegs) {
if ($curSDKReg -ne $null) {
$regkey=$curSDKReg -replace ".*\\",""
if ($regkey -match "VulkanSDK") {
# Get the install path from UninstallString
$tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
if (!$? -or $tmp -eq $null) {
WriteToLog "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey"
$Error.Clear();
continue;
}
$tmp=$tmp -replace "\\Uninstall.exe.*",""
$tmp=$tmp -replace ".*=.",""
WriteToLog "Adding $tmp to VulkanSDKDirs"
$VulkanSdkDirs+=$tmp
if ($regkey -eq $script:sdkname) {
# Save away the sdk install dir for the the most recent vulkandll
WriteToLog "Setting mrVulkanDllInstallDir to $tmp"
$mrVulkanDllInstallDir=$tmp
}
}
}
}
}
if (!$?) {
WriteToLog "Error: Failed creating array of of Vulkan SDK Install dirs"
setScriptReturnValue(90)
}
# Search list of sdk install dirs for an sdk compatible with $script:sdkname.
# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.
if ($mrVulkanDllInstallDir -eq "" -and $script:VulkanDllList.Length -gt 0) {
WriteToLog "Searching VulkanDllList"
ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {
$tmp=$script:VulkanDllList[$idx]
$vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]
$vulkanDllMinor=$script:VulkanDllList[$idx].Split('@')[2]
$vulkanDllPatch=$script:VulkanDllList[$idx].Split('@')[3]
$vulkanDllBuildno=$script:VulkanDllList[$idx].Split('@')[4]
$vulkanDllPrerelease=$script:VulkanDllList[$idx].Split('@')[5]
$vulkanDllPrebuildno=$script:VulkanDllList[$idx].Split('@')[6]
$regEntry="VulkanSDK"+$vulkanDllMajor+"."+$vulkanDllMinor+"."+$vulkanDllPatch+"."+$vulkanDllBuildno
if ($vulkanDllPrerelease) {
$regEntry=$regEntry+"."+$vulkanDllPrerelease
}
if ($vulkanDllPrebuildno) {
$regEntry=$regEntry+"."+$vulkanDllPrebuildno
}
WriteToLog "Comparing $regEntry"
$rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
if (!$? -or $rval -eq $null) {
WriteToLog "Ignoring $regEntry - corresponding SDK registry entry does not exist"
$Error.Clear();
continue
}
$instDir=$rval
$instDir=$instDir -replace "\\Uninstall.exe.*",""
$instDir=$instDir -replace ".*=.",""
if ($rval) {
$rval=$rval -replace ".* DisplayVersion=",""
$rval=$rval -replace ";.*",""
$reMajor=$rval.Split('.')[0]
$reMinor=$rval.Split('.')[1]
$rePatch=$rval.Split('.')[2]
if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
WriteToLog "Setting mrVulkanDllInstallDir to $instDir"
$mrVulkanDllInstallDir=$instDir
break
}
}
}
if (!$?) {
WriteToLog "Failed searching VulkanDLLList"
$Error.Clear();
}
}
# Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs.
# We do this because there is in a bug in SDK 0.9.3 in which layer
# reg entries were not removed on uninstall. So we'll try to clean up
# and remove them now.
# This works only if 0.9.3 was installed to the default location.
# If it was not installed to the default location, those entries will
# need to be cleaned up manually.
$VulkanSdkDirs+="C:\VulkanSDK\0.9.3"
$VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3"
# Remove layer registry values associated with all installed Vulkan SDKs.
# Note that we remove only those entries created by Vulkan SDKs. If other
# layers were installed that are not from an SDK, we don't mess with them.
WriteToLog "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
$regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property)
if ($regkeys -ne $null) {
ForEach ($regval in $regkeys) {
if ($regval -ne $null) {
ForEach ($sdkdir in $VulkanSdkDirs) {
if ($regval -like "$sdkdir\*.json") {
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
if (!$?) {
WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval"
} else {
WriteToLog "Removed registry value $regval"
}
}
}
}
}
}
if (!$?) {
WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
setScriptReturnValue(100)
}
# Remove 32-bit layer registry value if we're targeting a 64-bit OS
if ($ossize -eq 64) {
$regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property)
if ($regkeys -ne $null) {
ForEach ($regval in $regkeys) {
if ($regval -ne $null) {
ForEach ($sdkdir in $VulkanSdkDirs) {
if ($regval -like "$sdkdir\*.json") {
Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
if (!$?) {
WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval"
} else {
WriteToLog "Removed WOW6432Node registry value $regval"
}
}
}
}
}
}
if (!$?) {
WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
setScriptReturnValue(110)
}
}
# Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from
WriteToLog "Creating new layer registry values"
if ($mrVulkanDllInstallDir -ne "") {
# Create registry keys if they don't exist
if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) {
WriteToLog "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
if (!$?) {
WriteToLog "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers"
setScriptReturnValue(120)
}
}
if ($ossize -eq 64) {
if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) {
WriteToLog "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null
if (!$?) {
WriteToLog "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers"
setScriptReturnValue(130)
}
}
}
if ($ossize -eq 64) {
# Create registry values in normal registry location for 64-bit items on a 64-bit OS
Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
ForEach-Object {
WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_"
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
if (!$?) {
WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"
setScriptReturnValue(140)
}
}
if (!$?) {
WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object "
setScriptReturnValue(150)
}
# Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
ForEach-Object {
WriteToLog "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_"
New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
if (!$?) {
WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_"
setScriptReturnValue(160)
}
}
if (!$?) {
WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "
setScriptReturnValue(170)
}
} else {
# Create registry values in normal registry location for 32-bit items on a 32-bit OS
Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
ForEach-Object {
WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_"
New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
if (!$?) {
WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_"
setScriptReturnValue(180)
}
}
if (!$?) {
WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object "
setScriptReturnValue(190)
}
}
}
# Debug - for testing handling of script failure in installer
#setScriptReturnValue(200)
# Final log output
WriteToLog "ConfigLayersAndVulkanDLL.ps1 completed, return status is $script:scriptReturnValue"
$endTime=Get-Date
WriteToLog "End time: $endTime"
# Since InstallerRT.nsi runs this script by piping it to powershell.exe, the exit status
# doesn't seem to be available. So we put in it a file where InstallRT.nsi can retrieve it.
$statusfile=$Env:Temp+"\ConfigLayersAndVulkanDLL.stat"
echo $script:scriptReturnValue | Out-File -encoding ascii -filepath $statusfile
exit $script:scriptReturnValue