|
- 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 = $00000002;
- 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;
- TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar);
-
- Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall;
- Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent): 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_destroy = function(const aHandle: TlsfShaderFileHandle): 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_destroy: Tlsf_ShaderFile_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_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_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_destroy := nil;
- lsf_getLastErrorCode := nil;
- lsf_getLastErrorMsg := nil;
- lsf_getLastErrorTrace := nil;
- if (libHandle <> 0) then begin
- FreeLibrary(libHandle);
- libHandle := 0;
- end;
- end;
-
- end.
|