[#1] Gpu a szybkość trybu planarnego
Witam.
Pytanie dla obytych w temacie.
Jak szybki by był potrzebny procesor graficzny, aby wyświetlić grę 3d w sensownej rozdzielczości i prędkości bezpośrednio w trybie planarnym bez żadnego c2p itp.
[#2] Re: Gpu a szybkość trybu planarnego

@Shredder, post #1

Jaka to sensowna rozdzielczość i prędkość według Ciebie ?
[#3] Re: Gpu a szybkość trybu planarnego

@Norbert, post #2

min 700x600 25pfs w 16 bitach
[#4] Re: Gpu a szybkość trybu planarnego

@Shredder, post #1

Ustawianie losowego, pojedynczego piksela na bitmapie to jest jakieś 6 operacji (odczyt bajtu z bitem danego piksela, przygotowanie maski ustawiającej bit, sprawdzenie czy ustawiamy zero czy jedynkę, skok do instrukcji od odpowiedniego wariantu warunku, instrukcja za warunkiem która zrobi to co trzeba, zapis z powrotem do bitmapy, a może coś jeszcze co pomijam) na każdy bit głębi kolorów, przy 16 bitach na piksel ustawienie każdego piksela potrzebuje 6*16 = 96 instrukcji. W trybie chunky robisz to jedną instrukcją na piksel, po czym ciurem cały obrazek chunky zamieniasz na planar, bo możesz to wtedy zrobić mniejszym kosztem instrukcji na piksel. Tu Ci nie powiem ile to będzie mniej. Stosunek jednej liczby do drugiej będzie odpowiedzią na Twoje pytanie. ;)

16 bitów? W ogóle planar nie nadaje się do takiego czegoś, jego ideą jest to by "dziwne", nierówne liczby bitów na piksel (3, 5, 6, 7 bpp) upchnąć możliwie oszczędnie w RAMie. I na tym jego zalety się kończą.

Ostatnia aktualizacja: 04.12.2018 20:55:29 przez teh_KaiN
[#5] Re: Gpu a szybkość trybu planarnego

@teh_KaiN, post #4

Ustawianie losowego, pojedynczego piksela na bitmapie to jest jakieś 6 operacji (odczyt bajtu z bitem danego piksela, przygotowanie maski ustawiającej bit, sprawdzenie czy ustawiamy zero czy jedynkę, skok do instrukcji od odpowiedniego wariantu warunku, instrukcja za warunkiem która zrobi to co trzeba, zapis z powrotem do bitmapy, a może coś jeszcze co pomijam) na każdy bit głębi kolorów, przy 16 bitach na piksel ustawienie każdego piksela potrzebuje 6*16 = 96 instrukcji.

Ustawienie jednego piksela jest nieco prostsze. Zdecydowanie mniej niż 6 kroków.

Jak masz wartość piksela w zmiennej i chcesz go wkleić w odpowiednie miejsce, to można zrobić tak:

Przepraszam, że to Asembler, ale widać wyraźnie że to można zapisać dość zwięźle.

Oczywiście gdy buforujemy więcej pikseli (2-32) to można to zrobić lepiej, ponieważ w strukturze planarnej możemy zapisać/zmodyfikować nawet 32 piksele jedną instrukcją procesora.

Chyba się nie pomyliłem w kodzie.

; Wstaw piksel $00-$ff na miejsce 0-7 w bajcie

; Przygotowanie
	MOVE.B	#$80,D0
	LSR.B	#MIEJSCE,D0	; D0: Miejsce, gdzie wklejamy piksel w formie maski
	
	MOVE.B	#PIKSEL,D2	; D2: Wartość piksela
	ROL.W	#8,D2

; Wklejanie
; Wklejam bitplan 0
	ROR.W	#1,D2
	LSR.B	#MIEJSCE,D2

	MOVE.B	D0,D1
	AND.B	(A0),D1		; Pobieramy dane bitplanu nr 0
	EOR.B	D2,D1
	EOR.B	D1,(A0)

; Wklejam bitplan 1
	BCLR	#7-MIEJSCE,D2
	ROR.W	#1,D2
	LSR.B	#MIEJSCE,D2

	MOVE.B	D0,D1
	AND.B	(A1),D1		; Pobieramy dane bitplanu nr 1
	EOR.B	D2,D1
	EOR.B	D1,(A0)

itd.
[#6] Re: Gpu a szybkość trybu planarnego

@Hexmage960, post #5


...
Ustawienie jednego piksela jest nieco prostsze. Zdecydowanie mniej niż 6 kroków.
...
; Wklejam bitplan 0
1	ROR.W	#1,D2
2	LSR.B	#MIEJSCE,D2

3	MOVE.B	D0,D1
4	AND.B	(A0),D1		; Pobieramy dane bitplanu nr 0
5	EOR.B	D2,D1
6	EOR.B	D1,(A0)
; Wklejam bitplan 1



To w koncu ile tych krokow jest - "zdecydowanie mniej niz 6" czy 6 ? szeroki uśmiech
[#7] Re: Gpu a szybkość trybu planarnego

@docent, post #6

Kroków jest zdecydowanie mniej niż 6. Po prawdzie potrzebne są 2 kroki na każdy bitplan, bo potrzeba raz odczytać słowo pamięci i raz zapisać. Razem dwa polecenia EOR.B.

Do tego trzeba doliczyć obliczanie wartości do wklejenia. Jednak po zaopatrzeniu się w odpowiednią funkcję SetAPen(), możemy wklejać szybko i nie musimy tej wartości liczyć na nowo.

Dochodzi tylko określenie pozycji do wklejenia. Zakładamy, że wklejamy w losową pozycję. Ustalenie tego to tylko 2 instrukcje procesora na bitplan. Razem 4 instrukcje na bitplan.

Oczywiście im więcej pikseli tym - jak w promocjach sklepowych - koszt tańszy! Tutaj przedstawiam wklejanie pojedynczych pikseli niebuforowanych. Algorytm należy przekształcić by obsługiwał więcej pikseli. A potrafi aż do 16 pikseli, których wartości bitplanowe są przechowywane w rejestrach D1-D4 (w obu 16-bitowych połówkach). Wówczas dwa EOR staną się zbędne - i zamiast nich wystarczyć będzie jeden zapis do pamięci za pomocą MOVE.W.

Wówczas SetAPen() (albo SetAPenArray) byłby prostą procedurą C2P na 16 pikselach.

Oto ta funkcja. Przygotowuje do wklejania pikseli o podanej w rejestrze danych d0 wartości:

; Ustawia kolor ołówka A na ten w D0.
; d0: a7a6a5a4a3a2a1a0
SetAPen:

	move.b	d0,d1	; d1: bitplan 7
	move.b	d1,d2
	add.b	d2,d2	; d2: bitplan 6
	move.b	d2,d3
	add.b	d3,d3	; d3: bitplan 5
	move.b	d3,d4
	add.b	d4,d4	; d4: bitplan 4

	swap	d1
	move.b	d4,d1
	add.b	d1,d1	; d1: bitplan 7/3
	swap	d2
	move.b	d1,d2
	add.b	d2,d2	; d2: bitplan 6/2
	swap	d3
	move.b	d2,d3
	add.b	d3,d3	; d3: bitplan 5/1
	swap	d4
	move.b	d3,d4
	add.b	d4,d4	; d4: bitplan 4/0

	rts

A oto funkcja zapisująca pojedynczy niebuforowany piksel o tym kolorze w 8 bitplanach:

WritePixel:

; Przygotowanie
	moveq	#$80,d5
	lsr.b	d0,d5

	lsr.l	d0,d1
	lsr.l	d0,d2
	lsr.l	d0,d3
	lsr.l	d0,d4

; Wklejanie bitplanu 0

	move.b	d5,d6
	and.b	d1,d6

	eor.b	(a0),d6
	eor.b	d6,(a0)

; Wklejanie bitplanu 1

	move.b	d5,d6
	and.b	d2,d6

	eor.b	bpr(a0),d6
	eor.b	d6,bpr(a0)

; Wklejanie bitplanu 2

	move.b	d5,d6
	and.b	d3,d6

	eor.b	2*bpr(a0),d6
	eor.b	d6,2*bpr(a0)

; Wklejanie bitplanu 3

	move.b	d5,d6
	and.b	d4,d6

	eor.b	3*bpr(a0),d6
	eor.b	d6,3*bpr(a0)

; Przygotowanie

	swap	d1
	swap	d2
	swap	d3
	swap	d4

; Wklejanie bitplanu 4

	move.b	d5,d6
	and.b	d1,d6

	eor.b	4*bpr(a0),d6
	eor.b	d6,4*bpr(a0)

; Wklejanie bitplanu 5

	move.b	d5,d6
	and.b	d2,d6

	eor.b	5*bpr(a0),d6
	eor.b	d6,5*bpr(a0)

; Wklejanie bitplanu 6

	move.b	d5,d6
	and.b	d3,d6

	eor.b	6*bpr(a0),d6
	eor.b	d6,6*bpr(a0)

; Wklejanie bitplanu 7

	move.b	d5,d6
	and.b	d4,d6

	eor.b	7*bpr(a0),d6
	eor.b	d6,7*bpr(a0)

; Sprzątanie

	swap	d1
	swap	d2
	swap	d3
	swap	d4

	lsl.l	d0,d1
	lsl.l	d0,d2
	lsl.l	d0,d3
	lsl.l	d0,d4
	
	rts


Ostatnia aktualizacja: 10.01.2019 21:25:19 przez Hexmage960
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem