Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 03:10

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL: Unknown OpenGL Attribute
BeitragVerfasst: Sa Jul 11, 2009 22:35 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Ich hatte gerade ein Problemchen mit dem Stencilbuffer, der wurde nämlich nicht erstellt. Grund: "Unknown OpenGL Attribute".

Beim weiteren Debuggen ist mir auch aufgefallen, dass _alle_ Attributübergaben mit dem Fehler scheitern. Dargestellt wird aber trotzdem irgendwas und das Surface wird demnach logischerweise auch irgendwie erstellt. Nur alles, was über Farb-und Tiefenpuffer hinaus geht, funktioniert gar nicht.

Ich hab hier Ubuntu 9.04 (64 bit) mit den mitgelieferten SDL-Paketen (1.2.6) und ne NVidia GeForce 9300GE mit dem NVidia 180.44-Treiber laufen, könnte es was damit zu tun haben?
Habe gerade keine Möglichkeit, das auf anderen Systemen zu testen.

Zum Abschluss noch der Code von der SDL-Initialisierung:

Code:
  1.   if SDL_Init(SDL_INIT_VIDEO) < 0 then
  2.     log.terminate('Initialization of SDL failed: ' + SDL_GetError);
  3.   videoInfo := SDL_GetVideoInfo;
  4.   if videoInfo = nil then
  5.     log.terminate('Polling video card failed: ' + SDL_GetError);
  6.  
  7.   videoFlags := SDL_OPENGL or
  8.                 SDL_DOUBLEBUF or
  9.                 SDL_HWPALETTE;
  10.  
  11.   if videoInfo^.hw_available <> 0 then
  12.     videoFlags := videoFlags or SDL_HWSURFACE
  13.   else
  14.     videoFlags := videoFlags or SDL_SWSURFACE;
  15.  
  16.   if videoInfo^.blit_hw <> 0 then
  17.     videoFlags := videoFlags or SDL_HWACCEL;
  18.  
  19.   if Config.readbool('SDL.FULLSCREEN', false) then
  20.     videoFlags := videoFlags or SDL_FULLSCREEN;
  21.  
  22.   Log.Add(E_WARN, SDL_GetError);
  23.   SDL_GL_SetAttribute(SDL_GL_RED_SIZE, <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  24.   Log.Add(E_WARN, SDL_GetError);
  25.   SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  26.   Log.Add(E_WARN, SDL_GetError);
  27.   SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
  28.   Log.Add(E_WARN, SDL_GetError);
  29.   if SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) --> = -1 then
  30.     Log.add(E_WARN, 'Stencil buffer setup failed: ' + SDL_GetError);
  31.   if SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, config.readInt('SDL.DEPTHSIZE', 32)) = -1 then
  32.     begin
  33.     Log.add(E_WARN, 'Depth buffer size of ' + IntToStr(config.readInt('SDL.DEPTHSIZE', 32)) + ' bits seems to be too large - falling back to 16 bits: ' + SDL_GetError);
  34.     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
  35.     end;
  36.   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  37.  
  38.   SDL_WM_SetCaption(PChar(caption), nil);
  39.  
  40.   width := Config.readInt('SDL.RESWIDTH', 800);
  41.   height := Config.readInt('SDL.RESHEIGHT', 600);
  42.  
  43.   surface := SDL_SetVideoMode(width, height, 32, videoflags);
  44.  
  45.   if surface = nil then
  46.     log.terminate('Creating SDL-surface failed: ' + SDL_getError);
  47.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 12, 2009 11:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habs gerade mal kurz hier ausgeführt und habe festgestellt, dass die SDL-Fehlermeldungen eigentlich komplett egal sind. Die eigentliche Fehlererkennung läuft erst beim anfordern der Surface ab. Da flog er bei mir raus ("Couldn't find matching GLX visual"). Daraufhin habe ich mal glxinfo angeworfen und geschaut, was für GLX Visuals meine Grafikkarte denn drauf hat. Dabei habe ich festgestellt, dass kein einziger Modus 32-bit Tiefenpuffer unterstützt. Also hab ich mal aus der 32 ne 24 gemacht und sieheda, ich bekam den Puffer. Übrigens auch mit 8bit stencil. Ich denke einfach, dass die Meldungen, die SDL_GL_SetAttribute da rauswirft nichtssagend sind. Wenn was schief geht, musst du das beim holen der Surface prüfen.

greetings

P.S.: Hier läuft ein Fedora 11 mit NV-Treiber 185.18.14 auf ner GeForce 7600.

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 12, 2009 14:48 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
nach dem Holen des Surfaces entsteht bei mir kein Fehler.
Auch auf einem 32Bit-Windoof-Vista (habs heute mal probieren koennen) kommen keine Fehlermeldungen und alles funktioniert perfekt.

Hier wird das, was ich als Attribute übergebe, leider gar nicht erst beachtet. Der Tiefenpuffer hat laut OpenGL immer 24 Bit (ok, mehr kann meine graka aber auch wirklich nicht, meine alte konnte? Aber ich fliege da nichtmal raus..) (laut SDL ist gar keiner da :D), Stencilbuffer klappt nicht. Alle Attributübergaben fliegen mit dem netten Rückgabewert -1 raus.


Hast du ein 32 oder 64Bit-System?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 12, 2009 16:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ebenfalls 64bit..... Wobei es da nach meinen Erfahrungen schon erstaunlich genug ist, dass der SDL-Header funktioniert.

Das mit den Fehlern ist interessant... Ich habe übrigens eine andere SDL-Version als du, es ist 1.2.13. Bentutzt du eine aus den Entwicklerrepositories (gibts sowas für SDL überhaupt - also öffentlich?)? Denn laut libsdl.org ist 1.2.13 die aktuellste öffentliche Version.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 12, 2009 19:20 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Die eigentliche SDL-Core hier scheint doch die gleiche zu sein (wenn ich jetzt die richtigen Pakete erwischt hab). Die Versionierung der Ubuntu-Pakete hat mich stutzig gemacht :S

Ne, ne Entwicklerversion von SDL benutz ich nicht. Das wäre dann SDL 1.3, offenbar kommt der letzte commit vom 10. Juni, aber ich bezweifle mal, dass mich das weiterbringt.. (ok, hab schon genug unstable hier :D )


EDIT: Problem behoben

Das Problem scheint beim Header zu liegen. Scheinbar macht mein FPC aus dem Typen TSDL_GLAttr einen DWord. Der Funktionsaufruf benötigt in der 64Bit-Version aber einen QWord. Ich hab also in der Funktionsdeklaration von SDL_GL_SetAttribute den Typen auf QWord gesetzt und siehe da - wenn man die Konstanten wie SDL_GL_RED_SIZE nach QWord castet, returnen die Funktionen 0. :)

Jetzt muss ich nur noch zusehen, dass ich das 1. plattformunabhaengig mache (hat FPC fuer x86_64 nen compilerswitch?) und 2. noch den Stencilbuffer anschalte.

EDIT 2:

Anstatt eines Compilerswitches kann man auch PtrUInt als Typen benutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 13, 2009 11:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Genau, 1. PtrUInt (oder auch SizeUInt) und als Compilerswitch gibts dann auch noch CPU64 bzw CPU32.
Was mich dann allerdings erstaunt ist, dass es bei mir ohne probleme läuft. Welche FPC-Version benutzt du?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 13, 2009 21:03 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Hab FPC 2.3.1 aus dem SVN.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 24 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]