[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Matrox g450, dri, fb etc.



On Fri, May 23, 2003 at 10:07:06AM +0200, Grégory SIMON wrote:
> Michel Luc <mluc@cern91.net> writes:
> 
> Bonjour,
> 
> > 357.400 à 369.800 FPS, c'est en plein écran ?
> 
> Les cinq premiers sont en plein écran, les cinq autres sont en
> fenêtre.
> 
> 380 frames in 5.0 seconds = 76.000 FPS
> 384 frames in 5.0 seconds = 76.800 FPS
> 379 frames in 5.0 seconds = 75.800 FPS
> 393 frames in 5.0 seconds = 78.600 FPS
> 408 frames in 5.0 seconds = 81.600 FPS
> 2010 frames in 5.0 seconds = 402.000 FPS
> 2190 frames in 5.0 seconds = 438.000 FPS
> 2368 frames in 5.0 seconds = 473.600 FPS
> 2150 frames in 5.0 seconds = 430.000 FPS
> 2159 frames in 5.0 seconds = 431.800 FPS
> 
> > Sous woody, G450, 1280x1024 et Depth 16, j'obtiens
> > de 965.600 à 966.00 FPS. Sans le FrameBuffer et tous les
> > jeux 3D fonctionnent super.
> 
> Tu commences à m'inquieter là :-)

Remarquer que le processeur utiliser peut aussi avoir une influence sur
les FPS.

> Tu veux dire quoi par "sans le FrameBuffer" ?
> Sans les modules du noyau ou sans l'option "useFBdev" dans
> XF86Config-4 ?

L'usage ou non du framebuffer device ne devrait avoir aucune incidence
sur l'execution de logiciel OpenGL accelere. La seule chose que fait le
fbdev pour X c'est de faire le changement de mode et la detection des
emplacement memoire. de plus cela permet d'avoir exactement le meme mode
sous X et sous la console, et de permettre un console switch immediat.

Autant que je sache, le framebuffer device matroxfb (tu utilise bien
matroxfb et non vesafb) ne touche en rien le module drm (contrairement
au driver i810 par exemple) et donc n'a aucune influence sur l'accel
openGL, ni sur l'accel 2D d'ailleurs.

> > C'est peut être du coté du paramétrage du FB qu'il te faut chercher
> > ?
> 
> A vrai dire je cherche un peu partout là :-)
> 
> Je suis en train de me demander si cette carte n'est pas 16Mo au lieu
> de 32Mo...

Dacil a voir, que te dis /var/log/XFree86.0.log ou dmesg ?

> Existe-t'il un utilitaire pour determiner la quantité de mémoire d'une
> carte graphique (cela m'éviterai de démonter la carte :-) ?

comme dis, matroxfb et le driver X mga te disent cela.

Si tu veut tester par toi meme, tu peut faire un mmap de l'adresse du
framebuffer, donne par lspci -v, et essayer d'ecrire a l'adresse
correspondant a 17Mo. Ensuite, tu lis l'adresse correspondant a 1Mo
(pour verifier qu'il n'y a pas de wrap-around) et a 17Mo. Si tu reussit
a relire tes donnees a 17 Mo et que les donnes ne sont pas a 1Mo, alors
tu a plus que 16Mo de memoire. 

Le fichier attache est deja un debut d'un tel outils.

Amicalement,

Sven Luther
#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>
#include <sys/mman.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <errno.h>

typedef int	bool;
#define FALSE   (0)
#define TRUE    (!FALSE)
static CARD8 *
mapcfg() {
    CARD8 * base;
    int fd;

    if ((fd = open("/proc/bus/pci/01/00.0", O_RDONLY)) < 0) {
	printf ("failed to open /proc/bus/pci/01/00.0 (%s)\n", strerror(errno));
	return NULL;
    }

    base = mmap((caddr_t)0, 10,
	PROT_READ,
	MAP_SHARED|MAP_LOCKED, fd,
	(off_t)10);

    close(fd);
    if (base == MAP_FAILED) {
	printf ("Could not mmap cfg area (%s) %d\n",
	    strerror(errno), errno);
	return NULL;
    }
    return base;
}
static void
unmapcfg (CARD8 * base) {
    munmap((caddr_t)base, 256);
}
static CARD8 *
mapmem(unsigned long Base, unsigned long Size) {
    CARD8 * base;
    int fd;

    if ((fd = open("/dev/mem", O_RDWR)) < 0) {
	printf ("failed to open /dev/mem (%s)\n", strerror(errno));
	return NULL;
    }

    base = mmap((caddr_t)0, Size,
	PROT_READ|PROT_WRITE,
	MAP_SHARED|MAP_LOCKED, fd,
	(off_t)Base);
    close(fd);
    if (base == MAP_FAILED) {
	printf ("Could not mmap memory"
	    " (0x%08x,0x%x) (%s)\n", Base, Size,
	    strerror(errno));
	return NULL;
    }
    return base;
}
static void
unmapmem (CARD8 * Base, unsigned long Size) {
    munmap((caddr_t)Base, Size);
}

int
main () {
    char dummy;
    CARD8 * mmio;
    CARD8 * fb;
    mmio = mapmem (0xdeec0000, MMIO_SIZE);
    fb = mapmem (0xd8000000, FB_SIZE);

    if (fb) unmapmem (fb, FB_SIZE);
    if (mmio) unmapmem (mmio, MMIO_SIZE);
}

Reply to: