Add check for Qualcomm devices on Windows

Some of these devices are not capable of running >=4.0, due to issues
with Mesa's Compute Shaders and their D3D drivers.

This PR marks those GPUs as unsupported, and prints info to stdout.

A driver update will be available for 8cx Gen3 on the 17th October
from here:
https://www.qualcomm.com/products/mobile/snapdragon/pcs-and-tablets/snapdragon-8-series-mobile-compute-platforms/snapdragon-8cx-gen-3-compute-platform#Software

It will take longer via the standard MS Windows Update channels,
as there is certification, testing, etc required, but it is possible
to get the drivers, at least.

This issue applies even when using emulated x64.

If this does not get merged, all WoA devices will break with 4.0,
where older ones will just launch a grey screen and crash, and newer
ones will open, but scenes will not render correctly in Workbench.

These devices work by using Mesa's D3D12 Gallium driver ("GLOn12"),
which is why we have to read the DirectX driver version - the version
reported by OpenGL is the mesa version, which is independent of the
driver (which is the part with the bug).

Pull Request: https://projects.blender.org/blender/blender/pulls/113674
This commit is contained in:
Anthony Roberts
2023-10-20 17:18:35 +02:00
committed by Clément Foucault
parent 051b02ed11
commit 4e69e49e7e
6 changed files with 98 additions and 11 deletions

View File

@@ -59,14 +59,14 @@ static PyObject *pygpu_platform_version_get(PyObject * /*self*/)
return PyUnicode_FromString(GPU_platform_version());
}
PyDoc_STRVAR(
pygpu_platform_device_type_get_doc,
".. function:: device_type_get()\n"
"\n"
" Get GPU device type.\n"
"\n"
" :return: Device type ('APPLE', 'NVIDIA', 'AMD', 'INTEL', 'SOFTWARE', 'UNKNOWN').\n"
" :rtype: str\n");
PyDoc_STRVAR(pygpu_platform_device_type_get_doc,
".. function:: device_type_get()\n"
"\n"
" Get GPU device type.\n"
"\n"
" :return: Device type ('APPLE', 'NVIDIA', 'AMD', 'INTEL', 'SOFTWARE', 'QUALCOMM', "
"'UNKNOWN').\n"
" :rtype: str\n");
static PyObject *pygpu_platform_device_type_get(PyObject * /*self*/)
{
const char *device;
@@ -85,6 +85,10 @@ static PyObject *pygpu_platform_device_type_get(PyObject * /*self*/)
else if (GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_ANY, GPU_DRIVER_ANY)) {
device = "SOFTWARE";
}
/* Right now we can only detect Qualcomm GPUs on Windows, not other OSes */
else if (GPU_type_matches(GPU_DEVICE_QUALCOMM, GPU_OS_WIN, GPU_DRIVER_ANY)) {
device = "QUALCOMM";
}
else {
device = "UNKNOWN";
}