glLoadGen / modules / Specs.lua

Jason McKesson aaa96f5 

Jason McKesson c6fec6c 

Jason McKesson b25f381 
Jason McKesson c6fec6c 

Jason McKesson aaa96f5 

Jason McKesson 68aaa91 

Jason McKesson fa18131 
Jason McKesson aaa96f5 
Jason McKesson e239ec9 

Jason McKesson aaa96f5 

Jason McKesson 5f393a1 

Jason McKesson aaa96f5 

Jason McKesson 5f393a1 

Jason McKesson aaa96f5 

Jason McKesson 5f393a1 
Jason McKesson aaa96f5 

Jason McKesson 68aaa91 
Jason McKesson aaa96f5 

--[[ This module contains all of the spec-specific constructs (except where specs and styles overlap. That is, where styles have to do spec-specific work).

This module has a function called GetSpec which is given the spec name and returns a table containing functions/data that can be evaluated to do different jobs. This "class" contains:

- FilePrefix: nullary function that returns the filename prefix for this spec type.

- PlatformSetup: Takes a file and writes out platform-specific setup stuff.

- GetHeaderInit: Nullary function that returns a string to be written to the beginning of a header, just after the include guards.

- DeclPrefix: nullary function that returns the name of a prefix string for declarations.

local util = require "util"
local LoadSpec = require "LoadLuaSpec"

local gl_spec = {}
local wgl_spec = {}
local glx_spec = {}

local specTbl =
	gl = gl_spec,
	wgl = wgl_spec,
	glX = glx_spec,

-- Spec-specific functions.
--Validate the options.
function gl_spec.VerifyOptions(options, parseOpts)
	if(options.profile == "compatibility") then
		parseOpts:AssertParse(tonumber(options.version) >= 3.0, "The OpenGL compatibility profile cannot be used with version " .. options.version)

function wgl_spec.VerifyOptions(options, parseOpts)
	return "wgl_"
function glx_spec.VerifyOptions(options, parseOpts)
	return "glx_"

--Loads the appropriate Lua .spec file.
function gl_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "glspec.lua", gl_spec) end
function wgl_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "wglspec.lua", wgl_spec) end
function glx_spec.LoadSpec() return LoadSpec.LoadLuaSpec(util.GetSpecFilePath() .. "glxspec.lua", glx_spec) end

--Name for displaying.
function gl_spec.DisplayName() return "OpenGL" end
function wgl_spec.DisplayName() return "WGL" end
function glx_spec.DisplayName() return "GLX" end

function gl_spec.FilePrefix() return "gl_" end
function wgl_spec.FilePrefix() return "wgl_" end
function glx_spec.FilePrefix() return "glx_" end

--Include-guard string.
function gl_spec.GetIncludeGuardString() return "OPENGL" end
function wgl_spec.GetIncludeGuardString() return "WINDOWSGL" end
function glx_spec.GetIncludeGuardString() return "GLXWIN" end

--Declaration prefix.
function gl_spec.DeclPrefix() return "ogl_" end
function wgl_spec.DeclPrefix() return "wgl_" end
function glx_spec.DeclPrefix() return "glx_" end

--Extension name prefix.
function gl_spec.ExtNamePrefix() return "GL_" end
function wgl_spec.ExtNamePrefix() return "WGL_" end
function glx_spec.ExtNamePrefix() return "GLX_" end

--Enumerator name prefix. This is for defining "proper" GL enumerators.
function gl_spec.EnumNamePrefix() return "GL_" end
function wgl_spec.EnumNamePrefix() return "WGL_" end
function glx_spec.EnumNamePrefix() return "GLX_" end

--Function name prefix. This is for defining "proper" GL function names.
function gl_spec.FuncNamePrefix() return "gl" end
function wgl_spec.FuncNamePrefix() return "wgl" end
function glx_spec.FuncNamePrefix() return "glX" end

--Parameters given to the loader. No (), just the internals.
function gl_spec.GetLoaderParams() return "" end
function wgl_spec.GetLoaderParams() return "HDC hdc" end
function glx_spec.GetLoaderParams() return "Display *display, int screen" end

--CodeGen function pointer type. For APIFUNC and so forth.
function gl_spec.GetCodegenPtrType() return "CODEGEN_FUNCPTR" end
function wgl_spec.GetCodegenPtrType() return "CODEGEN_FUNCPTR" end
function glx_spec.GetCodegenPtrType() return "CODEGEN_FUNCPTR" end

--Name of the function that loads pointers
function gl_spec.GetPtrLoaderFuncName() return "IntGetProcAddress" end
function wgl_spec.GetPtrLoaderFuncName() return "IntGetProcAddress" end
function glx_spec.GetPtrLoaderFuncName() return "IntGetProcAddress" end

--Name of extension string function. Also returns true if this function needs to be loaded. If false is returned, then use the string name *exactly as is*.
function gl_spec.GetExtStringFuncName() return "GetString", true end
function wgl_spec.GetExtStringFuncName() return "GetExtensionsStringARB", true end
function glx_spec.GetExtStringFuncName() return "glXQueryExtensionsString", false end

--Gets the list of parameters that the extension string function will use. No (), just the internals. Pass a function used to resolve enumerator names into actual enumerator identifiers.
function gl_spec.GetExtStringParamList(enumResolve)
	return enumResolve("EXTENSIONS")
function wgl_spec.GetExtStringParamList(enumResolve) return "hdc" end
function glx_spec.GetExtStringParamList(enumResolve) return "display, screen" end

--Returns a table if it should use the indexed extension string functions. Returns false/nil otherwise.
-- The table is an array of:
--	Function name used to get the number of extensions.
--	Enumerator name used to get the number of extensions.
--	Function name used to get an extension string.
--	Enumerator name used to get an extension string.
function gl_spec.GetIndexedExtStringFunc(options)
	if(tonumber(options.version) >= 3.0) then
		return {"GetIntegerv", "NUM_EXTENSIONS", "GetStringi", "EXTENSIONS"}
	return nil
function wgl_spec.GetIndexedExtStringFunc(options) return nil end
function glx_spec.GetIndexedExtStringFunc(options) return nil end

local fileProps =
	{"GetHeaderInit", "init"},
	{"GetVersions", "versions"},
	{"GetCoreVersions", "coreversions"},
	{"GetCoreExts", "coreexts"},
	{"GetLoaderFunc", "loaderfunc"},

--Header initialization.
for key, spec in pairs(specTbl) do
	for _, props in ipairs(fileProps) do
		spec[props[1]] = function()
			return dofile(util.GetDataFilePath() .. spec:FilePrefix() ..
				"spec" .. props[2] .. ".lua")

-- Spec retrieval machinery
local function CopyTable(tbl)
	local ret = {}
	for key, value in pairs(tbl) do
		ret[key] = value
	return ret

local function GetSpec(spec)
	local spec_tbl = specTbl[spec]
	assert(spec_tbl, "Unknown specification " .. spec)
	return CopyTable(spec_tbl)

return { GetSpec = GetSpec }