unit ulibShaderFile; {$mode objfpc}{$H+} interface uses Classes, SysUtils; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const LSF_LOGLEVEL_DEBUG = 0; LSF_LOGLEVEL_INFO = 1; LSF_LOGLEVEL_WARNING = 2; LSF_LOGLEVEL_ERROR = 3; LSF_ERR_NONE = $00000000; LSF_ERR_NOT_INIT = $00000001; LSF_ERR_INVALID_HANDLE_SHADER_FILE = $00000010; LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR = $00000011; LSF_ERR_INVALID_GENERATOR_NAME = $00000020; LSF_ERR_INVALID_PROPERTY_INDEX = $00000021; LSF_ERR_UNKNOWN_IDENTFIFIER = $00001000; LSF_ERR_DUPLICATE_IDENTIFIER = $00001001; LSF_ERR_OUT_OF_RANGE = $00001002; LSF_ERR_INVALID_IDENTIFIER = $00001003; LSF_ERR_INVALID_PARAMTER_COUNT = $00001004; LSF_ERR_INVALID_PARAMTER = $00001005; LSF_ERR_UNEXPECTED_TOKEN = $00001006; LSF_ERR_INVALID_TOKEN = $00001007; LSF_ERR_EXPRESSION_INTERNAL = $00001008; LSF_ERR_EXPRESSION = $00001009; LSF_ERR_SHADER_PART_INTERNAL = $0000100A; LSF_ERR_SHADER_PART = $0000100B; LSF_ERR_UNKNOWN = $FFFFFFFF; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// type TlsfErrorCode = Cardinal; TlsfLogLevel = Cardinal; TlsfShaderFileHandle = Pointer; TlsfShaderGeneratorHandle = Pointer; TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall; Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent; const aUserArgs: Pointer): TlsfErrorCode; stdcall; Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall; Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall; Tlsf_ShaderFile_getGeneratorNames = function(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall; Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall; Tlsf_Generator_create = function(const aHandle: TlsfShaderFileHandle; const aName: PAnsiChar): TlsfShaderGeneratorHandle; stdcall; Tlsf_Generator_getPropertyNames = function(const aHandle: TlsfShaderGeneratorHandle): PAnsiChar; stdcall; Tlsf_Generator_getProperty = function(const aHandle: TlsfShaderGeneratorHandle; const aIndex: Integer): PAnsiChar; stdcall; Tlsf_Generator_setProperty = function(const aHandle: TlsfShaderGeneratorHandle; const aIndex: Integer; const aValue: PAnsiChar): TlsfErrorCode; stdcall; Tlsf_Generator_generateCode = function(const aHandle: TlsfShaderGeneratorHandle): PAnsiChar; stdcall; Tlsf_Generator_destroy = function(const aHandle: TlsfShaderGeneratorHandle): TlsfErrorCode; stdcall; Tlsf_init = function : TlsfErrorCode; stdcall; Tlsf_getLastErrorCode = function : TlsfErrorCode; stdcall; Tlsf_getLastErrorMsg = function : PAnsiChar; stdcall; Tlsf_getLastErrorTrace = function : PAnsiChar; stdcall; Tlsf_finish = function: TlsfErrorCode; stdcall; var lsf_ShaderFile_create: Tlsf_ShaderFile_create; lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback; lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile; lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile; lsf_ShaderFile_getGeneratorNames: Tlsf_ShaderFile_getGeneratorNames; lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy; lsf_Generator_create: Tlsf_Generator_create; lsf_Generator_getPropertyNames: Tlsf_Generator_getPropertyNames; lsf_Generator_getProperty: Tlsf_Generator_getProperty; lsf_Generator_setProperty: Tlsf_Generator_setProperty; lsf_Generator_generateCode: Tlsf_Generator_generateCode; lsf_Generator_destroy: Tlsf_Generator_destroy; lsf_getLastErrorCode: Tlsf_getLastErrorCode; lsf_getLastErrorMsg: Tlsf_getLastErrorMsg; lsf_getLastErrorTrace: Tlsf_getLastErrorTrace; procedure lsf_init(const aLibName: String); procedure lsf_finish; implementation uses dynlibs; var libHandle: TLibHandle; lsf_init_intern: Tlsf_init; lsf_finish_intern: Tlsf_finish; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure lsf_init(const aLibName: String); function LoadProc(const aName: AnsiString): Pointer; begin result := GetProcedureAddress(libHandle, aName); if not Assigned(result) then raise Exception.CreateFmt('unable to load ''%s'' from ''%s''', [aName, aLibName]); end; begin libHandle := LoadLibrary(aLibName); if (libHandle = 0) then raise Exception.CreateFmt('unable to load library: %s', [aLibName]); lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create')); lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback( LoadProc('lsf_ShaderFile_setLogCallback')); lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile')); lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile')); lsf_ShaderFile_getGeneratorNames := Tlsf_ShaderFile_getGeneratorNames( LoadProc('lsf_ShaderFile_getGeneratorNames')); lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy')); lsf_Generator_create := Tlsf_Generator_create( LoadProc('lsf_Generator_create')); lsf_Generator_getPropertyNames := Tlsf_Generator_getPropertyNames( LoadProc('lsf_Generator_getPropertyNames')); lsf_Generator_getProperty := Tlsf_Generator_getProperty( LoadProc('lsf_Generator_getProperty')); lsf_Generator_setProperty := Tlsf_Generator_setProperty( LoadProc('lsf_Generator_setProperty')); lsf_Generator_generateCode := Tlsf_Generator_generateCode( LoadProc('lsf_Generator_generateCode')); lsf_Generator_destroy := Tlsf_Generator_destroy( LoadProc('lsf_Generator_destroy')); lsf_init_intern := Tlsf_init( LoadProc('lsf_init')); lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode')); lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg')); lsf_getLastErrorTrace := Tlsf_getLastErrorTrace( LoadProc('lsf_getLastErrorTrace')); lsf_finish_intern := Tlsf_finish( LoadProc('lsf_finish')); if (lsf_init_intern() <> LSF_ERR_NONE) then raise Exception.Create('error while initializing library: ' + lsf_getLastErrorMsg()); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure lsf_finish; begin lsf_finish_intern(); lsf_ShaderFile_create := nil; lsf_ShaderFile_setLogCallback := nil; lsf_ShaderFile_loadFromFile := nil; lsf_ShaderFile_saveToFile := nil; lsf_ShaderFile_getGeneratorNames := nil; lsf_ShaderFile_destroy := nil; lsf_getLastErrorCode := nil; lsf_getLastErrorMsg := nil; lsf_getLastErrorTrace := nil; if (libHandle <> 0) then begin FreeLibrary(libHandle); libHandle := 0; end; end; end.