Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Obtener Cantidad Memoria De Video En Opengl

Iniciado por Zaelsius, 09 de Junio de 2005, 01:55:09 PM

« anterior - próximo »

Zaelsius

 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.

Lord Trancos 2

 Con SDL se puede. Con OpenGL a secas ni idea.
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

ethernet


Zaelsius

 Pues llevo 10 minutos buscando en la SDL, web, google, etc.. y no veo nada al respecto  :ph34r:  

Lord Trancos 2

 
var
 _info : PSDL_VideoInfo;

 ...

 _info := SDL_GetVideoInfo;
 if _info <> NIL then LogWriteln('Video memory: ' + IntToStr(_info^.video_mem));
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

Zaelsius

 Gracias Trancos ;)

He estado mirando los fuentes, y se apoya en DirectDraw.. no sé si me valdrá la pena el jaleo. Gracias!!

seryu

 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

Zaelsius

 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.

ShAq

 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  

ethernet

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.


_Grey

 Siempre e pensado que pedir DirectX y OpenGL en un mismo programa es un poco tonto, nop?

Saludos.

Zaelsius

Cita de: "_Grey"Siempre 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..






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.