amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Verwendung von LockBitMapTags [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

09.11.2005, 13:11 Uhr

MarkusPohlmann
Posts: 164
Nutzer
Hallo Kollegen,

ich habe ein Problem mit LockBitMapTags.

Aufruf wie folgend:


bmlock = LockBitMapTags (FBitMap,
LBMI_BASEADDRESS,&dataptr,
LBMI_BYTESPERROW,&bytesperrow,
TAG_END);


Auf meinem Entwicklungssystem (Mediator/Voodoo3/Picasso96) funktioniert das prima,
auf anderen Systemen mit reiner CGFX-INstallation funktioniert es nicht.

Die Prüfung, ob es sich um eine CGFX-Bitmap handelt fällt positiv aus, also kann es das wohl nicht sein.

Vielleicht ist es auch ein Verständnisproblem.
Wenn das "locken" nicht funktioniert hat, versucht man es dann direkt nochmal bis es klappt?
Ich meine, bedeutet ein Fehlschlag dieser Funktion, dass ein lock gerade jetzt nicht möglich ist, oder wohl permanent nicht?

Hat da jemand mehr Ahnung von, als ich?
Klares ja... aber wer hilft mir? :)

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 13:32 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Also bei mir läuft sowas auch auf CGX Systemen einwandfrei. Ich frag allerdings nie nach BYTESPERROW - daran sollte es aber nicht liegen...


--
:boing: Micha :boing:

Look at my HPs:
http://www.Silicon-Wizards.com

http://www.RealmsofPower.de.vu

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 14:49 Uhr

MarkusPohlmann
Posts: 164
Nutzer
@Micha1701:
Machst Du das denn genauso, dass Du nur einmal abfragst und dann mit den Speicherzugriffen beginst, oder rufst Du das LockBitMapTags beispielsweise in einer While-Schleife auf?

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 15:37 Uhr

Micha1701
Posts: 938
Nutzer
@MarkusPohlmann:

Wird nur einmal aufgerufen und kann es sofort locken...

--
:boing: Micha :boing:

Look at my HPs:
http://www.Silicon-Wizards.com

http://www.RealmsofPower.de.vu

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 15:43 Uhr

thomas
Posts: 7716
Nutzer
@MarkusPohlmann:

Die Funktion wartet, bis die Bitmap verfügbar ist, deshalb kann es auch zu Deadlocks kommen. Wenn die Funition eine NULL zurück gibt, dann ist etwas anderes falsch gelaufen. Was mir aufgefallen ist, ist daß du das Pixelformat nicht abgefragt hast. Wie willst du denn wissen, wie die Daten aufgebaut sind ? Vielleicht hat CGX da eine Kindersicherung eingebaut.

Darf ich mal fragen, warum du diese Funktion überhaupt brauchst ? Normalerweise sollte man sie tunlichst vermeiden.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 16:42 Uhr

MarkusPohlmann
Posts: 164
Nutzer
@thomas:

Das Pixelformat gebe ich beim anlegen des Screens/Fensters schon vor, bzw. prüfe dann vorher wegen dieser Endian-korrektur welches Format ich habe.
Ich denke nicht, dass es daran liegt, aber man weiss ja nie...

Klar darfst Du fragen, ich bin für alle Anregungen und Tipps dankbar.
Es kann durchaus sein, dass ich hier irgendwas unsinniges treibe...

Also, ich öffne einen Screen mit einer 16Bit Bitmap.
Dann allokiere ich eine "Friend" Bitmap: FBitMap=AllocBitMap(640,480,16,BMF_CLEAR,CGFXFenster->RPort->BitMap)
Und um an deren Speicheradresse zu kommen, nutze ich LockBitmapTags.
Inital kopiere ich das erste Frame in diese Bitmap.
Die Speicheradresse gebe ich dann als "Bildpuffer" an meine Grafikroutine weiter.
Innerhalb der Grafikroutine wird nun allerlei in diesem Friendbitmap "umgemalt" und anschliessend
blitte ich dieses Bitmap dann auf das "original" Bitmap.

Mit dem Pixelformat kann ich an der Stelle gar nicht falsch liegen, es sei denn, CGFX hat da wirklich noch irgendwleche eigenarten die ich nicht kenne.
Unter Picasso96 jedenfalls kommt die Grafik perfekt auf den Bildschirm wie gewünscht.

Das ganze ist entstanden, als ich eine 24Bit-Doublebuffer Grafikroutine des Speeds wegen auf 16 Bit runterkonvertiert habe.
Die Friend-Bitmap nutze ich dabei als "Doublebuffer"-Ersatz.
Da ist ständig das letzte Frame drinn und ich male nur die beweglichen Objekte um, bzw, korrigiere die Grafik unter/hinter diesen Objekten, je nach bedarf.
Der Blit wird dann durchgeführt, sobald das Frame fertig ist.

Funktioniert auf meinem Picasso96 System ganz gut, aber bei CGFX irgendwie nicht.

Der Cybergraphics Doku entnehme ich, dass jegliches "rum-poken" in Bitmap-daten verboten ist, ohne ein Lock auf die Bitmap zu haben.
Hier wird aber nicht explizit unterschieden, ob es eine anzeigbare Bitmap ist, oder wie in meinem Fall eine temporäre, nie wirklich selbst angezeigte.
Könnte man den auch die "Friend" Bitmap ohne Lock beschreiben?

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 17:26 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MarkusPohlmann:
Könnte man den auch die "Friend" Bitmap ohne Lock beschreiben?


