Vulkan error, vk::PhysicalDevice::createDeviceUnique: ErrorFeatureNotPresent

Still the same error from the patch jan 16.
Sad days with dx11 ahead... did anyone solve this issue by themselves?
Same problem here under Linux and integrated Intel graphics HD 620. Mesa drivers version 22.3.5 installed. Anyone found a way to fix this?
Hi. I am not sure if this is against the TOS; however, it might be helpful as it does not change the game files. GGG, please feel free to chime in.

I run Manjaro Linux. I understand that there is a software relationship between Vulkan and DXVK. DXVK is a dependency of Vulkan. If GGG provides DXVK with their install, I wonder if it's an older version.

Has anyone tried installing the git version of DXVK to see if that has fixed the Vulkan dependency error?
[/quote]
"
Belember wrote:
Hi. I am not sure if this is against the TOS; however, it might be helpful as it does not change the game files. GGG, please feel free to chime in.

I run Manjaro Linux. I understand that there is a software relationship between Vulkan and DXVK. DXVK is a dependency of Vulkan. If GGG provides DXVK with their install, I wonder if it's an older version.

Has anyone tried installing the git version of DXVK to see if that has fixed the Vulkan dependency error?





If I did everything right with the DXVK installation, it doesn't work for me.
Okay... so I decided to track down what exactly is missing in intel's vulkan.
The answer is shaderStorageImageReadWithoutFormat.
'vulkaninfo' reports it as a 'false' and PoE requests it, resulting in 'VK_ERROR_FEATURE_NOT_PRESENT' upon 'vkCreateDevice'.

Now the WTF part begins: PoE with Vulkan Intel graphics seems to run fine when tricked to think that the feature shaderStorageImageReadWithoutFormat is supported!

I wrote a basic wrapper for the 'vkCreateDevice' function that just takes down the bit requesting this feature.
LD_PRELOAD'ing a .so with the wrapper makes PoE just run...
I can't tell if there is a case/place where this would crash the game, but the basic gameplay just works.

Have a source here (one obviously needs a C++ compiler and vulkan dev headers to compile it):
"

#include <vulkan/vulkan.h>
#include <dlfcn.h>
#include <cstdio>
/*
Compile as:
g++ -fPIC --shared vulkan_intel_poe_override.cpp -lvulkan -o vulkan_intel_poe_override.so

Run wine as:
LD_PRELOAD=vulkan_intel_poe_override.so wine C:/Program\ Files\ \(x86\)/Grinding\ Gear\ Games/Path\ of\ Exile/PathOfExile.exe

Or just export that LD_PRELOAD as:
LD_PRELOAD=`readlink -e vulkan_intel_poe_override.so`
and then run wine in the same shell.
*/

// handle to the original vkCreateDevice function
auto vkCreateDevice_orig = (decltype(&vkCreateDevice)) dlsym(RTLD_NEXT, "vkCreateDevice");

extern "C" {

// the function that replaces the original vkCreateDevice
VkResult vkCreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDevice* pDevice){

printf("\nvkCreateDevice hack for running PoE on Intel graphics\n\n");

// POE needs:
// shaderStorageImageReadWithoutFormat: true <-- this one is FALSE on Intel

VkDeviceCreateInfo i = *pCreateInfo;
VkPhysicalDeviceFeatures f = *i.pEnabledFeatures;
f.shaderStorageImageReadWithoutFormat = false;
i.pEnabledFeatures=&f;

return vkCreateDevice_orig(physicalDevice, &i, pAllocator, pDevice);
}

}//extern "C"

I put a pre-built binary (for those too lazy to compile it themselves and lucky enough to have system libraries compatible with mine) here: https://jprofesorek.mooo.com/pub/vulkan_intel_poe_override.so
"
jprofesorek wrote:
Okay... so I decided to track down what exactly is missing in intel's vulkan.
The answer is shaderStorageImageReadWithoutFormat.
'vulkaninfo' reports it as a 'false' and PoE requests it, resulting in 'VK_ERROR_FEATURE_NOT_PRESENT' upon 'vkCreateDevice'.

Now the WTF part begins: PoE with Vulkan Intel graphics seems to run fine when tricked to think that the feature shaderStorageImageReadWithoutFormat is supported!

