shader_data.ts 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. function shader_data_create(raw: shader_data_t): shader_data_t {
  2. for (let i: i32 = 0; i < raw.contexts.length; ++i) {
  3. let c: shader_context_t = raw.contexts[i];
  4. shader_context_load(c);
  5. }
  6. return raw;
  7. }
  8. function shader_data_ext(): string {
  9. /// if arm_vulkan
  10. return ".spirv";
  11. /// elseif arm_metal
  12. return ".metal";
  13. /// elseif arm_webgpu
  14. return ".wgsl";
  15. /// else
  16. return ".d3d11";
  17. /// end
  18. }
  19. function shader_data_parse(file: string, name: string): shader_data_t {
  20. let format: scene_t = data_get_scene_raw(file);
  21. let raw: shader_data_t = shader_data_get_raw_by_name(format.shader_datas, name);
  22. if (raw == null) {
  23. iron_log("Shader data '" + name + "' not found!");
  24. return null;
  25. }
  26. return shader_data_create(raw);
  27. }
  28. function shader_data_get_raw_by_name(datas: shader_data_t[], name: string): shader_data_t {
  29. if (name == "") {
  30. return datas[0];
  31. }
  32. for (let i: i32 = 0; i < datas.length; ++i) {
  33. if (datas[i].name == name) {
  34. return datas[i];
  35. }
  36. }
  37. return null;
  38. }
  39. function shader_data_delete(raw: shader_data_t) {
  40. for (let i: i32 = 0; i < raw.contexts.length; ++i) {
  41. let c: shader_context_t = raw.contexts[i];
  42. shader_context_delete(c);
  43. }
  44. }
  45. function shader_data_get_context(raw: shader_data_t, name: string): shader_context_t {
  46. for (let i: i32 = 0; i < raw.contexts.length; ++i) {
  47. let c: shader_context_t = raw.contexts[i];
  48. if (c.name == name) {
  49. return c;
  50. }
  51. }
  52. return null;
  53. }
  54. function shader_context_load(raw: shader_context_t) {
  55. if (raw._ == null) {
  56. raw._ = {};
  57. }
  58. shader_context_parse_vertex_struct(raw);
  59. shader_context_compile(raw);
  60. }
  61. function shader_context_compile(raw: shader_context_t) {
  62. if (raw._.pipe != null) {
  63. gpu_delete_pipeline(raw._.pipe);
  64. }
  65. raw._.pipe = gpu_create_pipeline();
  66. raw._.constants = [];
  67. raw._.tex_units = [];
  68. raw._.pipe.input_layout = raw._.structure;
  69. raw._.pipe.depth_write = raw.depth_write;
  70. raw._.pipe.depth_mode = shader_context_get_compare_mode(raw.compare_mode);
  71. raw._.pipe.cull_mode = shader_context_get_cull_mode(raw.cull_mode);
  72. if (raw.blend_source != null) {
  73. raw._.pipe.blend_source = shader_context_get_blend_fac(raw.blend_source);
  74. }
  75. if (raw.blend_destination != null) {
  76. raw._.pipe.blend_destination = shader_context_get_blend_fac(raw.blend_destination);
  77. }
  78. if (raw.alpha_blend_source != null) {
  79. raw._.pipe.alpha_blend_source = shader_context_get_blend_fac(raw.alpha_blend_source);
  80. }
  81. if (raw.alpha_blend_destination != null) {
  82. raw._.pipe.alpha_blend_destination = shader_context_get_blend_fac(raw.alpha_blend_destination);
  83. }
  84. if (raw.color_writes_red != null) {
  85. for (let i: i32 = 0; i < raw.color_writes_red.length; ++i) {
  86. ARRAY_ACCESS(raw._.pipe.color_write_mask_red, i) = raw.color_writes_red[i];
  87. }
  88. }
  89. if (raw.color_writes_green != null) {
  90. for (let i: i32 = 0; i < raw.color_writes_green.length; ++i) {
  91. ARRAY_ACCESS(raw._.pipe.color_write_mask_green, i) = raw.color_writes_green[i];
  92. }
  93. }
  94. if (raw.color_writes_blue != null) {
  95. for (let i: i32 = 0; i < raw.color_writes_blue.length; ++i) {
  96. ARRAY_ACCESS(raw._.pipe.color_write_mask_blue, i) = raw.color_writes_blue[i];
  97. }
  98. }
  99. if (raw.color_writes_alpha != null) {
  100. for (let i: i32 = 0; i < raw.color_writes_alpha.length; ++i) {
  101. ARRAY_ACCESS(raw._.pipe.color_write_mask_alpha, i) = raw.color_writes_alpha[i];
  102. }
  103. }
  104. if (raw.color_attachments != null) {
  105. raw._.pipe.color_attachment_count = raw.color_attachments.length;
  106. for (let i: i32 = 0; i < raw.color_attachments.length; ++i) {
  107. ARRAY_ACCESS(raw._.pipe.color_attachment, i) = shader_context_get_tex_format(raw.color_attachments[i]);
  108. }
  109. }
  110. if (raw.depth_attachment != null) {
  111. raw._.pipe.depth_attachment_bits = raw.depth_attachment == "NONE" ? 0 : 32;
  112. }
  113. if (raw.shader_from_source) {
  114. raw._.pipe.vertex_shader = gpu_create_shader_from_source(raw.vertex_shader, raw._.vertex_shader_size, gpu_shader_type_t.VERTEX);
  115. raw._.pipe.fragment_shader = gpu_create_shader_from_source(raw.fragment_shader, raw._.fragment_shader_size, gpu_shader_type_t.FRAGMENT);
  116. if (raw._.pipe.vertex_shader == null || raw._.pipe.fragment_shader == null) {
  117. return;
  118. }
  119. }
  120. else {
  121. /// if arm_embed
  122. raw._.pipe.fragment_shader = sys_get_shader(raw.fragment_shader);
  123. raw._.pipe.vertex_shader = sys_get_shader(raw.vertex_shader);
  124. /// else // Load shaders manually
  125. let vs_buffer: buffer_t = data_get_blob(raw.vertex_shader + shader_data_ext());
  126. raw._.pipe.vertex_shader = gpu_create_shader(vs_buffer, gpu_shader_type_t.VERTEX);
  127. let fs_buffer: buffer_t = data_get_blob(raw.fragment_shader + shader_data_ext());
  128. raw._.pipe.fragment_shader = gpu_create_shader(fs_buffer, gpu_shader_type_t.FRAGMENT);
  129. /// end
  130. }
  131. shader_context_finish_compile(raw);
  132. }
  133. /// if arm_direct3d12
  134. function shader_context_type_size(t: string): i32 {
  135. if (t == "int")
  136. return 4;
  137. if (t == "float")
  138. return 4;
  139. if (t == "vec2")
  140. return 8;
  141. if (t == "vec3")
  142. return 12;
  143. if (t == "vec4")
  144. return 16;
  145. if (t == "mat3")
  146. return 48;
  147. if (t == "mat4")
  148. return 64;
  149. if (t == "float2")
  150. return 8;
  151. if (t == "float3")
  152. return 12;
  153. if (t == "float4")
  154. return 16;
  155. if (t == "float3x3")
  156. return 48;
  157. if (t == "float4x4")
  158. return 64;
  159. return 0;
  160. }
  161. function shader_context_type_pad(offset: i32, size: i32): i32 {
  162. let r: i32 = offset % 16;
  163. if (r == 0) {
  164. return 0;
  165. }
  166. if (size >= 16 || r + size > 16) {
  167. return 16 - r;
  168. }
  169. return 0;
  170. }
  171. /// else
  172. function shader_context_type_size(t: string): i32 {
  173. if (t == "int")
  174. return 4;
  175. if (t == "float")
  176. return 4;
  177. if (t == "vec2")
  178. return 8;
  179. if (t == "vec3")
  180. return 16;
  181. if (t == "vec4")
  182. return 16;
  183. if (t == "mat3")
  184. return 48;
  185. if (t == "mat4")
  186. return 64;
  187. if (t == "float2")
  188. return 8;
  189. if (t == "float3")
  190. return 16;
  191. if (t == "float4")
  192. return 16;
  193. if (t == "float3x3")
  194. return 48;
  195. if (t == "float4x4")
  196. return 64;
  197. return 0;
  198. }
  199. function shader_context_type_pad(offset: i32, size: i32): i32 {
  200. if (size > 16) {
  201. size = 16;
  202. }
  203. return (size - (offset % size)) % size;
  204. }
  205. /// end
  206. function shader_context_finish_compile(raw: shader_context_t) {
  207. gpu_pipeline_compile(raw._.pipe);
  208. if (raw.constants != null) {
  209. let offset: i32 = 0;
  210. for (let i: i32 = 0; i < raw.constants.length; ++i) {
  211. let c: shader_const_t = raw.constants[i];
  212. let size: i32 = shader_context_type_size(c.type);
  213. offset += shader_context_type_pad(offset, size);
  214. shader_context_add_const(raw, offset);
  215. offset += size;
  216. }
  217. }
  218. if (raw.texture_units != null) {
  219. for (let i: i32 = 0; i < raw.texture_units.length; ++i) {
  220. shader_context_add_tex(raw, i);
  221. }
  222. }
  223. }
  224. function shader_context_parse_data(data: string): gpu_vertex_data_t {
  225. if (data == "float1") {
  226. return gpu_vertex_data_t.F32_1X;
  227. }
  228. else if (data == "float2") {
  229. return gpu_vertex_data_t.F32_2X;
  230. }
  231. else if (data == "float3") {
  232. return gpu_vertex_data_t.F32_3X;
  233. }
  234. else if (data == "float4") {
  235. return gpu_vertex_data_t.F32_4X;
  236. }
  237. else if (data == "short2norm") {
  238. return gpu_vertex_data_t.I16_2X_NORM;
  239. }
  240. else if (data == "short4norm") {
  241. return gpu_vertex_data_t.I16_4X_NORM;
  242. }
  243. return gpu_vertex_data_t.F32_1X;
  244. }
  245. function shader_context_parse_vertex_struct(raw: shader_context_t) {
  246. let structure: gpu_vertex_structure_t = {};
  247. raw._.structure = structure;
  248. for (let i: i32 = 0; i < raw.vertex_elements.length; ++i) {
  249. let elem: vertex_element_t = raw.vertex_elements[i];
  250. gpu_vertex_struct_add(raw._.structure, elem.name, shader_context_parse_data(elem.data));
  251. }
  252. }
  253. function shader_context_delete(raw: shader_context_t) {
  254. if (raw._.pipe.fragment_shader != null) {
  255. gpu_shader_destroy(raw._.pipe.fragment_shader);
  256. }
  257. if (raw._.pipe.vertex_shader != null) {
  258. gpu_shader_destroy(raw._.pipe.vertex_shader);
  259. }
  260. gpu_delete_pipeline(raw._.pipe);
  261. }
  262. function shader_context_get_compare_mode(s: string): gpu_compare_mode_t {
  263. if (s == "always") {
  264. return gpu_compare_mode_t.ALWAYS;
  265. }
  266. if (s == "never") {
  267. return gpu_compare_mode_t.NEVER;
  268. }
  269. if (s == "equal") {
  270. return gpu_compare_mode_t.EQUAL;
  271. }
  272. return gpu_compare_mode_t.LESS;
  273. }
  274. function shader_context_get_cull_mode(s: string): gpu_cull_mode_t {
  275. if (s == "none") {
  276. return gpu_cull_mode_t.NONE;
  277. }
  278. if (s == "clockwise") {
  279. return gpu_cull_mode_t.CLOCKWISE;
  280. }
  281. return gpu_cull_mode_t.COUNTER_CLOCKWISE;
  282. }
  283. function shader_context_get_blend_fac(s: string): gpu_blend_t {
  284. if (s == "blend_one") {
  285. return gpu_blend_t.ONE;
  286. }
  287. if (s == "blend_zero") {
  288. return gpu_blend_t.ZERO;
  289. }
  290. if (s == "source_alpha") {
  291. return gpu_blend_t.SOURCE_ALPHA;
  292. }
  293. if (s == "destination_alpha") {
  294. return gpu_blend_t.DEST_ALPHA;
  295. }
  296. if (s == "inverse_source_alpha") {
  297. return gpu_blend_t.INV_SOURCE_ALPHA;
  298. }
  299. if (s == "inverse_destination_alpha") {
  300. return gpu_blend_t.INV_DEST_ALPHA;
  301. }
  302. return gpu_blend_t.ONE;
  303. }
  304. function shader_context_get_tex_format(s: string): gpu_texture_format_t {
  305. if (s == "RGBA32") {
  306. return gpu_texture_format_t.RGBA32;
  307. }
  308. if (s == "RGBA64") {
  309. return gpu_texture_format_t.RGBA64;
  310. }
  311. if (s == "RGBA128") {
  312. return gpu_texture_format_t.RGBA128;
  313. }
  314. if (s == "R32") {
  315. return gpu_texture_format_t.R32;
  316. }
  317. if (s == "R16") {
  318. return gpu_texture_format_t.R16;
  319. }
  320. if (s == "R8") {
  321. return gpu_texture_format_t.R8;
  322. }
  323. return gpu_texture_format_t.RGBA32;
  324. }
  325. function shader_context_add_const(raw: shader_context_t, offset: i32) {
  326. array_push(raw._.constants, offset);
  327. }
  328. function shader_context_add_tex(raw: shader_context_t, i: i32) {
  329. array_push(raw._.tex_units, i);
  330. }