Jump to content

Une belle bête incomprise : le blitter


GT Turbo

Recommended Posts

SCPCD :


A non je me suis trompé :D

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





Juste il va falloir que je cherches..... hé m.......



J'hallucines !! Car le truc c'est que cela marche pendant une dizaine de fois et après le code 68000 se retrouve bloqué sans raison. Le 68000 ne dispose pas de cache donc rien a voir de ce coté !! Le problème quand on devellope sur la Jag, non ce n'est pas la difficulté de programmmer ou autres, c'est de tout synchroniser !! ARGHHHHHHHHHHHHHHHH :wacko:





GT Asynchrone :wacko:
Link to comment
Share on other sites

  • Replies 68
  • Created
  • Last Reply

Top Posters In This Topic

Cela viens peut-être du 68000 :

 

Comment tu fais pour tester le GPUGO ?

 

Parcequ'il y a un bug dans la jag pour certaines instructions 68000 lors de l'accés a des registres GPU/Blitter...etc....

 

c'est indiqué dans la liste des bugs pour l'ecriture mais pour la lecture je sais pas si c pareil (je pense que oui)

 

 

 

Ensuite, sinon tu as plusieurs autres possibilité :

 

- générer une interruptions sur le 68000

 

- utiliser une adresse dans la RAM GPU pour indiquer qu'il a fini et tu lis au 68000 cette adresse en permanance.

 

 

 

La premiere est celle qui donnera plus de peche au GPU mais la deuxieme est la plus simple a ecrire.

 

 

 

Je me rappelle que j'avais aussi des trucs bizarre avec le GPU lorsque je voulais verifier qu'il etait arreté.

 

Du coup je faisait comme Native c'est a dire la seconde solution ecrite au dessus.

 

 

wait_for_gpu:

 

move.l All_Done,d0

 

cmpi.l #$12345678,d0

 

bne.s wait_for_gpu

 

move.l #0,All_Done

 

 

un truc de ce genre

 

Et normalement, en faisant :

 

[code]

 

moveq #$12345678,r30

 

movei #All_Done, r31

 

store r30, (r31)

 

; GPU stoppen

 

moveq #0,r30

 

movei #G_CTRL,r31

 

store r30,(r31)

 

 

ca devrais fonctionner puisque je l'ai deja fait et dans Native aussi c pareil...

 

 

 

mais peut-être que en ne faisant que

 

[code]

 

wait_for_gpu:

 

move.l G_CTRL,d0

 

btst.l #0,d0

 

bne.s wait_for_gpu

 

 

ca fonctionnerais... (si tu ne fais pas deja ca ;))

Link to comment
Share on other sites

SCPCD :


- utiliser une adresse dans la RAM GPU pour indiquer qu'il a fini et tu lis au 68000 cette adresse en permanance.





J'ai déjà essayé et ca marche pas :wacko:



SCPCD :


mais peut-être que en ne faisant que



wait_for_gpu:

move.l G_CTRL,d0

btst.l #0,d0

bne.s wait_for_gpu







Un truc pas très loin :

[code]lea G_CTRL,a0

move.l #1,(a0)

Wait : move.l (a0),d0

bne.s Wait





J'ai meme essayé un tst.l (a0) mais que nenni !! :no:



Je vais essayer la méthode que tu m'as décrite mais c'est bizzare ce truc, tu me diras un de plus !!



GT Presque perdu :wacko:
Link to comment
Share on other sites

Citation


Un truc pas très loin :

lea G_CTRL,a0

move.l #1,(a0)

Wait : move.l (a0),d0

bne.s Wait







je comprends pourquoi ca ne marche pas !!

car lorsque tu lit G_CTRL, tu ne lis pas exactement la valeur de CTRL ecrit par le GPU !!!

Car lorsque tu lis, il y a la version du processeur dans les bits le plus haut, et les latchs interruptions qui ne sont egal a 0 que si tu as ecrit un 1 dedans !



il faut donc juste tester le bit 0 de ce registre.
Link to comment
Share on other sites

SCPCD :


Citation


Un truc pas très loin :

lea G_CTRL,a0

move.l #1,(a0)

Wait : move.l (a0),d0

bne.s Wait







je comprends pourquoi ca ne marche pas !!

