Update for Glew and Opengl -> 4.0

BlitzMax Forums/OpenGL Module/Update for Glew and Opengl -> 4.0

Bobysait(Posted 2010) [#1]
I'm trying to update Opengl to OpenGL 4.0 ( with glew 1.5.4 ) for my 3D engine ( BigBang -> an OpenGl engine intended to replace Blitz3D )

For now, those are the step :

1/ BackUp the pub.opengl and pub.glew !!!

2/ Download last version of glew
http://sourceforge.net/projects/glew/files/glew/1.5.4/
( glew-1.5.4.zip )

3/ Extracted countain of "glew-1.5.4.zip" to a folder
3.1/ Copy/Paste "GL" directory ( from "include" directory ) to "pub.glew/GL" ( overwrite existing file )
3.2/ Copy/Paste "glew.c" ( from "src" Directory ) to "pub.glew" ( overwrite existing file )

4/ Update "Glew2Bmx.bmx" ( in pub.glew ) to :
4.1 -> update the code and save it


4.2 -> Run the code.

5 / Replace files
5.1 / Replace glew.bmx with __glew__.bmx ( replacing name of course )
5.2 / Replace opengl.bmx ( in pub.opengl ) with __opengl__.bmx

6 / Rebuild modules

Every thing seems to work fine except a bug in Z-Order ... but, maybe I missed something ?


Bobysait(Posted 2010) [#2]
Oo , I find the error
-> actually, using Glew2Bmx ( original )
it seems to have an error , it just can't get any GL Constant with value = "1"
So there is no "GL_TRUE" and a lot of other const...

Any ideas why BRL did this ?


BLaBZ(Posted 2012) [#3]
It's because there are duplicate identifiers in the glew.bmx generated code.

The code above will create glew.bmx correctly.

This code creates opengl.bmx

Strict
Framework brl.basic
Import brl.map
Import brl.retro

Rem
Cheezy little app to convert glew.h to bmx source.
extract glew header to __opengl__.bmx and __glew__.bmx
End Rem

Local OutOpenGLName$="__opengl__.bmx"
Local OutGlewName$="__glew__.bmx"

Global OutOpenGL:TStream	=	WriteStream(OutOpenGLName$)
Global OutGLew	:TStream	=	WriteStream(OutGlewName$)
Global Out		:TStream	=	OutOpenGL

' Write Headers
WriteLine OutOpenGL, "Strict"
WriteLine OutOpenGL, "Rem"
WriteLine OutOpenGL, "bbdoc: Graphics/OpenGL 1.1"
WriteLine OutOpenGL, "End Rem"
WriteLine OutOpenGL, "Module Pub.OpenGL"
WriteLine OutOpenGL, ""
WriteLine OutOpenGL, "ModuleInfo "+Chr(34)+"Version: 1.02"+Chr(34)
WriteLine OutOpenGL, "ModuleInfo "+Chr(34)+"License: SGI Free Software License B"+Chr(34)
WriteLine OutOpenGL, "ModuleInfo "+Chr(34)+"Modserver: brl"+Chr(34)
WriteLine OutOpenGL, ""
WriteLine OutOpenGL, "ModuleInfo "+Chr(34)+"History: 1.02 Release"+Chr(34)
WriteLine OutOpenGL, "ModuleInfo "+Chr(34)+"History: Restored GLU"+Chr(34)
WriteLine OutOpenGL, ""
WriteLine OutOpenGL, "?MacOS"
WriteLine OutOpenGL, "Import "+Chr(34)+"-Framework AGL"+Chr(34)
WriteLine OutOpenGL, "Import "+Chr(34)+"-Framework OpenGL"+Chr(34)
WriteLine OutOpenGL, "?Win32"
WriteLine OutOpenGL, "Import "+Chr(34)+"-lglu32"+Chr(34)
WriteLine OutOpenGL, "Import "+Chr(34)+"-lopengl32"+Chr(34)
WriteLine OutOpenGL, "?Linux"
WriteLine OutOpenGL, "Import "+Chr(34)+"-lGL"+Chr(34)
WriteLine OutOpenGL, "Import "+Chr(34)+"-lGLU"+Chr(34)
WriteLine OutOpenGL, "?"
WriteLine OutOpenGL, ""
WriteLine OutOpenGL, "Import "+Chr(34)+"glu.bmx"+Chr(34)
WriteLine OutOpenGL, ""
WriteLine OutOpenGL, "Extern "+Chr(34)+"Os"+Chr(34)

WriteLine OutGLew, "Strict"
WriteLine OutGLew, ""
WriteLine OutGLew, "Rem"
WriteLine OutGLew, "bbdoc: Graphics/Glew"
WriteLine OutGLew, "End Rem"
WriteLine OutGLew, "Module Pub.Glew"
WriteLine OutGLew, ""
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"Version: 1.07"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"Author: Milan Ikits, Marcelo Magallon"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"License: SGI Free Software License B"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"Copyright: Milan Ikits, Marcelo Magallon"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"Modserver: brl"+Chr(34)
WriteLine OutGLew, ""
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: 1.07 Release"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Updated To glew 1.5.1"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Modified glew2bmx To handle a GLint64EXT, GLuint64EXT And char - UNTESTED!"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: 1.06 Release"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Rebuilt To fix MacOs ld errors"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: 1.05 Release"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Removed glew2bmx.exe!"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: 1.04 Release"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Updated To glew 1.3.4"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: 1.03 Release"+Chr(34)
WriteLine OutGLew, "ModuleInfo "+Chr(34)+"History: Updated To GL2.0 compatible version 1.3.3"+Chr(34)
WriteLine OutGLew, ""
WriteLine OutGLew, "Import Pub.OpenGL"
WriteLine OutGLew, ""
WriteLine OutGLew, "Import "+Chr(34)+"glew_static.c"+Chr(34)
WriteLine OutGLew, ""
WriteLine OutGLew, "Extern "+Chr(34)+"Os"+Chr(34)


Global StartOutputGlew :Byte = False
Function Happen (chaine$, bbDoc$)
	
	WriteLine Out,"rem"
	WriteLine Out,"bbdoc: "+bbDoc
	WriteLine Out,"endrem"
	WriteLine Out,chaine
	
	If StartOutputGlew = False
		If Instr ( chaine , "glViewport" )
			Out = OutGLew
			StartOutputGlew = True
		EndIf
	EndIf
	
End Function

Global in:TStream=ReadStream( "GL/glew.h" )

Global curr$,text$

Local funMap:TMap=New TMap
Local constMap:TMap=New TMap

While Not Eof(in)
	text=in.ReadLine()
	bump
	If curr="GLAPI"
		bump
		Local funty$=gltype()
		If funty<>"x" And curr="GLAPIENTRY"
			Local id$=bump()
			If id[..2]="gl" And bump()="("
				Local proto$=glproto()
				If proto<>"x"
					Happen ( "Function "+id+funty+"("+proto+")", "GL Function "+id+funty )
				EndIf
			EndIf
		EndIf
	Else If curr="#"
		If bump()="define"
			Local id$=bump()
			If id[..11]="GL_VERSION_"
				
			Else If id[..3]="GL_"
				If Not constMap.ValueForKey(id)
					Local n$=bump()
					If n[..2]="0x"
						Happen ( "Const "+id+"=$"+n[2..], "GL Const "+id )
					Else If n.length And isdigit(n[0]) 'And n<>"1"
						Happen ( "Const "+id+"="+n, "GL Const "+id )
					EndIf
					constMap.Insert id,n
				EndIf
			Else If id[..5]="GLEW_"
				If bump()="GLEW_GET_VAR" And bump()="("
					Local sym$=bump()
					If sym[..7]="__GLEW_" And bump()=")"
						Happen ( "Global GL_"+id[5..]+":Byte=~q"+sym+"~q", "GL Global "+id )
					EndIf
				EndIf
			Else If id[..2]="gl"
				If bump()="GLEW_GET_FUN" And bump()="("
					Local sym$=bump()
					If sym[..6]="__glew" And bump()=")"
						Local key$="PFNGL"+sym[6..].ToUpper()+"PROC"
						Local val$=String( funMap.ValueForKey( key ) )
						If val
							Happen ( "Global "+id+val+"=~q"+sym+"~q", "GL Global "+id+val )
						Else
							DebugLog "***** "+sym+" *****"
						EndIf
					EndIf
				EndIf
			EndIf
		EndIf
	Else If curr="typedef"
		bump
		Local funty$=gltype()
		If funty<>"x" And curr="(" And bump()="GLAPIENTRY" And bump()="*"
			Local id$=bump()
			If id[..5]="PFNGL" And bump()=")" And bump()="("
				Local proto$=glproto()
				If proto<>"x"
					funMap.Insert id,funty+"("+proto+")"
				EndIf
			EndIf
		EndIf
	EndIf
Wend


in.Close

' close outputs
WriteLine OutOpenGL	, ""
WriteLine OutOpenGL	, "End Extern" ;OutOpenGL.Close()



WriteLine OutGLew	, "End Extern"
WriteLine OutGLew	, ""
WriteLine OutGLew	, "Extern "+Chr(34)+"C"+Chr(34)
WriteLine OutGLew	, "Function glewInit()"
WriteLine OutGLew	, "End Extern" ;OutGLew.Close()



Function glproto$()
	If bump()=")" Return ""
	Local proto$,err,argid
	Repeat
		Local argty$=gltype()
		If argty="x" Return argty
		Local id$
		If curr<>"," And curr<>")" And curr.length And (isalpha(curr[0]) Or curr[0]=Asc("_"))
			id$=curr
			If bump()="["
				While bump()<>"]"
				Wend
				bump
				If Not argty argty="Byte"
				argty:+" Ptr"
			EndIf
		Else
			id="arg"+argid
		EndIf
		argid:+1
		If proto proto:+","
		proto:+id+"_"+argty
		If curr=")"
			bump
			If proto="arg0_" proto=""
			Return proto
		EndIf
		If curr<>"," Return "x"
		bump
	Forever
End Function

Function gltype$()
	Local ty$
	If curr="const"
		bump
	EndIf
	Select curr
	Case "void","GLvoid"
		ty=""
	Case "char","GLbyte","GLubyte","GLchar","GLboolean","GLcharARB"
		ty="Byte"
	Case "GLshort","GLushort","GLhalf"
		ty="Short"
	Case "GLint","GLuint","GLenum","GLsizei","GLbitfield"
		ty="Int"
	Case "GLintptr","GLsizeiptr","GLintptrARB","GLsizeiptrARB"
		ty="Int"
	Case "GLhandleARB"
		ty="Int"
	Case "GLint64EXT","GLuint64EXT", "GLint64", "GLuint64"
		ty="Long"
	Case "GLfloat","GLclampf"
		ty="Float"
	Case "GLdouble","GLclampd"
		ty="Double"
	Default
		Return "x"
	End Select
	Repeat
		bump
		If curr="const" bump
		If curr<>"*" Exit
		If Not ty ty="Byte"
		ty:+" Ptr"
	Forever
	If ty ty=":"+ty
	Return ty
End Function

Function isalpha( c )
	Return (c>=Asc("A") And c<=Asc("Z")) Or (c>=Asc("a") And c<=Asc("z"))
End Function

Function isdigit( c )
	Return c>=Asc("0") And c<=Asc("9")
End Function

Function isalnum( c )
	Return isalpha(c) Or isdigit(c)
End Function

Function isxdigit( c )
	Return (c>=Asc("A") And c<=Asc("F")) Or (c>=Asc("a") And c<=Asc("f")) Or isdigit(c)
End Function

Function bump$()
	Local i=0
	While i<text.length And text[i]<=Asc(" ")
		i:+1
	Wend
	If i=text.length
		curr=""
		text=""
		Return curr
	EndIf
	text=text[i..]
	Local c=text[0]
	i=1
	If isalpha(c) Or c=Asc("_")
		While i<text.length And (isalnum( text[i] ) Or text[i]=Asc("_"))
			i:+1
		Wend
	Else If c>=Asc("0") And c<=Asc("9")
		If i<text.length And c=Asc("0") And text[i]=Asc("x")
			i:+1
			While i<text.length And isxdigit(text[i])
				i:+1
			Wend
		Else
			While i<text.length And isdigit(text[i])
				i:+1
			Wend
		EndIf
	EndIf
	curr=text[..i]
	text=text[i..]
	Return curr
End Function




Ferret(Posted 2012) [#4]
This works fine untill i try to compile in debug mode.

I get these errors.


Last edited 2012


Ferret(Posted 2012) [#5]
Help, i can't debug mi apps anymore :(

Did anyone else get this after updating or did i do something wrong?
What does this error mean and how can it be fixed?


Bobysait(Posted 2012) [#6]
"1/ BackUp the pub.opengl and pub.glew !!!"

Have you made a backup before running the update ?

Else, it seems something is missing ...
Did you import the pub.glew and initialized glew ?

Import pub.glew
SetGraphicsDriver GLMax2DDriver()
Graphics 800,600,0
GlewInit()



Ferret(Posted 2012) [#7]
Thx for the reply!

Glew is imported and initialized.

I have a backup, ill just try again.


BLaBZ(Posted 2012) [#8]
I've done this with the latest version of glew(1.9.0)

but when I do a version check

Graphics3D(1300, 700, 0, 2, 60)

Local major:Int
Local minor:Int
glGetIntegerv&#8203;(GL_MAJOR_VERSION&#8203;, Varptr major)
glGetIntegerv&#8203;(GL_MINOR_VERSION&#8203;, Varptr minor)

Notify major + " . " + minor + "  glver: " + te
End


I get 3.0!?? shouldn't it be 4.3?


joncom2000(Posted 2012) [#9]
They changed how opengl context work awhile ago, you have to open a core context to get all the newer stuff. You will be opening a context the old way based on the code you show and this will generally make a compatability context which only supports up to opengl 3.3 I think, so it will only return a 3.x opengl level.

Of course if your gfx card doesnt support the level your trying to create either in hardware or driver then you will not be able to make higher level contexts anyway. Look into wglCreateContextAttribsARB I think thats how you open a higher context.

Last edited 2012