I wrote a basic wrapper for the 'vkCreateDevice' function that just takes down the bit requesting this feature.
LD_PRELOAD'ing a .so with the wrapper makes PoE just run...
I can't tell if there is a case/place where this would crash the game, but the basic gameplay just works.

Have a source here (one obviously needs a C++ compiler and vulkan dev headers to compile it):
"

#include <vulkan/vulkan.h>
#include <dlfcn.h>
#include <cstdio>
/*
Compile as:
g++ -fPIC --shared vulkan_intel_poe_override.cpp -lvulkan -o vulkan_intel_poe_override.so

Run wine as:
LD_PRELOAD=vulkan_intel_poe_override.so wine C:/Program\ Files\ \(x86\)/Grinding\ Gear\ Games/Path\ of\ Exile/PathOfExile.exe

Or just export that LD_PRELOAD as:
LD_PRELOAD=`readlink -e vulkan_intel_poe_override.so`
and then run wine in the same shell.
*/

// handle to the original vkCreateDevice function
auto vkCreateDevice_orig = (decltype(&vkCreateDevice)) dlsym(RTLD_NEXT, "vkCreateDevice");

extern "C" {

// the function that replaces the original vkCreateDevice
VkResult vkCreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDevice* pDevice){

printf("\nvkCreateDevice hack for running PoE on Intel graphics\n\n");

// POE needs:
// shaderStorageImageReadWithoutFormat: true <-- this one is FALSE on Intel

VkDeviceCreateInfo i = *pCreateInfo;
VkPhysicalDeviceFeatures f = *i.pEnabledFeatures;
f.shaderStorageImageReadWithoutFormat = false;
i.pEnabledFeatures=&f;

return vkCreateDevice_orig(physicalDevice, &i, pAllocator, pDevice);
}

}//extern "C"

I put a pre-built binary (for those too lazy to compile it themselves and lucky enough to have system libraries compatible with mine) here: https://jprofesorek.mooo.com/pub/vulkan_intel_poe_override.so



Hello, I'm impressed that someone finally solved this problem, but could you explain to me how to do it as a person who is not interested in programming? Thanks in advance.
Last edited by HolyEmper0r on Feb 14, 2024, 4:32:46 AM
"
HolyEmper0r wrote:
Hello, I'm impressed that someone finally solved this problem, but could you explain to me how to do it as a person who is not interested in programming? Thanks in advance.

I assume you run PoE on Linux using wine.

You need to either download (or compile yourself) the shared library (vulkan_intel_poe_override.so).
Remember where you put the file - you need the full path to that library in your filesystem.

(By the way, you should never trust random binaries posted in the web... there are valid reasons to be cautious, and that's why I posted the code.)

1) If you start PoE from console, then issue the command
export LD_PRELOAD=/path/to/the/vulkan_intel_poe_override.so
prior to starting PoE.
(You should see a 'vkCreateDevice hack for running PoE on Intel graphics' amidst wine output.)

2) If you use some fancy GUI thingamajig, you need to modify it so that it sets LD_PRELOAD environment variable to the path of the shared library.
The exact way to do this depends on the desktop enviornment / thingamajig that is being used.
For instance, in KDE plasma this screenshot shows how to do it.
This random link tells how to set environment variables in e.g., in Lutris.
"
jprofesorek wrote:
"
HolyEmper0r wrote:
Hello, I'm impressed that someone finally solved this problem, but could you explain to me how to do it as a person who is not interested in programming? Thanks in advance.

I assume you run PoE on Linux using wine.

You need to either download (or compile yourself) the shared library (vulkan_intel_poe_override.so).
Remember where you put the file - you need the full path to that library in your filesystem.

(By the way, you should never trust random binaries posted in the web... there are valid reasons to be cautious, and that's why I posted the code.)

1) If you start PoE from console, then issue the command
export LD_PRELOAD=/path/to/the/vulkan_intel_poe_override.so
prior to starting PoE.
(You should see a 'vkCreateDevice hack for running PoE on Intel graphics' amidst wine output.)

