You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

127 lines
5.5 KiB

  1. unit ulibShaderFile;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils;
  6. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. const
  8. LSF_LOGLEVEL_DEBUG = 0;
  9. LSF_LOGLEVEL_INFO = 1;
  10. LSF_LOGLEVEL_WARNING = 2;
  11. LSF_LOGLEVEL_ERROR = 3;
  12. LSF_ERR_NONE = $00000000;
  13. LSF_ERR_NOT_INIT = $00000001;
  14. LSF_ERR_INVALID_HANDLE_SHADER_FILE = $00000002;
  15. LSF_ERR_UNKNOWN_IDENTFIFIER = $00001000;
  16. LSF_ERR_DUPLICATE_IDENTIFIER = $00001001;
  17. LSF_ERR_OUT_OF_RANGE = $00001002;
  18. LSF_ERR_INVALID_IDENTIFIER = $00001003;
  19. LSF_ERR_INVALID_PARAMTER_COUNT = $00001004;
  20. LSF_ERR_INVALID_PARAMTER = $00001005;
  21. LSF_ERR_UNEXPECTED_TOKEN = $00001006;
  22. LSF_ERR_INVALID_TOKEN = $00001007;
  23. LSF_ERR_EXPRESSION_INTERNAL = $00001008;
  24. LSF_ERR_EXPRESSION = $00001009;
  25. LSF_ERR_SHADER_PART_INTERNAL = $0000100A;
  26. LSF_ERR_SHADER_PART = $0000100B;
  27. LSF_ERR_UNKNOWN = $FFFFFFFF;
  28. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  29. type
  30. TlsfErrorCode = Cardinal;
  31. TlsfLogLevel = Cardinal;
  32. TlsfShaderFileHandle = Pointer;
  33. TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar);
  34. Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall;
  35. Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent): TlsfErrorCode; stdcall;
  36. Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  37. Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  38. Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall;
  39. Tlsf_init = function : TlsfErrorCode; stdcall;
  40. Tlsf_getLastErrorCode = function : TlsfErrorCode; stdcall;
  41. Tlsf_getLastErrorMsg = function : PAnsiChar; stdcall;
  42. Tlsf_getLastErrorTrace = function : PAnsiChar; stdcall;
  43. Tlsf_finish = function: TlsfErrorCode; stdcall;
  44. var
  45. lsf_ShaderFile_create: Tlsf_ShaderFile_create;
  46. lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback;
  47. lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile;
  48. lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile;
  49. lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy;
  50. lsf_getLastErrorCode: Tlsf_getLastErrorCode;
  51. lsf_getLastErrorMsg: Tlsf_getLastErrorMsg;
  52. lsf_getLastErrorTrace: Tlsf_getLastErrorTrace;
  53. procedure lsf_init(const aLibName: String);
  54. procedure lsf_finish;
  55. implementation
  56. uses
  57. dynlibs;
  58. var
  59. libHandle: TLibHandle;
  60. lsf_init_intern: Tlsf_init;
  61. lsf_finish_intern: Tlsf_finish;
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. procedure lsf_init(const aLibName: String);
  64. function LoadProc(const aName: AnsiString): Pointer;
  65. begin
  66. result := GetProcedureAddress(libHandle, aName);
  67. if not Assigned(result) then
  68. raise Exception.CreateFmt('unable to load ''%s'' from ''%s''', [aName, aLibName]);
  69. end;
  70. begin
  71. libHandle := LoadLibrary(aLibName);
  72. if (libHandle = 0) then
  73. raise Exception.CreateFmt('unable to load library: %s', [aLibName]);
  74. lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create'));
  75. lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback(LoadProc('lsf_ShaderFile_setLogCallback'));
  76. lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile'));
  77. lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile'));
  78. lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy'));
  79. lsf_init_intern := Tlsf_init( LoadProc('lsf_init'));
  80. lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode'));
  81. lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg'));
  82. lsf_getLastErrorTrace := Tlsf_getLastErrorTrace( LoadProc('lsf_getLastErrorTrace'));
  83. lsf_finish_intern := Tlsf_finish( LoadProc('lsf_finish'));
  84. if (lsf_init_intern() <> LSF_ERR_NONE) then
  85. raise Exception.Create('error while initializing library: ' + lsf_getLastErrorMsg());
  86. end;
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. procedure lsf_finish;
  89. begin
  90. lsf_finish_intern();
  91. lsf_ShaderFile_create := nil;
  92. lsf_ShaderFile_setLogCallback := nil;
  93. lsf_ShaderFile_loadFromFile := nil;
  94. lsf_ShaderFile_saveToFile := nil;
  95. lsf_ShaderFile_destroy := nil;
  96. lsf_getLastErrorCode := nil;
  97. lsf_getLastErrorMsg := nil;
  98. lsf_getLastErrorTrace := nil;
  99. if (libHandle <> 0) then begin
  100. FreeLibrary(libHandle);
  101. libHandle := 0;
  102. end;
  103. end;
  104. end.