Fortran 2003-Rajapinnan OpenGL

Link: http://www-stone.ch.cam.ac.uk/pub/f03gl/

F03GL kirjasto

F03GL kirjasto tarjoaa Fortran 2003-rajapinnan OpenGL-kirjasto, yhdessä GLU ja GLUT työkaluja. Se on kehittänyt Anthony Kivi ja Aleksandar Donev. Olemme jo saaneet hyödyllistä palautetta useita käyttäjiä tämän kirjastosta, ja olemme kiitollisia heidän ehdotuksiaan. Siellä on vielä parantamisen varaa, ja olisi kiva saada lisää kommentteja ja vikailmoituksia.

Kaikki lähdekoodit liittyvät F03GL kirjasto voidaan ladata zip-arkisto f03gl.zip tai gzipattu tarfile f03gl.tgz. On README tiedosto joka antaa perusohjeet purkamisesta ja kokoamisesta tiedostot ja käynnissä olevat testit. Paketti jaetaan ehtojen mukaisesti GNU General Public Licence, versio 3.

F03GL käyttää C Yhteentoimivuus ominaisuuksia Fortran 2003 ja sitoutuu C-liitäntä OpenGL. Näin ollen, mikä tahansa järjestelmä, joka on OpenGL-kirjasto ja ylä-ja Fortran-kääntäjä, joka tukee C Yhteentoimivuuden olisi voitava käyttää tätä käyttöliittymä helposti. Tässä mielessä, F03GL on eri f90gl kirjasto William F. Mitchellin, osoitteessa http://math.nist.gov/f90gl/. Että kirjasto toteuttaa virallinen Fortran 90 OpenGL-rajapinnan (kuten hyväksymän OpenGL Architecture Review Board), on kuvattu NISTIR 6134. Se käyttää kääntäjä-erityisiä kääreet toteuttamiseksi Fortran siteet, ja ei käytä Fortran 2003-ominaisuuksia. Se F03GL kirjaston oli tarkoitus olla erittäin kevyt käyttöliittymä C-kirjasto, jossa on vähäinen käyttö kääreet, ja niin vähän käyttöä ei-standardi tai prosessori-riippuvaisia ominaisuuksia kuin mahdollista. Erot F03GL ja NISTIR 6134on kuvattu tämän sivun lopussa. Muuntaminen koodeja käyttäen Fortran 90 käyttöliittymän pitäisi ottaa vaivalla. Olemme muuntaa useita esimerkkejä f90gl jakelu käyttää F03GL, ja me tunnustamme, kanssa kiitos Tohtori Mitchell on lupa tehdä niin. Monia muita esimerkkejä käytöstä OpenGL rutiinit Fortran ja F03GL paketin löytyvät osoitteesta dolfyn verkkosivuilla.

Tuottavan Lähteen Koodit F03GL

Fortran-lähdekoodit sisältävät moduulit PARAMETRI ilmoitukset, KÄYTTÖLIITTYMÄN lohkot, ja jotkut vähän kääreet luodaan automaattisesti käyttämällä Perl-skriptejä. Yksi tavoitteistamme on kehittää työkaluja, jotka voidaan helposti automatisoida muuntaminen C header-tiedostot Fortran Moduulit, ja tätä tarkoitusta varten me teemme työtä Craig Rasmussen on LANL kehittää XML-stylesheets voidaan käyttää tähän tarkoitukseen (käy KUILU työkalupakki www-sivulla). Perl-skriptejä itse eivät ole kovin kehittyneitä ja sisältävät monia hakata niin, että ne toimivat OpenGL-rajapintoja, ja ne voi varmaan helposti ottaa käyttöön muissa sovelluksissa.

Sukupolven GL ja GLU-liitännät, sen sijaan käyttää C header-tiedostot GL.s ja GLU.s (nämä ovat hieman leikata takaisin-versiot suhteellisen standardi Linux-gl.s ja glu.s), päätimme käyttää aito SGI eritelmä liitännöistä tiedostot gl.spec, enum.spec, glu.spec ja enumglu.spec, osoitteessahttp://oss.sgi.com/projects/ogl-sample/registry/. (Tiedostot, jotka on mainittu tässä tämä punainen sanserif-fontti sisältyvät f03gl paketti.)

