GLESRenderer.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. /*
  2. Copyright (c) 2013 Daniele Bartolini, Michele Rossi
  3. Copyright (c) 2012 Daniele Bartolini, Simone Boscaratto
  4. Permission is hereby granted, free of charge, to any person
  5. obtaining a copy of this software and associated documentation
  6. files (the "Software"), to deal in the Software without
  7. restriction, including without limitation the rights to use,
  8. copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. copies of the Software, and to permit persons to whom the
  10. Software is furnished to do so, subject to the following
  11. conditions:
  12. The above copyright notice and this permission notice shall be
  13. included in all copies or substantial portions of the Software.
  14. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  15. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  16. OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  17. NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18. HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  19. WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #include "Config.h"
  24. #include <GLES2/gl2.h>
  25. #include <algorithm>
  26. #include "Assert.h"
  27. #include "Types.h"
  28. #include "GLESRenderer.h"
  29. #include "GLESUtils.h"
  30. #include "Log.h"
  31. #include "Material.h"
  32. #include "Vec2.h"
  33. #include "Vec3.h"
  34. #include "Vec4.h"
  35. #include "Mat3.h"
  36. #include "Mat4.h"
  37. #include "Device.h"
  38. #include "ResourceManager.h"
  39. #include "VertexShaderResource.h"
  40. #include "PixelShaderResource.h"
  41. namespace crown
  42. {
  43. //-----------------------------------------------------------------------------
  44. static const char* gl_error_to_string(GLenum error)
  45. {
  46. switch (error)
  47. {
  48. case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
  49. case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
  50. case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
  51. case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
  52. default: return "UNKNOWN_GL_ERROR";
  53. }
  54. }
  55. //-----------------------------------------------------------------------------
  56. #ifdef CROWN_DEBUG
  57. #define GL_CHECK(function)\
  58. function;\
  59. do { GLenum error; CE_ASSERT((error = glGetError()) == GL_NO_ERROR,\
  60. "OpenGL error: %s", gl_error_to_string(error)); } while (0)
  61. #else
  62. #define GL_CHECK(function)\
  63. function;
  64. #endif
  65. //-----------------------------------------------------------------------------
  66. GLESRenderer::GLESRenderer() :
  67. m_max_texture_size(0),
  68. m_max_texture_units(0),
  69. m_max_vertex_indices(0),
  70. m_max_vertex_vertices(0),
  71. m_max_anisotropy(0.0f),
  72. m_ambient_light_color(Color4::GRAY),
  73. m_textures_id_table(m_allocator, MAX_TEXTURES),
  74. m_active_texture_unit(0),
  75. m_vertex_buffers_id_table(m_allocator, MAX_VERTEX_BUFFERS),
  76. m_index_buffers_id_table(m_allocator, MAX_INDEX_BUFFERS),
  77. m_vertex_shaders_id_table(m_allocator, MAX_VERTEX_SHADERS),
  78. m_pixel_shaders_id_table(m_allocator, MAX_PIXEL_SHADERS),
  79. m_gpu_programs_id_table(m_allocator, 128)
  80. //m_render_buffers_id_table(m_allocator, MAX_RENDER_BUFFERS)
  81. {
  82. m_min_max_point_size[0] = 0.0f;
  83. m_min_max_point_size[1] = 0.0f;
  84. m_min_max_line_width[0] = 0.0f;
  85. m_min_max_line_width[1] = 0.0f;
  86. // Initialize viewport and scissor
  87. m_viewport[0] = 0;
  88. m_viewport[1] = 0;
  89. m_viewport[2] = 0;
  90. m_viewport[3] = 0;
  91. m_scissor[0] = 0;
  92. m_scissor[1] = 0;
  93. m_scissor[2] = 0;
  94. m_scissor[3] = 0;
  95. // Initialize texture units
  96. for (uint32_t i = 0; i < MAX_TEXTURE_UNITS; i++)
  97. {
  98. m_texture_unit[i] = 0;
  99. m_texture_unit_target[i] = GL_TEXTURE_2D;
  100. }
  101. // Initialize the matrices
  102. for (uint32_t i = 0; i < MT_COUNT; i++)
  103. {
  104. m_matrix[i].load_identity();
  105. }
  106. m_model_view_matrix.load_identity();
  107. m_model_view_projection_matrix.load_identity();
  108. }
  109. //-----------------------------------------------------------------------------
  110. GLESRenderer::~GLESRenderer()
  111. {
  112. }
  113. //-----------------------------------------------------------------------------
  114. void GLESRenderer::init()
  115. {
  116. m_context.create_context();
  117. GL_CHECK(glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_max_texture_size));
  118. GL_CHECK(glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &m_max_texture_units));
  119. //glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &m_max_vertex_indices);
  120. //glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &m_max_vertex_vertices);
  121. GL_CHECK(glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, &m_min_max_point_size[0]));
  122. //glGetFloatv(GL_LINE_WIDTH_RANGE, &m_min_max_line_width[0]);
  123. Log::i("OpenGL Vendor\t: %s", glGetString(GL_VENDOR));
  124. Log::i("OpenGL Renderer\t: %s", glGetString(GL_RENDERER));
  125. Log::i("OpenGL Version\t: %s", glGetString(GL_VERSION));
  126. Log::d("Min Point Size\t: %f", m_min_max_point_size[0]);
  127. Log::d("Max Point Size\t: %f", m_min_max_point_size[1]);
  128. Log::d("Min Line Width\t: %f", m_min_max_line_width[0]);
  129. Log::d("Max Line Width\t: %f", m_min_max_line_width[1]);
  130. Log::d("Max Texture Size\t: %dx%d", m_max_texture_size, m_max_texture_size);
  131. Log::d("Max Texture Units\t: %d", m_max_texture_units);
  132. Log::d("Max Vertex Indices\t: %d", m_max_vertex_indices);
  133. Log::d("Max Vertex Vertices\t: %d", m_max_vertex_vertices);
  134. Log::d("Max Anisotropy\t: %f", m_max_anisotropy);
  135. GL_CHECK(glDisable(GL_BLEND));
  136. GL_CHECK(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
  137. GL_CHECK(glBlendEquation(GL_FUNC_ADD));
  138. GL_CHECK(glFrontFace(GL_CCW));
  139. GL_CHECK(glEnable(GL_CULL_FACE));
  140. // Set the default framebuffer clear color
  141. GL_CHECK(glClearColor(0.5f, 0.5f, 0.5f, 0.5f));
  142. // Enable depth test
  143. GL_CHECK(glEnable(GL_DEPTH_TEST));
  144. GL_CHECK(glDepthFunc(GL_LEQUAL));
  145. GL_CHECK(glClearDepthf(1.0));
  146. // Enable scissor test
  147. GL_CHECK(glEnable(GL_SCISSOR_TEST));
  148. // Disable dithering
  149. GL_CHECK(glDisable(GL_DITHER));
  150. Log::i("OpenGL Renderer initialized.");
  151. load_default_shaders();
  152. }
  153. //-----------------------------------------------------------------------------
  154. void GLESRenderer::shutdown()
  155. {
  156. unload_default_shaders();
  157. m_context.destroy_context();
  158. }
  159. //-----------------------------------------------------------------------------
  160. VertexBufferId GLESRenderer::create_vertex_buffer(size_t count, VertexFormat format, const void* vertices)
  161. {
  162. const VertexBufferId id = m_vertex_buffers_id_table.create();
  163. VertexBuffer& buffer = m_vertex_buffers[id.index];
  164. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  165. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  166. GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices, GL_STATIC_DRAW));
  167. buffer.count = count;
  168. buffer.format = format;
  169. return id;
  170. }
  171. //-----------------------------------------------------------------------------
  172. VertexBufferId GLESRenderer::create_dynamic_vertex_buffer(size_t count, VertexFormat format, const void* vertices)
  173. {
  174. const VertexBufferId id = m_vertex_buffers_id_table.create();
  175. VertexBuffer& buffer = m_vertex_buffers[id.index];
  176. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  177. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  178. GL_CHECK(glBufferData(GL_ARRAY_BUFFER, count * Vertex::bytes_per_vertex(format), vertices, GL_STREAM_DRAW));
  179. buffer.count = count;
  180. buffer.format = format;
  181. return id;
  182. }
  183. //-----------------------------------------------------------------------------
  184. void GLESRenderer::update_vertex_buffer(VertexBufferId id, size_t offset, size_t count, const void* vertices)
  185. {
  186. CE_ASSERT(m_vertex_buffers_id_table.has(id), "Vertex buffer does not exist");
  187. VertexBuffer& buffer = m_vertex_buffers[id.index];
  188. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, buffer.gl_object));
  189. GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER, offset * Vertex::bytes_per_vertex(buffer.format),
  190. count * Vertex::bytes_per_vertex(buffer.format), vertices));
  191. }
  192. //-----------------------------------------------------------------------------
  193. void GLESRenderer::destroy_vertex_buffer(VertexBufferId id)
  194. {
  195. CE_ASSERT(m_vertex_buffers_id_table.has(id), "Vertex buffer does not exist");
  196. VertexBuffer& buffer = m_vertex_buffers[id.index];
  197. GL_CHECK(glDeleteBuffers(1, &buffer.gl_object));
  198. m_vertex_buffers_id_table.destroy(id);
  199. }
  200. //-----------------------------------------------------------------------------
  201. IndexBufferId GLESRenderer::create_index_buffer(size_t count, const void* indices)
  202. {
  203. const IndexBufferId id = m_index_buffers_id_table.create();
  204. IndexBuffer& buffer = m_index_buffers[id.index];
  205. GL_CHECK(glGenBuffers(1, &buffer.gl_object));
  206. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.gl_object));
  207. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER, count * sizeof(GLushort), indices, GL_STATIC_DRAW));
  208. buffer.index_count = count;
  209. return id;
  210. }
  211. //-----------------------------------------------------------------------------
  212. void GLESRenderer::destroy_index_buffer(IndexBufferId id)
  213. {
  214. CE_ASSERT(m_index_buffers_id_table.has(id), "Index buffer does not exist");
  215. IndexBuffer& buffer = m_index_buffers[id.index];
  216. GL_CHECK(glDeleteBuffers(1, &buffer.gl_object));
  217. m_index_buffers_id_table.destroy(id);
  218. }
  219. //-----------------------------------------------------------------------------
  220. TextureId GLESRenderer::create_texture(uint32_t width, uint32_t height, PixelFormat format, const void* data)
  221. {
  222. const TextureId id = m_textures_id_table.create();
  223. Texture& gl_texture = m_textures[id.index];
  224. GL_CHECK(glGenTextures(1, &gl_texture.gl_object));
  225. GL_CHECK(glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object));
  226. //GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE));
  227. // FIXME
  228. GL_CHECK(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
  229. GLES::pixel_format(format), GL_UNSIGNED_BYTE, data));
  230. gl_texture.format = format;
  231. return id;
  232. }
  233. //-----------------------------------------------------------------------------
  234. void GLESRenderer::update_texture(TextureId id, uint32_t x, uint32_t y, uint32_t width, uint32_t height, const void* data)
  235. {
  236. CE_ASSERT(m_textures_id_table.has(id), "Texture does not exist");
  237. Texture& gl_texture = m_textures[id.index];
  238. GL_CHECK(glBindTexture(GL_TEXTURE_2D, gl_texture.gl_object));
  239. GL_CHECK(glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GLES::pixel_format(gl_texture.format),
  240. GL_UNSIGNED_BYTE, data));
  241. }
  242. //-----------------------------------------------------------------------------
  243. void GLESRenderer::destroy_texture(TextureId id)
  244. {
  245. CE_ASSERT(m_textures_id_table.has(id), "Texture does not exist");
  246. Texture& gl_texture = m_textures[id.index];
  247. GL_CHECK(glDeleteTextures(1, &gl_texture.gl_object));
  248. }
  249. //-----------------------------------------------------------------------------
  250. VertexShaderId GLESRenderer::create_vertex_shader(const char* program)
  251. {
  252. CE_ASSERT(program != NULL, "Program must be != NULL");
  253. const VertexShaderId& id = m_vertex_shaders_id_table.create();
  254. VertexShader& gl_shader = m_vertex_shaders[id.index];
  255. gl_shader.gl_object = GL_CHECK(glCreateShader(GL_VERTEX_SHADER));
  256. GL_CHECK(glShaderSource(gl_shader.gl_object, 1, &program, NULL));
  257. GL_CHECK(glCompileShader(gl_shader.gl_object));
  258. GLint success;
  259. GL_CHECK(glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success));
  260. if (!success)
  261. {
  262. GLchar info_log[256];
  263. GL_CHECK(glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log));
  264. Log::e("Vertex shader compilation failed.");
  265. Log::e("Log: %s", info_log);
  266. CE_ASSERT(0, "");
  267. }
  268. return id;
  269. }
  270. //-----------------------------------------------------------------------------
  271. void GLESRenderer::destroy_vertex_shader(VertexShaderId id)
  272. {
  273. CE_ASSERT(m_vertex_shaders_id_table.has(id), "Vertex shader does not exist");
  274. VertexShader& gl_shader = m_vertex_shaders[id.index];
  275. GL_CHECK(glDeleteShader(gl_shader.gl_object));
  276. }
  277. //-----------------------------------------------------------------------------
  278. PixelShaderId GLESRenderer::create_pixel_shader(const char* program)
  279. {
  280. CE_ASSERT(program != NULL, "Program must be != NULL");
  281. const PixelShaderId& id = m_pixel_shaders_id_table.create();
  282. PixelShader& gl_shader = m_pixel_shaders[id.index];
  283. gl_shader.gl_object = GL_CHECK(glCreateShader(GL_FRAGMENT_SHADER));
  284. GL_CHECK(glShaderSource(gl_shader.gl_object, 1, &program, NULL));
  285. GL_CHECK(glCompileShader(gl_shader.gl_object));
  286. GLint success;
  287. GL_CHECK(glGetShaderiv(gl_shader.gl_object, GL_COMPILE_STATUS, &success));
  288. if (!success)
  289. {
  290. GLchar info_log[256];
  291. GL_CHECK(glGetShaderInfoLog(gl_shader.gl_object, 256, NULL, info_log));
  292. Log::e("Pixel shader compilation failed.");
  293. Log::e("Log: %s", info_log);
  294. CE_ASSERT(0, "");
  295. }
  296. return id;
  297. }
  298. //-----------------------------------------------------------------------------
  299. void GLESRenderer::destroy_pixel_shader(PixelShaderId id)
  300. {
  301. CE_ASSERT(m_pixel_shaders_id_table.has(id), "Pixel shader does not exist");
  302. PixelShader& gl_shader = m_pixel_shaders[id.index];
  303. GL_CHECK(glDeleteShader(gl_shader.gl_object));
  304. }
  305. //-----------------------------------------------------------------------------
  306. GPUProgramId GLESRenderer::create_gpu_program(VertexShaderId vs, PixelShaderId ps)
  307. {
  308. CE_ASSERT(m_vertex_shaders_id_table.has(vs), "Vertex shader does not exist");
  309. CE_ASSERT(m_pixel_shaders_id_table.has(ps), "Pixel shader does not exist");
  310. const GPUProgramId id = m_gpu_programs_id_table.create();
  311. GPUProgram& gl_program = m_gpu_programs[id.index];
  312. gl_program.gl_object = GL_CHECK(glCreateProgram());
  313. GL_CHECK(glAttachShader(gl_program.gl_object, m_vertex_shaders[id.index].gl_object));
  314. GL_CHECK(glAttachShader(gl_program.gl_object, m_pixel_shaders[id.index].gl_object));
  315. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_VERTEX, "vertex"));
  316. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_COORDS, "coords"));
  317. GL_CHECK(glBindAttribLocation(gl_program.gl_object, SA_NORMAL, "normal"));
  318. GL_CHECK(glLinkProgram(gl_program.gl_object));
  319. GLint success;
  320. GL_CHECK(glGetProgramiv(gl_program.gl_object, GL_LINK_STATUS, &success));
  321. if (!success)
  322. {
  323. GLchar info_log[256];
  324. GL_CHECK(glGetProgramInfoLog(gl_program.gl_object, 256, NULL, info_log));
  325. Log::e("GPU program compilation failed.\n");
  326. Log::e("Log: %s", info_log);
  327. }
  328. return id;
  329. }
  330. //-----------------------------------------------------------------------------
  331. void GLESRenderer::destroy_gpu_program(GPUProgramId id)
  332. {
  333. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  334. GPUProgram& gl_program = m_gpu_programs[id.index];
  335. GL_CHECK(glDeleteProgram(gl_program.gl_object));
  336. }
  337. //-----------------------------------------------------------------------------
  338. void GLESRenderer::set_gpu_program_bool_uniform(GPUProgramId id, const char* name, bool value)
  339. {
  340. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  341. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  342. GL_CHECK(glUniform1i(uniform, (GLint) value));
  343. }
  344. //-----------------------------------------------------------------------------
  345. void GLESRenderer::set_gpu_program_int_uniform(GPUProgramId id, const char* name, int value)
  346. {
  347. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  348. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  349. GL_CHECK(glUniform1i(uniform, (GLint) value));
  350. }
  351. //-----------------------------------------------------------------------------
  352. void GLESRenderer::set_gpu_program_vec2_uniform(GPUProgramId id, const char* name, const Vec2& value)
  353. {
  354. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  355. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  356. GL_CHECK(glUniform2fv(uniform, 1, value.to_float_ptr()));
  357. }
  358. //-----------------------------------------------------------------------------
  359. void GLESRenderer::set_gpu_program_vec3_uniform(GPUProgramId id, const char* name, const Vec3& value)
  360. {
  361. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  362. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  363. GL_CHECK(glUniform3fv(uniform, 1, value.to_float_ptr()));
  364. }
  365. //-----------------------------------------------------------------------------
  366. void GLESRenderer::set_gpu_program_vec4_uniform(GPUProgramId id, const char* name, const Vec4& value)
  367. {
  368. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  369. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  370. GL_CHECK(glUniform4fv(uniform, 1, value.to_float_ptr()));
  371. }
  372. //-----------------------------------------------------------------------------
  373. void GLESRenderer::set_gpu_porgram_mat3_uniform(GPUProgramId id, const char* name, const Mat3& value)
  374. {
  375. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  376. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  377. GL_CHECK(glUniformMatrix3fv(uniform, 1, GL_FALSE, value.to_float_ptr()));
  378. }
  379. //-----------------------------------------------------------------------------
  380. void GLESRenderer::set_gpu_program_mat4_uniform(GPUProgramId id, const char* name, const Mat4& value)
  381. {
  382. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  383. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  384. GL_CHECK(glUniformMatrix4fv(uniform, 1, GL_FALSE, value.to_float_ptr()));
  385. }
  386. //-----------------------------------------------------------------------------
  387. void GLESRenderer::set_gpu_program_sampler_uniform(GPUProgramId id, const char* name, uint32_t value)
  388. {
  389. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  390. const GLint uniform = find_gpu_program_uniform(m_gpu_programs[id.index].gl_object, name);
  391. GL_CHECK(glUniform1i(uniform, (GLint) value));
  392. }
  393. //-----------------------------------------------------------------------------
  394. void GLESRenderer::bind_gpu_program(GPUProgramId id) const
  395. {
  396. CE_ASSERT(m_gpu_programs_id_table.has(id), "GPU program does not exist");
  397. const GPUProgram& gl_program = m_gpu_programs[id.index];
  398. GL_CHECK(glUseProgram(gl_program.gl_object));
  399. }
  400. //-----------------------------------------------------------------------------
  401. void GLESRenderer::set_clear_color(const Color4& color)
  402. {
  403. GL_CHECK(glClearColor(color.r, color.g, color.b, color.a));
  404. }
  405. //-----------------------------------------------------------------------------
  406. void GLESRenderer::set_ambient_light(const Color4& color)
  407. {
  408. m_ambient_light_color = color;
  409. }
  410. //-----------------------------------------------------------------------------
  411. void GLESRenderer::bind_texture(uint32_t unit, TextureId texture)
  412. {
  413. CE_ASSERT(m_textures_id_table.has(texture), "Texture does not exist");
  414. if (!activate_texture_unit(unit))
  415. {
  416. return;
  417. }
  418. m_texture_unit_target[unit] = GL_TEXTURE_2D;
  419. m_texture_unit[unit] = m_textures[texture.index].gl_object;
  420. GL_CHECK(glEnable(m_texture_unit_target[unit]));
  421. GL_CHECK(glBindTexture(m_texture_unit_target[unit], m_texture_unit[unit]));
  422. }
  423. //-----------------------------------------------------------------------------
  424. void GLESRenderer::set_texturing(uint32_t unit, bool texturing)
  425. {
  426. if (!activate_texture_unit(unit))
  427. return;
  428. if (texturing)
  429. {
  430. GL_CHECK(glEnable(m_texture_unit_target[unit]));
  431. }
  432. else
  433. {
  434. GL_CHECK(glDisable(m_texture_unit_target[unit]));
  435. }
  436. }
  437. //-----------------------------------------------------------------------------
  438. void GLESRenderer::set_texture_wrap(uint32_t unit, TextureWrap wrap)
  439. {
  440. GLenum gl_wrap = GLES::texture_wrap(wrap);
  441. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_WRAP_S, gl_wrap));
  442. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_WRAP_T, gl_wrap));
  443. }
  444. //-----------------------------------------------------------------------------
  445. void GLESRenderer::set_texture_filter(uint32_t unit, TextureFilter filter)
  446. {
  447. if (!activate_texture_unit(unit))
  448. return;
  449. GLint min_filter;
  450. GLint mag_filter;
  451. GLES::texture_filter(filter, min_filter, mag_filter);
  452. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_MIN_FILTER, min_filter));
  453. GL_CHECK(glTexParameteri(m_texture_unit_target[unit], GL_TEXTURE_MAG_FILTER, mag_filter));
  454. }
  455. //-----------------------------------------------------------------------------
  456. void GLESRenderer::set_backface_culling(bool culling)
  457. {
  458. if (culling)
  459. {
  460. GL_CHECK(glEnable(GL_CULL_FACE));
  461. }
  462. else
  463. {
  464. GL_CHECK(glDisable(GL_CULL_FACE));
  465. }
  466. }
  467. //-----------------------------------------------------------------------------
  468. void GLESRenderer::set_depth_test(bool test)
  469. {
  470. if (test)
  471. {
  472. GL_CHECK(glEnable(GL_DEPTH_TEST));
  473. }
  474. else
  475. {
  476. GL_CHECK(glDisable(GL_DEPTH_TEST));
  477. }
  478. }
  479. //-----------------------------------------------------------------------------
  480. void GLESRenderer::set_depth_write(bool write)
  481. {
  482. GL_CHECK(glDepthMask((GLboolean) write));
  483. }
  484. //-----------------------------------------------------------------------------
  485. void GLESRenderer::set_depth_func(CompareFunction func)
  486. {
  487. GLenum gl_func = GLES::compare_function(func);
  488. GL_CHECK(glDepthFunc(gl_func));
  489. }
  490. //-----------------------------------------------------------------------------
  491. void GLESRenderer::set_blending(bool blending)
  492. {
  493. if (blending)
  494. {
  495. GL_CHECK(glEnable(GL_BLEND));
  496. }
  497. else
  498. {
  499. GL_CHECK(glDisable(GL_BLEND));
  500. }
  501. }
  502. //-----------------------------------------------------------------------------
  503. void GLESRenderer::set_blending_params(BlendEquation equation, BlendFunction src, BlendFunction dst, const Color4& color)
  504. {
  505. GLenum gl_equation = GLES::blend_equation(equation);
  506. GL_CHECK(glBlendEquation(gl_equation));
  507. GLenum gl_src_factor = GLES::blend_function(src);
  508. GLenum gl_dst_factor = GLES::blend_function(dst);
  509. GL_CHECK(glBlendFunc(gl_src_factor, gl_dst_factor));
  510. GL_CHECK(glBlendColor(color.r, color.g, color.b, color.a));
  511. }
  512. //-----------------------------------------------------------------------------
  513. void GLESRenderer::set_color_write(bool write)
  514. {
  515. if (write)
  516. {
  517. GL_CHECK(glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE));
  518. }
  519. else
  520. {
  521. GL_CHECK(glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE));
  522. }
  523. }
  524. //-----------------------------------------------------------------------------
  525. void GLESRenderer::set_front_face(FrontFace face)
  526. {
  527. const GLenum gl_face = (face == FF_CCW) ? GL_CCW : GL_CW;
  528. GL_CHECK(glFrontFace(gl_face));
  529. }
  530. //-----------------------------------------------------------------------------
  531. void GLESRenderer::set_viewport_params(int32_t x, int32_t y, int32_t width, int32_t height)
  532. {
  533. m_viewport[0] = x;
  534. m_viewport[1] = y;
  535. m_viewport[2] = width;
  536. m_viewport[3] = height;
  537. GL_CHECK(glViewport(x, y, width, height));
  538. }
  539. //-----------------------------------------------------------------------------
  540. void GLESRenderer::get_viewport_params(int32_t& x, int32_t& y, int32_t& width, int32_t& height)
  541. {
  542. x = m_viewport[0];
  543. y = m_viewport[1];
  544. width = m_viewport[2];
  545. height = m_viewport[3];
  546. }
  547. //-----------------------------------------------------------------------------
  548. void GLESRenderer::set_scissor(bool scissor)
  549. {
  550. if (scissor)
  551. {
  552. GL_CHECK(glEnable(GL_SCISSOR_TEST));
  553. }
  554. else
  555. {
  556. GL_CHECK(glDisable(GL_SCISSOR_TEST));
  557. }
  558. }
  559. //-----------------------------------------------------------------------------
  560. void GLESRenderer::set_scissor_params(int32_t x, int32_t y, int32_t width, int32_t height)
  561. {
  562. m_scissor[0] = x;
  563. m_scissor[1] = y;
  564. m_scissor[2] = width;
  565. m_scissor[3] = height;
  566. GL_CHECK(glScissor(x, y, width, height));
  567. }
  568. //-----------------------------------------------------------------------------
  569. void GLESRenderer::get_scissor_params(int32_t& x, int32_t& y, int32_t& width, int32_t& height)
  570. {
  571. x = m_scissor[0];
  572. y = m_scissor[1];
  573. width = m_scissor[2];
  574. height = m_scissor[3];
  575. }
  576. //-----------------------------------------------------------------------------
  577. void GLESRenderer::frame()
  578. {
  579. // Clear frame/depth buffer
  580. GL_CHECK(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
  581. // Bind the default gpu program
  582. bind_gpu_program(m_default_gpu_program);
  583. set_gpu_program_mat4_uniform(m_default_gpu_program, "mvp_matrix", m_model_view_projection_matrix);
  584. GL_CHECK(glFinish());
  585. m_context.swap_buffers();
  586. }
  587. //-----------------------------------------------------------------------------
  588. Mat4 GLESRenderer::get_matrix(MatrixType type) const
  589. {
  590. return m_matrix[type];
  591. }
  592. //-----------------------------------------------------------------------------
  593. void GLESRenderer::set_matrix(MatrixType type, const Mat4& matrix)
  594. {
  595. m_matrix[type] = matrix;
  596. switch (type)
  597. {
  598. case MT_VIEW:
  599. case MT_MODEL:
  600. {
  601. m_model_view_matrix = m_matrix[MT_VIEW] * m_matrix[MT_MODEL];
  602. break;
  603. }
  604. case MT_PROJECTION:
  605. {
  606. m_model_view_projection_matrix = m_matrix[MT_PROJECTION] * m_model_view_matrix;
  607. break;
  608. }
  609. default:
  610. {
  611. break;
  612. CE_ASSERT(0, "");
  613. }
  614. }
  615. }
  616. //-----------------------------------------------------------------------------
  617. void GLESRenderer::bind_vertex_buffer(VertexBufferId vb) const
  618. {
  619. CE_ASSERT(m_vertex_buffers_id_table.has(vb), "Vertex buffer does not exist");
  620. const VertexBuffer& vertex_buffer = m_vertex_buffers[vb.index];
  621. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer.gl_object));
  622. switch (vertex_buffer.format)
  623. {
  624. case VF_XY_FLOAT_32:
  625. {
  626. GL_CHECK(glEnableVertexAttribArray(SA_VERTEX));
  627. GL_CHECK(glVertexAttribPointer(SA_VERTEX, 2, GL_FLOAT, GL_FALSE, 0, 0));
  628. break;
  629. }
  630. case VF_XYZ_FLOAT_32:
  631. {
  632. GL_CHECK(glEnableVertexAttribArray(SA_VERTEX));
  633. GL_CHECK(glVertexAttribPointer(SA_VERTEX, 3, GL_FLOAT, GL_FALSE, 0, 0));
  634. break;
  635. }
  636. case VF_UV_FLOAT_32:
  637. {
  638. GL_CHECK(glEnableVertexAttribArray(SA_COORDS));
  639. GL_CHECK(glVertexAttribPointer(SA_COORDS, 2, GL_FLOAT, GL_FALSE, 0, 0));
  640. break;
  641. }
  642. case VF_UVT_FLOAT_32:
  643. {
  644. GL_CHECK(glEnableVertexAttribArray(SA_COORDS));
  645. GL_CHECK(glVertexAttribPointer(SA_COORDS, 3, GL_FLOAT, GL_FALSE, 0, 0));
  646. break;
  647. }
  648. case VF_XYZ_NORMAL_FLOAT_32:
  649. {
  650. GL_CHECK(glEnableVertexAttribArray(SA_NORMAL));
  651. GL_CHECK(glVertexAttribPointer(SA_NORMAL, 3, GL_FLOAT, GL_FALSE, 0, 0));
  652. break;
  653. }
  654. case VF_XYZ_UV_XYZ_NORMAL_FLOAT_32:
  655. {
  656. break;
  657. }
  658. default:
  659. {
  660. CE_ASSERT(0, "Vertex format unknown");
  661. break;
  662. }
  663. }
  664. }
  665. //-----------------------------------------------------------------------------
  666. void GLESRenderer::draw_triangles(IndexBufferId id) const
  667. {
  668. CE_ASSERT(m_index_buffers_id_table.has(id), "Index buffer does not exist");
  669. const IndexBuffer& index_buffer = m_index_buffers[id.index];
  670. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer.gl_object));
  671. GL_CHECK(glDrawElements(GL_TRIANGLES, index_buffer.index_count, GL_UNSIGNED_SHORT, 0));
  672. }
  673. //-----------------------------------------------------------------------------
  674. // void GLESRenderer::bind_render_buffer(RenderBufferId id) const
  675. // {
  676. // CE_ASSERT(m_render_buffers_id_table.has(id), "Render buffer does not exist");
  677. // const GLRenderBuffer& render_buffer = m_render_buffers[id.index];
  678. // }
  679. //-----------------------------------------------------------------------------
  680. void GLESRenderer::draw_lines(const float* vertices, const float* colors, uint32_t count)
  681. {
  682. // GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0));
  683. // GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
  684. // GL_CHECK(glEnableClientState(GL_VERTEX_ARRAY));
  685. // GL_CHECK(glEnableClientState(GL_COLOR_ARRAY));
  686. // GL_CHECK(glVertexPointer(3, GL_FLOAT, 0, vertices));
  687. // GL_CHECK(glColorPointer(4, GL_FLOAT, 0, colors));
  688. // GL_CHECK(glDrawArrays(GL_LINES, 0, count));
  689. // GL_CHECK(glDisableClientState(GL_COLOR_ARRAY));
  690. // GL_CHECK(glDisableClientState(GL_VERTEX_ARRAY));
  691. }
  692. //-----------------------------------------------------------------------------
  693. void GLESRenderer::load_default_shaders()
  694. {
  695. static const char* vs_text =
  696. "attribute vec4 vertex;"
  697. "attribute vec2 coords;"
  698. "uniform mat4 mvp_matrix;"
  699. "void main(void)"
  700. "{"
  701. " gl_Position = mvp_matrix * vertex;"
  702. "}";
  703. static const char* ps_text =
  704. "void main(void)"
  705. "{"
  706. " gl_FragColor = vec4(1, 0, 0, 0);"
  707. "}";
  708. m_default_vertex_shader = create_vertex_shader(vs_text);
  709. m_default_pixel_shader = create_pixel_shader(ps_text);
  710. // Create and bind the default program
  711. m_default_gpu_program = create_gpu_program(m_default_vertex_shader, m_default_pixel_shader);
  712. }
  713. //-----------------------------------------------------------------------------
  714. void GLESRenderer::unload_default_shaders()
  715. {
  716. destroy_pixel_shader(m_default_pixel_shader);
  717. destroy_vertex_shader(m_default_vertex_shader);
  718. destroy_gpu_program(m_default_gpu_program);
  719. }
  720. //-----------------------------------------------------------------------------
  721. void GLESRenderer::reload_default_shaders()
  722. {
  723. }
  724. //-----------------------------------------------------------------------------
  725. bool GLESRenderer::activate_texture_unit(uint32_t unit)
  726. {
  727. if (unit >= (uint32_t) m_max_texture_units)
  728. {
  729. return false;
  730. }
  731. GL_CHECK(glActiveTexture(GL_TEXTURE0 + unit));
  732. m_active_texture_unit = unit;
  733. return true;
  734. }
  735. //-----------------------------------------------------------------------------
  736. GLint GLESRenderer::find_gpu_program_uniform(GLuint program, const char* name) const
  737. {
  738. GLint uniform = GL_CHECK(glGetUniformLocation(program, name));
  739. CE_ASSERT(uniform != -1, "Uniform does not exist");
  740. return uniform;
  741. }
  742. //-----------------------------------------------------------------------------
  743. Renderer* Renderer::create(Allocator& a)
  744. {
  745. return CE_NEW(a, GLESRenderer);
  746. }
  747. //-----------------------------------------------------------------------------
  748. void Renderer::destroy(Allocator& a, Renderer* renderer)
  749. {
  750. CE_DELETE(a, renderer);
  751. }
  752. } // namespace crown