Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

156 рядки
8.1 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 = $00000010;
  15. LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR = $00000011;
  16. LSF_ERR_INVALID_GENERATOR_NAME = $00000020;
  17. LSF_ERR_INVALID_PROPERTY_INDEX = $00000021;
  18. LSF_ERR_UNKNOWN_IDENTFIFIER = $00001000;
  19. LSF_ERR_DUPLICATE_IDENTIFIER = $00001001;
  20. LSF_ERR_OUT_OF_RANGE = $00001002;
  21. LSF_ERR_INVALID_IDENTIFIER = $00001003;
  22. LSF_ERR_INVALID_PARAMTER_COUNT = $00001004;
  23. LSF_ERR_INVALID_PARAMTER = $00001005;
  24. LSF_ERR_UNEXPECTED_TOKEN = $00001006;
  25. LSF_ERR_INVALID_TOKEN = $00001007;
  26. LSF_ERR_EXPRESSION_INTERNAL = $00001008;
  27. LSF_ERR_EXPRESSION = $00001009;
  28. LSF_ERR_SHADER_PART_INTERNAL = $0000100A;
  29. LSF_ERR_SHADER_PART = $0000100B;
  30. LSF_ERR_UNKNOWN = $FFFFFFFF;
  31. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  32. type
  33. TlsfErrorCode = Cardinal;
  34. TlsfLogLevel = Cardinal;
  35. TlsfShaderFileHandle = Pointer;
  36. TlsfShaderGeneratorHandle = Pointer;
  37. TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer);
  38. Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall;
  39. Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
  40. Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  41. Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  42. Tlsf_ShaderFile_getGeneratorNames = function(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall;
  43. Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall;
  44. Tlsf_Generator_create = function(const aHandle: TlsfShaderFileHandle; const aName: PAnsiChar): TlsfShaderGeneratorHandle; stdcall;
  45. Tlsf_Generator_getPropertyNames = function(const aHandle: TlsfShaderGeneratorHandle): PAnsiChar; stdcall;
  46. Tlsf_Generator_getProperty = function(const aHandle: TlsfShaderGeneratorHandle; const aIndex: Integer): PAnsiChar; stdcall;
  47. Tlsf_Generator_setProperty = function(const aHandle: TlsfShaderGeneratorHandle; const aIndex: Integer; const aValue: PAnsiChar): TlsfErrorCode; stdcall;
  48. Tlsf_Generator_generateCode = function(const aHandle: TlsfShaderGeneratorHandle): PAnsiChar; stdcall;
  49. Tlsf_Generator_destroy = function(const aHandle: TlsfShaderGeneratorHandle): TlsfErrorCode; stdcall;
  50. Tlsf_init = function : TlsfErrorCode; stdcall;
  51. Tlsf_getLastErrorCode = function : TlsfErrorCode; stdcall;
  52. Tlsf_getLastErrorMsg = function : PAnsiChar; stdcall;
  53. Tlsf_getLastErrorTrace = function : PAnsiChar; stdcall;
  54. Tlsf_finish = function: TlsfErrorCode; stdcall;
  55. var
  56. lsf_ShaderFile_create: Tlsf_ShaderFile_create;
  57. lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback;
  58. lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile;
  59. lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile;
  60. lsf_ShaderFile_getGeneratorNames: Tlsf_ShaderFile_getGeneratorNames;
  61. lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy;
  62. lsf_Generator_create: Tlsf_Generator_create;
  63. lsf_Generator_getPropertyNames: Tlsf_Generator_getPropertyNames;
  64. lsf_Generator_getProperty: Tlsf_Generator_getProperty;
  65. lsf_Generator_setProperty: Tlsf_Generator_setProperty;
  66. lsf_Generator_generateCode: Tlsf_Generator_generateCode;
  67. lsf_Generator_destroy: Tlsf_Generator_destroy;
  68. lsf_getLastErrorCode: Tlsf_getLastErrorCode;
  69. lsf_getLastErrorMsg: Tlsf_getLastErrorMsg;
  70. lsf_getLastErrorTrace: Tlsf_getLastErrorTrace;
  71. procedure lsf_init(const aLibName: String);
  72. procedure lsf_finish;
  73. implementation
  74. uses
  75. dynlibs;
  76. var
  77. libHandle: TLibHandle;
  78. lsf_init_intern: Tlsf_init;
  79. lsf_finish_intern: Tlsf_finish;
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. procedure lsf_init(const aLibName: String);
  82. function LoadProc(const aName: AnsiString): Pointer;
  83. begin
  84. result := GetProcedureAddress(libHandle, aName);
  85. if not Assigned(result) then
  86. raise Exception.CreateFmt('unable to load ''%s'' from ''%s''', [aName, aLibName]);
  87. end;
  88. begin
  89. libHandle := LoadLibrary(aLibName);
  90. if (libHandle = 0) then
  91. raise Exception.CreateFmt('unable to load library: %s', [aLibName]);
  92. lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create'));
  93. lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback( LoadProc('lsf_ShaderFile_setLogCallback'));
  94. lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile'));
  95. lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile'));
  96. lsf_ShaderFile_getGeneratorNames := Tlsf_ShaderFile_getGeneratorNames( LoadProc('lsf_ShaderFile_getGeneratorNames'));
  97. lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy'));
  98. lsf_Generator_create := Tlsf_Generator_create( LoadProc('lsf_Generator_create'));
  99. lsf_Generator_getPropertyNames := Tlsf_Generator_getPropertyNames( LoadProc('lsf_Generator_getPropertyNames'));
  100. lsf_Generator_getProperty := Tlsf_Generator_getProperty( LoadProc('lsf_Generator_getProperty'));
  101. lsf_Generator_setProperty := Tlsf_Generator_setProperty( LoadProc('lsf_Generator_setProperty'));
  102. lsf_Generator_generateCode := Tlsf_Generator_generateCode( LoadProc('lsf_Generator_generateCode'));
  103. lsf_Generator_destroy := Tlsf_Generator_destroy( LoadProc('lsf_Generator_destroy'));
  104. lsf_init_intern := Tlsf_init( LoadProc('lsf_init'));
  105. lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode'));
  106. lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg'));
  107. lsf_getLastErrorTrace := Tlsf_getLastErrorTrace( LoadProc('lsf_getLastErrorTrace'));
  108. lsf_finish_intern := Tlsf_finish( LoadProc('lsf_finish'));
  109. if (lsf_init_intern() <> LSF_ERR_NONE) then
  110. raise Exception.Create('error while initializing library: ' + lsf_getLastErrorMsg());
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. procedure lsf_finish;
  114. begin
  115. lsf_finish_intern();
  116. lsf_ShaderFile_create := nil;
  117. lsf_ShaderFile_setLogCallback := nil;
  118. lsf_ShaderFile_loadFromFile := nil;
  119. lsf_ShaderFile_saveToFile := nil;
  120. lsf_ShaderFile_getGeneratorNames := nil;
  121. lsf_ShaderFile_destroy := nil;
  122. lsf_getLastErrorCode := nil;
  123. lsf_getLastErrorMsg := nil;
  124. lsf_getLastErrorTrace := nil;
  125. if (libHandle <> 0) then begin
  126. FreeLibrary(libHandle);
  127. libHandle := 0;
  128. end;
  129. end;
  130. end.