Vain pari pieniä korjauksia tehtiin nämä tiedostot. Spec-tiedostot antavat enemmän tietoa kuin C-otsakkeiden: esimerkiksi, he antavat TAHALLISUUS info ja rajoja info array argumentteja, ja he myös dokumentoida asioita, kuten OpenGL-kirjasto säilyttää viitteitä sisäiseen käyttöön. Yritimme käyttää kaikki tämä tieto tuottaa parempia Fortran rajapintoja. Fortran-koodit ovat tuotettu kanssa

   spec_interfaces.pl --bozinit --PUBLIC -p . -d -m OpenGL -gl
   spec_interfaces.pl --bozinit --PRIVATE -p . -d -m OpenGL -glu

Suorittamista spec_interfaces.pl ilman argumentteja antaa lyhyt dokumentointi tärkeimmät valinnat. Tärkein on “-m” tai “–moduuli” vaihtoehto, joka päättää, mitä etuliite Fortran MODUULI nimet on. Jos haluat korvata f90gl teidän koodit (kuten teemme hyväksymällä joitakin sen esimerkit), moduuli nimet pitäisi olla OpenGL_GL, OpenGL_GLU ja OpenGL_GLUT. Jos haluat pitää f90gl moduulit ja kokeilla uutta F03GL kirjasto, sitten “m-F03GL” olisi hyvä vaihtoehto. Jos Fortran compiler ei tue BOZ vakiot (heksadesimaali vakiot muodossa z”0B04″) PARAMETRI lausuntoja, uudistua liitännät ilman “–bozinit” vaihtoehto. Muuten, voit vain käyttää tiedostoja OpenGL_gl.f90 ja OpenGL_glu.f90 vuonna f03gl paketti.

Sillä GLUT-kirjasto, ei ole spec tiedostoja, ja käytimme C header-tiedostot luoda rajapintoja. On olemassa myös erilaisia GLUT-kuten toolkit kirjastot ja vastaavat otsikot, nimittäin, alkuperäinen TULVIVAT.s (jälleen, leikata takaisin-versio glut.h GLUT 3.8) Mark J. Kilgard (SGI), joka ei ole julkinen-verkkotunnuksen, mutta se on ilmainen, sekä useita avoimen lähdekoodin osien vaihdot, kuten FreeGLUT.s FreeGLUT tai OpenGLUT.s OpenGLUT. Olemme testanneet Perl-skripti h_interfaces.pl, jossa kaikki nämä kirjastot ja syntyy lähde koodit OpenGL_glut.f90, OpenGL_freeglut.f90 ja OpenGL_openglut.f90, käyttäen jotain

   h_interfaces.pl -q --bozinit --scalar -m OpenGL -i GLUT.h

TULVIVAT ennalta määriteltyjä fontteja, jotka ovat void C osoittimen arvot, ei voida käsitellä suoraan Fortran, jossa TYYPPI(C_PTR) on läpinäkymätön tyyppi, joka voi olla annettu selkeät arvot. Myös eri GLUT toteutukset näyttävät käsitellä fontit eri tavalla. Siksi olemme päättäneet lisätä GLUT_fonts.c ja käyttää ei-vakioita TYYPPI(C_PTR) ja ennalta määriteltyjä fontteja. Tämä tekee mitään näkyvää eroa käyttäjälle. SUOJATTU määritettä käytetään, jotta ne olisivat jatkuvasti-kuten, mutta jos kääntäjä ei vielä tue tätä ominaisuutta, yksinkertaisesti poistaa sen Perl-skripti. Huomaa, että glutInit on ollut ylikuormitettu yleinen käyttöliittymä, joka mahdollistaa yhden jättää komennon argumentteja, koska nämä eivät ole yleisesti käytetty Fortran-koodeista.

Käsittely GLUT Callbacks

