π
<-
Chat plein-écran
[^]

Bug dans routine de tracé lignes

C, C++, ASM...

Bug dans routine de tracé lignes

Message non lude SlyVTT » 26 Jan 2021, 12:21

Hello,

encore une question, relative à un bug dans une routine de tracé de ligne horizontale.
Certaines couleurs semblent bien fonctionner, par contre d'autres ne fonctionne pas. Je pense qu'il s'agit d'un problème avec la manipulation de la mémoire via "memset" qui prend des octets, mais pas des blocs de 16bits.
y'a t il une autre fonction de manipulation de la mémoire qui permette de traiter les doubles octets ?

Pour un seul pixel ca a l'air Ok, par contre pour remplir une zone de la mémoire non...

Voici mon code qui bugge (tracé de lignes horizontales et certaines n'apparaissent tout simplement pas).
Y'a t il un moyen plus rapide qu'une boucle ?

Code: Tout sélectionner
#include <os.h>
#include <string.h>


// some RGB color definitions in high color and corresponding RGB code
#define S_Black           0x0000      /*   0,   0,   0 */
#define S_Navy            0x000F      /*   0,   0, 128 */
#define S_DarkGreen       0x03E0      /*   0, 128,   0 */
#define S_DarkCyan        0x03EF      /*   0, 128, 128 */
#define S_Brown           0x7800      /* 128,   0,   0 */
#define S_Purple          0x780F      /* 128,   0, 128 */
#define S_Olive           0x7BE0      /* 128, 128,   0 */
#define S_LightGrey       0xC618      /* 192, 192, 192 */
#define S_DarkGrey        0x7BEF      /* 128, 128, 128 */
#define S_Blue            0x001F      /*   0,   0, 255 */
#define S_Green           0x07E0      /*   0, 255,   0 */
#define S_Cyan            0x07FF      /*   0, 255, 255 */
#define S_Red             0xF800      /* 255,   0,   0 */
#define S_Magenta         0xF81F      /* 255,   0, 255 */
#define S_Yellow          0xFFE0      /* 255, 255,   0 */
#define S_White           0xFFFF      /* 255, 255, 255 */
#define S_Orange          0xFD20      /* 255, 165,   0 */
#define S_GreenYellow     0xAFE5      /* 173, 255,  47 */


void S_Clear_Screen( void )
{
    // Clear Screen and paint it black
    memset((void*) REAL_SCREEN_BASE_ADDRESS, 0x00, _scrsize());
}

void S_Draw_Pixel( int x, int y, unsigned short color )
{
    // Set the color of the pixel (x,y) to Color in R5G6B5 format
    if ((x>=0) && (x<=320) && (y>=0) && (y<=240))
    {
        unsigned short *screenAdress = REAL_SCREEN_BASE_ADDRESS;
        screenAdress += (y<<8) + (y<<6) + x;
        *(unsigned short *)screenAdress = color;
    }
}

void S_Draw_Scanline( int x0, int x1, int y, unsigned short color )
{
    // this is the optimised Horizontal Line Drawing routine for filling shapes
    if (x0==x1) S_Draw_Pixel( x0, y, color);
    if (x0<x1)
    {
        unsigned short *screenAdress = REAL_SCREEN_BASE_ADDRESS;
        screenAdress += (y<<8) + (y<<6) + x0;
        int sizeline=x1-x0;
        memset((void*) screenAdress, color, sizeline*2);
    }
    if(x0>x1)
    {
        unsigned short *screenAdress = REAL_SCREEN_BASE_ADDRESS;
        screenAdress += (y<<8) + (y<<6) + x1;
        int sizeline=x0-x1;
        memset((void*) screenAdress, color, sizeline*2);     
    }
}

int main( void )
{
    if( !has_colors )
        return 0;
    lcd_incolor();
   
    S_Clear_Screen();
   
    wait_key_pressed();
   
    S_Draw_Scanline( 10, 310, 120, S_White );
    wait_key_pressed();
   
    S_Draw_Scanline( 30, 290, 140, S_Yellow );
    wait_key_pressed();
   
    S_Draw_Scanline( 50, 270, 160, S_Orange );
    wait_key_pressed();
   
    S_Draw_Scanline( 70, 250, 180, S_Red );
    wait_key_pressed();
   
    S_Draw_Scanline( 90, 230, 200, S_Purple );
    wait_key_pressed();
   
    S_Draw_Scanline( 110, 210, 220, S_Magenta );
    wait_key_pressed();
   
    return 0;
}




Merci

Sly
Some works in progress :
The GUI Toolkit NF for nSpireMyShmup for fxCG-50Magic Light for Casio Graph 90+E
and
Magic Light for nSpire CX/CX-II
Simple Text Editor for nSpireOutRun for Casio Graph 90+E
95%
50%
100%
75%
100%
And more to come ... stay tuned
Avatar de l’utilisateur
SlyVTTPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 43.1%
 
Messages: 484
Images: 31
Inscription: 19 Jan 2021, 09:41
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
GitHub: SlyVTT

Re: Bug dans routine de tracé lignes

Message non lude SlyVTT » 26 Jan 2021, 15:33

Après quelques analyses, un S_Clear_Screen prends 0.9ms (10000 boucles en 9s).
Si je réécris cette fonction "proprement" pour boucler avec des valeurs sur 16 bits (avec une boucle for sur l'ensemble de la zone mémoire de l'écran), il faut le double de temps (1.7ms).
Ces métriques ont été obtenues avec des calls au RTC (0x90090000).

Une idée pour accélérer un "clear screen" avec une couleur sur 16 bits ?

Thanks

Sly
Some works in progress :
The GUI Toolkit NF for nSpireMyShmup for fxCG-50Magic Light for Casio Graph 90+E
and
Magic Light for nSpire CX/CX-II
Simple Text Editor for nSpireOutRun for Casio Graph 90+E
95%
50%
100%
75%
100%
And more to come ... stay tuned
Avatar de l’utilisateur
SlyVTTPremium
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 43.1%
 
Messages: 484
Images: 31
Inscription: 19 Jan 2021, 09:41
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
GitHub: SlyVTT

Re: Bug dans routine de tracé lignes

Message non lude Vogtinator » 02 Fév 2021, 21:28

Please don't use REAL_SCREEN_BASE_ADDRESS, that's an implementation detail.

Certaines couleurs semblent bien fonctionner, par contre d'autres ne fonctionne pas. Je pense qu'il s'agit d'un problème avec la manipulation de la mémoire via "memset" qui prend des octets, mais pas des blocs de 16bits.
y'a t il une autre fonction de manipulation de la mémoire qui permette de traiter les doubles octets ?


Yes, memset takes an 8bit value, so the higher 8 bits are just ignored.

Une idée pour accélérer un "clear screen" avec une couleur sur 16 bits ?


You can just write a loop to write 16bit at a time, the compiler should optimize it properly. You could help it a bit by writing 32bit values instead.

Note that on the CX II, the LCD controller points to "magic VRAM", which makes it behave weirdly for certain types of access. It works best when using an off-screen buffer for drawing and then blitting it into VRAM (which is also what lcd_blit does).

How does lcd_blit's performance compare?
Avatar de l’utilisateur
VogtinatorPremium
Niveau 9: IC (Compteur Infatigable)
Niveau 9: IC (Compteur Infatigable)
Prochain niv.: 1.6%
 
Messages: 217
Inscription: 29 Mar 2014, 15:55
Genre: Homme
Calculatrice(s):
MyCalcs profile


Retourner vers Native: Ndless, Linux, ...

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 5 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1192 utilisateurs:
>1149 invités
>38 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)