2
0

AndroidGL.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757
  1. /*
  2. * Copyright (c) 2009-2021 jMonkeyEngine
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are
  7. * met:
  8. *
  9. * * Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. *
  12. * * Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. *
  16. * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
  17. * may be used to endorse or promote products derived from this software
  18. * without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  21. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
  22. * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  23. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  24. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  25. * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  26. * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  27. * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
  28. * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
  29. * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  30. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. package com.jme3.renderer.android;
  33. import android.opengl.*;
  34. import com.jme3.renderer.RendererException;
  35. import com.jme3.renderer.opengl.*;
  36. import com.jme3.util.BufferUtils;
  37. import java.nio.Buffer;
  38. import java.nio.ByteBuffer;
  39. import java.nio.FloatBuffer;
  40. import java.nio.IntBuffer;
  41. import java.nio.ShortBuffer;
  42. public class AndroidGL implements GL, GL2, GLES_30, GLExt, GLFbo {
  43. IntBuffer tmpBuff = BufferUtils.createIntBuffer(1);
  44. IntBuffer tmpBuff16 = BufferUtils.createIntBuffer(16);
  45. @Override
  46. public void resetStats() {
  47. }
  48. private static int getLimitBytes(ByteBuffer buffer) {
  49. checkLimit(buffer);
  50. return buffer.limit();
  51. }
  52. private static int getLimitBytes(ShortBuffer buffer) {
  53. checkLimit(buffer);
  54. return buffer.limit() * 2;
  55. }
  56. private static int getLimitBytes(IntBuffer buffer) {
  57. checkLimit(buffer);
  58. return buffer.limit() * 4;
  59. }
  60. private static int getLimitBytes(FloatBuffer buffer) {
  61. checkLimit(buffer);
  62. return buffer.limit() * 4;
  63. }
  64. private static int getLimitCount(Buffer buffer, int elementSize) {
  65. checkLimit(buffer);
  66. return buffer.limit() / elementSize;
  67. }
  68. private static void checkLimit(Buffer buffer) {
  69. if (buffer == null) {
  70. return;
  71. }
  72. if (buffer.limit() == 0) {
  73. throw new RendererException("Attempting to upload empty buffer (limit = 0), that's an error");
  74. }
  75. if (buffer.remaining() == 0) {
  76. throw new RendererException("Attempting to upload empty buffer (remaining = 0), that's an error");
  77. }
  78. }
  79. @Override
  80. public void glActiveTexture(int texture) {
  81. GLES20.glActiveTexture(texture);
  82. }
  83. @Override
  84. public void glAttachShader(int program, int shader) {
  85. GLES20.glAttachShader(program, shader);
  86. }
  87. @Override
  88. public void glBeginQuery(int target, int query) {
  89. GLES30.glBeginQuery(target, query);
  90. }
  91. @Override
  92. public void glBindBuffer(int target, int buffer) {
  93. GLES20.glBindBuffer(target, buffer);
  94. }
  95. @Override
  96. public void glBindTexture(int target, int texture) {
  97. GLES20.glBindTexture(target, texture);
  98. }
  99. @Override
  100. public void glBlendFunc(int sfactor, int dfactor) {
  101. GLES20.glBlendFunc(sfactor, dfactor);
  102. }
  103. @Override
  104. public void glBlendFuncSeparate(int sfactorRGB, int dfactorRGB, int sfactorAlpha, int dfactorAlpha) {
  105. GLES20.glBlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha);
  106. }
  107. @Override
  108. public void glBufferData(int target, FloatBuffer data, int usage) {
  109. GLES20.glBufferData(target, getLimitBytes(data), data, usage);
  110. }
  111. @Override
  112. public void glBufferData(int target, ShortBuffer data, int usage) {
  113. GLES20.glBufferData(target, getLimitBytes(data), data, usage);
  114. }
  115. @Override
  116. public void glBufferData(int target, ByteBuffer data, int usage) {
  117. GLES20.glBufferData(target, getLimitBytes(data), data, usage);
  118. }
  119. @Override
  120. public void glBufferData(int target, long dataSize, int usage) {
  121. GLES20.glBufferData(target, (int) dataSize, null, usage);
  122. }
  123. @Override
  124. public void glBufferSubData(int target, long offset, FloatBuffer data) {
  125. GLES20.glBufferSubData(target, (int) offset, getLimitBytes(data), data);
  126. }
  127. @Override
  128. public void glBufferSubData(int target, long offset, ShortBuffer data) {
  129. GLES20.glBufferSubData(target, (int) offset, getLimitBytes(data), data);
  130. }
  131. @Override
  132. public void glBufferSubData(int target, long offset, ByteBuffer data) {
  133. GLES20.glBufferSubData(target, (int) offset, getLimitBytes(data), data);
  134. }
  135. @Override
  136. public void glGetBufferSubData(int target, long offset, ByteBuffer data) {
  137. throw new UnsupportedOperationException("OpenGL ES 2 does not support glGetBufferSubData");
  138. }
  139. @Override
  140. public void glClear(int mask) {
  141. GLES20.glClear(mask);
  142. }
  143. @Override
  144. public void glClearColor(float red, float green, float blue, float alpha) {
  145. GLES20.glClearColor(red, green, blue, alpha);
  146. }
  147. @Override
  148. public void glColorMask(boolean red, boolean green, boolean blue, boolean alpha) {
  149. GLES20.glColorMask(red, green, blue, alpha);
  150. }
  151. @Override
  152. public void glCompileShader(int shader) {
  153. GLES20.glCompileShader(shader);
  154. }
  155. @Override
  156. public void glCompressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, ByteBuffer data) {
  157. GLES20.glCompressedTexImage2D(target, level, internalformat, width, height, 0, getLimitBytes(data), data);
  158. }
  159. @Override
  160. public void glCompressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, ByteBuffer data) {
  161. GLES20.glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, getLimitBytes(data), data);
  162. }
  163. @Override
  164. public int glCreateProgram() {
  165. return GLES20.glCreateProgram();
  166. }
  167. @Override
  168. public int glCreateShader(int shaderType) {
  169. return GLES20.glCreateShader(shaderType);
  170. }
  171. @Override
  172. public void glCullFace(int mode) {
  173. GLES20.glCullFace(mode);
  174. }
  175. @Override
  176. public void glDeleteBuffers(IntBuffer buffers) {
  177. checkLimit(buffers);
  178. GLES20.glDeleteBuffers(buffers.limit(), buffers);
  179. }
  180. @Override
  181. public void glDeleteProgram(int program) {
  182. GLES20.glDeleteProgram(program);
  183. }
  184. @Override
  185. public void glDeleteShader(int shader) {
  186. GLES20.glDeleteShader(shader);
  187. }
  188. @Override
  189. public void glDeleteTextures(IntBuffer textures) {
  190. checkLimit(textures);
  191. GLES20.glDeleteTextures(textures.limit(), textures);
  192. }
  193. @Override
  194. public void glDepthFunc(int func) {
  195. GLES20.glDepthFunc(func);
  196. }
  197. @Override
  198. public void glDepthMask(boolean flag) {
  199. GLES20.glDepthMask(flag);
  200. }
  201. @Override
  202. public void glDepthRange(double nearVal, double farVal) {
  203. GLES20.glDepthRangef((float)nearVal, (float)farVal);
  204. }
  205. @Override
  206. public void glDetachShader(int program, int shader) {
  207. GLES20.glDetachShader(program, shader);
  208. }
  209. @Override
  210. public void glDisable(int cap) {
  211. GLES20.glDisable(cap);
  212. }
  213. @Override
  214. public void glDisableVertexAttribArray(int index) {
  215. GLES20.glDisableVertexAttribArray(index);
  216. }
  217. @Override
  218. public void glDrawArrays(int mode, int first, int count) {
  219. GLES20.glDrawArrays(mode, first, count);
  220. }
  221. @Override
  222. public void glDrawRangeElements(int mode, int start, int end, int count, int type, long indices) {
  223. GLES20.glDrawElements(mode, count, type, (int)indices);
  224. }
  225. @Override
  226. public void glEnable(int cap) {
  227. GLES20.glEnable(cap);
  228. }
  229. @Override
  230. public void glEnableVertexAttribArray(int index) {
  231. GLES20.glEnableVertexAttribArray(index);
  232. }
  233. @Override
  234. public void glEndQuery(int target) {
  235. GLES30.glEndQuery(target);
  236. }
  237. @Override
  238. public void glGenBuffers(IntBuffer buffers) {
  239. checkLimit(buffers);
  240. GLES20.glGenBuffers(buffers.limit(), buffers);
  241. }
  242. @Override
  243. public void glGenTextures(IntBuffer textures) {
  244. checkLimit(textures);
  245. GLES20.glGenTextures(textures.limit(), textures);
  246. }
  247. @Override
  248. public void glGenQueries(int num, IntBuffer buff) {
  249. GLES30.glGenQueries(num, buff);
  250. }
  251. @Override
  252. public int glGetAttribLocation(int program, String name) {
  253. return GLES20.glGetAttribLocation(program, name);
  254. }
  255. @Override
  256. public void glGetBoolean(int pname, ByteBuffer params) {
  257. // GLES20.glGetBoolean(pname, params);
  258. throw new UnsupportedOperationException("Today is not a good day for this");
  259. }
  260. @Override
  261. public int glGetError() {
  262. return GLES20.glGetError();
  263. }
  264. @Override
  265. public void glGetFloat(int parameterId, FloatBuffer storeValues) {
  266. checkLimit(storeValues);
  267. GLES20.glGetFloatv(parameterId, storeValues);
  268. }
  269. @Override
  270. public void glGetInteger(int pname, IntBuffer params) {
  271. checkLimit(params);
  272. GLES20.glGetIntegerv(pname, params);
  273. }
  274. @Override
  275. public void glGetProgram(int program, int pname, IntBuffer params) {
  276. checkLimit(params);
  277. GLES20.glGetProgramiv(program, pname, params);
  278. }
  279. @Override
  280. public String glGetProgramInfoLog(int program, int maxLength) {
  281. return GLES20.glGetProgramInfoLog(program);
  282. }
  283. @Override
  284. public long glGetQueryObjectui64(int query, int pname) {
  285. IntBuffer buff = IntBuffer.allocate(1);
  286. //FIXME This is wrong IMO should be glGetQueryObjectui64v with a LongBuffer but it seems the API doesn't provide it.
  287. GLES30.glGetQueryObjectuiv(query, pname, buff);
  288. return buff.get(0);
  289. }
  290. @Override
  291. public int glGetQueryObjectiv(int query, int pname) {
  292. IntBuffer buff = IntBuffer.allocate(1);
  293. GLES30.glGetQueryiv(query, pname, buff);
  294. return buff.get(0);
  295. }
  296. @Override
  297. public void glGetShader(int shader, int pname, IntBuffer params) {
  298. checkLimit(params);
  299. GLES20.glGetShaderiv(shader, pname, params);
  300. }
  301. @Override
  302. public String glGetShaderInfoLog(int shader, int maxLength) {
  303. return GLES20.glGetShaderInfoLog(shader);
  304. }
  305. @Override
  306. public String glGetString(int name) {
  307. return GLES20.glGetString(name);
  308. }
  309. @Override
  310. public int glGetUniformLocation(int program, String name) {
  311. return GLES20.glGetUniformLocation(program, name);
  312. }
  313. @Override
  314. public boolean glIsEnabled(int cap) {
  315. return GLES20.glIsEnabled(cap);
  316. }
  317. @Override
  318. public void glLineWidth(float width) {
  319. GLES20.glLineWidth(width);
  320. }
  321. @Override
  322. public void glLinkProgram(int program) {
  323. GLES20.glLinkProgram(program);
  324. }
  325. @Override
  326. public void glPixelStorei(int pname, int param) {
  327. GLES20.glPixelStorei(pname, param);
  328. }
  329. @Override
  330. public void glPolygonOffset(float factor, float units) {
  331. GLES20.glPolygonOffset(factor, units);
  332. }
  333. @Override
  334. public void glReadPixels(int x, int y, int width, int height, int format, int type, ByteBuffer data) {
  335. GLES20.glReadPixels(x, y, width, height, format, type, data);
  336. }
  337. @Override
  338. public void glScissor(int x, int y, int width, int height) {
  339. GLES20.glScissor(x, y, width, height);
  340. }
  341. @Override
  342. public void glShaderSource(int shader, String[] string, IntBuffer length) {
  343. if (string.length != 1) {
  344. throw new UnsupportedOperationException("Today is not a good day");
  345. }
  346. GLES20.glShaderSource(shader, string[0]);
  347. }
  348. @Override
  349. public void glStencilFuncSeparate(int face, int func, int ref, int mask) {
  350. GLES20.glStencilFuncSeparate(face, func, ref, mask);
  351. }
  352. @Override
  353. public void glStencilOpSeparate(int face, int sfail, int dpfail, int dppass) {
  354. GLES20.glStencilOpSeparate(face, sfail, dpfail, dppass);
  355. }
  356. @Override
  357. public void glTexImage2D(int target, int level, int internalFormat, int width, int height, int border, int format, int type, ByteBuffer data) {
  358. GLES20.glTexImage2D(target, level, internalFormat, width, height, 0, format, type, data);
  359. }
  360. @Override
  361. public void glTexParameterf(int target, int pname, float param) {
  362. GLES20.glTexParameterf(target, pname, param);
  363. }
  364. @Override
  365. public void glTexParameteri(int target, int pname, int param) {
  366. GLES20.glTexParameteri(target, pname, param);
  367. }
  368. @Override
  369. public void glTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, ByteBuffer data) {
  370. GLES20.glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, data);
  371. }
  372. @Override
  373. public void glUniform1(int location, FloatBuffer value) {
  374. GLES20.glUniform1fv(location, getLimitCount(value, 1), value);
  375. }
  376. @Override
  377. public void glUniform1(int location, IntBuffer value) {
  378. GLES20.glUniform1iv(location, getLimitCount(value, 1), value);
  379. }
  380. @Override
  381. public void glUniform1f(int location, float v0) {
  382. GLES20.glUniform1f(location, v0);
  383. }
  384. @Override
  385. public void glUniform1i(int location, int v0) {
  386. GLES20.glUniform1i(location, v0);
  387. }
  388. @Override
  389. public void glUniform2(int location, IntBuffer value) {
  390. GLES20.glUniform2iv(location, getLimitCount(value, 2), value);
  391. }
  392. @Override
  393. public void glUniform2(int location, FloatBuffer value) {
  394. GLES20.glUniform2fv(location, getLimitCount(value, 2), value);
  395. }
  396. @Override
  397. public void glUniform2f(int location, float v0, float v1) {
  398. GLES20.glUniform2f(location, v0, v1);
  399. }
  400. @Override
  401. public void glUniform3(int location, IntBuffer value) {
  402. GLES20.glUniform3iv(location, getLimitCount(value, 3), value);
  403. }
  404. @Override
  405. public void glUniform3(int location, FloatBuffer value) {
  406. GLES20.glUniform3fv(location, getLimitCount(value, 3), value);
  407. }
  408. @Override
  409. public void glUniform3f(int location, float v0, float v1, float v2) {
  410. GLES20.glUniform3f(location, v0, v1, v2);
  411. }
  412. @Override
  413. public void glUniform4(int location, FloatBuffer value) {
  414. GLES20.glUniform4fv(location, getLimitCount(value, 4), value);
  415. }
  416. @Override
  417. public void glUniform4(int location, IntBuffer value) {
  418. GLES20.glUniform4iv(location, getLimitCount(value, 4), value);
  419. }
  420. @Override
  421. public void glUniform4f(int location, float v0, float v1, float v2, float v3) {
  422. GLES20.glUniform4f(location, v0, v1, v2, v3);
  423. }
  424. @Override
  425. public void glUniformMatrix3(int location, boolean transpose, FloatBuffer value) {
  426. GLES20.glUniformMatrix3fv(location, getLimitCount(value, 3 * 3), transpose, value);
  427. }
  428. @Override
  429. public void glUniformMatrix4(int location, boolean transpose, FloatBuffer value) {
  430. GLES20.glUniformMatrix4fv(location, getLimitCount(value, 4 * 4), transpose, value);
  431. }
  432. @Override
  433. public void glUseProgram(int program) {
  434. GLES20.glUseProgram(program);
  435. }
  436. @Override
  437. public void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, long pointer) {
  438. GLES20.glVertexAttribPointer(index, size, type, normalized, stride, (int)pointer);
  439. }
  440. @Override
  441. public void glViewport(int x, int y, int width, int height) {
  442. GLES20.glViewport(x, y, width, height);
  443. }
  444. @Override
  445. public void glBlitFramebufferEXT(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) {
  446. GLES30.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
  447. }
  448. @Override
  449. public void glBufferData(int target, IntBuffer data, int usage) {
  450. GLES20.glBufferData(target, getLimitBytes(data), data, usage);
  451. }
  452. @Override
  453. public void glBufferSubData(int target, long offset, IntBuffer data) {
  454. GLES20.glBufferSubData(target, (int)offset, getLimitBytes(data), data);
  455. }
  456. @Override
  457. public void glDrawArraysInstancedARB(int mode, int first, int count, int primcount) {
  458. GLES30.glDrawArraysInstanced(mode, first, count, primcount);
  459. }
  460. @Override
  461. public void glDrawBuffers(IntBuffer bufs) {
  462. GLES30.glDrawBuffers(bufs.limit(), bufs);
  463. }
  464. @Override
  465. public void glDrawElementsInstancedARB(int mode, int indicesCount, int type, long indicesBufferOffset, int primcount) {
  466. GLES30.glDrawElementsInstanced(mode, indicesCount, type, (int)indicesBufferOffset, primcount);
  467. }
  468. @Override
  469. public void glGetMultisample(int pname, int index, FloatBuffer val) {
  470. GLES31.glGetMultisamplefv(pname, index, val);
  471. }
  472. @Override
  473. public void glRenderbufferStorageMultisampleEXT(int target, int samples, int internalformat, int width, int height) {
  474. GLES30.glRenderbufferStorageMultisample(target, samples, internalformat, width, height);
  475. }
  476. @Override
  477. public void glTexImage2DMultisample(int target, int samples, int internalformat, int width, int height, boolean fixedSampleLocations) {
  478. GLES31.glTexStorage2DMultisample(target, samples, internalformat, width, height, fixedSampleLocations);
  479. }
  480. @Override
  481. public void glVertexAttribDivisorARB(int index, int divisor) {
  482. GLES30.glVertexAttribDivisor(index, divisor);
  483. }
  484. @Override
  485. public void glBindFramebufferEXT(int param1, int param2) {
  486. GLES20.glBindFramebuffer(param1, param2);
  487. }
  488. @Override
  489. public void glBindRenderbufferEXT(int param1, int param2) {
  490. GLES20.glBindRenderbuffer(param1, param2);
  491. }
  492. @Override
  493. public int glCheckFramebufferStatusEXT(int param1) {
  494. return GLES20.glCheckFramebufferStatus(param1);
  495. }
  496. @Override
  497. public void glDeleteFramebuffersEXT(IntBuffer param1) {
  498. checkLimit(param1);
  499. GLES20.glDeleteFramebuffers(param1.limit(), param1);
  500. }
  501. @Override
  502. public void glDeleteRenderbuffersEXT(IntBuffer param1) {
  503. checkLimit(param1);
  504. GLES20.glDeleteRenderbuffers(param1.limit(), param1);
  505. }
  506. @Override
  507. public void glFramebufferRenderbufferEXT(int param1, int param2, int param3, int param4) {
  508. GLES20.glFramebufferRenderbuffer(param1, param2, param3, param4);
  509. }
  510. @Override
  511. public void glFramebufferTexture2DEXT(int param1, int param2, int param3, int param4, int param5) {
  512. GLES20.glFramebufferTexture2D(param1, param2, param3, param4, param5);
  513. }
  514. @Override
  515. public void glGenFramebuffersEXT(IntBuffer param1) {
  516. checkLimit(param1);
  517. GLES20.glGenFramebuffers(param1.limit(), param1);
  518. }
  519. @Override
  520. public void glGenRenderbuffersEXT(IntBuffer param1) {
  521. checkLimit(param1);
  522. GLES20.glGenRenderbuffers(param1.limit(), param1);
  523. }
  524. @Override
  525. public void glGenerateMipmapEXT(int param1) {
  526. GLES20.glGenerateMipmap(param1);
  527. }
  528. @Override
  529. public void glRenderbufferStorageEXT(int param1, int param2, int param3, int param4) {
  530. GLES20.glRenderbufferStorage(param1, param2, param3, param4);
  531. }
  532. @Override
  533. public void glReadPixels(int x, int y, int width, int height, int format, int type, long offset) {
  534. // TODO: no offset???
  535. GLES20.glReadPixels(x, y, width, height, format, type, null);
  536. }
  537. @Override
  538. public int glClientWaitSync(Object sync, int flags, long timeout) {
  539. throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences");
  540. }
  541. @Override
  542. public void glDeleteSync(Object sync) {
  543. throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences");
  544. }
  545. @Override
  546. public Object glFenceSync(int condition, int flags) {
  547. throw new UnsupportedOperationException("OpenGL ES 2 does not support sync fences");
  548. }
  549. @Override
  550. public void glBlendEquationSeparate(int colorMode, int alphaMode) {
  551. GLES20.glBlendEquationSeparate(colorMode, alphaMode);
  552. }
  553. @Override
  554. public void glFramebufferTextureLayerEXT(int target, int attachment, int texture, int level, int layer) {
  555. GLES30.glFramebufferTextureLayer(target, attachment, texture, level, layer);
  556. }
  557. @Override
  558. public void glAlphaFunc(int func, float ref) {
  559. }
  560. @Override
  561. public void glPointSize(float size) {
  562. }
  563. @Override
  564. public void glPolygonMode(int face, int mode) {
  565. }
  566. // Wrapper to DrawBuffers as there's no DrawBuffer method in GLES
  567. @Override
  568. public void glDrawBuffer(int mode) {
  569. int nBuffers = (mode - GLFbo.GL_COLOR_ATTACHMENT0_EXT) + 1;
  570. if (nBuffers <= 0 || nBuffers > 16) {
  571. throw new IllegalArgumentException("Draw buffer outside range: " + Integer.toHexString(mode));
  572. }
  573. tmpBuff16.clear();
  574. for (int i = 0; i < nBuffers - 1; i++) {
  575. tmpBuff16.put(GL.GL_NONE);
  576. }
  577. tmpBuff16.put(mode);
  578. tmpBuff16.flip();
  579. glDrawBuffers(tmpBuff16);
  580. }
  581. @Override
  582. public void glReadBuffer(int mode) {
  583. GLES30.glReadBuffer(mode);
  584. }
  585. @Override
  586. public void glCompressedTexImage3D(int target, int level, int internalFormat, int width, int height, int depth,
  587. int border, ByteBuffer data) {
  588. GLES30.glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, getLimitBytes(data), data);
  589. }
  590. @Override
  591. public void glCompressedTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width,
  592. int height, int depth, int format, ByteBuffer data) {
  593. GLES30.glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, getLimitBytes(data), data);
  594. }
  595. @Override
  596. public void glTexImage3D(int target, int level, int internalFormat, int width, int height, int depth, int border,
  597. int format, int type, ByteBuffer data) {
  598. GLES30.glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, data);
  599. }
  600. @Override
  601. public void glTexSubImage3D(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height,
  602. int depth, int format, int type, ByteBuffer data) {
  603. GLES30.glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data);
  604. }
  605. @Override
  606. public void glBindVertexArray(int array) {
  607. GLES30.glBindVertexArray(array);
  608. }
  609. @Override
  610. public void glDeleteVertexArrays(IntBuffer arrays) {
  611. GLES30.glDeleteVertexArrays(arrays.limit(),arrays);
  612. }
  613. @Override
  614. public void glGenVertexArrays(IntBuffer arrays) {
  615. GLES30.glGenVertexArrays(arrays.limit(),arrays);
  616. }
  617. }