Suurin komplikaatio on hoito GLUT callbacks, ja erityisesti, kääntämällä ne pois. On olemassa kaksi tapaa siirtää menettelyt (argumentit) C Fortran 2003: kuten nuken menettelyjä, joilla voidaan antaa täyden rajapinnat, tai koska menettely viitteitä [eli, TYPE(C_FUNPTR) perustelut, jotka ovat yleisiä menettely-osoittimia]. Me mieluummin entisen, koska antaa täyden rajapinnat auttaa (hyvä) kääntäjät tarkistaa, että käyttäjän antamia kutsuja on odotettavissa rajapintoja. Kuitenkin, se sitten tulee vaikea sammuttaa soittopyynnön, jotka GLUT tapahtuu ajamalla NULL-toiminto-osoitin. Fortran, tämä tapahtuu parhaiten tekemällä dummy-menettely on OPTIONAL, mutta tämä edellyttää käyttämällä kääreet, koska OPTIONAL argumentit eivät voi olla yhteentoimivia (vielä). Käyttäjä yksinkertaisesti jättää soittopyynnön argumentti jotta sammuttaa sen. Vuonna NISTIR 6134, ja lähemmäksi, yhdenmukaisuus C-liitäntä, yksi tarvikkeita todellinen argumentti GLUT_NULL_FUNC. Käsikirjoitus h_interfaces.glutnullfunc.pl luo käyttöliittymä, joka käyttää joitakin vaatimustenvastaisista temppuja tehdä tätä työtä, mutta silti säilyttäen tarkkailun soittopyynnön rajapintoja. Jotkut saattavat haluta tehdä kutsuja TYPE(C_FUNPTR) ja soittaa GLUT C toimintoja suoraan ilman kääreitä (rajapinnat, nämä ovat jo syntyy Perl-skriptejä), mutta emme rohkaista tätä, koska se vaatii muuttaminen calling sequence (yksi on laittaa C_FUNLOC todellinen argumentti lista sen sijaan, että yksinkertaisesti kulkee soittopyynnön menettelyä kuin todellinen), ja johtaa incompatibilites joukossa koodit eri käyttäjät F03GL.

Merkkijono argumentit

Vuonna F03GL, merkkijono argumentit ovat välitetään merkki paneelit [CHARACTER(C_CHAR), DIMENSION(*)], kanssa F03 standardi, pikemminkin kuin merkkijonoja [CHARACTER(KIND=C_CHAR, LEN=*)]. Se F03 standardi on erityinen hakata joka mahdollistaa jouset olla kulunut kuin todellisia argumentteja, mutta null-merkki (C_CHAR_NULL) ei ole liitetty automaattisesti, vaan pitää manuaalisesti lisätä. Tarjoamme, OpenGL_gl.f90, auttaja rutiini CString, joka muuntaa merkkijonon null-irtisanotaan merkin valikoimaan. Käyttäjä koodit täytyy muuttaa merkkijonoja, kuten “teksti” todellinen argumentti luettelot CString(“text”)

Käyttämällä F03GL

Jos Fortran lähteistä OpenGL moduulit koota onnistuneesti, seuraava askel on testata niitä. Ohjelma
RandomSphere_OpenGLUT.f90 tarjoaa opetusohjelma-tyyli test-ohjelma. Tämä ohjelma käyttää joitakin kaikkein hyödyllisiä uusia Ilmaisia/OpenGLUT ominaisuuksia, jotka ovat emuloitu klassisen YLITARJONTAA RandomSphere_GLUT.f90. Meillä on myös sovitettu jotkin testi esimerkkejä f90gl työskennellä f03gl. Suorita skripti Script.sh vuonna f03gl hakemistoon, ensimmäinen asetus KÄÄNTÄJÄ muuttujan sopiva kääntäjä komento. Esimerkit on testattu nagfor, gfortran ja ifort. For compiler-riippuvainen tiedot, ks. compiler muistiinpanoja. Lisää esimerkkejä löytyy osoitteesta dolfyn verkkosivuilla.

Yhteensopimattomuudet kanssa NISTIR 6134

