billitch

Bienvenue sur blog de billitch !
Du code, de la noise, et quelques pensées électrogènes...


mercredi 24 septembre 2008

Le C doit mourir

Le C est basé sur des standards désuets, et en voici encore une preuve : dans la norme ISO la conversion d'un float vers un int est une troncation de la partie flottante, tout programmeur le sait. Pourtant le FPU fait tous ses calculs dans un autre mode qui arrondit les valeurs, passer de ce mode au mode troncation vide le pipeline du FPU, ce qui fait perdre toute optimisation. Il existe une manière jusqu'à 10x plus rapide de convertir des floats en int en bénéficiant en plus d'un arrondi grace à la fonction lrint(3), comme l'explique cet excellent article de l'auteur de la libsndfile : Faster Floating Point to Integer Conversions.


jeudi 18 septembre 2008

OpenGL Texture Proxy

Pour savoir si une texture va tenir en mémoire, la FAQ d'OpenGL nous propose d'utiliser GL_TEXTURE_PROXY, mais leur technique ne marche pas toujours. Je décris rapidement la technique :

glTexImage2D (GL_PROXY_TEXTURE_2D, level, internalFormat,
              width, height, border,
              format, type, NULL);

En gros tout est normal sauf target qui devient GL_PROXY_TEXTURE_* et pixels qui est NULL. Inutile de balancer les pixels, on ne fait qu'évaluer la place en mémoire que prendra l'image au format donné. La FAQ nous dit qu'on peut ensuite savoir si ça a marché avec :

GLint width;
glGetTexLevelParameteriv (GL_PROXY_TEXTURE_2D, 0,
                          GL_TEXTURE_WIDTH, &actual_width);
if (actual_width == 0) {
    /* La texture ne tiendra pas en mémoire */
}

Seulement chez moi ça n'a pas marché. Après avoir lancé GDB, je me suis rendu compte que parfois actual_width contient une valeur qui n'est ni 0, ni width ! J'ai donc réécrit le test qui fonctionne beaucoup mieux ainsi :

if (actual_width != width) {
    /* La texture ne tiendra pas en mémoire */
}

Pour plus de détails :

1. Le jeudi 18 septembre 2008à18:41, par martin

Ah oué d'acc. 8D