Jump to content
Jagware
Sign in to follow this  
GT Turbo

Une belle bête incomprise : le blitter

Recommended Posts

GT Turbo    3

J'ouvre un sujet sur le blitter, c'est un des points très fort de la Jag, aussi bien coté puissance que l'étendu de ces capacités peut rendre beaucoup de service.

 

 

 

Avant certaines questions et réponses techniques, quelqu'un aurait une idée de ce que veut dire ceci (Trouvé dans la doc officielle Atari) :

 

 

 

Single scan of polygon fills

 

 

 

Parce que sauf erreur de ma part on parle bien de remplissage de polygones, mais le single scan me perturbe, ca veut dire quoi ?

 

 

 

 

 

GT En train de cherché a comprendre :wacko:

Share this post


Link to post
Share on other sites
SCPCD    0

Je pense qu'ils veulent dire qu'il est possible de faire du remplissage de polygone en un passage....

 

Mais je ne sais pas comment on fais le remplissage de polygone normalement alors...voila quoi...:D

Share this post


Link to post
Share on other sites
GT Turbo    3
SCPCD :


Je pense qu'ils veulent dire qu'il est possible de faire du remplissage de polygone en un passage....

Mais je ne sais pas comment on fais le remplissage de polygone normalement alors...voila quoi...:D





La technique dite habituelle, consiste a tracer virtuellement les lignes du polygone et a stocker les points, on les stocke de manière a avoir juste pour chaque ligne les deux x (X gauche et droite of course !) et ensuite on remplit ligne par ligne vu qu'on a les deux cotés du polygone pour chaque ligne, cette technique était surtout pratique sur un Atari a cause des bitmaps, le remplissage en ligne était plus simple et la je m'apercois qu'a cause du true color, en colonne ou en ligne cela revient exactement pareil !! :wacko:



Je suis en train de chercher dans la doc du blitter, mais pas trouver grand chose, je vais regarder dans d'autre code pour voir.



GT En train de remplir !! :yes:

Share this post


Link to post
Share on other sites
GT Turbo    3

Si on veut remplir une forme la question est y a t'il un mode du blitter qui permet de s'adapter suivant la donnée destination.

 

 

 

Explication :

 

 

 

Imaginons un carré sur l'écran, on peut balayer le carré pour le remplir avec le blitter, celui peut remplir un rectangle tout seul en balayant de gauche a droite, ligne par ligne, ce qui veut dire que de ce coté pas de soucis, la question est donc est ce que si la destination contient un point on peut forcer le blitter a remplir jusqu'a un autre point, là ou ils devraient s'arreter et on recommence l'opération jusqu'a remplissage du carré.

 

 

 

Si on peut faire cela, un petit soucis se posent, faut qu'a chaque polygone, on le dessine dans un écran vierge et après qu'on le recopie sur l'écran finale, car sinon on risque d'avoir de sérieux soucis d'intersection après des polygones déjà remplis.

 

 

 

Puis qu'on efface notre écran de dessin et rebelote, cela risque d'ètre un peu lent.

 

 

 

GT Pas rempli ;)

Share this post


Link to post
Share on other sites
GT Turbo    3

Faut que je lises et relise la doc du blitter pour voir si je peux trouver mon bonheur, sinon on calcule les x au Gpu et le Gpu remplit au blitter cela permet d'utiliser la fonction Z-Buffer. Parce que j'avais pensé a un autre truc, on trace virtuellement le polygone, au lieu de réeffacer completement l'écran, on crée un sprite de la taille de l'objet, on dessine l'objet dedans et on place ce sprite a l'écran a la place du polygone. Cela permet si un objet ne bouge pas de ne pas le redessiner ou de faire des redraws qui servent a rien. Mais un soucis apparait pas de Z-Buffer !!

 

 

 

Donc si on trouve rien pour remplir completement au blitter, je passe au Gpu / Blitter pour le remplissage de polygones.

 

 

 

 

 

GT En train de remplir au pinceau !! :wacko:

Share this post


Link to post
Share on other sites
GT Turbo    3

A première vue ce n'est pas possible de remplir un polygone en un coup, on peut lire ceci première page du blitter :

 

 

 

For example, the GPU might calculates co-ordinates and gradients associated with a polygon, while the Blitter draws strips of pixels.

 

 

 