2) If you use some fancy GUI thingamajig, you need to modify it so that it sets LD_PRELOAD environment variable to the path of the shared library.
The exact way to do this depends on the desktop enviornment / thingamajig that is being used.
For instance, in KDE plasma this screenshot shows how to do it.
This random link tells how to set environment variables in e.g., in Lutris.


oh, you were writing about Linux the whole time, I thought you were talking about Windows, my mistake
"
jprofesorek wrote:
"
HolyEmper0r wrote:
Hello, I'm impressed that someone finally solved this problem, but could you explain to me how to do it as a person who is not interested in programming? Thanks in advance.

I assume you run PoE on Linux using wine.

You need to either download (or compile yourself) the shared library (vulkan_intel_poe_override.so).
Remember where you put the file - you need the full path to that library in your filesystem.

(By the way, you should never trust random binaries posted in the web... there are valid reasons to be cautious, and that's why I posted the code.)

1) If you start PoE from console, then issue the command
export LD_PRELOAD=/path/to/the/vulkan_intel_poe_override.so
prior to starting PoE.
(You should see a 'vkCreateDevice hack for running PoE on Intel graphics' amidst wine output.)

2) If you use some fancy GUI thingamajig, you need to modify it so that it sets LD_PRELOAD environment variable to the path of the shared library.
The exact way to do this depends on the desktop enviornment / thingamajig that is being used.
For instance, in KDE plasma this screenshot shows how to do it.
This random link tells how to set environment variables in e.g., in Lutris.


Hey! If I could upvote your comment you would get quite a few! Thank you so very much - you gave some really good information. I just hope that GGG will read your comments and include / use your input for fixing the issue from their side.
"
jprofesorek wrote:
Okay... so I decided to track down what exactly is missing in intel's vulkan.
The answer is shaderStorageImageReadWithoutFormat.
'vulkaninfo' reports it as a 'false' and PoE requests it, resulting in 'VK_ERROR_FEATURE_NOT_PRESENT' upon 'vkCreateDevice'.

Now the WTF part begins: PoE with Vulkan Intel graphics seems to run fine when tricked to think that the feature shaderStorageImageReadWithoutFormat is supported!

I wrote a basic wrapper for the 'vkCreateDevice' function that just takes down the bit requesting this feature.
LD_PRELOAD'ing a .so with the wrapper makes PoE just run...
I can't tell if there is a case/place where this would crash the game, but the basic gameplay just works.

Have a source here (one obviously needs a C++ compiler and vulkan dev headers to compile it):
"

#include <vulkan/vulkan.h>
#include <dlfcn.h>
#include <cstdio>
/*
Compile as:
g++ -fPIC --shared vulkan_intel_poe_override.cpp -lvulkan -o vulkan_intel_poe_override.so

Run wine as:
LD_PRELOAD=vulkan_intel_poe_override.so wine C:/Program\ Files\ \(x86\)/Grinding\ Gear\ Games/Path\ of\ Exile/PathOfExile.exe

Or just export that LD_PRELOAD as:
LD_PRELOAD=`readlink -e vulkan_intel_poe_override.so`
and then run wine in the same shell.
*/

// handle to the original vkCreateDevice function
auto vkCreateDevice_orig = (decltype(&vkCreateDevice)) dlsym(RTLD_NEXT, "vkCreateDevice");

extern "C" {

// the function that replaces the original vkCreateDevice
VkResult vkCreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkDevice* pDevice){

printf("\nvkCreateDevice hack for running PoE on Intel graphics\n\n");

// POE needs:
// shaderStorageImageReadWithoutFormat: true <-- this one is FALSE on Intel

VkDeviceCreateInfo i = *pCreateInfo;
VkPhysicalDeviceFeatures f = *i.pEnabledFeatures;
f.shaderStorageImageReadWithoutFormat = false;
i.pEnabledFeatures=&f;

return vkCreateDevice_orig(physicalDevice, &i, pAllocator, pDevice);
}

}//extern "C"

I put a pre-built binary (for those too lazy to compile it themselves and lucky enough to have system libraries compatible with mine) here: https://jprofesorek.mooo.com/pub/vulkan_intel_poe_override.so


Is there a way to do it in windows?

Report Forum Post

Report Account:

Report Type

Additional Info