car lorsque tu lit G_CTRL, tu ne lis pas exactement la valeur de CTRL ecrit par le GPU !!!

Car lorsque tu lis, il y a la version du processeur dans les bits le plus haut, et les latchs interruptions qui ne sont egal a 0 que si tu as ecrit un 1 dedans !



il faut donc juste tester le bit 0 de ce registre.





Exact, j'avais pas pais gaffe au reste du registre, merci pour le coup de pouce, je modifierais mon code ce soir. Un problème en moins ! :yes:



GT Débuggué !! ;)
Link to comment
Share on other sites

Comme cela ca marche mieux :

 

 

 

lea G_CTRL,a0

 

move.l #1,(a0)

 

Wait : move.l (a0),d0

 

btst #0,d0

 

bne.s Wait

 

 

 

Hier soir une dizaine d'essais pour commencer a optimiser et apparement cela marche, pendant un moment j'ai pensé a utiliser l'inter, mais cela risque pas d'ètre plus lent ? Un traitement d'interruption par un 68000 c'est pas très rapide et en fin de compte, l'inter elle meme va juste placer le flag donc on fait un traitement pour rien, l'ancienne technique est plus rapide je penses non ?

 

 

 

Parce que du coté Gpu, a la place de mettre 0 dans G_CTRL il suffit de mettre 2 (%10) pour generer l'inter.

 

 

 

J'ai dégagé plusieurs compteur décimales que j'avais (5 au total) j'en ai dégagé 3 et je suis a 32 polygones. Ceci est une broutille. J'ai completement réecrit la routine de calcul des points au Gpu, il me reste juste a voir pour le passage de paramètres et la mon but c'est les 40. J'ai pensé a un super truc mais qui va me couter assez cher en ram 1600 octets. Par la j'ai les 2 routines (remplissage et calcul) a part, ensuite je comptes bien les recoller, mais il me faut les tableaux x min et x max de chaque ligne, au lieu d'utiliser la ram standard, je pourrais utiliser la ram Gpu, j'évites de toucher au bus et je profites de la vitesse d'accès mais la ou ca fait mal c'est cela :

 

 

 

J'ai deux tableau de 200 lignes (Pour un écran de 200 lignes of course !), ce qui fait (2+2)*200=800 octets, mais le petit soucis c'est que le Gpu en interne ne fait que des accés 32 bits (4 octets) ce qui fait que mon tableau ferait (4+4)*200=1600 octets, ca fait cher, mais c'est le prix a payer pour que cela pousse. Pour résumé dans la ram Gpu faut que je cases :

 

 

 

- le gestionnaire de liste

 

- la routine de polygone

 

- 1600 octets de tableau

 

 

 

Un défi bien interressant, par contre après je passerais au Dsp, car la ram va bientot me manquer !! :wacko:

 

 

 

GT ;)

 

 

 

P.S. : Je viens de réaliser un truc, hier soir j'ai essayé ca :

 

 

 

[code]lea G_CTRL,a0

 

move.l #1,(a0)

 

Wait :

 

btst #0,3(a0)

 

bne.s Wait

 

 

 

Et ca a planté direct, c'est simple 90% des registre de la Jag necessite un accès en long (4 octets) et la je fais un accès octet !! Moi et ma tête !! :wacko:

Link to comment
Share on other sites

Après cette brève incursion dans la 3d je vais retourner afficher mes sprites (dès que la routine full Gpu fonctionnera), faut que je finisses mon gestionnaire de liste :yes:

 

 

 

GT Reparti pour le sprites ! B)

Link to comment
Share on other sites

GT Turbo :


Hier soir une dizaine d'essais pour commencer a optimiser et apparement cela marche, pendant un moment j'ai pensé a utiliser l'inter, mais cela risque pas d'ètre plus lent ? Un traitement d'interruption par un 68000 c'est pas très rapide et en fin de compte, l'inter elle meme va juste placer le flag donc on fait un traitement pour rien, l'ancienne technique est plus rapide je penses non ?



Ben en fait, ca depend.

Le system d'interruption sera plus rapide je pense que dans le cas où l'on met en veille le 68000 en attendant une interruption.

Parceque dans les autres cas, on spam le bus pour ne rien faire :