Tässä on luettelo yhteensopimattomuudet kanssa NISTIR 6134.

  1. nimet moduulit voidaan OpenGL_XXX jos käyttäjä haluaa korvata f90gl, mutta muuten ne olisi F03GL_XXX.
  2. F03GL ei käsitellä prosessorit puuttuvat lyhyet tyypit. Se vain määrittelee, esimerkiksi GLshort=C_SHORT, jossa C_SHORT on sellainen parametri on määritelty F2003 luontainen ISO_C_BINDING moduuli. Se voi olla -1, jos prosessori ei tue sellainen kysymys, joka tarkoittaa, että ohjelmat käyttää tällainen parametri ei yksinkertaisesti koota. Tämä on luultavasti pienempi ongelma tänään, koska melkein kaikki asiaankuuluvat prosessorit tukevat C-sarja standard kokonaisluku tyyppejä.
  3. GLboolean ovat INTEGER(GLboolean)=INTEGER(C_SIGNED_CHAR) sen sijaan, että LOOGINEN, mukaan F2003-standardia. LOGICAL(C_BOOL) interoperates vain C99 on _Bool. Muita “logicals” C (lainausmerkit koska ne ovat todella kokonaisluku tyyppejä muutenkin), yksi pitäisi käyttää INTEGER
    .
  4. char tulee CHARACTER(KIND=C_CHAR), seuraavat F2003. Lähes kaikki, jos ei kaikki, prosessorit, tämä on sama kuin oletuksena CHARACTER. char* tulee merkki array [“CHARACTER(C_CHAR), DIMENSION(*)”]. ei merkkijono.
  5. Toiminnot, jotka palauttavat osoittimia, ja erityisesti char*, on paluu TYPE(C_PTR), “yleinen” C osoitin. Ne voidaan muuntaa array osoitin-tyyppinen HAHMO(KIND=C_CHAR) käyttäen F2003 menettely C_F_POINTERs. Emme tarjoa funktion sisällä F2003, mutta se on helppo kirjoittaa. Muuntamalla ne Viitteitä tyypin CHARACTER(KIND=C_CHAR,LEN=:) ei ole oikeudellista mukaan F2003 koska pituus on 1 olla yhteentoimivia.
  6. TYPE(GLCPTR) tulee TYPE(C_PTR), ja GLNULLPTR tulee C_NULL_PTR alkaen F2003. Valitettavasti, ei ole TYPEALIAS vuonna F2003, joten niitä ei voida aliasing.
  7. F2003 ei määritellä mitään käyttäjän määrittämiä tyyppejä, kuten gluQuadricObj tai TK_RGTImageRec. Jos nämä tyypit ovat manipuloitu kautta osoitin (kahva), TYPE(C_PTR) argumentti on käytetty. Se on mahdollista määritellä johdetut tyypit, jos todella tarvitaan, mutta tämä ei ole välttämätöntä, että pohja kirjastot, koska on vain kahvat näkyviin ja komponenttien rakenteet ovat koskaan tarvitaan. Jälleen, TYPEALIAS olisi ollut hyödyllistä…
  8. Void argumentteja tullut TYPE(C_PTR)—ei yleinen käyttöliittymä on säädetty, koska tämä ei vastaa F2003-standardia. Vain TYPE(C_PTR) interoperates “tarpeeton*”.
  9. menettelyt eivät ole yleisiä, vaan ainoastaan rajapintojen erityiset C rutiineja (jotka oletetaan on ulkoinen linkeage). Tällä hetkellä ainoa poikkeus on glutInit, joka on ollut ylikuormitettu niin, että sitä voidaan kutsua ilman argumentteja.
  10. Ei katkaisu 31 merkkiä on tehty. Tämä saattaa tehdä Fortran-prosessori itse, eli se saattaa sivuuttaa kaikki merkit 32 ja enemmän.
  11. GLUTNULLFUNC on poistettu (ks. yllä keskustelua GLUT callbacks—emme tarjota versio GLUT rajapinnat, joissa GLUTNULLFUNC voidaan käyttää). Sen sijaan, yksinkertaisesti soittaa GLUT menettely ilman toimittamalla todellinen argumentti soittopyynnön sammuttaa sen. Huomaa, että tämä saattaa edellyttää avainsanojen käyttöön, jos valinnainen soittopyyntö väite ei ole viimeinen argumentti lista.
  12. tapauksissa, joissa GL säilyttää osoitin todellinen argumentti, kuten glFeedbackBuffer (kohta 4.2 NISTIR), F03GL käyttää TYPE(C_PTR) dummy sen sijaan, että TARGET-attribuutin nukke, joka voi epäonnistua. Vain tapauksissa, joissa Fortran 2003-standardin oikeastaan takaa mitään-kopio on, kun nukke on oletettu,-muoto ja TARGET —oletetaan-muoto vaikeuttaa yhteentoimivuus (itse asiassa se on vain tuettava tulevassa F2008).
  13. GLUT kutsuja on oltava perustelut ominaisuuden VALUE ja on BIND(C) label, niin, että ne voidaan kutsua suoraan C. Huomaa, että BIND(C, NAME=””) voidaan käyttää tukahduttaa sitova etiketti aliohjelmia, jotka ovat vain tarvitaan kutsuja. Näin vältetään pilaavien maailmanlaajuinen symboli nimiavaruuden kanssa callbacks.

Leave a Reply

Your email address will not be published. Required fields are marked *