/**
 * =========================================================================
 * File        : gfx.cpp
 * Project     : 0 A.D.
 * Description : graphics card detection.
 * =========================================================================
 */

// license: GPL; see lib/license.txt

#include "precompiled.h"
#include "gfx.h"

#include "lib/external_libraries/sdl.h"


char gfx_card[GFX_CARD_LEN] = "";
char gfx_drv_ver[GFX_DRV_VER_LEN] = "";

int gfx_mem = -1;   // [MiB]; approximate


extern LibError ogl_get_gfx_info();

// detect graphics card and set the above information.
void gfx_detect()
{
    // TODO: add sizeof(FB)?
    gfx_mem = (SDL_GetVideoInfo()->video_mem) / 1048576;    // [MiB]

    // try platform-specific version: they return more
    // detailed information, and don't require OpenGL to be ready.
#if OS_WIN
    extern LibError win_get_gfx_info();
    if(win_get_gfx_info() < 0)
#endif
    {
        // the OpenGL version should always work, unless OpenGL isn't ready for use,
        // or we were called between glBegin and glEnd.
        ogl_get_gfx_info();
    }

    // remove crap from vendor names. (don't dare touch the model name -
    // it's too risky, there are too many different strings)
#define SHORTEN(what, chars_to_keep)\
    if(!strncmp(gfx_card, what, ARRAY_SIZE(what)-1))\
    memmove(gfx_card+chars_to_keep, gfx_card+ARRAY_SIZE(what)-1, strlen(gfx_card)-(ARRAY_SIZE(what)-1)+1);
    SHORTEN("ATI Technologies Inc.", 3);
    SHORTEN("NVIDIA Corporation", 6);
    SHORTEN("S3 Graphics", 2);                  // returned by EnumDisplayDevices
    SHORTEN("S3 Graphics, Incorporated", 2);    // returned by GL_VENDOR
#undef SHORTEN
}