It seems that Mirror's Edge (and also some PhysX demos), or likely the PhysX version that comes with that, needs NvAPI_CUDA_EnumComputeCapableByTopology (0x36e39e6b) for working PhysX. Unfortunately this function is not exposed by NVAPI headers.
May be similar to NvAPI_GPU_CudaEnumComputeCapableGpus (
|
NvAPI_Status __cdecl NvAPI_GPU_CudaEnumComputeCapableGpus(NV_COMPUTE_GPU_TOPOLOGY* pComputeTopo) { |
|
constexpr auto n = __func__; |
|
|
|
if (log::tracing()) |
|
log::trace(n, log::fmt::ptr(pComputeTopo)); |
|
|
|
if (!nvapiAdapterRegistry) |
|
return ApiNotInitialized(n); |
|
|
|
if (!pComputeTopo) |
|
return InvalidArgument(n); |
|
|
|
if (pComputeTopo->version != NV_COMPUTE_GPU_TOPOLOGY_VER1) |
|
return IncompatibleStructVersion(n, pComputeTopo->version); |
|
|
|
auto cudaCapableGpus = std::vector<NvPhysicalGpuHandle>(0); |
|
for (auto i = 0U; i < nvapiAdapterRegistry->GetAdapterCount(); i++) { |
|
auto adapter = nvapiAdapterRegistry->GetAdapter(i); |
|
if (!adapter->HasNvProprietaryDriver() || adapter->GetArchitectureId() < NV_GPU_ARCHITECTURE_GM000) // Maxwell is the oldest generation we can detect |
|
continue; |
|
|
|
cudaCapableGpus.push_back(reinterpret_cast<NvPhysicalGpuHandle>(adapter)); |
|
} |
|
|
|
// Those flags match NVAPI on Windows for a normal desktop machine |
|
auto flags = NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_CAPABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_ENABLE | NV_COMPUTE_GPU_TOPOLOGY_PHYSICS_RECOMMENDED; |
|
|
|
switch (pComputeTopo->version) { |
|
case NV_COMPUTE_GPU_TOPOLOGY_VER1: { |
|
auto pComputeTopoV1 = reinterpret_cast<NV_COMPUTE_GPU_TOPOLOGY_V1*>(pComputeTopo); |
|
pComputeTopoV1->gpuCount = cudaCapableGpus.size(); |
|
for (auto i = 0U; i < cudaCapableGpus.size(); i++) { |
|
pComputeTopoV1->computeGpus[i].hPhysicalGpu = cudaCapableGpus[i]; |
|
pComputeTopoV1->computeGpus[i].flags = flags; |
|
} |
|
break; |
|
} |
|
default: |
|
return Error(n); // Unreachable, but just to be sure |
|
} |
|
|
|
return Ok(n); |
|
} |
).
Ref: 5455377
Related: SveSop@7b69abf
It seems that Mirror's Edge (and also some PhysX demos), or likely the PhysX version that comes with that, needs
NvAPI_CUDA_EnumComputeCapableByTopology(0x36e39e6b) for working PhysX. Unfortunately this function is not exposed by NVAPI headers.May be similar to
NvAPI_GPU_CudaEnumComputeCapableGpus(dxvk-nvapi/src/nvapi_gpu.cpp
Lines 639 to 681 in dc2c0bd
Ref: 5455377
Related: SveSop@7b69abf