Et encore ceci :

 

 

 

[code]Each blit creates one scan line of a polygon, with the graphics processor responsible for re-calculating the start, length and gradient parameters for each scan line.

 

 

 

Donc a la main, a la rigueur cela me dérange pas, c'était juste pour ètre sur de pas écrire une routine de remplissage alors que c'était dispo en hard, ca aurait été con !!

 

 

 

J'ai commencé a regarder les détails concernant le 'Z-buffering', bien sur l'absence de doc clair est une habitude, les Z de chaque point sont entrelacés avec les pixels sous la forme :

 

 

 

pixel : 1 2 3 4 ensuite Z du pixel 1 2 3 4, ceci pour des raisons d'accès mémoire, cela n'est pas un problème, par contre les Z sont codés sur combien ? La les données sont organisés en phrases (8 octets) donc si on divise par 4 cela nous donne 2 octets donc des Z allant de 0 à 65535, mais cela pourrait ètre codé aussi sur 1 octet, quelqu'un a une info dessus ?

 

 

 

Faut de toute façon que je fasses des essais, mais toute info est bonne a prendre.

 

 

 

GT Plein de pixels !!

Share this post


Link to post
Share on other sites
GT Turbo    3
atariowl :


Pardonnez mon francais mauvais





No problem



atariowl :


est environ 20-40 % sur la vitesse, selon les circonstances

2 - prévenir la page les coups manqués



vous pouvez blit un carré, un rectangle ou paralllelogram dans on va, mais être conscient que gouraud les valeurs ira faire noty être la reconstruction pour chaque scanline, mais se poursuivrait de la valeur à la fin de la ligne précédente





AtariOwl





Merci pour les infos.



Voila je viens de finir des essais, j'ai fait des essais au 68000 seul, j'ai réussi a afficher 1 polygone (Exemples a venir si ce PC de m.... veut bien lire ma disquette Falcon !) en 1 Vbl, j'avais peur et voila que Super Blitter arriva, après deux, trois bricoles, je suis passé a 2, puis 3, et....... j'ai fini a 7 polygones, ceci juste en utilisant le blitter.



J'ai 14000 cycles qui servent a rien (bouclage pour les tracés de ligne) le 68000 qui me plombe le bus, donc on se revoit quand j'aurais tout réecrit au Gpu.



GT Pas a fond, loin de la !! ;)

Share this post


Link to post
Share on other sites
GT Turbo    3

7 Polys / Vbl, normal filling (Without gouraud or mapping)

 

 

 

I've got an example, i wanted to give you but the PC doesn't like my Falcon's Disk !! The poly is near the half of a screen.

 

 

 

Tonight i will rewrite some parts with Gpu, so i hope the next try i can give an example.

 

 

 

 

 

GT Turbo ;)

Share this post


Link to post
Share on other sites
GT Turbo    3

Vous etes tous assis ?

 

 

 

Hier soir après avoir réecrit une partie au Gpu, et suite a des problèmes de transmission de tableau (Coordonnées x gauche et droite) j'ai fourni les coordonnées a la main, ce qui fait que je me retrouves avec des polygones rectangulaires de 278*170. Suite a l'augmentation de la taille je me suis dit que j'allais plombé mes statistiques et bien c'est sans oublié cette machine de guerre baptisé Gpu.

 

 

 

De 7 je suis passé a ......................... roulement de tambour : 26, j'ai essayé plus et suivant le code gpu employé je dépasses les 30 !! Ca fait mal !! Très mal !!

 

 

 

Par contre encore a prendre avec des pincettes ce résultat, certains de mes polygones on des bavures a gauche et droite, je penses a un petit problème de synchro, le Gpu est ultra rapide, j'ai du rajouter une boucle pour attendre que le blitter est fini pour tracer la prochaine ligne, chose que je n'avais pas a faire avec le 68000. Par contre vu que j'attends un moment je vais utiliser une partie de ce temps d'attente pour clipper les coordonnées en X, comme ca pas de perte de temps !!!

 

 

 

Dans tous les cas de figure :

 

 

 

GPU POWER !!

 

 

 

GT Turbooooooooooooooo ;)

Share this post


Link to post
Share on other sites
SCPCD    0

:o

 

 

 