lorsque l'on accede aux registres, le bus est ralentit par la lecture du 68000

mais dans le cas où l'on veut faire des interruptions sans le mette en veille, c vrai que ca risque même d'être plus lent vu que lorsque le 68000 a une interruption, son niveau de priorité d'execution est plus élevé que normalement donc ralentit tout...



(Mais pkoi ils ont mis un 68000 !!!:cry: et pas un autre DSP !!!)
Link to comment
Share on other sites

Je suis en train de tout mettre dans le Gpu, donc voici en clair pour afficher un polygone comment cela va se passer :

 

 

 

vous devrez juste passer :

 

 

 

l'adresse de votre tableau de points (X,Y)

 

 

 

qui devrait ressembler a ceci :

 

 

 

Tab_XY:

 

dc.w 160,100

 

dc.w 200,40

 

....

 

dc.w -1,-1

 

 

 

La dernière ligne indique a la routine la fin des coordonnées.

 

 

 

La routine referme toute seule le polygone, puis l'adresse de votre écran et la couleur du polygone, un dernier truc l'offset pour passer a la ligne suivante, dans le cas ou votre écran ferait pas par exemple 320 colonnes

 

voila ca devrait etre tout.

 

 

 

si des personnes n'aime pas cette organisation, dite le moi, je veux pas reecrire toute une partie de code alors que j'aurais fini la routine !! :wacko:

 

 

 

GT En train de finaliser la routine Gpu :yes:

Link to comment
Share on other sites

M...... m...... et m......

 

Il va falloir que refixes mes objectits a la baisse.....

 

 

 

Encore trompé a la ..................... hausse !!! J'ai pratiquement fini la routine 100% full Gpu, mais hier soir pour faire une transition dans mes 48 versions de mon code, j'ai fait une version intermédiaire, calcul des points 68000, remplissage au Gpu mais utilisation de la ram Gpu pour rentre les coordonnés X,Y et la je finis avec 39 polygones, si on compare au 7 du tout début au 68000, il y a pas photo, le rapport est de 5 fois plus (Et meme un peus plus !).

 

 

 

La routine de calcul des points au 68000 est fini, mais j'ai quelques soucis a faire accepter mes saut conditionnels a Mad Mac. J'espère que ce soir la routine 100% Gpu sera opérationnel. J'avais visé les 40 polygones et bien on se fixe un nouvel objectif 48.

 

 

 

 

 

GT toujours pas a fond !! Non !! Gpu Power !! B)

 

 

 

P.S : Pour l'instant avec le code de restauration des listes au Gpu plus la routine de remplissage au Gpu (+Blitter) j'en suis meme a 350 octets !! Asm Power !! :yes:

Link to comment
Share on other sites

La routine est presque fini, j'ai enfin pu avoir des tests corrects (Voir dans cette meme partie ma petite prise de tete avec les sauts conditionnels), enfin il me reste encore deux bugs, qui font que ma recherche de Y min et Y max du polygone partent en fleurs, mais je penses que ce soir, la routine fonctionnera !!

 

 

 

GT En 3D !! ;)

Link to comment
Share on other sites

SCPCD :


En tout cas tu fais un secret boulot !!

:)

J'ai hate d'avoir la demo sur une CF ;)





Je t'avoues que cela répresente pas tellement de boulot, je suis parti d'un source 68000, qu'on avait devellopé pour faire des polygones pour nos démos, après un peu d'optim pour s'adaptater au mode vidéo (C'est le pied l'optim en true color, plus de calcul de bit et d'offset en utilisant des techniques plus ou moins exotiques ! :wacko: ) et après un transcodage pour le Gpu, qui faut le dire est très simple a programmer pour ceux qui s'y connaissent un peu en assembleur !!



Pour l'instant le plus gros boulot c'est toi qui l'a fait (Voir CF !), faudrait encore que je fasses pareil pour la routine 3d, car voir un paquet de polygones fixes a l'écran c'est pas très répresentatif !! :no:



GT En train remplir et j'ai bientot fini !! ;)
Link to comment
Share on other sites

 

lea G_CTRL,a0

 

move.l #1,(a0)

 

Wait :

 

btst #0,3(a0)

 

