shader_gles2.cpp 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. /*************************************************************************/
  2. /* shader_gles2.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* https://godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
  9. /* Copyright (c) 2014-2018 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 "memory.h"
  32. #include "print_string.h"
  33. #include "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. void ShaderGLES2::bind_uniforms() {
  57. if (!uniforms_dirty)
  58. return;
  59. // regular uniforms
  60. const Map<uint32_t, Variant>::Element *E = uniform_defaults.front();
  61. while (E) {
  62. int idx = E->key();
  63. int location = version->uniform_location[idx];
  64. if (location < 0) {
  65. E = E->next();
  66. continue;
  67. }
  68. Variant v;
  69. v = E->value();
  70. _set_uniform_variant(location, v);
  71. E = E->next();
  72. }
  73. // camera uniforms
  74. const Map<uint32_t, CameraMatrix>::Element *C = uniform_cameras.front();
  75. while (C) {
  76. int idx = E->key();
  77. int location = version->uniform_location[idx];
  78. if (location < 0) {
  79. C = C->next();
  80. continue;
  81. }
  82. glUniformMatrix4fv(location, 1, GL_FALSE, &(C->get().matrix[0][0]));
  83. C = C->next();
  84. }
  85. uniforms_dirty = false;
  86. }
  87. GLint ShaderGLES2::get_uniform_location(int p_index) const {
  88. ERR_FAIL_COND_V(!version, -1);
  89. return version->uniform_location[p_index];
  90. }
  91. bool ShaderGLES2::bind() {
  92. if (active != this || !version || new_conditional_version.key != conditional_version.key) {
  93. conditional_version = new_conditional_version;
  94. version = get_current_version();
  95. } else {
  96. return false;
  97. }
  98. ERR_FAIL_COND_V(!version, false);
  99. glUseProgram(version->id);
  100. // find out uniform names and locations
  101. int count;
  102. glGetProgramiv(version->id, GL_ACTIVE_UNIFORMS, &count);
  103. version->uniform_names.resize(count);
  104. for (int i = 0; i < count; i++) {
  105. GLchar uniform_name[1024];
  106. int len = 0;
  107. GLint size = 0;
  108. GLenum type;
  109. glGetActiveUniform(version->id, i, 1024, &len, &size, &type, uniform_name);
  110. uniform_name[len] = '\0';
  111. String name = String((const char *)uniform_name);
  112. version->uniform_names.write[i] = name;
  113. }
  114. bind_uniforms();
  115. DEBUG_TEST_ERROR("use program");
  116. active = this;
  117. uniforms_dirty = true;
  118. return true;
  119. }
  120. void ShaderGLES2::unbind() {
  121. version = NULL;
  122. glUseProgram(0);
  123. uniforms_dirty = true;
  124. active = NULL;
  125. }
  126. static String _fix_error_code_line(const String &p_error, int p_code_start, int p_offset) {
  127. int last_find_pos = -1;
  128. // NVIDIA
  129. String error = p_error;
  130. while ((last_find_pos = p_error.find("(", last_find_pos + 1)) != -1) {
  131. int end_pos = last_find_pos + 1;
  132. while (true) {
  133. if (p_error[end_pos] >= '0' && p_error[end_pos] <= '9') {
  134. end_pos++;
  135. continue;
  136. } else if (p_error[end_pos] == ')') {
  137. break;
  138. } else {
  139. end_pos = -1;
  140. break;
  141. }
  142. }
  143. if (end_pos == -1)
  144. continue;
  145. String numstr = error.substr(last_find_pos + 1, (end_pos - last_find_pos) - 1);
  146. String begin = error.substr(0, last_find_pos + 1);
  147. String end = error.substr(end_pos, error.length());
  148. int num = numstr.to_int() + p_code_start - p_offset;
  149. error = begin + itos(num) + end;
  150. }
  151. // ATI
  152. last_find_pos = -1;
  153. while ((last_find_pos = p_error.find("ERROR: ", last_find_pos + 1)) != -1) {
  154. last_find_pos += 6;
  155. int end_pos = last_find_pos + 1;
  156. while (true) {
  157. if (p_error[end_pos] >= '0' && p_error[end_pos] <= '9') {
  158. end_pos++;
  159. continue;
  160. } else if (p_error[end_pos] == ':') {
  161. break;
  162. } else {
  163. end_pos = -1;
  164. break;
  165. }
  166. }
  167. continue;
  168. if (end_pos == -1)
  169. continue;
  170. String numstr = error.substr(last_find_pos + 1, (end_pos - last_find_pos) - 1);
  171. print_line("numstr: " + numstr);
  172. String begin = error.substr(0, last_find_pos + 1);
  173. String end = error.substr(end_pos, error.length());
  174. int num = numstr.to_int() + p_code_start - p_offset;
  175. error = begin + itos(num) + end;
  176. }
  177. return error;
  178. }
  179. ShaderGLES2::Version *ShaderGLES2::get_current_version() {
  180. Version *_v = version_map.getptr(conditional_version);
  181. if (_v) {
  182. if (conditional_version.code_version != 0) {
  183. CustomCode *cc = custom_code_map.getptr(conditional_version.code_version);
  184. ERR_FAIL_COND_V(!cc, _v);
  185. if (cc->version == _v->code_version)
  186. return _v;
  187. } else {
  188. return _v;
  189. }
  190. }
  191. if (!_v)
  192. version_map[conditional_version] = Version();
  193. Version &v = version_map[conditional_version];
  194. if (!_v) {
  195. v.uniform_location = memnew_arr(GLint, uniform_count);
  196. } else {
  197. if (v.ok) {
  198. glDeleteShader(v.vert_id);
  199. glDeleteShader(v.frag_id);
  200. glDeleteProgram(v.id);
  201. v.id = 0;
  202. }
  203. }
  204. v.ok = false;
  205. Vector<const char *> strings;
  206. #ifdef GLES_OVER_GL
  207. strings.push_back("#version 120\n");
  208. strings.push_back("#define USE_GLES_OVER_GL\n");
  209. #else
  210. strings.push_back("#version 100\n");
  211. #endif
  212. int define_line_ofs = 1;
  213. for (int j = 0; j < conditional_count; j++) {
  214. bool enable = (conditional_version.version & (1 << j)) > 0;
  215. if (enable) {
  216. strings.push_back(conditional_defines[j]);
  217. define_line_ofs++;
  218. DEBUG_PRINT(conditional_defines[j]);
  219. }
  220. }
  221. // keep them around during the functino
  222. CharString code_string;
  223. CharString code_string2;
  224. CharString code_globals;
  225. CustomCode *cc = NULL;
  226. if (conditional_version.code_version > 0) {
  227. cc = custom_code_map.getptr(conditional_version.code_version);
  228. ERR_FAIL_COND_V(!cc, NULL);
  229. v.code_version = cc->version;
  230. define_line_ofs += 2;
  231. }
  232. // program
  233. v.id = glCreateProgram();
  234. ERR_FAIL_COND_V(v.id == 0, NULL);
  235. if (cc) {
  236. for (int i = 0; i < cc->custom_defines.size(); i++) {
  237. strings.push_back(cc->custom_defines.write[i]);
  238. DEBUG_PRINT("CD #" + itos(i) + ": " + String(cc->custom_defines[i]));
  239. }
  240. }
  241. // vertex shader
  242. int string_base_size = strings.size();
  243. strings.push_back(vertex_code0.get_data());
  244. if (cc) {
  245. code_globals = cc->vertex_globals.ascii();
  246. strings.push_back(code_globals.get_data());
  247. }
  248. strings.push_back(vertex_code1.get_data());
  249. if (cc) {
  250. code_string = cc->vertex.ascii();
  251. strings.push_back(code_string.get_data());
  252. }
  253. strings.push_back(vertex_code2.get_data());
  254. #ifdef DEBUG_SHADER
  255. DEBUG_PRINT("\nVertex Code:\n\n" + String(code_string.get_data()));
  256. #endif
  257. v.vert_id = glCreateShader(GL_VERTEX_SHADER);
  258. glShaderSource(v.vert_id, strings.size(), &strings[0], NULL);
  259. glCompileShader(v.vert_id);
  260. GLint status;
  261. glGetShaderiv(v.vert_id, GL_COMPILE_STATUS, &status);
  262. if (status == GL_FALSE) {
  263. GLsizei iloglen;
  264. glGetShaderiv(v.vert_id, GL_INFO_LOG_LENGTH, &iloglen);
  265. if (iloglen < 0) {
  266. glDeleteShader(v.vert_id);
  267. glDeleteProgram(v.id);
  268. v.id = 0;
  269. ERR_PRINT("No OpenGL vertex shader compiler log. What the frick?");
  270. } else {
  271. if (iloglen == 0) {
  272. iloglen = 4096; // buggy driver (Adreno 220+)
  273. }
  274. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  275. ilogmem[iloglen] = '\0';
  276. glGetShaderInfoLog(v.vert_id, iloglen, &iloglen, ilogmem);
  277. String err_string = get_shader_name() + ": Vertex shader compilation failed:\n";
  278. err_string += ilogmem;
  279. err_string = _fix_error_code_line(err_string, vertex_code_start, define_line_ofs);
  280. ERR_PRINTS(err_string);
  281. Memory::free_static(ilogmem);
  282. glDeleteShader(v.vert_id);
  283. glDeleteProgram(v.id);
  284. v.id = 0;
  285. }
  286. ERR_FAIL_V(NULL);
  287. }
  288. strings.resize(string_base_size);
  289. // fragment shader
  290. strings.push_back(fragment_code0.get_data());
  291. if (cc) {
  292. code_globals = cc->fragment_globals.ascii();
  293. strings.push_back(code_globals.get_data());
  294. }
  295. strings.push_back(fragment_code1.get_data());
  296. if (cc) {
  297. code_string = cc->fragment.ascii();
  298. strings.push_back(code_string.get_data());
  299. }
  300. strings.push_back(fragment_code2.get_data());
  301. if (cc) {
  302. code_string2 = cc->light.ascii();
  303. strings.push_back(code_string2.get_data());
  304. }
  305. strings.push_back(fragment_code3.get_data());
  306. #ifdef DEBUG_SHADER
  307. if (cc) {
  308. DEBUG_PRINT("\nFragment Code:\n\n" + String(cc->fragment_globals));
  309. }
  310. DEBUG_PRINT("\nFragment Code:\n\n" + String(code_string.get_data()));
  311. #endif
  312. v.frag_id = glCreateShader(GL_FRAGMENT_SHADER);
  313. glShaderSource(v.frag_id, strings.size(), &strings[0], NULL);
  314. glCompileShader(v.frag_id);
  315. glGetShaderiv(v.frag_id, GL_COMPILE_STATUS, &status);
  316. if (status == GL_FALSE) {
  317. GLsizei iloglen;
  318. glGetShaderiv(v.frag_id, GL_INFO_LOG_LENGTH, &iloglen);
  319. if (iloglen < 0) {
  320. glDeleteShader(v.frag_id);
  321. glDeleteShader(v.vert_id);
  322. glDeleteProgram(v.id);
  323. v.id = 0;
  324. ERR_PRINT("No OpenGL fragment shader compiler log. What the frick?");
  325. } else {
  326. if (iloglen == 0) {
  327. iloglen = 4096; // buggy driver (Adreno 220+)
  328. }
  329. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  330. ilogmem[iloglen] = '\0';
  331. glGetShaderInfoLog(v.frag_id, iloglen, &iloglen, ilogmem);
  332. String err_string = get_shader_name() + ": Fragment shader compilation failed:\n";
  333. err_string += ilogmem;
  334. err_string = _fix_error_code_line(err_string, fragment_code_start, define_line_ofs);
  335. ERR_PRINTS(err_string);
  336. Memory::free_static(ilogmem);
  337. glDeleteShader(v.frag_id);
  338. glDeleteShader(v.vert_id);
  339. glDeleteProgram(v.id);
  340. v.id = 0;
  341. }
  342. ERR_FAIL_V(NULL);
  343. }
  344. glAttachShader(v.id, v.frag_id);
  345. glAttachShader(v.id, v.vert_id);
  346. // bind the attribute locations. This has to be done before linking so that the
  347. // linker doesn't assign some random indices
  348. for (int i = 0; i < attribute_pair_count; i++) {
  349. glBindAttribLocation(v.id, attribute_pairs[i].index, attribute_pairs[i].name);
  350. }
  351. glLinkProgram(v.id);
  352. glGetProgramiv(v.id, GL_LINK_STATUS, &status);
  353. if (status == GL_FALSE) {
  354. GLsizei iloglen;
  355. glGetProgramiv(v.id, GL_INFO_LOG_LENGTH, &iloglen);
  356. if (iloglen < 0) {
  357. glDeleteShader(v.frag_id);
  358. glDeleteShader(v.vert_id);
  359. glDeleteProgram(v.id);
  360. v.id = 0;
  361. ERR_PRINT("No OpenGL program link log. What the frick?");
  362. ERR_FAIL_V(NULL);
  363. }
  364. if (iloglen == 0) {
  365. iloglen = 4096; // buggy driver (Adreno 220+)
  366. }
  367. char *ilogmem = (char *)Memory::alloc_static(iloglen + 1);
  368. ilogmem[iloglen] = '\0';
  369. glGetProgramInfoLog(v.id, iloglen, &iloglen, ilogmem);
  370. String err_string = get_shader_name() + ": Program linking failed:\n";
  371. err_string += ilogmem;
  372. err_string = _fix_error_code_line(err_string, fragment_code_start, define_line_ofs);
  373. ERR_PRINTS(err_string);
  374. Memory::free_static(ilogmem);
  375. glDeleteShader(v.frag_id);
  376. glDeleteShader(v.vert_id);
  377. glDeleteProgram(v.id);
  378. v.id = 0;
  379. ERR_FAIL_V(NULL);
  380. }
  381. // get uniform locations
  382. glUseProgram(v.id);
  383. for (int i = 0; i < uniform_count; i++) {
  384. v.uniform_location[i] = glGetUniformLocation(v.id, uniform_names[i]);
  385. }
  386. for (int i = 0; i < texunit_pair_count; i++) {
  387. GLint loc = glGetUniformLocation(v.id, texunit_pairs[i].name);
  388. if (loc >= 0) {
  389. if (texunit_pairs[i].index < 0) {
  390. glUniform1i(loc, max_image_units + texunit_pairs[i].index);
  391. } else {
  392. glUniform1i(loc, texunit_pairs[i].index);
  393. }
  394. }
  395. }
  396. if (cc) {
  397. // uniforms
  398. for (int i = 0; i < cc->custom_uniforms.size(); i++) {
  399. StringName native_uniform_name = "m_" + cc->custom_uniforms[i];
  400. GLint location = glGetUniformLocation(v.id, ((String)native_uniform_name).ascii().get_data());
  401. v.custom_uniform_locations[cc->custom_uniforms[i]] = location;
  402. }
  403. // textures
  404. for (int i = 0; i < cc->texture_uniforms.size(); i++) {
  405. StringName native_uniform_name = "m_" + cc->texture_uniforms[i];
  406. GLint location = glGetUniformLocation(v.id, ((String)native_uniform_name).ascii().get_data());
  407. v.custom_uniform_locations[cc->texture_uniforms[i]] = location;
  408. }
  409. }
  410. glUseProgram(0);
  411. v.ok = true;
  412. return &v;
  413. }
  414. GLint ShaderGLES2::get_uniform_location(const String &p_name) const {
  415. ERR_FAIL_COND_V(!version, -1);
  416. return glGetUniformLocation(version->id, p_name.ascii().get_data());
  417. }
  418. void ShaderGLES2::setup(
  419. const char **p_conditional_defines,
  420. int p_conditional_count,
  421. const char **p_uniform_names,
  422. int p_uniform_count,
  423. const AttributePair *p_attribute_pairs,
  424. int p_attribute_count,
  425. const TexUnitPair *p_texunit_pairs,
  426. int p_texunit_pair_count,
  427. const char *p_vertex_code,
  428. const char *p_fragment_code,
  429. int p_vertex_code_start,
  430. int p_fragment_code_start) {
  431. ERR_FAIL_COND(version);
  432. conditional_version.key = 0;
  433. new_conditional_version.key = 0;
  434. uniform_count = p_uniform_count;
  435. conditional_count = p_conditional_count;
  436. conditional_defines = p_conditional_defines;
  437. uniform_names = p_uniform_names;
  438. vertex_code = p_vertex_code;
  439. fragment_code = p_fragment_code;
  440. texunit_pairs = p_texunit_pairs;
  441. texunit_pair_count = p_texunit_pair_count;
  442. vertex_code_start = p_vertex_code_start;
  443. fragment_code_start = p_fragment_code_start;
  444. attribute_pairs = p_attribute_pairs;
  445. attribute_pair_count = p_attribute_count;
  446. {
  447. String globals_tag = "\nVERTEX_SHADER_GLOBALS";
  448. String code_tag = "\nVERTEX_SHADER_CODE";
  449. String code = vertex_code;
  450. int cpos = code.find(globals_tag);
  451. if (cpos == -1) {
  452. vertex_code0 = code.ascii();
  453. } else {
  454. vertex_code0 = code.substr(0, cpos).ascii();
  455. code = code.substr(cpos + globals_tag.length(), code.length());
  456. cpos = code.find(code_tag);
  457. if (cpos == -1) {
  458. vertex_code1 = code.ascii();
  459. } else {
  460. vertex_code1 = code.substr(0, cpos).ascii();
  461. vertex_code2 = code.substr(cpos + code_tag.length(), code.length()).ascii();
  462. }
  463. }
  464. }
  465. {
  466. String globals_tag = "\nFRAGMENT_SHADER_GLOBALS";
  467. String code_tag = "\nFRAGMENT_SHADER_CODE";
  468. String light_code_tag = "\nLIGHT_SHADER_CODE";
  469. String code = fragment_code;
  470. int cpos = code.find(globals_tag);
  471. if (cpos == -1) {
  472. fragment_code0 = code.ascii();
  473. } else {
  474. fragment_code0 = code.substr(0, cpos).ascii();
  475. code = code.substr(cpos + globals_tag.length(), code.length());
  476. cpos = code.find(code_tag);
  477. if (cpos == -1) {
  478. fragment_code1 = code.ascii();
  479. } else {
  480. fragment_code1 = code.substr(0, cpos).ascii();
  481. String code2 = code.substr(cpos + code_tag.length(), code.length());
  482. cpos = code2.find(light_code_tag);
  483. if (cpos == -1) {
  484. fragment_code2 = code2.ascii();
  485. } else {
  486. fragment_code2 = code2.substr(0, cpos).ascii();
  487. fragment_code3 = code2.substr(cpos + light_code_tag.length(), code2.length()).ascii();
  488. }
  489. }
  490. }
  491. }
  492. glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_image_units);
  493. }
  494. void ShaderGLES2::finish() {
  495. const VersionKey *V = NULL;
  496. while ((V = version_map.next(V))) {
  497. Version &v = version_map[*V];
  498. glDeleteShader(v.vert_id);
  499. glDeleteShader(v.frag_id);
  500. glDeleteProgram(v.id);
  501. memdelete_arr(v.uniform_location);
  502. }
  503. }
  504. void ShaderGLES2::clear_caches() {
  505. const VersionKey *V = NULL;
  506. while ((V = version_map.next(V))) {
  507. Version &v = version_map[*V];
  508. glDeleteShader(v.vert_id);
  509. glDeleteShader(v.frag_id);
  510. glDeleteProgram(v.id);
  511. memdelete_arr(v.uniform_location);
  512. }
  513. version_map.clear();
  514. custom_code_map.clear();
  515. version = NULL;
  516. last_custom_code = 1;
  517. uniforms_dirty = true;
  518. }
  519. uint32_t ShaderGLES2::create_custom_shader() {
  520. custom_code_map[last_custom_code] = CustomCode();
  521. custom_code_map[last_custom_code].version = 1;
  522. return last_custom_code++;
  523. }
  524. void ShaderGLES2::set_custom_shader_code(uint32_t p_code_id,
  525. const String &p_vertex,
  526. const String &p_vertex_globals,
  527. const String &p_fragment,
  528. const String &p_light,
  529. const String &p_fragment_globals,
  530. const Vector<StringName> &p_uniforms,
  531. const Vector<StringName> &p_texture_uniforms,
  532. const Vector<CharString> &p_custom_defines) {
  533. CustomCode *cc = custom_code_map.getptr(p_code_id);
  534. ERR_FAIL_COND(!cc);
  535. cc->vertex = p_vertex;
  536. cc->vertex_globals = p_vertex_globals;
  537. cc->fragment = p_fragment;
  538. cc->fragment_globals = p_fragment_globals;
  539. cc->light = p_light;
  540. cc->custom_uniforms = p_uniforms;
  541. cc->custom_defines = p_custom_defines;
  542. cc->texture_uniforms = p_texture_uniforms;
  543. cc->version++;
  544. }
  545. void ShaderGLES2::set_custom_shader(uint32_t p_code_id) {
  546. new_conditional_version.code_version = p_code_id;
  547. }
  548. void ShaderGLES2::free_custom_shader(uint32_t p_code_id) {
  549. ERR_FAIL_COND(!custom_code_map.has(p_code_id));
  550. if (conditional_version.code_version == p_code_id)
  551. conditional_version.code_version = 0;
  552. custom_code_map.erase(p_code_id);
  553. }
  554. void ShaderGLES2::use_material(void *p_material) {
  555. RasterizerStorageGLES2::Material *material = (RasterizerStorageGLES2::Material *)p_material;
  556. if (!material) {
  557. return;
  558. }
  559. if (!material->shader) {
  560. return;
  561. }
  562. Version *v = version_map.getptr(conditional_version);
  563. CustomCode *cc = NULL;
  564. if (v) {
  565. cc = custom_code_map.getptr(v->code_version);
  566. }
  567. // bind uniforms
  568. for (Map<StringName, ShaderLanguage::ShaderNode::Uniform>::Element *E = material->shader->uniforms.front(); E; E = E->next()) {
  569. if (E->get().texture_order >= 0)
  570. continue; // this is a texture, doesn't go here
  571. Map<StringName, Variant>::Element *V = material->params.find(E->key());
  572. Pair<ShaderLanguage::DataType, Vector<ShaderLanguage::ConstantNode::Value> > value;
  573. value.first = E->get().type;
  574. value.second = E->get().default_value;
  575. if (V) {
  576. value.second = Vector<ShaderLanguage::ConstantNode::Value>();
  577. value.second.resize(E->get().default_value.size());
  578. switch (E->get().type) {
  579. case ShaderLanguage::TYPE_BOOL: {
  580. if (value.second.size() < 1)
  581. value.second.resize(1);
  582. value.second.write[0].boolean = V->get();
  583. } break;
  584. case ShaderLanguage::TYPE_BVEC2: {
  585. if (value.second.size() < 2)
  586. value.second.resize(2);
  587. int flags = V->get();
  588. value.second.write[0].boolean = flags & 1;
  589. value.second.write[1].boolean = flags & 2;
  590. } break;
  591. case ShaderLanguage::TYPE_BVEC3: {
  592. if (value.second.size() < 3)
  593. value.second.resize(3);
  594. int flags = V->get();
  595. value.second.write[0].boolean = flags & 1;
  596. value.second.write[1].boolean = flags & 2;
  597. value.second.write[2].boolean = flags & 4;
  598. } break;
  599. case ShaderLanguage::TYPE_BVEC4: {
  600. if (value.second.size() < 4)
  601. value.second.resize(4);
  602. int flags = V->get();
  603. value.second.write[0].boolean = flags & 1;
  604. value.second.write[1].boolean = flags & 2;
  605. value.second.write[2].boolean = flags & 4;
  606. value.second.write[3].boolean = flags & 8;
  607. } break;
  608. case ShaderLanguage::TYPE_INT: {
  609. if (value.second.size() < 1)
  610. value.second.resize(1);
  611. int val = V->get();
  612. value.second.write[0].sint = val;
  613. } break;
  614. case ShaderLanguage::TYPE_IVEC2: {
  615. if (value.second.size() < 2)
  616. value.second.resize(2);
  617. PoolIntArray val = V->get();
  618. for (int i = 0; i < val.size(); i++) {
  619. value.second.write[i].sint = val[i];
  620. }
  621. } break;
  622. case ShaderLanguage::TYPE_IVEC3: {
  623. if (value.second.size() < 3)
  624. value.second.resize(3);
  625. PoolIntArray val = V->get();
  626. for (int i = 0; i < val.size(); i++) {
  627. value.second.write[i].sint = val[i];
  628. }
  629. } break;
  630. case ShaderLanguage::TYPE_IVEC4: {
  631. if (value.second.size() < 4)
  632. value.second.resize(4);
  633. PoolIntArray val = V->get();
  634. for (int i = 0; i < val.size(); i++) {
  635. value.second.write[i].sint = val[i];
  636. }
  637. } break;
  638. case ShaderLanguage::TYPE_UINT: {
  639. if (value.second.size() < 1)
  640. value.second.resize(1);
  641. uint32_t val = V->get();
  642. value.second.write[0].uint = val;
  643. } break;
  644. case ShaderLanguage::TYPE_UVEC2: {
  645. if (value.second.size() < 2)
  646. value.second.resize(2);
  647. PoolIntArray val = V->get();
  648. for (int i = 0; i < val.size(); i++) {
  649. value.second.write[i].uint = val[i];
  650. }
  651. } break;
  652. case ShaderLanguage::TYPE_UVEC3: {
  653. if (value.second.size() < 3)
  654. value.second.resize(3);
  655. PoolIntArray val = V->get();
  656. for (int i = 0; i < val.size(); i++) {
  657. value.second.write[i].uint = val[i];
  658. }
  659. } break;
  660. case ShaderLanguage::TYPE_UVEC4: {
  661. if (value.second.size() < 4)
  662. value.second.resize(4);
  663. PoolIntArray val = V->get();
  664. for (int i = 0; i < val.size(); i++) {
  665. value.second.write[i].uint = val[i];
  666. }
  667. } break;
  668. case ShaderLanguage::TYPE_FLOAT: {
  669. if (value.second.size() < 1)
  670. value.second.resize(1);
  671. value.second.write[0].real = V->get();
  672. } break;
  673. case ShaderLanguage::TYPE_VEC2: {
  674. if (value.second.size() < 2)
  675. value.second.resize(2);
  676. Vector2 val = V->get();
  677. value.second.write[0].real = val.x;
  678. value.second.write[1].real = val.y;
  679. } break;
  680. case ShaderLanguage::TYPE_VEC3: {
  681. if (value.second.size() < 3)
  682. value.second.resize(3);
  683. Vector3 val = V->get();
  684. value.second.write[0].real = val.x;
  685. value.second.write[1].real = val.y;
  686. value.second.write[2].real = val.z;
  687. } break;
  688. case ShaderLanguage::TYPE_VEC4: {
  689. if (value.second.size() < 4)
  690. value.second.resize(4);
  691. if (V->get().get_type() == Variant::PLANE) {
  692. Plane val = V->get();
  693. value.second.write[0].real = val.normal.x;
  694. value.second.write[1].real = val.normal.y;
  695. value.second.write[2].real = val.normal.z;
  696. value.second.write[3].real = val.d;
  697. } else {
  698. Color val = V->get();
  699. value.second.write[0].real = val.r;
  700. value.second.write[1].real = val.g;
  701. value.second.write[2].real = val.b;
  702. value.second.write[3].real = val.a;
  703. }
  704. } break;
  705. case ShaderLanguage::TYPE_MAT2: {
  706. Transform2D val = V->get();
  707. if (value.second.size() < 4) {
  708. value.second.resize(4);
  709. }
  710. value.second.write[0].real = val.elements[0][0];
  711. value.second.write[1].real = val.elements[0][1];
  712. value.second.write[2].real = val.elements[1][0];
  713. value.second.write[3].real = val.elements[1][1];
  714. } break;
  715. case ShaderLanguage::TYPE_MAT3: {
  716. Basis val = V->get();
  717. if (value.second.size() < 9) {
  718. value.second.resize(9);
  719. }
  720. value.second.write[0].real = val.elements[0][0];
  721. value.second.write[1].real = val.elements[0][1];
  722. value.second.write[2].real = val.elements[0][2];
  723. value.second.write[3].real = val.elements[1][0];
  724. value.second.write[4].real = val.elements[1][1];
  725. value.second.write[5].real = val.elements[1][2];
  726. value.second.write[6].real = val.elements[2][0];
  727. value.second.write[7].real = val.elements[2][1];
  728. value.second.write[8].real = val.elements[2][2];
  729. } break;
  730. case ShaderLanguage::TYPE_MAT4: {
  731. Transform val = V->get();
  732. if (value.second.size() < 16) {
  733. value.second.resize(16);
  734. }
  735. value.second.write[0].real = val.basis.elements[0][0];
  736. value.second.write[1].real = val.basis.elements[0][1];
  737. value.second.write[2].real = val.basis.elements[0][2];
  738. value.second.write[3].real = 0;
  739. value.second.write[4].real = val.basis.elements[1][0];
  740. value.second.write[5].real = val.basis.elements[1][1];
  741. value.second.write[6].real = val.basis.elements[1][2];
  742. value.second.write[7].real = 0;
  743. value.second.write[8].real = val.basis.elements[2][0];
  744. value.second.write[9].real = val.basis.elements[2][1];
  745. value.second.write[10].real = val.basis.elements[2][2];
  746. value.second.write[11].real = 0;
  747. value.second.write[12].real = val.origin[0];
  748. value.second.write[13].real = val.origin[1];
  749. value.second.write[14].real = val.origin[2];
  750. value.second.write[15].real = 1;
  751. } break;
  752. default: {
  753. } break;
  754. }
  755. } else {
  756. if (value.second.size() == 0) {
  757. // No default value set... weird, let's just use zero for everything
  758. size_t default_arg_size = 1;
  759. bool is_float = false;
  760. switch (E->get().type) {
  761. case ShaderLanguage::TYPE_BOOL:
  762. case ShaderLanguage::TYPE_INT:
  763. case ShaderLanguage::TYPE_UINT: {
  764. default_arg_size = 1;
  765. } break;
  766. case ShaderLanguage::TYPE_FLOAT: {
  767. default_arg_size = 1;
  768. is_float = true;
  769. } break;
  770. case ShaderLanguage::TYPE_BVEC2:
  771. case ShaderLanguage::TYPE_IVEC2:
  772. case ShaderLanguage::TYPE_UVEC2: {
  773. default_arg_size = 2;
  774. } break;
  775. case ShaderLanguage::TYPE_VEC2: {
  776. default_arg_size = 2;
  777. is_float = true;
  778. } break;
  779. case ShaderLanguage::TYPE_BVEC3:
  780. case ShaderLanguage::TYPE_IVEC3:
  781. case ShaderLanguage::TYPE_UVEC3: {
  782. default_arg_size = 3;
  783. } break;
  784. case ShaderLanguage::TYPE_VEC3: {
  785. default_arg_size = 3;
  786. is_float = true;
  787. } break;
  788. case ShaderLanguage::TYPE_BVEC4:
  789. case ShaderLanguage::TYPE_IVEC4:
  790. case ShaderLanguage::TYPE_UVEC4: {
  791. default_arg_size = 4;
  792. } break;
  793. case ShaderLanguage::TYPE_VEC4: {
  794. default_arg_size = 4;
  795. is_float = true;
  796. } break;
  797. default: {
  798. // TODO matricies and all that stuff
  799. default_arg_size = 1;
  800. } break;
  801. }
  802. value.second.resize(default_arg_size);
  803. for (int i = 0; i < default_arg_size; i++) {
  804. if (is_float) {
  805. value.second.write[i].real = 0.0;
  806. } else {
  807. value.second.write[i].uint = 0;
  808. }
  809. }
  810. }
  811. }
  812. // GLint location = get_uniform_location(E->key());
  813. GLint location;
  814. if (v->custom_uniform_locations.has(E->key())) {
  815. location = v->custom_uniform_locations[E->key()];
  816. } else {
  817. int idx = v->uniform_names.find(E->key()); // TODO maybe put those in a Map?
  818. if (idx < 0) {
  819. location = -1;
  820. } else {
  821. location = v->uniform_location[idx];
  822. }
  823. }
  824. _set_uniform_value(location, value);
  825. }
  826. // bind textures
  827. int tc = material->textures.size();
  828. Pair<StringName, RID> *textures = material->textures.ptrw();
  829. ShaderLanguage::ShaderNode::Uniform::Hint *texture_hints = material->shader->texture_hints.ptrw();
  830. for (int i = 0; i < tc; i++) {
  831. Pair<ShaderLanguage::DataType, Vector<ShaderLanguage::ConstantNode::Value> > value;
  832. value.first = ShaderLanguage::TYPE_INT;
  833. value.second.resize(1);
  834. value.second.write[0].sint = i;
  835. // GLint location = get_uniform_location(textures[i].first);
  836. // if (location < 0) {
  837. // location = material->shader->uniform_locations[textures[i].first];
  838. // }
  839. GLint location = -1;
  840. if (v->custom_uniform_locations.has(textures[i].first)) {
  841. location = v->custom_uniform_locations[textures[i].first];
  842. } else {
  843. location = get_uniform_location(textures[i].first);
  844. }
  845. _set_uniform_value(location, value);
  846. }
  847. }
  848. void ShaderGLES2::set_base_material_tex_index(int p_idx) {
  849. }
  850. ShaderGLES2::ShaderGLES2() {
  851. version = NULL;
  852. last_custom_code = 1;
  853. uniforms_dirty = true;
  854. }
  855. ShaderGLES2::~ShaderGLES2() {
  856. finish();
  857. }