PageRenderTime 69ms CodeModel.GetById 62ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/xbmc/visualizations/Goom/goom2k4-0/sdl-goom/pixeldoubler.h

http://github.com/xbmc/xbmc
C++ Header | 58 lines | 5 code | 3 blank | 50 comment | 0 complexity | 31c41798226317d6eb75cd580af0b9b8 MD5 | raw file
 1#ifndef _PIXELDOUBLER_H
 2#define _PIXELDOUBLER_H
 3
 4#include "surface.h"
 5
 6/*
 7 * copie la surface src dans la surface dest en doublant la taille des pixels.
 8 *
 9 * la surface dest doit faire exactement 2 fois la taille de la surface src.
10 * (segfault sinon).
11 *
12 * auteur : JeKo <jeko@free.fr>
13 *
14 * bench : <2001-11-28|20h00> 9 cycles par pixel marqué (cpm) sur un PII 266.
15 *           (surement limité par le debit de la memoire vive..
16 *            je fonce chez moi verifier)
17 *         <chez moi|1h10> 11 cpm sur un Duron 800. (i.e. pas loin de 300fps)
18 *           surement que les acces memoires sont assez penalisant.
19 *           je tente d'aligner les données des surfaces pour voir.
20 *           => pas mieux : le systeme doit deja faire ca comme il faut.
21 *           mais pour l'alignement 64bits ca va etre utile : je passe a l'ASM
22 *         <3h00> l'optimisation asm a permi de gagner vraiment pas grand
23 *           chose (0.1 ms sur mon Duron).. le code en C semble suffisant.
24 *           et je persiste a croire ke la vitesse est plafonné par la vitesse
25 *           d'acces a la memoire.. ceci expliquerait aussi cela.
26 *
27 *         <2001-12-08|1h20> Travail sur le code assembleur :
28 *           pour reduire les temps d'acces memoire, utilisation de
29 *           l'instruction 3Dnow! PREFETCH/W pour le prechargement des
30 *           page de cache. pour pousser cette optimisation jusque au bout :
31 *           j'ai déroulé la boucle pour qu'elle traite a chaque passage
32 *           une page de cache complete en lecture et 2 en ecriture.
33 *           (optimisé sur un Duron=Athlon, page de cache = 64 octets)
34 *           preformances sur mon Duron 800 : 9 CPM.
35 *           (ce qui fait 18% de mieux que la version en C)
36 *           ATTENTION : CETTE VERSION NE SUPPORTE DONC QUE DES TAILLES DE
37 *           SURFACE AYANT UNE LARGEUR MULTIPLE DE 32 POUR DEST,
38 *           DONC 16 POUR SRC. (ce qui n'est pas tres genant puisque ce sont
39 *           des resolutions standard, mais il faut le savoir)
40 *           explication : alignement des données sur la taille des pages de
41 *           cache.
42 *           
43 *         <2001-12-08|14h20> Apres intense potassage de la doc de l'Athlon,
44 *           decouverte certaines subtilités de ce FABULEUX processeur :)
45 *           entrelacement de la copie de 2 pixel, plus utilisation de
46 *           l'instruction de transfert rapide 3Dnow! MOVNTQ... attention les
47 *           chiffres -> sur mon Duron 800 : 4 CPM !!!!!
48 *
49 * note : ne fonctionne que sur un systeme 32bits.. mais le faire fonctionner
50 *        sur une machine autre ne posera aucun probleme.
51 *        (le seul truc c'est ke j'ai considéré mes pointeurs comme des entiers
52 *        32bits <- je sais je suis vaxiste, et alors???:)
53 *
54 * copyright (c)2001, JC Hoelt for iOS software.
55 */
56void pixel_doubler (Surface *src, Surface *dest) ;
57
58#endif