bne.s Wait

 

 

 

Ce style de boucle pour atteindre la fin d'un proc, ne marche pas du tout si le proc en question fait le travail trop vite !!

 

 

 

Retour a nos polygones :

 

 

 

La routine est entierement Gpu-isé, mais j'ai un débugguage de fou a faire, mon code a l'air instable comme un pingouin sur une savonnette !! Mon code fonctionne pas tout a faire normalement : l'affichage d'un polygone fait apparaitre un paquet de triangles et de formes plus ou moins bizzare et l'insertion d'un nop a différents endroits du code soit ne fait rien apparaitre, soit plante direct !! Sur ce coup je sens que je vais transpirer !!!!

 

 

 

GT Paniqué !! :wacko:

Link to comment
Share on other sites

SCPCD :


HHAAA...

Les joies du debuggage du GPU !!!



Que du bonheur !!

:D





Boite de gatos :yes: !! Et Coca !! Et une nuit blanche dans la g.... !!



Ce code va tourner très vite, j'ai des sprites a afficher !!



Et c'est dans ce genre de moment, je m'apercois qu'il faudrait que je continues un peu le nouveau debugger !! Avec la possibilité de tracer du Gpu !! :yes:



GT En train de debugger !! :wacko:
Link to comment
Share on other sites

Areuhgfsdsfhdgiosf meme après deux boites de gato (Je vais vomir ! :wacko:), ce code ne fonctionne pas, j'ai réussi malgré tout a debugger deux Kdo, il me reste apparement un soucis conernant la routine qui appel la routine de tracé de ligne virtuel. Je me suis remotivé et c'est reparti !! :yes:

 

 

 

GT En train de debugger !! :yes:

Link to comment
Share on other sites

J'ai laissé tomber les gatos !! j'attaques au petit suisse !! Etant donné que c'est apparement 'misereland' a debugger, j'ai transformé ma routine de tracé de ligne virtuel en routine de tracé de ligne réel, c'est plus simple a debugger !! :yes:

 

 

 

 

 

GT En train de voir mes erreurs !!;)

Link to comment
Share on other sites

L'affaire est dans le sac, je remplis mes polygones gones gones au Gpu u u u u u u !!!

 

 

 

Je ferais des essais pour voir le gain cette nuit, j'ai un petit soucis de ram gpu, plutot d'organisation, car suite a mes tableaux placés avec un lance pierre je n'arrives plus a mettre ma routine de resturation de liste au Gpu, donc les chiffres serait pas comparables, enfin cela marche et je suis heureux !!!

 

 

 

 

 

GT En train de ranger ma Gpu - Ram !! ;)

Link to comment
Share on other sites

Tous les chiffres tombent a l'eau !! :cry:

 

 

 

J'ai lancé mon code et le chiffre est tombé 26 polygones !! Quoi ??? J'ai vérifié plusieurs fois et ben non, c'est le bon chiffre.

 

 

 

J'ai repris mon code 68000 et vérifié, dans le code 68000, les points du polygone étaient calculés qu'une fois et pas a chaque polygone, ce que la routine 100% Gpu fait. Le 68000 dans ce cas de figure tourne a un polygone !! :blink:

 

 

 

Donc d'un coté j'ai les boules a moitié (Car la routine Gpu n'est pas encore optimisé ! Ouf !) de l'autre le Gpu est 26 fois plus rapide que le 68000 !! Meme si on divise par deux du fait que le 68000 tourne a la moitié du Gpu, cela fait toujours un rapport de 12 !!

 

 

 

Pour voir reellement ce que cela vaut, faudrait que j'adaptes une routine 3d et faire touner quelques objets car c'est sur que c'est pas visuellement parlant, meme moi je commences a en avoir marre de regarder ces polygones sans vie.

 

 

 

GT Un peu dégouté mais je reparts de plus belle !! :yes:

Link to comment
Share on other sites

Azrael :


26 seulement !?! Glp... pas glop... quelle taille tes polygones ?





Pas Glop comme tu dis, on verra après optimisation. Sinon je suis en train de me demander si j'arriverais pas a utiliser le temps libre d'attente du blitter pour faire certains des calculs. Faut que je regardes tout cela.



GT En train de réfléchir :blink:
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...