Multiplié par au moins 3 !! rien qu'en reecrivant au GPU !!

 

et sans optimisation, je suis sur !!

 

 

 

GPU PPPPPPOOOOOOOOOWWWWWEEEERRRRRRR

Share this post


Link to post
Share on other sites
Azrael    0

Faudrait aussi voir à pas trop charger le GPU non plus, c'est ça qui m'inquiète. Quelqu'un sait comment sont remplis les polygones dans Cybermorph ?

Share this post


Link to post
Share on other sites
GT Turbo    3
SCPCD :


:o



Multiplié par au moins 3 !! rien qu'en reecrivant au GPU !!

et sans optimisation, je suis sur !!



GPU PPPPPPOOOOOOOOOWWWWWEEEERRRRRRR





Beaucoup plus mes premiers polygones étaient plus petits !! Et comme tu dis sans optimisations, toute la routine de calcul de points est a réecrire au gpu !!!



GPU PPPPPPOOOOOOOOOWWWWWEEEERRRRRRR



<

Share this post


Link to post
Share on other sites
GT Turbo    3
Azrael :


Je pense que tout sera fait en True Color.





Exact, true color 16 bits.



Le remplissage sans gouraud peut etre ultra rapide, si on fait comme cela, car l'autre technique en calculant la pente, j'ai peur qu'elle soit plus lente. Le calcul de la pente et remplir le paquet de registre pour ceci est très long, la je suis a 4 instruction Gpu pour tracer une ligne et quelque soit sa longueur.



Et on peut pas raccourcir sinon le blitter va me taper une crise.



Et pour info, la routine de calcul des points est du Bresenham, la routine la plus exacte (Pas de partie décimal dans les calculs) mais la plus lente, on optera pour la version floue si il venait a nous manquer quelque cycles (Non Azrael ne me tapes pas !) ;)





GT Turbo ;)

Share this post


Link to post
Share on other sites
RaZ    0

Hey, owl, if you're in trouble with your french, we won't mind you writing in english. Especially when it gets technical.

 

We'll translate it and add the french version to your messages, if it's worth it ;)

 

 

 

And thanks for your help.

Share this post


Link to post
Share on other sites
GT Turbo    3

Tout est rentré dans l'ordre, je tournes 4 fois plus vite. J'ai réussi a tout débugger, en reprenant le premier polygone (Mon passage de tableau fonctionne !), je suis a 29 Polygones / Vbl.

 

 

 

Mes 'ratures' venait du 68000, ma boucle qui attendait que le Gpu ait fini son boulot ne fonctionnait pas, j'ai fait attendre le 68000 comme un ane, et maintenant cela marche.

 

 

 

La routine Gpu n'est pas optimisé, par contre il y a déjà le clipping dedans !! Héhé !!

 

 

 

Seul la partie remplissage est au Gpu, le reste c'est du 68000, donc faut que je réecrives tout le reste au Gpu, donc préparez vous encore a manger du chiffre qui fait mal !!

 

 

 

Par contre si quelqu'un a une idée pour synchroniser le Gpu, dans ma boucle 68000 j'attendais que le registre de control (Start / Stop) du Gpu soit égal a zéro, la routine Gpu effface ce registre toute seule comme une grande, mais cela parfois fonctionne parfois pas du tout, donc ? J'ai essayé en utilisant un autre flag, mais cela fait pareil !!

 

 

 

Pour ceux qui veulent faire du code Gpu n'oubliez pas une chose insérez TOUJOURS un Nop après un saut, car il faut le savoir, que le saut soit pris ou pas l'instruction suivante est executé !! Heuresement que c'est inscrit dans les docs, sinon je débugguerais encore maintenant !!

 

 

 

GT Turbo qui :wub: son Gpu

Share this post


Link to post
Share on other sites
Azrael    0

Joli, mais je dois jouer mon rôle d'emm.... Une question me taraude : y-a-t'il en core du temps machine pour faire d'autres calculs ? Et quelle taille font tes polygones ? Et question subsidiaire : AVP et Iron Soldier tournaient-ils en 1 vbl ?

Share this post


Link to post
Share on other sites
GT Turbo    3
Azrael :


