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.

263 lines
12 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. #if __MINGW32__
  36. # define WINAPI __stdcall
  37. #else
  38. # define WINAPI
  39. #endif
  40. typedef uint32_t lsf_error_code_t;
  41. typedef uint32_t lsf_log_level_t;
  42. typedef void* lsf_shader_file_handle_t;
  43. typedef void* lsf_shader_generator_handle_t;
  44. typedef void (*lsf_shader_file_log_callback_t)(const lsf_log_level_t loglevel, const char* msg, const void* userargs);
  45. /** create a new shader file handle
  46. * @returns shader file handle or NULL (check lsf_get_last_error_* for more details) */
  47. lsf_shader_file_handle_t (WINAPI *lsf_shader_file_create) ();
  48. /** set the callback for log messages of a specific shader file handle
  49. * @param handle shader file handle to set callback for
  50. * @param callback pointer to callback function
  51. * @param userargs user defined arguments
  52. * @returns error code (see LSF_ERR_*) */
  53. 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);
  54. /** load shader file code from a given file
  55. * @param handle handle of shader file to load from file
  56. * @param filename file to load shader code from
  57. * @returns error code (see LSF_ERR_*) */
  58. lsf_error_code_t (WINAPI *lsf_shader_file_load_from_file) (const lsf_shader_file_handle_t handle, const char* filename);
  59. /** save shader file code to a given file
  60. * @param handle handle of shader file to save to file
  61. * @param filename file to save shader code to
  62. * @returns error code (see LSF_ERR_*) */
  63. lsf_error_code_t (WINAPI *lsf_shader_file_save_to_file) (const lsf_shader_file_handle_t handle, const char* filename);
  64. /** generate a list of all code generators in a shader file
  65. * @param handle shader file handle to generate list for
  66. * @returns list of code generators (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */
  67. const char* (WINAPI *lsf_shader_file_get_generator_names) (const lsf_shader_file_handle_t handle);
  68. /** destroy a shader file handle
  69. * @param handle shader file handle to destroy
  70. * @returns error code (see LSF_ERR_*) */
  71. lsf_error_code_t (WINAPI *lsf_shader_file_destroy) (const lsf_shader_file_handle_t handle);
  72. /** create a new code generator from a given shader file. the generator is owned by the shader file handle.
  73. * if you destroy a shader file handle, all associated generator handles will be destroyed to.
  74. * @param handle shader file handle to create generator from
  75. * @param name name of the generator (see lsf_shader_file_get_generator_names to get a list of all valid names)
  76. * @return generator handle of NULL (check lsf_get_last_error_* for more details) */
  77. lsf_shader_generator_handle_t (WINAPI *lsf_generator_create) (const lsf_shader_file_handle_t handle, const char* name);
  78. /** generate a list of all known properties within a given generator handle
  79. * @handle generator handle to get properties from
  80. * @return list of all known properties (seperated by linebreak) or NULL (check lsf_get_last_error_* for more details) */
  81. const char* (WINAPI *lsf_generator_get_property_names) (const lsf_shader_generator_handle_t handle);
  82. /** get a property value by its index
  83. * @param handle generator handle
  84. * @param index index of the property (see lsf_generator_get_property_names to calculate property index)
  85. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  86. const char* (WINAPI *lsf_generator_get_property) (const lsf_shader_generator_handle_t handle, const int index);
  87. /** get a property value by its name
  88. * @param handle generator handle
  89. * @param name name of the property
  90. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  91. const char* (WINAPI *lsf_generator_get_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name);
  92. /** set a property value by its index
  93. * @param handle generator handle
  94. * @param index index of the property (see lsf_generator_get_property_names to calculate property index)
  95. * @param value new value of the property
  96. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  97. lsf_error_code_t (WINAPI *lsf_generator_set_property) (const lsf_shader_generator_handle_t handle, const int index, const char* value);
  98. /** set a property value by its name
  99. * @param handle generator handle
  100. * @param name name of the property
  101. * @param value new value of the property
  102. * @return property value or NULL (check lsf_get_last_error_* for more details) */
  103. lsf_error_code_t (WINAPI *lsf_generator_set_property_by_name) (const lsf_shader_generator_handle_t handle, const char* name, const char* value);
  104. /** generate shader code
  105. * @param handle generator handle
  106. * @return generated shader code or NULL (check lsf_get_last_error_* for more details) */
  107. const char* (WINAPI *lsf_generator_generate_code) (const lsf_shader_generator_handle_t handle);
  108. /** destroy a generator handle
  109. * @param handle generator handle to destroy
  110. * @returns error code (see LSF_ERR_*) */
  111. lsf_error_code_t (WINAPI *lsf_generator_destroy) (const lsf_shader_generator_handle_t handle);
  112. /** get last error code
  113. * @return error code of last failed operation */
  114. lsf_error_code_t (WINAPI *lsf_get_last_error_code) ();
  115. /** get last error message
  116. * @return error message of last failed operation */
  117. const char* (WINAPI *lsf_get_last_error_msg) ();
  118. /** get last error trace
  119. * @return error message and a trace of last failed operation */
  120. const char* (WINAPI *lsf_get_last_error_trace) ();
  121. /** initialize the library
  122. * @param libname name of the shared library to load data from
  123. * @return 0 on success, LSF_ERR_* otherwise */
  124. int lsf_init(const char* libname);
  125. /** finalize the library
  126. * @return 0 on success, LSF_ERR_* otherwise */
  127. int lsf_finish(void);
  128. /**********************************************************************************************************************************/
  129. /* internal initialization code */
  130. /**********************************************************************************************************************************/
  131. //#define LSF_DEBUG
  132. #ifdef LSF_DEBUG
  133. # include <stdio.h>
  134. #endif
  135. #if WIN32 || WIN64 || _WIN32 || _WIN64
  136. # include <windows.h>
  137. typedef HMODULE lib_handle_t;
  138. lib_handle_t open_lib(const char* name)
  139. { return LoadLibrary(name); };
  140. void* get_addr(lib_handle_t handle, const char* name)
  141. { return GetProcAddress(handle, name); };
  142. int close_lib(lib_handle_t handle)
  143. { return FreeLibrary(handle); };
  144. #elif LINUX || __linux__
  145. # include <dlfcn.h>
  146. typedef void* lib_handle_t;
  147. lib_handle_t open_lib(const char* name)
  148. { return dlopen(name, RTLD_LAZY); };
  149. void* get_addr(lib_handle_t handle, const char* name)
  150. { return dlsym(handle, name); };
  151. int close_lib(lib_handle_t handle)
  152. { return !dlclose(handle); };
  153. #else
  154. # error "unknown operation system"
  155. #endif
  156. #ifndef LSF_DEBUG
  157. # define LoadProc(proc, name) \
  158. proc = get_addr(handle, name); \
  159. if (!proc) \
  160. return LSF_ERR_INVALID_METHOD_NAME
  161. #else
  162. # define LoadProc(proc, name) \
  163. proc = get_addr(handle, name); \
  164. printf("load method '%s' (addr=0x%016x)\n", name, proc); \
  165. if (!proc) \
  166. return LSF_ERR_INVALID_METHOD_NAME
  167. #endif
  168. lsf_error_code_t (WINAPI *lsf_init_intern)();
  169. lsf_error_code_t (WINAPI *lsf_finish_intern)();
  170. lib_handle_t handle = NULL;
  171. int lsf_init(const char* libname)
  172. {
  173. #ifdef LSF_DEBUG
  174. printf("loading library '%s'\n", libname);
  175. #endif
  176. handle = open_lib(libname);
  177. if (!handle)
  178. return LSF_ERR_INVALID_LIBRARY_NAME;
  179. #ifdef LSF_DEBUG
  180. printf(" done (handle=0x%016x)\n", handle);
  181. #endif
  182. LoadProc(lsf_shader_file_create, "lsf_ShaderFile_create");
  183. LoadProc(lsf_shader_file_set_log_callback, "lsf_ShaderFile_setLogCallback");
  184. LoadProc(lsf_shader_file_load_from_file, "lsf_ShaderFile_loadFromFile");
  185. LoadProc(lsf_shader_file_save_to_file, "lsf_ShaderFile_saveToFile");
  186. LoadProc(lsf_shader_file_get_generator_names, "lsf_ShaderFile_getGeneratorNames");
  187. LoadProc(lsf_shader_file_destroy, "lsf_ShaderFile_destroy");
  188. LoadProc(lsf_generator_create, "lsf_Generator_create");
  189. LoadProc(lsf_generator_get_property_names, "lsf_Generator_getPropertyNames");
  190. LoadProc(lsf_generator_get_property, "lsf_Generator_getProperty");
  191. LoadProc(lsf_generator_get_property_by_name, "lsf_Generator_getPropertyByName");
  192. LoadProc(lsf_generator_set_property, "lsf_Generator_setProperty");
  193. LoadProc(lsf_generator_set_property_by_name, "lsf_Generator_setPropertyByName");
  194. LoadProc(lsf_generator_generate_code, "lsf_Generator_generateCode");
  195. LoadProc(lsf_generator_destroy, "lsf_Generator_destroy");
  196. LoadProc(lsf_init_intern, "lsf_init");
  197. LoadProc(lsf_get_last_error_code, "lsf_getLastErrorCode");
  198. LoadProc(lsf_get_last_error_msg, "lsf_getLastErrorMsg");
  199. LoadProc(lsf_get_last_error_trace, "lsf_getLastErrorTrace");
  200. LoadProc(lsf_finish_intern, "lsf_finish");
  201. return lsf_init_intern();
  202. }
  203. int lsf_finish(void)
  204. {
  205. lsf_error_code_t err = lsf_finish_intern();
  206. if (!close_lib(handle))
  207. return LSF_ERR_INVALID_LIBRARY_HANDLE;
  208. return err;
  209. }
  210. #endif /* LIB_SHADER_FILE_H */