@Falsam et Dobro
Merci pour vos propositions. Malheureusement, elles ne suffisent pas...
Je m'explique. Il y a plusieurs méthodes pour écrire en mémoire Vidéo. La plus simple c'est d'y aller "cash" >> on a un exemple dans notre documentation. Je crois que c'est DirectScreen.PB le fichier d'exemple. On cherche l'adresse mémoire du buffer Vidéo puis on lit et/ou modifie pixel après pixel avec Peek et Poke.
Mais il n'y a pas d'accélération matérielle.
Et c'est ce qui m'intéresse vraiment. J'entends par accélération matérielle Vidéo le fait d'écrire dans un premier temps (en faisant appel au CPU central, de manière conventionnelle) en mémoire Vidéo sa texture ou sa couleur et d'offrir, dans un second temps, à sa carte Vidéo un ensemble d'instructions pour qu'elle aille d'elle-même (
sans le CPU central) transférer de la mémoire Vidéo à celle du buffer Vidéo (l'affichage) avec x sortes de transformations (agrandissement, déformation, rotation tangentielle, etc...).
Ces transformations se multiplient au fur et à mesure que les cartes se "sophistiquent". Et deux support logiciels tiennent tête pour traiter ces transformations : DirectX et OpenGL.
Quand on veut jouir de toutes les possibilités de la carte Vidéo que l'on possède, il est normal de disposer de DirectX et OpenGL, puisque la gamme d'instructions Vidéo est consistantes mais surtout les marques de fabricant de carte Vidéo sont nombreuses donc le programmeur n'a pas à se soucier de la manière dont il faut accéder aux différentes possibilités Vidéo: c'est DirectX ou OpenGL qui s'en charge.
Or, moi, je ne veux pas jouir de
toutes les possibilités de ma carte Vidéo! Je veux seulement les bases de géométrie d'affichage. Et mon petit doigt me dit que ces bases sont désormais "standardisées". C'est-à-dire que je pense (mais attention, ceci n'est que mon avis personnel et donc sans aucun fondement) qu'il y a désormais une petite douzaines de type d'accès mémoire à 3 étages* qui suffisent dans l'électronique informatique d'aujourd'hui pour afficher un triangle monochrome (complètement de la même couleur) à une vitesse phénoménale, même sur une petite configuration récente (carte vidéo standard agée de moins de 3 ans).
(*): J'entends par «accès mémoire à 3 étages» un tableau de données qu'il faut aller "pécher" (une première fois) dans sa carte Vidéo pour pécher (une seconde fois) un ensemble d'autres tableaux de données toujours dans la carte Vidéo qui donne enfin accès à une troisième pèche qu'est l'architecture Vidéo "en live" (=en direct).
Si ce tissu d'hypothèses peut éclairer la lanterne de personnes audacieuses et partageuses, ce serait le bonheur!
Dans
un autre domaine, voici l'impasse technique sur laquelle j'ai buté et qui m'a poussé à faire la demande ici. J'ai récupéré l'exemple de la documentation sur l'accès direct à l'écran et ai utilisé une instruction de transfert ASM SSE. C'est certes
une accélération matérielle. Mais, après quelques mesures de chronométrie, je me suis bien rendu compte que ce n'était pas l'accélération matérielle qui me convenait. Il y en a bien une autre, beaucoup plus performante que celle-ci. Je vous laisse maître de juger par vous-même.
Dans cet exemple, voici un équivalent de ClearScreen() (je ne me suis pas foulé à aller jusqu'à tracer un triangle...), mais j'ai beau tâter, le CPU reste bel et bien chargé de faire le transfert mémoire, ce qui ne me convient pas. Attention les yeux, car pour "observer" la vitesse de transfert, j'ai différencié un "ClearScreen(Rouge)" d'un "ClearScreen(Bleu)".
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - Drawing via Direct Screen Access (DSA)
;
; (c) 2006 - Fantaisie Software
;
; ------------------------------------------------------------
;
; Note: disable the debugger to run at full speed !
;
; La note d'Olliv : ai modifié l'écriture VIDEO pour tester
; l'instruction SSE qui ne suffit malheureusement pas...
ExamineDesktops()
ScreenWidth = DesktopWidth(0)
ScreenHeight = DesktopHeight(0)
ScreenDepth = DesktopDepth(0)
InitSprite()
InitKeyboard()
Structure Pixel
Pixel.l
EndStructure
Procedure.f GSin(angle.f)
ProcedureReturn Sin(angle*(2*3.14/360))
EndProcedure
; Pre-calculated values are faster than realtime calculated ones...
; ... so we save them in an array before starting gfx operations
Dim CosTable(ScreenWidth*2)
Dim ColorTable(255)
For i = 0 To ScreenWidth*2
CosTable(i) = GSin(360*i/320)* 32 + 32
Next
OpenWindow(0,0,0,400,300,Str(ScreenWidth) + " x " + Str(ScreenHeight) + " x " + Str(ScreenDepth) , $CF0001)
StringGadget(1, 10, 10, 350, 24, "Fenêtre de déboguage (Alt+F4 pour fermer)")
If OpenScreen(ScreenWidth, ScreenHeight, 32, "PB Plasma")
StartDrawing(ScreenOutput())
Buffer1 = DrawingBuffer() ; Get the start address of the screen buffer
Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format.
StopDrawing()
FlipBuffers()
StartDrawing(ScreenOutput())
Buffer2 = DrawingBuffer() ; Get the start address of the screen buffer
Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format.
StopDrawing()
FlipBuffers()
*Alloc = AllocateMemory(32)
*Alloc + 15
*Alloc & ~15
For I = 0 To 15 Step 4
PokeL(*Alloc + I, $FF007FFF)
Next
Define Count.L
Define Sourc.L = *Alloc
Define Desti.L = Buffer1
Define Desti2.L
Count = Pitch * ScreenHeight / 16 / 2 / 2
Repeat
Delay(16)
Flip ! 1
If Flip
Desti = Buffer1
Desti2 = (Desti + Count * 16)
Desti3 = (Desti2 + Count * 16)
Desti4 = (Desti3 + Count * 16)
For I = 0 To 15 Step 4
PokeL(*Alloc + I, $FF007FFF)
Next
Else
Desti = Buffer2
Desti2 = (Desti + Count * 16)
Desti3 = (Desti2 + Count * 16)
Desti4 = (Desti3 + Count * 16)
For I = 0 To 15 Step 4
PokeL(*Alloc + I, $FFFF0000)
Next
EndIf
! Mov ESI, [v_Sourc]
! Movaps XMM0, [ESI]
! Movaps XMM1, [ESI]
! Movaps XMM2, [ESI]
! Movaps XMM3, [ESI]
! Mov ECX, [v_Count]
! Mov EDI, [v_Desti]
! Mov EDX, [v_Desti2]
! Mov EAX, [v_Desti3]
! Mov EBX, [v_Desti4]
!Loop1:
! Movaps [EDI], XMM0
! Movaps [EDX], XMM1
! Movaps [EAX], XMM2
! Movaps [EBX], XMM3
! Add EDI, 16
! Add EDX, 16
! Add EAX, 16
! Add EBX, 16
! Dec ECX
! Jnz Loop1
ExamineKeyboard()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
;SetWindowTitle(0, Str(Align) + " " + Str(PitchEqu) )
Repeat
Until WaitWindowEvent() = 16
Else
MessageRequester("Error","Can't open the screen !",0)
EndIf
End