2
0

shader_gles2.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107
  1. /*************************************************************************/
  2. /* shader_gles2.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md) */
  10. /* */
  11. /* Permission is hereby granted, free of charge, to any person obtaining */
  12. /* a copy of this software and associated documentation files (the */
  13. /* "Software"), to deal in the Software without restriction, including */
  14. /* without limitation the rights to use, copy, modify, merge, publish, */
  15. /* distribute, sublicense, and/or sell copies of the Software, and to */
  16. /* permit persons to whom the Software is furnished to do so, subject to */
  17. /* the following conditions: */
  18. /* */
  19. /* The above copyright notice and this permission notice shall be */
  20. /* included in all copies or substantial portions of the Software. */
  21. /* */
  22. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  23. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  24. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  25. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  26. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  27. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  28. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  29. /*************************************************************************/
  30. #include "shader_gles2.h"
  31. #include "core/os/memory.h"
  32. #include "core/print_string.h"
  33. #include "core/string_builder.h"
  34. #include "rasterizer_gles2.h"
  35. #include "rasterizer_storage_gles2.h"
  36. // #define DEBUG_OPENGL
  37. // #include "shaders/copy.glsl.gen.h"
  38. #ifdef DEBUG_OPENGL
  39. #define DEBUG_TEST_ERROR(m_section) \
  40. { \
  41. uint32_t err = glGetError(); \
  42. if (err) { \
  43. print_line("OpenGL Error #" + itos(err) + " at: " + m_section); \
  44. } \
  45. }
  46. #else
  47. #define DEBUG_TEST_ERROR(m_section)
  48. #endif
  49. ShaderGLES2 *ShaderGLES2::active = NULL;
  50. //#define DEBUG_SHADER
  51. #ifdef DEBUG_SHADER
  52. #define DEBUG_PRINT(m_text) print_line(m_text);
  53. #else
  54. #define DEBUG_PRINT(m_text)
  55. #endif
  56. GLint ShaderGLES2::get_uniform_location(int p_index) const {
  57. ERR_FAIL_COND_V(!version, -1);
  58. return version->uniform_location[p_index];
  59. }
  60. bool ShaderGLES2::bind() {
  61. if (active != this || !version || new_conditional_version.key != conditional_version.key) {
  62. conditional_version = new_conditional_version;
  63. version = get_current_version();
  64. } else {
  65. return false;
  66. }
  67. ERR_FAIL_COND_V(!version, false);
  68. if (!version->ok) { //broken, unable to bind (do not throw error, you saw it before already when it failed compilation).
  69. glUseProgram(0);
  70. return false;
  71. }
  72. glUseProgram(version->id);
  73. DEBUG_TEST_ERROR("use program");
  74. active = this;
  75. uniforms_dirty = true;
  76. return true;
  77. }
  78. void ShaderGLES2::unbind() {
  79. version = NULL;
  80. glUseProgram(0);
  81. uniforms_dirty = true;
  82. active = NULL;
  83. }
  84. static void _display_error_with_code(const String &p_error, const Vector<const char *> &p_code) {
  85. int line = 1;
  86. String total_code;
  87. for (int i = 0; i < p_code.size(); i++) {
  88. total_code += String(p_code[i]);
  89. }
  90. Vector<String> lines = String(total_code).split("\n");
  91. for (int j = 0; j < lines.size(); j++) {
  92. print_line(itos(line) + ": " + lines[j]);
  93. line++;
  94. }
  95. ERR_PRINTS(p_error);
  96. }
  97. static String _mkid(const String &p_id) {
  98. String id = "m_" + p_id;
  99. return id.replace("__", "_dus_"); //doubleunderscore is reserved in glsl
  100. }
  101. ShaderGLES2::Version *ShaderGLES2::get_current_version() {
  102. Version *_v = version_map.getptr(conditional_version);
  103. if (_v) {
  104. if (conditional_version.code_version != 0) {
  105. CustomCode *cc = custom_code_map.getptr(conditional_version.code_version);
  106. ERR_FAIL_COND_V(!cc, _v);
  107. if (cc->version == _v->code_version)
  108. return _v;
  109. } else {
  110. return _v;
  111. }
  112. }
  113. if (!_v)
  114. version_map[conditional_version] = Version();
  115. Version &v = version_map[conditional_version];
  116. if (!_v) {
  117. v.uniform_location = memnew_arr(GLint, uniform_count);
  118. } else {
  119. if (v.ok) {
  120. glDeleteShader(v.vert_id);
  121. glDeleteShader(v.frag_id);
  122. glDeleteProgram(v.id);
  123. v.id = 0;
  124. }
  125. }
  126. v.ok = false;
  127. Vector<const char *> strings;
  128. #ifdef GLES_OVER_GL
  129. strings.push_back("#version 120\n");
  130. strings.push_back("#define USE_GLES_OVER_GL\n");
  131. #else
  132. strings.push_back("#version 100\n");
  133. //angle does not like
  134. #ifdef JAVASCRIPT_ENABLED
  135. strings.push_back("#define USE_HIGHP_PRECISION\n");
  136. #endif
  137. #endif
  138. int define_line_ofs = 1;
  139. for (int j = 0; j < conditional_count; j++) {
  140. bool enable = (conditional_version.version & (1 << j)) > 0;
  141. if (enable) {
  142. strings.push_back(conditional_defines[j]);
  143. define_line_ofs++;
  144. DEBUG_PRINT(conditional_defines[j]);
  145. }
  146. }
  147. // keep them around during the function
  148. CharString code_string;
  149. CharString code_string2;
  150. CharString code_globals;
  151. CustomCode *cc = NULL;
  152. if (conditional_version.code_version > 0) {
  153. cc = custom_code_map.getptr(conditional_version.code_version);
  154. ERR_FAIL_COND_V(!cc, NULL);
  155. v.code_version = cc->version;
  156. define_line_ofs += 2;
  157. }
  158. // program
  159. v.id = glCreateProgram();
  160. ERR_FAIL_COND_V(v.id == 0, NULL);
  161. if (cc) {
  162. for (int i = 0; i < cc->custom_defines.size(); i++) {
  163. strings.push_back(cc->custom_defines.write[i]);
  164. DEBUG_PRINT("CD #" + itos(i) + ": " + String(cc->custom_defines[i].get_data()));
  165. }
  166. }
  167. // vertex shader
  168. int string_base_size = strings.size();
  169. strings.push_back(vertex_code0.get_data());
  170. if (cc) {
  171. code_globals = cc->vertex_globals.ascii();
  172. strings.push_back(code_globals.get_data());
  173. }
  174. strings.push_back(vertex_code1.get_data());
  175. if (cc) {
  176. code_string = cc->vertex.ascii();
  177. strings.push_back(code_string.get_data());
  178. }
  179. strings.push_back(vertex_code2.get_data());
  180. #ifdef DEBUG_SHADER
  181. DEBUG_PRINT("\nVertex Code:\n\n" + String(code_string.get_data()));
  182. #endif
  183. v.vert_id = glCreateShader(GL_VERTEX_SHADER);
  184. glShaderSource(v.vert_id, strings.size(), &strings[0], NULL);
  185. glCompileShader(v.vert_id);
  186. GLint status;
  187. glGetShaderiv(v.vert_id, GL_COMPILE_STATUS, &status);
  188. if (status == GL_FALSE) {
  189. GLsizei iloglen;
  190. glGetShaderiv(v.vert_id, GL_INFO_LOG_LENGTH, &iloglen);
  191. if (iloglen < 0) {
  192. glDeleteShader(v.vert_id);
  193. glDeleteProgram(v.id);
  194. v.id = 0;
  195. ERR_PRINT("No OpenGL vertex shader compiler log. What the frick?");
  196. } else {
  197. if (iloglen == 0) {
  198. iloglen = 4096; // buggy driver (Adreno 220+)
  199. }
  200. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  201. ilogmem[iloglen] = '\0';
  202. glGetShaderInfoLog(v.vert_id, iloglen, &iloglen, ilogmem);
  203. String err_string = get_shader_name() + ": Vertex shader compilation failed:\n";
  204. err_string += ilogmem;
  205. _display_error_with_code(err_string, strings);
  206. Memory::free_static(ilogmem);
  207. glDeleteShader(v.vert_id);
  208. glDeleteProgram(v.id);
  209. v.id = 0;
  210. }
  211. ERR_FAIL_V(NULL);
  212. }
  213. strings.resize(string_base_size);
  214. // fragment shader
  215. strings.push_back(fragment_code0.get_data());
  216. if (cc) {
  217. code_globals = cc->fragment_globals.ascii();
  218. strings.push_back(code_globals.get_data());
  219. }
  220. strings.push_back(fragment_code1.get_data());
  221. if (cc) {
  222. code_string = cc->light.ascii();
  223. strings.push_back(code_string.get_data());
  224. }
  225. strings.push_back(fragment_code2.get_data());
  226. if (cc) {
  227. code_string2 = cc->fragment.ascii();
  228. strings.push_back(code_string2.get_data());
  229. }
  230. strings.push_back(fragment_code3.get_data());
  231. #ifdef DEBUG_SHADER
  232. if (cc) {
  233. DEBUG_PRINT("\nFragment Code:\n\n" + String(cc->fragment_globals));
  234. }
  235. DEBUG_PRINT("\nFragment Code:\n\n" + String(code_string.get_data()));
  236. #endif
  237. v.frag_id = glCreateShader(GL_FRAGMENT_SHADER);
  238. glShaderSource(v.frag_id, strings.size(), &strings[0], NULL);
  239. glCompileShader(v.frag_id);
  240. glGetShaderiv(v.frag_id, GL_COMPILE_STATUS, &status);
  241. if (status == GL_FALSE) {
  242. GLsizei iloglen;
  243. glGetShaderiv(v.frag_id, GL_INFO_LOG_LENGTH, &iloglen);
  244. if (iloglen < 0) {
  245. glDeleteShader(v.frag_id);
  246. glDeleteShader(v.vert_id);
  247. glDeleteProgram(v.id);
  248. v.id = 0;
  249. ERR_PRINT("No OpenGL fragment shader compiler log. What the frick?");
  250. } else {
  251. if (iloglen == 0) {
  252. iloglen = 4096; // buggy driver (Adreno 220+)
  253. }
  254. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  255. ilogmem[iloglen] = '\0';
  256. glGetShaderInfoLog(v.frag_id, iloglen, &iloglen, ilogmem);
  257. String err_string = get_shader_name() + ": Fragment shader compilation failed:\n";
  258. err_string += ilogmem;
  259. _display_error_with_code(err_string, strings);
  260. Memory::free_static(ilogmem);
  261. glDeleteShader(v.frag_id);
  262. glDeleteShader(v.vert_id);
  263. glDeleteProgram(v.id);
  264. v.id = 0;
  265. }
  266. ERR_FAIL_V(NULL);
  267. }
  268. glAttachShader(v.id, v.frag_id);
  269. glAttachShader(v.id, v.vert_id);
  270. // bind the attribute locations. This has to be done before linking so that the
  271. // linker doesn't assign some random indices
  272. for (int i = 0; i < attribute_pair_count; i++) {
  273. glBindAttribLocation(v.id, attribute_pairs[i].index, attribute_pairs[i].name);
  274. }
  275. glLinkProgram(v.id);
  276. glGetProgramiv(v.id, GL_LINK_STATUS, &status);
  277. if (status == GL_FALSE) {
  278. GLsizei iloglen;
  279. glGetProgramiv(v.id, GL_INFO_LOG_LENGTH, &iloglen);
  280. if (iloglen < 0) {
  281. glDeleteShader(v.frag_id);
  282. glDeleteShader(v.vert_id);
  283. glDeleteProgram(v.id);
  284. v.id = 0;
  285. ERR_PRINT("No OpenGL program link log. What the frick?");
  286. ERR_FAIL_V(NULL);
  287. }
  288. if (iloglen == 0) {
  289. iloglen = 4096; // buggy driver (Adreno 220+)
  290. }
  291. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  292. ilogmem[iloglen] = '\0';
  293. glGetProgramInfoLog(v.id, iloglen, &iloglen, ilogmem);
  294. String err_string = get_shader_name() + ": Program linking failed:\n";
  295. err_string += ilogmem;
  296. _display_error_with_code(err_string, strings);
  297. Memory::free_static(ilogmem);
  298. glDeleteShader(v.frag_id);
  299. glDeleteShader(v.vert_id);
  300. glDeleteProgram(v.id);
  301. v.id = 0;
  302. ERR_FAIL_V(NULL);
  303. }
  304. // get uniform locations
  305. glUseProgram(v.id);
  306. for (int i = 0; i < uniform_count; i++) {
  307. v.uniform_location[i] = glGetUniformLocation(v.id, uniform_names[i]);
  308. }
  309. for (int i = 0; i < texunit_pair_count; i++) {
  310. GLint loc = glGetUniformLocation(v.id, texunit_pairs[i].name);
  311. if (loc >= 0) {
  312. if (texunit_pairs[i].index < 0) {
  313. glUniform1i(loc, max_image_units + texunit_pairs[i].index);
  314. } else {
  315. glUniform1i(loc, texunit_pairs[i].index);
  316. }
  317. }
  318. }
  319. if (cc) {
  320. // uniforms
  321. for (int i = 0; i < cc->custom_uniforms.size(); i++) {
  322. String native_uniform_name = _mkid(cc->custom_uniforms[i]);
  323. GLint location = glGetUniformLocation(v.id, (native_uniform_name).ascii().get_data());
  324. v.custom_uniform_locations[cc->custom_uniforms[i]] = location;
  325. }
  326. // textures
  327. for (int i = 0; i < cc->texture_uniforms.size(); i++) {
  328. String native_uniform_name = _mkid(cc->texture_uniforms[i]);
  329. GLint location = glGetUniformLocation(v.id, (native_uniform_name).ascii().get_data());
  330. v.custom_uniform_locations[cc->texture_uniforms[i]] = location;
  331. glUniform1i(location, i);
  332. }
  333. }
  334. glUseProgram(0);
  335. v.ok = true;
  336. if (cc) {
  337. cc->versions.insert(conditional_version.version);
  338. }
  339. return &v;
  340. }
  341. GLint ShaderGLES2::get_uniform_location(const String &p_name) const {
  342. ERR_FAIL_COND_V(!version, -1);
  343. return glGetUniformLocation(version->id, p_name.ascii().get_data());
  344. }
  345. void ShaderGLES2::setup(
  346. const char **p_conditional_defines,
  347. int p_conditional_count,
  348. const char **p_uniform_names,
  349. int p_uniform_count,
  350. const AttributePair *p_attribute_pairs,
  351. int p_attribute_count,
  352. const TexUnitPair *p_texunit_pairs,
  353. int p_texunit_pair_count,
  354. const char *p_vertex_code,
  355. const char *p_fragment_code,
  356. int p_vertex_code_start,
  357. int p_fragment_code_start) {
  358. ERR_FAIL_COND(version);
  359. conditional_version.key = 0;
  360. new_conditional_version.key = 0;
  361. uniform_count = p_uniform_count;
  362. conditional_count = p_conditional_count;
  363. conditional_defines = p_conditional_defines;
  364. uniform_names = p_uniform_names;
  365. vertex_code = p_vertex_code;
  366. fragment_code = p_fragment_code;
  367. texunit_pairs = p_texunit_pairs;
  368. texunit_pair_count = p_texunit_pair_count;
  369. vertex_code_start = p_vertex_code_start;
  370. fragment_code_start = p_fragment_code_start;
  371. attribute_pairs = p_attribute_pairs;
  372. attribute_pair_count = p_attribute_count;
  373. {
  374. String globals_tag = "\nVERTEX_SHADER_GLOBALS";
  375. String code_tag = "\nVERTEX_SHADER_CODE";
  376. String code = vertex_code;
  377. int cpos = code.find(globals_tag);
  378. if (cpos == -1) {
  379. vertex_code0 = code.ascii();
  380. } else {
  381. vertex_code0 = code.substr(0, cpos).ascii();
  382. code = code.substr(cpos + globals_tag.length(), code.length());
  383. cpos = code.find(code_tag);
  384. if (cpos == -1) {
  385. vertex_code1 = code.ascii();
  386. } else {
  387. vertex_code1 = code.substr(0, cpos).ascii();
  388. vertex_code2 = code.substr(cpos + code_tag.length(), code.length()).ascii();
  389. }
  390. }
  391. }
  392. {
  393. String globals_tag = "\nFRAGMENT_SHADER_GLOBALS";
  394. String code_tag = "\nFRAGMENT_SHADER_CODE";
  395. String light_code_tag = "\nLIGHT_SHADER_CODE";
  396. String code = fragment_code;
  397. int cpos = code.find(globals_tag);
  398. if (cpos == -1) {
  399. fragment_code0 = code.ascii();
  400. } else {
  401. fragment_code0 = code.substr(0, cpos).ascii();
  402. code = code.substr(cpos + globals_tag.length(), code.length());
  403. cpos = code.find(light_code_tag);
  404. String code2;
  405. if (cpos != -1) {
  406. fragment_code1 = code.substr(0, cpos).ascii();
  407. code2 = code.substr(cpos + light_code_tag.length(), code.length());
  408. } else {
  409. code2 = code;
  410. }
  411. cpos = code2.find(code_tag);
  412. if (cpos == -1) {
  413. fragment_code2 = code2.ascii();
  414. } else {
  415. fragment_code2 = code2.substr(0, cpos).ascii();
  416. fragment_code3 = code2.substr(cpos + code_tag.length(), code2.length()).ascii();
  417. }
  418. }
  419. }
  420. glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_image_units);
  421. }
  422. void ShaderGLES2::finish() {
  423. const VersionKey *V = NULL;
  424. while ((V = version_map.next(V))) {
  425. Version &v = version_map[*V];
  426. glDeleteShader(v.vert_id);
  427. glDeleteShader(v.frag_id);
  428. glDeleteProgram(v.id);
  429. memdelete_arr(v.uniform_location);
  430. }
  431. }
  432. void ShaderGLES2::clear_caches() {
  433. const VersionKey *V = NULL;
  434. while ((V = version_map.next(V))) {
  435. Version &v = version_map[*V];
  436. glDeleteShader(v.vert_id);
  437. glDeleteShader(v.frag_id);
  438. glDeleteProgram(v.id);
  439. memdelete_arr(v.uniform_location);
  440. }
  441. version_map.clear();
  442. custom_code_map.clear();
  443. version = NULL;
  444. last_custom_code = 1;
  445. uniforms_dirty = true;
  446. }
  447. uint32_t ShaderGLES2::create_custom_shader() {
  448. custom_code_map[last_custom_code] = CustomCode();
  449. custom_code_map[last_custom_code].version = 1;
  450. return last_custom_code++;
  451. }
  452. void ShaderGLES2::set_custom_shader_code(uint32_t p_code_id,
  453. const String &p_vertex,
  454. const String &p_vertex_globals,
  455. const String &p_fragment,
  456. const String &p_light,
  457. const String &p_fragment_globals,
  458. const Vector<StringName> &p_uniforms,
  459. const Vector<StringName> &p_texture_uniforms,
  460. const Vector<CharString> &p_custom_defines) {
  461. CustomCode *cc = custom_code_map.getptr(p_code_id);
  462. ERR_FAIL_COND(!cc);
  463. cc->vertex = p_vertex;
  464. cc->vertex_globals = p_vertex_globals;
  465. cc->fragment = p_fragment;
  466. cc->fragment_globals = p_fragment_globals;
  467. cc->light = p_light;
  468. cc->custom_uniforms = p_uniforms;
  469. cc->custom_defines = p_custom_defines;
  470. cc->texture_uniforms = p_texture_uniforms;
  471. cc->version++;
  472. }
  473. void ShaderGLES2::set_custom_shader(uint32_t p_code_id) {
  474. new_conditional_version.code_version = p_code_id;
  475. }
  476. void ShaderGLES2::free_custom_shader(uint32_t p_code_id) {
  477. ERR_FAIL_COND(!custom_code_map.has(p_code_id));
  478. if (conditional_version.code_version == p_code_id) {
  479. conditional_version.code_version = 0; //do not keep using a version that is going away
  480. unbind();
  481. }
  482. VersionKey key;
  483. key.code_version = p_code_id;
  484. for (Set<uint32_t>::Element *E = custom_code_map[p_code_id].versions.front(); E; E = E->next()) {
  485. key.version = E->get();
  486. ERR_CONTINUE(!version_map.has(key));
  487. Version &v = version_map[key];
  488. glDeleteShader(v.vert_id);
  489. glDeleteShader(v.frag_id);
  490. glDeleteProgram(v.id);
  491. memdelete_arr(v.uniform_location);
  492. v.id = 0;
  493. version_map.erase(key);
  494. }
  495. custom_code_map.erase(p_code_id);
  496. }
  497. void ShaderGLES2::use_material(void *p_material) {
  498. RasterizerStorageGLES2::Material *material = (RasterizerStorageGLES2::Material *)p_material;
  499. if (!material) {
  500. return;
  501. }
  502. if (!material->shader) {
  503. return;
  504. }
  505. Version *v = version_map.getptr(conditional_version);
  506. // bind uniforms
  507. for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = material->shader->uniforms.front(); E; E = E->next()) {
  508. if (E->get().texture_order >= 0)
  509. continue; // this is a texture, doesn't go here
  510. Map<StringName, GLint>::Element *L = v->custom_uniform_locations.find(E->key());
  511. if (!L || L->get() < 0)
  512. continue; //uniform not valid
  513. GLuint location = L->get();
  514. Map<StringName, Variant>::Element *V = material->params.find(E->key());
  515. if (V) {
  516. switch (E->get().type) {
  517. case ShaderLanguage::TYPE_BOOL: {
  518. bool boolean = V->get();
  519. glUniform1i(location, boolean ? 1 : 0);
  520. } break;
  521. case ShaderLanguage::TYPE_BVEC2: {
  522. int flags = V->get();
  523. glUniform2i(location, (flags & 1) ? 1 : 0, (flags & 2) ? 1 : 0);
  524. } break;
  525. case ShaderLanguage::TYPE_BVEC3: {
  526. int flags = V->get();
  527. glUniform3i(location, (flags & 1) ? 1 : 0, (flags & 2) ? 1 : 0, (flags & 4) ? 1 : 0);
  528. } break;
  529. case ShaderLanguage::TYPE_BVEC4: {
  530. int flags = V->get();
  531. glUniform4i(location, (flags & 1) ? 1 : 0, (flags & 2) ? 1 : 0, (flags & 4) ? 1 : 0, (flags & 8) ? 1 : 0);
  532. } break;
  533. case ShaderLanguage::TYPE_INT:
  534. case ShaderLanguage::TYPE_UINT: {
  535. int value = V->get();
  536. glUniform1i(location, value);
  537. } break;
  538. case ShaderLanguage::TYPE_IVEC2:
  539. case ShaderLanguage::TYPE_UVEC2: {
  540. Array r = V->get();
  541. const int count = 2;
  542. if (r.size() == count) {
  543. int values[count];
  544. for (int i = 0; i < count; i++) {
  545. values[i] = r[i];
  546. }
  547. glUniform2i(location, values[0], values[1]);
  548. }
  549. } break;
  550. case ShaderLanguage::TYPE_IVEC3:
  551. case ShaderLanguage::TYPE_UVEC3: {
  552. Array r = V->get();
  553. const int count = 3;
  554. if (r.size() == count) {
  555. int values[count];
  556. for (int i = 0; i < count; i++) {
  557. values[i] = r[i];
  558. }
  559. glUniform3i(location, values[0], values[1], values[2]);
  560. }
  561. } break;
  562. case ShaderLanguage::TYPE_IVEC4:
  563. case ShaderLanguage::TYPE_UVEC4: {
  564. Array r = V->get();
  565. const int count = 4;
  566. if (r.size() == count) {
  567. int values[count];
  568. for (int i = 0; i < count; i++) {
  569. values[i] = r[i];
  570. }
  571. glUniform4i(location, values[0], values[1], values[2], values[3]);
  572. }
  573. } break;
  574. case ShaderLanguage::TYPE_FLOAT: {
  575. float value = V->get();
  576. glUniform1f(location, value);
  577. } break;
  578. case ShaderLanguage::TYPE_VEC2: {
  579. Vector2 value = V->get();
  580. glUniform2f(location, value.x, value.y);
  581. } break;
  582. case ShaderLanguage::TYPE_VEC3: {
  583. Vector3 value = V->get();
  584. glUniform3f(location, value.x, value.y, value.z);
  585. } break;
  586. case ShaderLanguage::TYPE_VEC4: {
  587. if (V->get().get_type() == Variant::COLOR) {
  588. Color value = V->get();
  589. glUniform4f(location, value.r, value.g, value.b, value.a);
  590. } else if (V->get().get_type() == Variant::QUAT) {
  591. Quat value = V->get();
  592. glUniform4f(location, value.x, value.y, value.z, value.w);
  593. } else {
  594. Plane value = V->get();
  595. glUniform4f(location, value.normal.x, value.normal.y, value.normal.z, value.d);
  596. }
  597. } break;
  598. case ShaderLanguage::TYPE_MAT2: {
  599. Transform2D tr = V->get();
  600. GLfloat matrix[4] = {
  601. /* build a 16x16 matrix */
  602. tr.elements[0][0],
  603. tr.elements[0][1],
  604. tr.elements[1][0],
  605. tr.elements[1][1],
  606. };
  607. glUniformMatrix2fv(location, 1, GL_FALSE, matrix);
  608. } break;
  609. case ShaderLanguage::TYPE_MAT3: {
  610. Basis val = V->get();
  611. GLfloat mat[9] = {
  612. val.elements[0][0],
  613. val.elements[1][0],
  614. val.elements[2][0],
  615. val.elements[0][1],
  616. val.elements[1][1],
  617. val.elements[2][1],
  618. val.elements[0][2],
  619. val.elements[1][2],
  620. val.elements[2][2],
  621. };
  622. glUniformMatrix3fv(location, 1, GL_FALSE, mat);
  623. } break;
  624. case ShaderLanguage::TYPE_MAT4: {
  625. Transform2D tr = V->get();
  626. GLfloat matrix[16] = { /* build a 16x16 matrix */
  627. tr.elements[0][0],
  628. tr.elements[0][1],
  629. 0,
  630. 0,
  631. tr.elements[1][0],
  632. tr.elements[1][1],
  633. 0,
  634. 0,
  635. 0,
  636. 0,
  637. 1,
  638. 0,
  639. tr.elements[2][0],
  640. tr.elements[2][1],
  641. 0,
  642. 1
  643. };
  644. glUniformMatrix4fv(location, 1, GL_FALSE, matrix);
  645. } break;
  646. default: {
  647. ERR_PRINT("ShaderNode type missing, bug?");
  648. } break;
  649. }
  650. } else if (E->get().default_value.size()) {
  651. const Vector<ShaderLanguage::ConstantNode::Value> &values = E->get().default_value;
  652. switch (E->get().type) {
  653. case ShaderLanguage::TYPE_BOOL: {
  654. glUniform1i(location, values[0].boolean);
  655. } break;
  656. case ShaderLanguage::TYPE_BVEC2: {
  657. glUniform2i(location, values[0].boolean, values[1].boolean);
  658. } break;
  659. case ShaderLanguage::TYPE_BVEC3: {
  660. glUniform3i(location, values[0].boolean, values[1].boolean, values[2].boolean);
  661. } break;
  662. case ShaderLanguage::TYPE_BVEC4: {
  663. glUniform4i(location, values[0].boolean, values[1].boolean, values[2].boolean, values[3].boolean);
  664. } break;
  665. case ShaderLanguage::TYPE_INT: {
  666. glUniform1i(location, values[0].sint);
  667. } break;
  668. case ShaderLanguage::TYPE_IVEC2: {
  669. glUniform2i(location, values[0].sint, values[1].sint);
  670. } break;
  671. case ShaderLanguage::TYPE_IVEC3: {
  672. glUniform3i(location, values[0].sint, values[1].sint, values[2].sint);
  673. } break;
  674. case ShaderLanguage::TYPE_IVEC4: {
  675. glUniform4i(location, values[0].sint, values[1].sint, values[2].sint, values[3].sint);
  676. } break;
  677. case ShaderLanguage::TYPE_UINT: {
  678. glUniform1i(location, values[0].uint);
  679. } break;
  680. case ShaderLanguage::TYPE_UVEC2: {
  681. glUniform2i(location, values[0].uint, values[1].uint);
  682. } break;
  683. case ShaderLanguage::TYPE_UVEC3: {
  684. glUniform3i(location, values[0].uint, values[1].uint, values[2].uint);
  685. } break;
  686. case ShaderLanguage::TYPE_UVEC4: {
  687. glUniform4i(location, values[0].uint, values[1].uint, values[2].uint, values[3].uint);
  688. } break;
  689. case ShaderLanguage::TYPE_FLOAT: {
  690. glUniform1f(location, values[0].real);
  691. } break;
  692. case ShaderLanguage::TYPE_VEC2: {
  693. glUniform2f(location, values[0].real, values[1].real);
  694. } break;
  695. case ShaderLanguage::TYPE_VEC3: {
  696. glUniform3f(location, values[0].real, values[1].real, values[2].real);
  697. } break;
  698. case ShaderLanguage::TYPE_VEC4: {
  699. glUniform4f(location, values[0].real, values[1].real, values[2].real, values[3].real);
  700. } break;
  701. case ShaderLanguage::TYPE_MAT2: {
  702. GLfloat mat[4];
  703. for (int i = 0; i < 4; i++) {
  704. mat[i] = values[i].real;
  705. }
  706. glUniformMatrix2fv(location, 1, GL_FALSE, mat);
  707. } break;
  708. case ShaderLanguage::TYPE_MAT3: {
  709. GLfloat mat[9];
  710. for (int i = 0; i < 9; i++) {
  711. mat[i] = values[i].real;
  712. }
  713. glUniformMatrix3fv(location, 1, GL_FALSE, mat);
  714. } break;
  715. case ShaderLanguage::TYPE_MAT4: {
  716. GLfloat mat[16];
  717. for (int i = 0; i < 16; i++) {
  718. mat[i] = values[i].real;
  719. }
  720. glUniformMatrix4fv(location, 1, GL_FALSE, mat);
  721. } break;
  722. case ShaderLanguage::TYPE_SAMPLER2D: {
  723. } break;
  724. case ShaderLanguage::TYPE_ISAMPLER2D: {
  725. } break;
  726. case ShaderLanguage::TYPE_USAMPLER2D: {
  727. } break;
  728. case ShaderLanguage::TYPE_SAMPLERCUBE: {
  729. } break;
  730. case ShaderLanguage::TYPE_SAMPLER2DARRAY:
  731. case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
  732. case ShaderLanguage::TYPE_USAMPLER2DARRAY:
  733. case ShaderLanguage::TYPE_SAMPLER3D:
  734. case ShaderLanguage::TYPE_ISAMPLER3D:
  735. case ShaderLanguage::TYPE_USAMPLER3D: {
  736. // Not implemented in GLES2
  737. } break;
  738. case ShaderLanguage::TYPE_VOID: {
  739. // Nothing to do?
  740. } break;
  741. default: {
  742. ERR_PRINT("ShaderNode type missing, bug?");
  743. } break;
  744. }
  745. } else { //zero
  746. switch (E->get().type) {
  747. case ShaderLanguage::TYPE_BOOL: {
  748. glUniform1i(location, GL_FALSE);
  749. } break;
  750. case ShaderLanguage::TYPE_BVEC2: {
  751. glUniform2i(location, GL_FALSE, GL_FALSE);
  752. } break;
  753. case ShaderLanguage::TYPE_BVEC3: {
  754. glUniform3i(location, GL_FALSE, GL_FALSE, GL_FALSE);
  755. } break;
  756. case ShaderLanguage::TYPE_BVEC4: {
  757. glUniform4i(location, GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  758. } break;
  759. case ShaderLanguage::TYPE_INT: {
  760. glUniform1i(location, 0);
  761. } break;
  762. case ShaderLanguage::TYPE_IVEC2: {
  763. glUniform2i(location, 0, 0);
  764. } break;
  765. case ShaderLanguage::TYPE_IVEC3: {
  766. glUniform3i(location, 0, 0, 0);
  767. } break;
  768. case ShaderLanguage::TYPE_IVEC4: {
  769. glUniform4i(location, 0, 0, 0, 0);
  770. } break;
  771. case ShaderLanguage::TYPE_UINT: {
  772. glUniform1i(location, 0);
  773. } break;
  774. case ShaderLanguage::TYPE_UVEC2: {
  775. glUniform2i(location, 0, 0);
  776. } break;
  777. case ShaderLanguage::TYPE_UVEC3: {
  778. glUniform3i(location, 0, 0, 0);
  779. } break;
  780. case ShaderLanguage::TYPE_UVEC4: {
  781. glUniform4i(location, 0, 0, 0, 0);
  782. } break;
  783. case ShaderLanguage::TYPE_FLOAT: {
  784. glUniform1f(location, 0);
  785. } break;
  786. case ShaderLanguage::TYPE_VEC2: {
  787. glUniform2f(location, 0, 0);
  788. } break;
  789. case ShaderLanguage::TYPE_VEC3: {
  790. glUniform3f(location, 0, 0, 0);
  791. } break;
  792. case ShaderLanguage::TYPE_VEC4: {
  793. glUniform4f(location, 0, 0, 0, 0);
  794. } break;
  795. case ShaderLanguage::TYPE_MAT2: {
  796. GLfloat mat[4] = { 0, 0, 0, 0 };
  797. glUniformMatrix2fv(location, 1, GL_FALSE, mat);
  798. } break;
  799. case ShaderLanguage::TYPE_MAT3: {
  800. GLfloat mat[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  801. glUniformMatrix3fv(location, 1, GL_FALSE, mat);
  802. } break;
  803. case ShaderLanguage::TYPE_MAT4: {
  804. GLfloat mat[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  805. glUniformMatrix4fv(location, 1, GL_FALSE, mat);
  806. } break;
  807. case ShaderLanguage::TYPE_SAMPLER2D: {
  808. } break;
  809. case ShaderLanguage::TYPE_ISAMPLER2D: {
  810. } break;
  811. case ShaderLanguage::TYPE_USAMPLER2D: {
  812. } break;
  813. case ShaderLanguage::TYPE_SAMPLERCUBE: {
  814. } break;
  815. case ShaderLanguage::TYPE_SAMPLER2DARRAY:
  816. case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
  817. case ShaderLanguage::TYPE_USAMPLER2DARRAY:
  818. case ShaderLanguage::TYPE_SAMPLER3D:
  819. case ShaderLanguage::TYPE_ISAMPLER3D:
  820. case ShaderLanguage::TYPE_USAMPLER3D: {
  821. // Not implemented in GLES2
  822. } break;
  823. case ShaderLanguage::TYPE_VOID: {
  824. // Nothing to do?
  825. } break;
  826. default: {
  827. ERR_PRINT("ShaderNode type missing, bug?");
  828. } break;
  829. }
  830. }
  831. }
  832. }
  833. ShaderGLES2::ShaderGLES2() {
  834. version = NULL;
  835. last_custom_code = 1;
  836. uniforms_dirty = true;
  837. }
  838. ShaderGLES2::~ShaderGLES2() {
  839. finish();
  840. }