Wie würdest Du in diesem Fall an die Grafikadresse kommen?

Andere Frage: ist denn bei diesen Systemen auch genug Hauptspeicher vorhanden, um die komplette, gelockte BitMap aufzunehmen?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 17:40 Uhr

MarkusPohlmann
Posts: 164
Nutzer
@Holger:
Was ich definitiv sagen kann, ist dass für die Screen-bitmap, die Friendbitmap und allerlei benötigte, von mir verwaltete Puffer genügend Speicher da ist.
Fehlt ein bischen, steigt das Programm schon beim initialisieren aus, da es sich erst allen benötigten Speicher zieht und nur dann wirklich loslegt, wenn es den auch bekommt.

Benötigt LockBitMapTags denn nochmal extra Speicher in grösse der gesamten BitMap, oder muss ich diesen Speicher irgendwie vorallokieren?

Von einem Testsystem wo es nicht funktioniert weiss ich jedenfalls dass 2MB Chip und mindestens 64MB Fastram zur Verfügung stehen.
Mein Programm zieht vielleicht 5-7MB Fastram, da kann es eigentlich nicht drann liegen.

[ - Antworten - Zitieren - Direktlink - ]

09.11.2005, 17:53 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von MarkusPohlmann:
Benötigt LockBitMapTags denn nochmal extra Speicher in grösse der gesamten BitMap, oder muss ich diesen Speicher irgendwie vorallokieren?

Nein, mehr als einmal benötigt sie den nicht. Es wäre nur eine theoretische Möglichkeit, daß die BitMap im Grafikkartenspeicher gehalten und durch LockBitMap in den Hauptspeicher gezwungen wird.
War auch sehr unwahrscheinlich, daß das hier zutrifft, aber wenn man sonst keine Ursache findet, geht man halt jeder kleinen Möglichkeit nach.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

17.11.2005, 18:51 Uhr

MarkusPohlmann
Posts: 164
Nutzer
Neuigkeiten!

Man nehme folgenden Codeschnippsel aus meinem Programm:

...

if (UseBitmap){
if (!(FBitMap=AllocBitMap(640,480,16,BMF_CLEAR,CGFXFenster->RPort->BitMap ))) clearup("F-BitMap konnte nicht allokiert werden!\n");
}

...

printf("Bytes per Row: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_XMOD));
printf("Bytes per pixel: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_BPPIX));
printf("Pixelformat: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_PIXFMT));
printf("Width in lines: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_WIDTH));
printf("Height in lines: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_HEIGHT));
printf("Bits per Pixel: %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_DEPTH));
printf("Is Cybergfx? %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_ISCYBERGFX));
printf("Linear Memory Access supported? %i\n",GetCyberMapAttr(FBitMap,CYBRMATTR_ISLINEARMEM));

...

Liefert auf meinem Picasso96-System den Output:
Bytes per Row: 1280
Bytes per pixel: 2
Pixelformat: 5
Width in lines: 640
Height in lines: 480
Bits per Pixel: 16
Is Cybergfx? -1
Linear Memory Access supported? -1

Das selbe Programm bringt dann auf dem CGFX System folgenden Output:

Bytes per Row: -1
Bytes per pixel: -1
Pixelformat: -1
Width in lines: -1
Height in lines: -1
Bits per Pixel: -1
Is Cybergfx? 0
Linear Memory Access supported? -1

Da geht also beim allokieren ganz schön was schief.
Und wenn Is Cybergfx schon FALSE ist, kein Wunder dass dann LockBitmapTags nich locken kann. Konsequent richtig.

Aber warum bringt jetzt die Allokation eines "FriendBitmap" in der CGFX-Emu von Picasso96 ein zum Window-Bitmap identisches Bitmap und auf reellen CGFX-Systemen nicht?

Gibt es da Versionsunterschiede in der graphics.library (wegen AllocBitmap) die man beachten sollte?

[ - Antworten - Zitieren - Direktlink - ]

17.11.2005, 19:50 Uhr

thomas
Posts: 7716
Nutzer

Ja, darüber bin ich auch schon gestolpert. Lies dir mal den zweiten Abschnitt der Cybergraphics-Autodocs ganz genau durch (den über Bitmaps). Da steht nämlich, daß man für RTG-Bitmaps immer auch BMF_MINPLANES setzen muß, sonst wird die Bitmap trotz allem als Amiga-Bitmap angelegt. Als Grund wird angegeben, daß der picture.datatype die Bitmaps nicht richtig behandelt, wenn dieses Flag nicht gesetzt ist. Bei P96 hat man das wohl ganz geschickt umgangen, indem man einfach einen eigenen picture.datatype mitgeliefert hat. Das erklärt auch, warum der Installer meint, unter OS3.1 oder 3.0 *müssten* die neuen Datatypes installiert werden.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

17.11.2005, 20:22 Uhr

MarkusPohlmann
Posts: 164
Nutzer
Man bin ich blöd!
Danke für den Hinweis.

Ich habe den ganzen Abschnitt mindestens 5 mal gelesen. Und 5 mal drann vorbei...
Und weils auf Picasso96 klappt ist mir doch nie aufgefallen dass ich da einen fehler drinn hatte.

Naja, immerhin wieder etwas schlauer!

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Verwendung von LockBitMapTags [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.