En Mac OS X hay unas llamadas nativas para obtener la cantidad de VRAM instalada. ¿hay alguna forma de hacer lo propio en Windows, desde OpenGL?
Creo que hay un mecanismo para ello usando DirectX/dxDiag.. pero no me gusta un pelo, y además he visto fallar más de una vez la estimación de VRAM que hace dxDiag.
Necesito saber si la tarjeta de vídeo tiene 32mb de ram o más, para así poder hacer algunas decisiones sobre la calidad de los recursos a cargar en un juego.
Con SDL se puede. Con OpenGL a secas ni idea.
SDL tiene código abierto...
Pues llevo 10 minutos buscando en la SDL, web, google, etc.. y no veo nada al respecto :ph34r:
var
_info : PSDL_VideoInfo;
...
_info := SDL_GetVideoInfo;
if _info <> NIL then LogWriteln('Video memory: ' + IntToStr(_info^.video_mem));
Gracias Trancos ;)
He estado mirando los fuentes, y se apoya en DirectDraw.. no sé si me valdrá la pena el jaleo. Gracias!!
OpenGL no esta pensado para que obtengas la cantidad de memoria de video, eso se supone que es transparente, ya que hay tarjetas antiguas (y actuales) que no tengan memoria de video.. y aun asi funcionen con la memoria del sistema (tienen una memoria compartida).
Ten en cuenta que OGL esta pensado para TODO tipo de dispositivos 3d, y eso incluye estaciones de trabajo que no funcionan como PCs domesticos.
Es mejor dejar esa decision de la calidad al usuario.
Si aun asi quieres hacer algo al respecto, solo te queda usar directx, o hacer peticiones de texturas (512x512 1024x1024 etc) hasta que te la denieguen, para hacerte una idea.
Pero yo NO te lo recomiendo.
pd. si tienes mas dudas, OpenGL forums tienen a toda la gente alli metida.
http://www.opengl.org
Bueno, aquí dejo la rutina final, para el que le sirva:
const int GetInstalledVRAM( void )
{
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER
AGLRendererInfo info;
GLint vram( 0 );
info = aglQueryRendererInfo ( NULL, 0 );
while ( info != NULL )
{
if( aglDescribeRenderer( info, AGL_VIDEO_MEMORY, &vram ) == GL_TRUE )
{
if( vram > 0 )
return static_cast<int>( vram / (1024 * 1024) );
}
info = aglNextRendererInfo( info );
}
return 0;
#elif WIN32
HINSTANCE DDrawDLL;
int vram ( 0 );
DDrawDLL = LoadLibrary( "ddraw.dll" );
if( DDrawDLL != NULL )
{
MYPROC DDrawCreate;
LPDIRECTDRAW DDraw;
HRESULT hres;
/* Try to create a valid DirectDraw object */
DDrawCreate = ( MYPROC ) GetProcAddress( DDrawDLL, "DirectDrawCreate");
if( ( DDrawCreate != NULL )
&& !FAILED( DDrawCreate( NULL, &DDraw, NULL ) ) )
{
DDCAPS caps;
memset(&caps,0,sizeof(DDCAPS));
caps.dwSize = sizeof(DDCAPS);
hres = IDirectDraw2_GetCaps( DDraw, &caps, NULL );
if( hres == S_OK )
{
// dwvidMemTotal is the number of bytes(approximate)
vram = caps.dwVidMemTotal / (1024 * 1024);
}
IDirectDraw_Release( DDraw );
}
FreeLibrary( DDrawDLL );
}
return vram;
#endif // WIN32
}
Si veis algo raro no dudeis en comentarlo. Podeis usar este código libremente, a cambio, vuestra alma me pertenecerá en el momento de vuestra muerte.
Edit:
por cierto, el código de Windows/DirectDraw usa las interfaces de DirectX 5, con lo cual debería funcionar en W98(no SE) en adelante. En caso de error devuelve cero siempre.
Otra cosa. El código de Mac devuelve la cantidad de megas de ram exactos. En cambio, DirectDraw devuelve cosas como 13mb para tarjetas de 16mb, 122mb para tarjetas de 128mb.. no sé de dónde viene la cantidad que descuenta, quizá sea el frame-buffer.. ¿alguna idea? Lo digo para que lo tengais en cuenta en vuestro código.
Edit: Ethernet, esto se podría colocar como COTW no? Si gusta lo puedo empaquetar en un zip, con un programa simple de consola para hacer la prueba.
bueno, ni que decir, que no es necesario linkar con DirectX, lo único
necesario es ddraw.h por las estructuras utilizadas.
PD: La parte de windoz es mia, (twist)
asi que la mitad de vuestra alma pa mi, :P
Cita de: ZaelSiuS
Edit: Ethernet, esto se podría colocar como COTW no? Si gusta lo puedo empaquetar en un zip, con un programa simple de consola para hacer la prueba.
No había leído el post porque ya había leído el code en tu blog :)
Sí, es perfectamente válido para el COTW :) si tienes la aplicación pásamela, si no no pasa nada, creo que el código tiene un funcionamiento obvio. En cualquier caso luxo hace tiempo que dejó de contestarme por MSN y él es que subía los cotw al server de stratos.
Siempre e pensado que pedir DirectX y OpenGL en un mismo programa es un poco tonto, nop?
Saludos.
Cita de: _GreySiempre e pensado que pedir DirectX y OpenGL en un mismo programa es un poco tonto, nop?
Si conoces alguna manera mejor de obtener la memoria de vídeo en OpenGL/Windows..