Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

247 lignes
11 KiB

  1. #ifndef LIB_SHADER_FILE_H
  2. #define LIB_SHADER_FILE_H
  3. #include <stdint.h>
  4. /**********************************************************************************************************************************/
  5. /* public interface */
  6. /**********************************************************************************************************************************/
  7. #define LSF_LOGLEVEL_DEBUG 0
  8. #define LSF_LOGLEVEL_INFO 1
  9. #define LSF_LOGLEVEL_WARNING 2
  10. #define LSF_LOGLEVEL_ERROR 3
  11. #define LSF_ERR_NONE 0x00000000
  12. #define LSF_ERR_NOT_INIT 0x00000001
  13. #define LSF_ERR_INVALID_HANDLE_SHADER_FILE 0x00000010
  14. #define LSF_ERR_INVALID_HANDLE_SHADER_GENERATOR 0x00000011
  15. #define LSF_ERR_INVALID_GENERATOR_NAME 0x00000020
  16. #define LSF_ERR_INVALID_PROPERTY_INDEX 0x00000021
  17. #define LSF_ERR_INVALID_PROPERTY_NAME 0x00000022
  18. #define LSF_ERR_GENERATOR_NOT_ASSIGNED_TO_FILE 0x00000023
  19. #define LSF_ERR_UNKNOWN_IDENTFIFIER 0x00001000
  20. #define LSF_ERR_DUPLICATE_IDENTIFIER 0x00001001
  21. #define LSF_ERR_OUT_OF_RANGE 0x00001002
  22. #define LSF_ERR_INVALID_IDENTIFIER 0x00001003
  23. #define LSF_ERR_INVALID_PARAMTER_COUNT 0x00001004
  24. #define LSF_ERR_INVALID_PARAMTER 0x00001005
  25. #define LSF_ERR_UNEXPECTED_TOKEN 0x00001006
  26. #define LSF_ERR_INVALID_TOKEN 0x00001007
  27. #define LSF_ERR_EXPRESSION_INTERNAL 0x00001008
  28. #define LSF_ERR_EXPRESSION 0x00001009
  29. #define LSF_ERR_SHADER_PART_INTERNAL 0x0000100A
  30. #define LSF_ERR_SHADER_PART 0x0000100B
  31. #define LSF_ERR_INVALID_LIBRARY_NAME 0x00002000
  32. #define LSF_ERR_INVALID_LIBRARY_HANDLE 0x00002001
  33. #define LSF_ERR_INVALID_METHOD_NAME 0x00002002
  34. #define LSF_ERR_UNKNOWN 0xFFFFFFFF
  35. #define WINAPI __stdcall
  36. typedef uint32_t lsf_error_code_t;
  37. typedef uint32_t lsf_log_level_t;
  38. typedef void* lsf_shader_file_handle_t;
  39. typedef void* lsf_shader_generator_handle_t;
  40. typedef void (*lsf_shader_file_log_callback_t)(const lsf_log_level_t loglevel, const char* msg, const void* userargs);
  41. /** create a new shader file handle
  42. * @returns shader file handle or NULL (check lsf_get_last_error_* for more details) */
  43. lsf_shader_file_handle_t (WINAPI *lsf_shader_file_create) ();
  44. /** set the callback for log messages of a specific shader file handle
  45. * @param handle shader file handle to set callback for
  46. * @param callback pointer to callback function
  47. * @param userargs user defined arguments
  48. * @returns error code (see LSF_ERR_*) */
  49. lsf_error_code_t (WINAPI *lsf_shader_file_set_log_callback) (const lsf_shader_file_handle_t handle, const lsf_shader_file_log_callback_t callback, const void* userargs);
  50. /** load shader file code from a given file
  51. * @param handle handle of shader file to load from file
  52. * @param filename file to load shader code from
  53. * @returns error code (see LSF_ERR_*) */
  54. lsf_error_code_t (WINAPI *lsf_shader_file_load_from_file) (const lsf_shader_file_handle_t handle, const char* filename);
  55. /** save shader file code to a given file
  56. * @param handle handle of shader file to save to file
  57. * @param filename file to save shader code to
  58. * @returns error code (see LSF_ERR_*) */
  59. lsf_error_code_t (WINAPI *lsf_shader_file_save_to_file) (const lsf_shader_file_handle_t handle, const char* filename);
  60. /** generate a list of all code generators in a shader file
  61. * @param handle shader file handle to generate list for
  62. * @returns list of code generators (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */
  63. const char* (WINAPI *lsf_shader_file_get_generator_names) (const lsf_shader_file_handle_t handle);
  64. /** destroy a shader file handle
  65. * @param handle shader file handle to destroy
  66. * @returns error code (see LSF_ERR_*) */
  67. lsf_error_code_t (WINAPI *lsf_shader_file_destroy) (const lsf_shader_file_handle_t handle);
  68. /** create a new code generator from a given shader file. the generator is owned by the shader file handle.
  69. * if you destroy a shader file handle, all associated generator handles will be destroyed to.
  70. * @param handle shader file handle to create generator from
  71. * @param name name of the generator (see lsf_shader_file_get_generator_names to get a list of all valid names)
  72. * @return generator handle of NULL (check lsf_get_last_error_* for more details) */
  73. lsf_shader_generator_handle_t (WINAPI *lsf_generator_create) (const lsf_shader_file_handle_t handle, const char* name);
  74. /** generate a list of all known properties within a given generator handle
  75. * @handle generator handle to get properties from
  76. * @return list of all known properties (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */
  77. const char* (WINAPI *lsf_generator_get_property_names) (const lsf_shader_generator_handle_t handle);
  78. /** get a property value by its index
  79. * @param handle generator handle
  80. * @param index index of the property (see lsf_generator_get_property_names to calculate property index)
  81. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  82. const char* (WINAPI *lsf_generator_get_property) (const lsf_shader_generator_handle_t handle, const int index);
  83. /** get a property value by its name
  84. * @param handle generator handle
  85. * @param name name of the property
  86. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  87. const char* (WINAPI *lsf_generator_get_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name);
  88. /** set a property value by its index
  89. * @param handle generator handle
  90. * @param index index of the property (see lsf_generator_get_property_names to calculate property index)
  91. * @param value new value of the property
  92. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  93. lsf_error_code_t (WINAPI *lsf_generator_set_property) (const lsf_shader_generator_handle_t handle, const int index, const char* value);
  94. /** set a property value by its name
  95. * @param handle generator handle
  96. * @param name name of the property
  97. * @param value new value of the property
  98. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  99. lsf_error_code_t (WINAPI *lsf_generator_set_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name, const char* value);
  100. /** generate shader code
  101. * @param handle generator handle
  102. * @return generated shader code or NULL (check lsf_get_last_error_* for more details) */
  103. const char* (WINAPI *lsf_generator_generate_code) (const lsf_shader_generator_handle_t handle);
  104. /** destroy a generator handle
  105. * @param handle generator handle to destroy
  106. * @returns error code (see LSF_ERR_*) */
  107. lsf_error_code_t (WINAPI *lsf_generator_destroy) (const lsf_shader_generator_handle_t handle);
  108. /** get last error code
  109. * @return error code of last failed operation */
  110. lsf_error_code_t (WINAPI *lsf_get_last_error_code) ();
  111. /** get last error message
  112. * @return error message of last failed operation */
  113. const char* (WINAPI *lsf_get_last_error_msg) ();
  114. /** get last error trace
  115. * @return error message and a trace of last failed operation */
  116. const char* (WINAPI *lsf_get_last_error_trace) ();
  117. /** initialize the library
  118. * @param libname name of the shared library to load data from
  119. * @return 0 on success, LSF_ERR_* otherwise */
  120. int lsf_init(const char* libname);
  121. /** finalize the library
  122. * @return 0 on success, LSF_ERR_* otherwise */
  123. int lsf_finish(void);
  124. /**********************************************************************************************************************************/
  125. /* internal initialization code */
  126. /**********************************************************************************************************************************/
  127. //#define LSF_DEBUG
  128. #ifdef LSF_DEBUG
  129. # include <stdio.h>
  130. #endif
  131. #if defined(WIN32) || defined(WIN64)
  132. # include <windows.h>
  133. typedef HMODULE lib_handle_t;
  134. lib_handle_t open_lib(const char* name)
  135. { return LoadLibrary(name); };
  136. void* get_addr(lib_handle_t handle, const char* name)
  137. { return GetProcAddress(handle, name); };
  138. int close_lib(lib_handle_t handle)
  139. { return FreeLibrary(handle); };
  140. #elif defined(LINUX)
  141. # include <dlfcn.h>
  142. # error "linux is not supported yet"
  143. #else
  144. # error "unknown operation system"
  145. #endif
  146. #ifndef LSF_DEBUG
  147. # define LoadProc(proc, name) \
  148. proc = get_addr(handle, name); \
  149. if (!proc) \
  150. return LSF_ERR_INVALID_METHOD_NAME
  151. #else
  152. # define LoadProc(proc, name) \
  153. proc = get_addr(handle, name); \
  154. printf("load method '%s' (addr=0x%016x)\n", name, proc); \
  155. if (!proc) \
  156. return LSF_ERR_INVALID_METHOD_NAME
  157. #endif
  158. lsf_error_code_t (WINAPI *lsf_init_intern)();
  159. lsf_error_code_t (WINAPI *lsf_finish_intern)();
  160. lib_handle_t handle = NULL;
  161. int lsf_init(const char* libname)
  162. {
  163. #ifdef LSF_DEBUG
  164. printf("loading library '%s'\n", libname);
  165. #endif
  166. handle = open_lib(libname);
  167. if (!handle)
  168. return LSF_ERR_INVALID_LIBRARY_NAME;
  169. #ifdef LSF_DEBUG
  170. printf(" done (handle=0x%016x)\n", handle);
  171. #endif
  172. LoadProc(lsf_shader_file_create, "lsf_ShaderFile_create");
  173. LoadProc(lsf_shader_file_set_log_callback, "lsf_ShaderFile_setLogCallback");
  174. LoadProc(lsf_shader_file_load_from_file, "lsf_ShaderFile_loadFromFile");
  175. LoadProc(lsf_shader_file_save_to_file, "lsf_ShaderFile_saveToFile");
  176. LoadProc(lsf_shader_file_get_generator_names, "lsf_ShaderFile_getGeneratorNames");
  177. LoadProc(lsf_shader_file_destroy, "lsf_ShaderFile_destroy");
  178. LoadProc(lsf_generator_create, "lsf_Generator_create");
  179. LoadProc(lsf_generator_get_property_names, "lsf_Generator_getPropertyNames");
  180. LoadProc(lsf_generator_get_property, "lsf_Generator_getProperty");
  181. LoadProc(lsf_generator_get_property_by_name, "lsf_Generator_getPropertyByName");
  182. LoadProc(lsf_generator_set_property, "lsf_Generator_setProperty");
  183. LoadProc(lsf_generator_set_property_by_name, "lsf_Generator_setPropertyByName");
  184. LoadProc(lsf_generator_generate_code, "lsf_Generator_generateCode");
  185. LoadProc(lsf_generator_destroy, "lsf_Generator_destroy");
  186. LoadProc(lsf_init_intern, "lsf_init");
  187. LoadProc(lsf_get_last_error_code, "lsf_getLastErrorCode");
  188. LoadProc(lsf_get_last_error_msg, "lsf_getLastErrorMsg");
  189. LoadProc(lsf_get_last_error_trace, "lsf_getLastErrorTrace");
  190. LoadProc(lsf_finish_intern, "lsf_finish");
  191. return lsf_init_intern();
  192. }
  193. int lsf_finish(void)
  194. {
  195. lsf_error_code_t err = lsf_finish_intern();
  196. if (!close_lib(handle))
  197. return LSF_ERR_INVALID_LIBRARY_HANDLE;
  198. return err;
  199. }
  200. #endif /* LIB_SHADER_FILE_H */