Estoy escribiendo una pequeña utilidad que informa de las capacidades del sistema. Uno es el modelo de sombreado más alto compatible con la tarjeta gráfica instalada, y actualmente lo estoy detectando utilizando las capacidades del dispositivo de Direct3D 9.0 c y verificando los campos VertexShaderVersion
y PixelShaderVersion
de la estructura D3DCAPS9
.
HRESULT hrDCaps = poD3D9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &oCaps); if (!FAILED(hrDCaps)) { // Pixel and vertex shader model versions. Use the minimum number of each for "the" shader model version const int iVertexShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.VertexShaderVersion); const int iPixelShaderModel = D3DSHADER_VERSION_MAJOR(oCaps.PixelShaderVersion);
Sin embargo, ambos valores devuelven shader model 3 incluso para tarjetas que admiten modelos superiores. Esto es lo que devuelve GPU-Z para la misma tarjeta, por ejemplo:
Esta pregunta indica que DX9 nunca reportará más de SM3 incluso en tarjetas que admiten un modelo superior, pero en realidad no menciona cómo resolverlo.
¿Cómo obtengo con precisión el modelo de sombreado compatible con la tarjeta instalada? Es decir, las capacidades de la tarjeta, no las capacidades del controlador DirectX instalado.
La utilidad tiene que ejecutarse en Windows 2000 y superior, y funcionar en sistemas donde no se haya instalado una tarjeta gráfica e incluso DirectX. Actualmente estoy cargando dinámicamente DX9, por lo que en esos sistemas la comprobación falla correctamente (lo cual está bien.) Pero estoy buscando una solución similar: algo que todavía se ejecute en todos los sistemas y funcione correctamente (detecte la versión SM) en la mayoría de los sistemas.
Editar – propósito: No estoy usando este código para cambiar dinámicamente las características de un programa, es decir, seleccionar sombreadores. Lo estoy usando para informar de las capacidades de hardware como un «ping» a un servidor, que está acostumbrado a tener una buena idea del hardware típico que usan nuestros clientes, que puede informar decisiones futuras de productos. (Por ejemplo: ¿cuántos clientes tienen SM4 o superior? ¿Cuántos están usando un sistema operativo de 64 bits? Sucesivamente.) Esta es la razón por la que (a) falla con gracia, por lo que sabemos que falló, o (b) obtener un número de modelo de sombreado preciso son los dos modos preferidos.
Editar – respuestas hasta ahora: La siguiente respuesta de SigTerm sugiere crear instancias de DirectX 11, 10.1, 10 y 9.0 c en orden, y basar el modelo de sombreado reportado en qué versión se creó la instancia sin errores (modelo de sombreado 5, 4.1, 4 y DXCAPS en ese orden.) Si es posible, apreciaría un ejemplo de código del DX11 y 10 formas de hacer esto.
Esta puede no ser una solución fiable. Por ejemplo, estoy ejecutando Windows en una máquina virtual VMware Fusion en OSX. Los controladores de Fusion informan DX11 en DxDiag, pero sé por las especificaciones técnicas de Fusion que solo admite DX9.0c y shader model 3. Sin embargo, con esta excepción, este método parece la mejor manera hasta ahora.