Joli, mais je dois jouer mon rôle d'emm.... Une question me taraude : y-a-t'il en core du temps machine pour faire d'autres calculs ? Et quelle taille font tes polygones ? Et question subsidiaire : AVP et Iron Soldier tournaient-ils en 1 vbl ?





Oui, car il faut savoir une chose ultra importante, le Dsp est libre !!! Et oui l'avantage des procs en parallèle. Pour l'instant il sert juste a lire les Joypads, ce qui fait une routine de 280 octets, alors qu'il y a de la place pour 12 Kilos, le 68000 s'emmerde aussi, mais celui la on le laisse de coté a part me pourrir les codes, c'est tout ce qu'il a réussi a me faire.... Et en plus, une partie de mon code Gpu passe son temps a attendre que le blitter est fini la ligne pour balancer la suivante, si je voulais jouer l'ultra 'chaud', j'insérais carrement des routines de calcul durant ce temps mort, j'ai l'impression d'inséré du code dans une routine d'overscan (Souvenir de démomaker !).



Dessin :



Mise en place des ------ Temps mort -------------- Boucle, et on recommence.

valeurs blitter



Les polygones je vous passerais les coordonnées et sinon un exemple pour ceux qui peuvent lancer le code. AVP est assez loin de la Vbl, I.S. est plus proche mais il tourne pas en une Vbl.



GT Turbo :wacko:

Share this post


Link to post
Share on other sites
SCPCD    0

Pour le GPUGO (Start/Stop du GPU), tu le fais comment ?

 

Parceque, seul le GPU peut le remettre a Zero et il faut le faire en soft : c'est a dire en lisant le G_CTRL et en mettant a 0 le bit 0 puis de reecrire le resultat dans le registre.

 

Mais du fait du pipeline, le GPU ne stop pas immediatement, il peux executer plusieurs instructions après si elles peuvent rentrer dans le pipeline avant la demande d'arret du GPU.

Share this post


Link to post
Share on other sites
GT Turbo    3
SCPCD :


Pour le GPUGO (Start/Stop du GPU), tu le fais comment ?

Parceque, seul le GPU peut le remettre a Zero et il faut le faire en soft : c'est a dire en lisant le G_CTRL et en mettant a 0 le bit 0 puis de reecrire le resultat dans le registre.

Mais du fait du pipeline, le GPU ne stop pas immediatement, il peux executer plusieurs instructions après si elles peuvent rentrer dans le pipeline avant la demande d'arret du GPU.







J'ai effacer le registre comme cela :



store r20,(r22)



avec R22=G_CTRL et bien sur R20=0



a priori donc l'écriture directe pourrait ne pas marcher, il faudrait faire comme tu a écrit. Si l'écriture directe ne marche pas ou pas correctement, mon Gpu execute du code après ma routine !! :wacko: si c'est vrai la routine est encore plus rapide.



Pour le pipe line je sais j'ai un paquet de nop derrière



GT Pas effacé !! :no:

Share this post


Link to post
Share on other sites
Azrael    0
GT Turbo :


il faut savoir une chose ultra importante, le Dsp est libre





Et la musique ? c'est le DSP qui s'en charge, non ? Au final ça ne fait plus trop de temps libre... Le mapping sous AVP est fait au GPU ou au Blitter ?

Share this post


Link to post
Share on other sites
GT Turbo    3
Azrael :


Citation
GT Turbo :

il faut savoir une chose ultra importante, le Dsp est libre





Et la musique ? c'est le DSP qui s'en charge, non ? Au final ça ne fait plus trop de temps libre... Le mapping sous AVP est fait au GPU ou au Blitter ?





Le dsp est effectivement prévu pour la musique mais une routine de zik de 12 Kilos c'est écrit en basic !! Ou elle dispose d'un sacré paquet d'options. Le mapping doit ètre fait au blitter, tu peux recopier une ligne (pas droite) en la zoomant avec le blitter donc cela simplifie beaucoup les routines de mapping !!! Tu peux utiliser le Gpu pour calculer les valeurs a mettre dans le blitter, vu qu'ils sont 'super potes' ca va plus vite !!



GT Un copain au Gpu !! ;)

Share this post


Link to post
Share on other sites
SCPCD    0

A non je me suis trompé :D

 

J'ai verifié dans un de mes codes et j'ai bien fait comme toi...

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×