PageRenderTime 81ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/GT-I5700/gles20/src/glCore.cpp

https://github.com/DE-NISkA/cm_android_vendor_spica
C++ | 3905 lines | 3103 code | 552 blank | 250 comment | 519 complexity | 1bb512e6cd9dc82d173d9e917e59523a MD5 | raw file
  1. /*
  2. *******************************************************************************
  3. *
  4. * SAMSUNG INDIA SOFTWARE OPERATIONS
  5. * Copyright(C) 2006
  6. * ALL RIGHTS RESERVED
  7. *
  8. * This program is proprietary to Samsung India Software Operations Pvt. Ltd.,
  9. * and is protected under International Copyright Act as an unpublished work.Its
  10. * use and disclosure is limited by the terms and conditions of a license agree-
  11. * -ment. It may not be copied or otherwise reproduced or disclosed to persons
  12. * outside the licensee's organization except in accordance with the terms and
  13. * conditions of such an agreement. All copies and reproductions shall be the
  14. * property of Samsung India Software Operations Pvt. Ltd. and must bear this
  15. * notice in its entirety.
  16. *
  17. *******************************************************************************
  18. */
  19. /*
  20. ***************************************************************************//*!
  21. *
  22. * \file glCore.cpp
  23. * \author Sandeep Kakarlapudi (s.kakarla@samsung.com)
  24. * Anurag Ved (anuragv@samsung.com)
  25. * \brief Implementation of Core functionality of GL
  26. *
  27. *//*---------------------------------------------------------------------------
  28. * NOTES:
  29. *
  30. *//*---------------------------------------------------------------------------
  31. * HISTORY:
  32. *
  33. * 07.08.2006 Sandeep Kakarlapudi Initial version from OGL2_glfimg.c
  34. *
  35. *******************************************************************************
  36. */
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <string.h>
  40. //TODO: modify the includes
  41. #include "glState.h"
  42. #include "glFimg.h"
  43. //#include "egl.h"
  44. #include "buffers.h"
  45. #include "pixel.h"
  46. #include "platform.h"
  47. #include "glprof.h"
  48. #include <cutils/log.h>
  49. #include <time.h>
  50. /*
  51. *******************************************************************************
  52. * Global Variable Definitions
  53. *******************************************************************************
  54. */
  55. #ifndef MULTI_CONTEXT
  56. OGLState *pgles2State;
  57. #endif
  58. static GLuint gContextIDCounter = 2000;
  59. #ifdef CACHE_MEM
  60. extern void invalidate_cached_buffer(void);
  61. extern void clean_cached_buffer(void);
  62. extern void clean_invalidate_cached_buffer(void);
  63. #endif
  64. extern int fimgPowerInit(void);
  65. extern int fimgPowerStatus(void);
  66. extern int lock3DCriticalSection(void);
  67. extern int unlock3DCriticalSection(void);
  68. bool stateFlush( OGLState * ctx);
  69. //TODO: Need a cleanup function
  70. static void gfSetFrameBuffer(OGLState* ctx, GLint Width, GLint Height)
  71. {
  72. // GET_GL_STATE(ctx);
  73. ctx->viewport_data.x = 0;
  74. ctx->viewport_data.y = 0;
  75. ctx->viewport_data.w = Width;
  76. ctx->viewport_data.h = Height;
  77. ctx->scissor_test_data.w = Width;
  78. ctx->scissor_test_data.h = Height;
  79. ctx->scissor_test_data.x = 0;
  80. ctx->scissor_test_data.y = 0;
  81. }
  82. static void set_default_values(OGLState* ctx)
  83. {
  84. ctx->version = 20;
  85. ctx->id = gContextIDCounter++;
  86. ctx->init_dimensions = GL_TRUE;
  87. // GLint W_WIDTH = ctx->defFBData.width;
  88. // GLint W_HEIGHT = ctx->defFBData.height;
  89. ctx->sharedState = NULL;
  90. for(int i=0; i<MAX_VERTEX_ATTRIBS; i++)
  91. {
  92. ctx->vertex_attribs[i][0] = ctx->vertex_attribs[i][1] = ctx->vertex_attribs[i][2] = 0.0f;
  93. ctx->vertex_attribs[i][3] = 1.0f;
  94. }
  95. for(int i=0; i<MAX_VERTEX_ATTRIBS; i++)
  96. {
  97. ctx->vertex_attrib_array_data[i].size = 4;
  98. ctx->vertex_attrib_array_data[i].type = GL_FLOAT;
  99. ctx->vertex_attrib_array_data[i].normalized = GL_FALSE;
  100. ctx->vertex_attrib_array_data[i].stride = 0;
  101. ctx->vertex_attrib_array_data[i].ptr = NULL;
  102. ctx->vertex_attrib_array_data[i].enabled = GL_FALSE;
  103. ctx->vertex_attrib_array_data[i].vboID = 0;
  104. ctx->vertex_attrib_array_data[i].vertex_attrib_ptr_binding = NULL;
  105. }
  106. Plat::memset(&(ctx->buffer_object_data),0,sizeof(BufferObjectData));
  107. ctx->depth_range_data.near_depth =0.0f;
  108. ctx->depth_range_data.far_depth =1.0f;
  109. /*
  110. ctx->viewport_data.x = 0;
  111. ctx->viewport_data.y = 0;
  112. ctx->viewport_data.w = W_WIDTH;
  113. ctx->viewport_data.h = W_HEIGHT;
  114. */
  115. ctx->front_face_mode = GL_CCW;
  116. ctx->point_size = 1.0f;
  117. ctx->line_width = 1.0f;
  118. ctx->cull_face_data.is_enabled = GL_FALSE;
  119. ctx->cull_face_data.mode = GL_BACK;
  120. ctx->polygon_offset_data.factor = 0.0;
  121. ctx->polygon_offset_data.units = 0.0;
  122. ctx->polygon_offset_data.is_enabled_fill = GL_FALSE;
  123. ctx->pixel_store_data.pack_alignment = 4;
  124. ctx->pixel_store_data.unpack_alignment = 4;
  125. ctx->sample_coverage_data.is_enabled_alpha_to_coverage = GL_FALSE;
  126. ctx->sample_coverage_data.is_enabled_coverage = GL_FALSE;
  127. ctx->sample_coverage_data.value = 1.0f;
  128. ctx->sample_coverage_data.invert = GL_FALSE;
  129. ctx->stencil_test_data.is_enabled = GL_FALSE;
  130. ctx->stencil_test_data.front_face_func = GL_ALWAYS;
  131. ctx->stencil_test_data.front_face_mask = ~0;
  132. ctx->stencil_test_data.front_face_ref = 0;
  133. ctx->stencil_test_data.front_face_fail = GL_KEEP;
  134. ctx->stencil_test_data.front_face_zfail = GL_KEEP;
  135. ctx->stencil_test_data.front_face_zpass = GL_KEEP;
  136. ctx->stencil_test_data.back_face_func = GL_ALWAYS;
  137. ctx->stencil_test_data.back_face_mask = ~0;
  138. ctx->stencil_test_data.back_face_ref = 0;
  139. ctx->stencil_test_data.back_face_fail = GL_KEEP;
  140. ctx->stencil_test_data.back_face_zfail = GL_KEEP;
  141. ctx->stencil_test_data.back_face_zpass = GL_KEEP;
  142. ctx->blend_data.is_enabled = GL_FALSE;
  143. ctx->blend_data.fn_srcRGB = GL_ONE;
  144. ctx->blend_data.fn_srcAlpha = GL_ONE;
  145. ctx->blend_data.fn_dstRGB = GL_ZERO;
  146. ctx->blend_data.fn_dstAlpha = GL_ZERO;
  147. ctx->blend_data.eqn_modeRGB = GL_FUNC_ADD;
  148. ctx->blend_data.eqn_modeAlpha = GL_FUNC_ADD;
  149. ctx->blend_data.blnd_clr_alpha = 0;
  150. ctx->blend_data.blnd_clr_blue = 0;
  151. ctx->blend_data.blnd_clr_green = 0;
  152. ctx->blend_data.blnd_clr_red = 0;
  153. ctx->scissor_test_data.is_enabled = GL_FALSE;
  154. /* ctx->scissor_test_data.w = W_WIDTH;
  155. ctx->scissor_test_data.h = W_HEIGHT;
  156. ctx->scissor_test_data.x = 0;
  157. ctx->scissor_test_data.y = 0;
  158. */
  159. ctx->depth_test_func = GL_LESS;
  160. ctx->is_enabled_depth = GL_FALSE;
  161. ctx->depth_write_mask = GL_TRUE;
  162. ctx->front_stencil_writemask = ~0;
  163. ctx->back_stencil_writemask = ~0;
  164. ctx->color_mask_data.r = GL_TRUE;
  165. ctx->color_mask_data.g = GL_TRUE;
  166. ctx->color_mask_data.b = GL_TRUE;
  167. ctx->color_mask_data.a = GL_TRUE;
  168. ctx->clear_color_data.r = 0;
  169. ctx->clear_color_data.g = 0;
  170. ctx->clear_color_data.b = 0;
  171. ctx->clear_color_data.a = 0;
  172. ctx->clear_depth = 1.0f;
  173. ctx->clear_stencil = 0;
  174. ctx->is_enabled_dither = GL_TRUE;
  175. ctx->is_enabled_vertex_program_point_size = GL_FALSE;
  176. ctx->hint_data.generate_mipmap_hint = GL_DONT_CARE;
  177. ctx->hint_data.fragment_shader_derivative_hint = GL_DONT_CARE;
  178. // ctx->shader_and_program_data; //TODO: verify this is to be set to zero
  179. ctx->current_program = 0;
  180. ctx->error = GL_NO_ERROR;
  181. ctx->str_data.version = "2.0"; //not used, instead GLES2_VERSION_STRING is used
  182. ctx->str_data.vendor = "Samsung Electronics";
  183. ctx->str_data.renderer = "FIMG";
  184. ctx->str_data.extensions = "OES_read_format OES_compressed_paletted_texture OES_framebuffer_object OES_stencil8 OES_texture_compression_S3TC OES_mapbuffer OES_texture_npot " ;
  185. ctx->str_data.shadingLangVersion = "1.00";
  186. #ifdef EN_EXT_ALPHA_TEST_EXP
  187. ctx->alpha_test_data.func = GL_ALWAYS;
  188. ctx->alpha_test_data.refValue = 0.0f;
  189. ctx->alpha_test_data.is_enabled = false;
  190. #endif
  191. #ifdef EN_EXT_LOGIC_OP_EXP
  192. ctx->logicOp = GL_COPY_EXP;
  193. ctx->is_logicOp_enabled = GL_FALSE;
  194. #endif
  195. #ifdef EN_EXT_POINT_SPRITE_EXP
  196. ctx->is_point_sprite_enable = GL_TRUE; //for default case this should be always true
  197. #endif
  198. //clear out temporary data;
  199. Plat::memset(ctx->tempStrBuff,0,GLF_TEMP_STRING_BUFFER_LENGTH);
  200. ctx->tempInt4[0] = ctx->tempInt4[1] = ctx->tempInt4[2] = ctx->tempInt4[3] = 0;
  201. ctx->tempFloat4[0] = ctx->tempFloat4[1] = ctx->tempFloat4[2] = ctx->tempFloat4[3] = 0.0f;
  202. Plat::memset(&(ctx->prevFBData), 0, sizeof(FramebufferData));
  203. Plat::memset(&(ctx->curFBData), 0, sizeof(FramebufferData));
  204. ctx->VPPSEnable = false;
  205. gfSetFrameBuffer(ctx,0, 0);
  206. }
  207. #ifdef USE_3D_PM
  208. GLboolean PM_GLES2SetSurfaceData(GLES2SurfaceData * surfdata);
  209. extern "C" GLboolean GLES2SetSurfaceData(GLES2SurfaceData * surfdata)
  210. {
  211. GLboolean retVal = GL_FALSE;
  212. lock3DCriticalSection();
  213. retVal = PM_GLES2SetSurfaceData(surfdata);
  214. unlock3DCriticalSection();
  215. return retVal;
  216. }
  217. GLboolean PM_GLES2SetSurfaceData(GLES2SurfaceData * surfdata)
  218. #else
  219. extern "C" GLboolean GLES2SetSurfaceData(GLES2SurfaceData * surfdata)
  220. #endif
  221. {
  222. if(surfdata)
  223. {
  224. GET_GL_STATE(ctx);
  225. if(!ctx)
  226. {
  227. //LOGMSG("ERROR: ctx is 0 while trying to set SurfaceData");
  228. }
  229. //FimgFinish(ctx);
  230. #if 0
  231. FramebufferData* fbData;
  232. fbData = (FramebufferData*)Plat::malloc(sizeof(FramebufferData));
  233. fbData->colorAddr.vaddr = surfdata->colorAddr2.vaddr;
  234. fbData->colorAddr.paddr = surfdata->colorAddr2.paddr;
  235. fbData->depthStencilAddr.vaddr = surfdata->depthStencilAddr.vaddr;
  236. fbData->depthStencilAddr.paddr = surfdata->depthStencilAddr.paddr;
  237. fbData->width = surfdata->width;
  238. fbData->height = surfdata->height;
  239. fbData->nativeColorFormat = surfdata->nativeColorFormat;
  240. fbData->nativeDepthStencilFormat = surfdata->nativeDepthStencilFormat;
  241. fbData->flipped = surfdata->flipped;
  242. #endif
  243. //Plat::printf("id %d egl make current = %p \n" ,pthread_self(), surfdata->colorAddr.paddr);
  244. Plat::memcpy(&(ctx->defFBData), surfdata, sizeof(FramebufferData));
  245. #if 0
  246. ctx->colorBuff1.vaddr = surfdata->colorAddr1.vaddr;
  247. ctx->colorBuff1.paddr = surfdata->colorAddr1.paddr;
  248. ctx->colorBuff2.vaddr = surfdata->colorAddr2.vaddr;
  249. ctx->colorBuff2.paddr = surfdata->colorAddr2.paddr;
  250. ctx->colorBuff3.vaddr = surfdata->colorAddr3.vaddr;
  251. ctx->colorBuff3.paddr = surfdata->colorAddr3.paddr;
  252. #endif
  253. if(ctx->init_dimensions)
  254. {
  255. gfSetFrameBuffer(ctx,ctx->defFBData.width,ctx->defFBData.height);
  256. ctx->init_dimensions = GL_FALSE;
  257. }
  258. }
  259. return GL_TRUE;
  260. }
  261. extern "C" GLboolean GLES2SetDrawSurface(GLES2SurfaceData *surface)
  262. {
  263. if(surface)
  264. {
  265. GET_GL_STATE(ctx);
  266. if(!ctx)
  267. {
  268. //LOGMSG("ERROR: ctx is 0 while trying to set DrawSurfaceData");
  269. }
  270. //FimgFinish(ctx); // 090827 : "color touch lite" app bug patch
  271. Plat::memcpy(&(ctx->defFBData), surface, sizeof(FramebufferData));
  272. if(ctx->init_dimensions)
  273. {
  274. gfSetFrameBuffer(ctx,ctx->defFBData.width, ctx->defFBData.height);
  275. ctx->init_dimensions = GL_FALSE;
  276. }
  277. }
  278. return GL_TRUE;
  279. }
  280. #ifdef USE_3D_PM
  281. GLboolean PM_GLES2SetReadSurface(GLES2SurfaceData *surface);
  282. extern "C" GLboolean GLES2SetReadSurface(GLES2SurfaceData *surface)
  283. {
  284. GLboolean retVal = GL_FALSE;
  285. lock3DCriticalSection();
  286. retVal = PM_GLES2SetReadSurface(surface);
  287. unlock3DCriticalSection();
  288. return retVal;
  289. }
  290. GLboolean PM_GLES2SetReadSurface(GLES2SurfaceData *surface)
  291. #else
  292. extern "C" GLboolean GLES2SetReadSurface(GLES2SurfaceData *surface)
  293. #endif
  294. {
  295. if(surface)
  296. {
  297. GET_GL_STATE(ctx);
  298. if(!ctx)
  299. {
  300. //LOGMSG("ERROR: ctx is 0 while trying to set DrawSurfaceData");
  301. }
  302. //FimgFinish(ctx); // 090827 : "color touch lite" app bug patch
  303. Plat::memcpy(&(ctx->readFBData), surface, sizeof(FramebufferData));
  304. }
  305. return GL_TRUE;
  306. }
  307. #ifdef USE_3D_PM
  308. GLES2Context PM_GLES2CreateContext(GLES2Context sharedctx);
  309. extern "C" GLES2Context GLES2CreateContext(GLES2Context sharedctx)
  310. {
  311. GLES2Context retVal = NULL;
  312. lock3DCriticalSection();
  313. retVal = PM_GLES2CreateContext(sharedctx);
  314. unlock3DCriticalSection();
  315. return retVal;
  316. }
  317. GLES2Context PM_GLES2CreateContext(GLES2Context sharedctx)
  318. #else
  319. extern "C" GLES2Context GLES2CreateContext(GLES2Context sharedctx)
  320. #endif
  321. {
  322. #ifndef MULTI_CONTEXT
  323. if(sharedctx != GLES_NO_CONTEXT){
  324. //LOGMSG("ERROR: Sharing texture object withour using multi-context");
  325. sharedctx = GLES_NO_CONTEXT;
  326. }
  327. #endif
  328. #ifdef FIMG_GLES_11
  329. OGLState *ctx = new OGLState();
  330. #else
  331. #ifdef MULTI_CONTEXT
  332. OGLState *ctx = new OGLState();
  333. SET_GL_STATE(ctx)
  334. #else
  335. pgles2State = new OGLState(); //ctx = new OGLState();
  336. GET_GL_STATE(ctx);
  337. #endif
  338. #endif
  339. //part of context not being shared so need to be initialized everytime
  340. set_default_values(ctx);
  341. InitShaderState(ctx);
  342. glfInit(ctx);
  343. //Init FBO state
  344. ctx->renderbuffState.setDefaults();
  345. ctx->framebuffState.setDefaults();
  346. //Init local texture state
  347. InitLocalTextureState(ctx);
  348. SharedState* sharedState = NULL;
  349. if(sharedctx == GLES_NO_CONTEXT){
  350. sharedState = new SharedState();
  351. #ifdef SHARED_CONTEXT_DEBUG
  352. //LOGMSG("\n \"shared context\" being created \n");
  353. #endif
  354. }
  355. else
  356. {
  357. //as to share the state need to make it equal to the ctx being passed as argument
  358. sharedState = ((OGLState *)sharedctx)->sharedState;
  359. #ifdef SHARED_CONTEXT_DEBUG
  360. //LOGMSG("\n \"shared context\" being initailized from another context \n");
  361. #endif
  362. }
  363. ctx->sharedState = sharedState;
  364. lockGLSharedState(ctx); //lock the shared state before any opeartion
  365. ctx->sharedState->sharedStateRefCount++;
  366. unlockGLSharedState(ctx); //unlock the shared state before any opeartion
  367. #ifdef SHARED_CONTEXT_DEBUG
  368. //LOGMSG("\n shared state ref count = %d : gles2createContext \n" , ctx->sharedState->sharedStateRefCount);
  369. #endif
  370. #ifdef FSO_JITO
  371. ctx->cgd = constructCodegenData();
  372. #endif
  373. return ctx;
  374. }
  375. extern "C" GLES2Context GLES2SetContext(GLES2Context glctx)
  376. {
  377. GET_GL_STATE_NOCHECK(prev_ctx);
  378. if(glctx != NULL)
  379. {
  380. #ifndef FIMG_GLES_11
  381. #ifdef MULTI_CONTEXT
  382. SET_GL_STATE(glctx)
  383. #else
  384. pgles2State = (OGLState *)glctx;
  385. #endif
  386. #endif
  387. }
  388. return prev_ctx;
  389. }
  390. extern "C" GLboolean GLES2DestroyContext(GLES2Context _ctx)
  391. {
  392. OGLState* ctx = (OGLState*)_ctx;
  393. //GET_GL_STATE(ctx);
  394. if(!ctx)
  395. {
  396. return GL_FALSE;
  397. }
  398. ((OGLState*) ctx)->framebuffState.setDefaults();
  399. ((OGLState*) ctx)->renderbuffState.setDefaults();
  400. for(int i = 0; i < ((OGLState*) ctx)->buffer_object_data.buffer_objects_last_index; i++){
  401. if( ((OGLState*) ctx)->buffer_object_data.buffer_objects[i].data){
  402. free(ctx->buffer_object_data.buffer_objects[i].data);
  403. ctx->buffer_object_data.buffer_objects[i].data=NULL;
  404. }
  405. }
  406. DeInitShaderState((OGLState*)ctx);
  407. lockGLSharedTextureState(ctx);
  408. DeInitLocalTextureState(ctx);
  409. unlockGLSharedTextureState(ctx);
  410. lockGLSharedState(ctx); //lock the shared state before any opeartion
  411. ctx->sharedState->sharedStateRefCount--;
  412. #ifdef SHARED_CONTEXT_DEBUG
  413. //LOGMSG("\n shared state ref count = %d : GLES2DestroyContext \n" , ctx->sharedState->sharedStateRefCount);
  414. #endif
  415. unlockGLSharedState(ctx); //unlock the shared state before any opeartion
  416. if(ctx->sharedState->sharedStateRefCount == 0){
  417. delete(ctx->sharedState);
  418. ctx->sharedState = NULL;
  419. }else{
  420. ctx->sharedState = NULL;
  421. }
  422. #ifdef FSO_JITO
  423. destroyCodegenData(((OGLState*) ctx)->cgd);
  424. ((OGLState*) ctx)->cgd = 0;
  425. #endif
  426. #ifndef MULTI_CONTEXT
  427. delete pgles2State;
  428. pgles2State = 0;
  429. #else
  430. delete ctx;
  431. ctx = NULL;
  432. #endif
  433. return GL_TRUE;
  434. }
  435. #ifdef USE_3D_PM
  436. GLboolean PM_GLES2Flush(void);
  437. extern "C" GLboolean GLES2Flush(void)
  438. {
  439. GLboolean retVal = GL_FALSE;
  440. lock3DCriticalSection();
  441. retVal = PM_GLES2Flush();
  442. unlock3DCriticalSection();
  443. return retVal;
  444. }
  445. GLboolean PM_GLES2Flush(void)
  446. #else
  447. extern "C" GLboolean GLES2Flush(void)
  448. #endif
  449. {
  450. GET_GL_STATE(ctx);
  451. FimgFinish(ctx);
  452. return GL_TRUE;
  453. }
  454. glfError FimgFinish(OGLState* pState)
  455. {
  456. Plat::lockGPUSFR(__FUNCTION__);
  457. glfFinish(pState);
  458. Plat::unlockGPUSFR(__FUNCTION__);
  459. return GLF_ERR_SUCCESS;
  460. }
  461. void set_err(GLenum err)
  462. {
  463. GET_GL_STATE(ctx);
  464. // //LOGMSG("\nGLERROR: %s from %s\n", getGLErrorString(err), getLastGLFunc());
  465. #ifdef _MSC_VER
  466. // __asm int 3;
  467. #endif
  468. if(ctx->error == GL_NO_ERROR) //Do not overwrite older error
  469. {
  470. ctx->error = err;
  471. }
  472. }
  473. void set_err(OGLState *ctx, GLenum err)
  474. {
  475. // //LOGMSG("\nGLERROR: %s from %s\n", getGLErrorString(err), getLastGLFunc());
  476. #ifdef _MSC_VER
  477. //TODO: remove this? This is useful while testnig the statemanagement with
  478. // visual studio
  479. // __asm int 3;
  480. #endif
  481. if(ctx->error == GL_NO_ERROR) //Do not overwrite older error
  482. {
  483. ctx->error = err;
  484. }
  485. // LOGE("ERROR in 2.0 ::%d",ctx->error);
  486. }
  487. /* determines the number of bytes per pixel based on 'format' and 'type' */
  488. int determine_bpp(GLenum format, GLenum type)
  489. {
  490. int bpp = 0;
  491. if((format == GL_RGBA) && (type == GL_UNSIGNED_BYTE))
  492. {
  493. bpp = 4;
  494. }
  495. else if((format == GL_RGB) && (type == GL_UNSIGNED_BYTE))
  496. {
  497. bpp = 3;
  498. }
  499. else if((format == GL_RGBA) && (type == GL_UNSIGNED_SHORT_4_4_4_4))
  500. {
  501. bpp = 2;
  502. }
  503. else if((format == GL_RGBA) && (type == GL_UNSIGNED_SHORT_5_5_5_1))
  504. {
  505. bpp = 2;
  506. }
  507. else if((format == GL_RGB) && (type == GL_UNSIGNED_SHORT_5_6_5))
  508. {
  509. bpp = 2;
  510. }
  511. else if((format == GL_LUMINANCE_ALPHA) && (type == GL_UNSIGNED_BYTE))
  512. {
  513. bpp = 2;
  514. }
  515. else if((format == GL_LUMINANCE) && (type == GL_UNSIGNED_BYTE))
  516. {
  517. bpp = 1;
  518. }
  519. else if((format == GL_ALPHA) && (type == GL_UNSIGNED_BYTE))
  520. {
  521. bpp = 1;
  522. }
  523. else
  524. {
  525. set_err(GL_INVALID_ENUM);
  526. }
  527. return bpp;
  528. }
  529. GLboolean isValidBlendFunc(GLenum factor)
  530. {
  531. switch(factor)
  532. {
  533. case GL_ZERO:
  534. case GL_ONE:
  535. case GL_SRC_COLOR:
  536. case GL_ONE_MINUS_SRC_COLOR:
  537. case GL_SRC_ALPHA:
  538. case GL_ONE_MINUS_SRC_ALPHA:
  539. case GL_DST_ALPHA:
  540. case GL_ONE_MINUS_DST_ALPHA:
  541. case GL_DST_COLOR:
  542. case GL_ONE_MINUS_DST_COLOR:
  543. case GL_SRC_ALPHA_SATURATE:
  544. case GL_CONSTANT_COLOR:
  545. case GL_ONE_MINUS_CONSTANT_COLOR:
  546. case GL_CONSTANT_ALPHA:
  547. case GL_ONE_MINUS_CONSTANT_ALPHA:
  548. return GL_TRUE; //intended fall through
  549. break;
  550. }
  551. return GL_FALSE;
  552. }
  553. GLboolean isValidDepthFunc(GLenum func)
  554. {
  555. switch(func)
  556. {
  557. case GL_NEVER:
  558. case GL_LESS:
  559. case GL_EQUAL:
  560. case GL_LEQUAL:
  561. case GL_GREATER:
  562. case GL_NOTEQUAL:
  563. case GL_GEQUAL:
  564. case GL_ALWAYS:
  565. return GL_TRUE;
  566. break;
  567. }
  568. return GL_FALSE;
  569. }
  570. GLboolean isValidStencilOp(GLenum op)
  571. {
  572. //should be GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, and GL_INVERT
  573. switch(op)
  574. {
  575. case GL_KEEP:
  576. case GL_ZERO:
  577. case GL_REPLACE:
  578. case GL_INCR:
  579. case GL_DECR:
  580. case GL_INVERT:
  581. return GL_TRUE; //intended fall though
  582. }
  583. return GL_FALSE;
  584. }
  585. GL_API void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
  586. {
  587. GET_GL_STATE(ctx);
  588. ctx->blend_data.blnd_clr_red = clamp(red);
  589. ctx->blend_data.blnd_clr_green = clamp(green);
  590. ctx->blend_data.blnd_clr_blue = clamp(blue);
  591. ctx->blend_data.blnd_clr_alpha = clamp(alpha);
  592. SetUpDateFlagPerFragment(ctx,GLF_UF_Blend);
  593. }
  594. GL_API void GL_APIENTRY glBlendEquation( GLenum mode )
  595. {
  596. //GET_GL_STATE(ctx);
  597. glBlendEquationSeparate(mode, mode);
  598. }
  599. GL_API void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
  600. {
  601. GET_GL_STATE(ctx);
  602. switch(modeRGB)
  603. {
  604. case GL_FUNC_ADD:
  605. case GL_FUNC_SUBTRACT:
  606. case GL_FUNC_REVERSE_SUBTRACT:
  607. break; //Intended fallthough
  608. default:
  609. set_err(GL_INVALID_ENUM);
  610. return;
  611. }
  612. switch(modeAlpha)
  613. {
  614. case GL_FUNC_ADD:
  615. case GL_FUNC_SUBTRACT:
  616. case GL_FUNC_REVERSE_SUBTRACT:
  617. break; //Intended fallthough
  618. default:
  619. set_err(GL_INVALID_ENUM);
  620. return;
  621. }
  622. ctx->blend_data.eqn_modeRGB = modeRGB;
  623. ctx->blend_data.eqn_modeAlpha = modeAlpha;
  624. SetUpDateFlagPerFragment(ctx,GLF_UF_Blend);
  625. }
  626. GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor)
  627. {
  628. //GET_GL_STATE(ctx);
  629. glBlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
  630. }
  631. GL_API void GL_APIENTRY glBlendFuncSeparate (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
  632. {
  633. GET_GL_STATE(ctx);
  634. if(isValidBlendFunc(srcRGB) && isValidBlendFunc(dstRGB) && isValidBlendFunc(srcAlpha) && isValidBlendFunc(dstAlpha))
  635. {
  636. ctx->blend_data.fn_srcRGB = srcRGB;
  637. ctx->blend_data.fn_srcAlpha = srcAlpha;
  638. ctx->blend_data.fn_dstRGB = dstRGB;
  639. ctx->blend_data.fn_dstAlpha = dstAlpha;
  640. SetUpDateFlagPerFragment(ctx,GLF_UF_Blend);
  641. }
  642. else
  643. {
  644. set_err(GL_INVALID_ENUM);
  645. }
  646. }
  647. #ifdef USE_3D_PM
  648. void PM_glClear (GLbitfield mask);
  649. GL_API void GL_APIENTRY glClear (GLbitfield mask)
  650. {
  651. lock3DCriticalSection();
  652. PM_glClear(mask);
  653. unlock3DCriticalSection();
  654. }
  655. void PM_glClear (GLbitfield mask)
  656. #else
  657. GL_API void GL_APIENTRY glClear (GLbitfield mask)
  658. #endif
  659. {
  660. GET_GL_STATE(ctx);
  661. //Check if FB is complete Sandeep K.
  662. if(!isFBrenderable(ctx))
  663. {
  664. set_err(GL_INVALID_FRAMEBUFFER_OPERATION);
  665. return;
  666. }
  667. //glfFinish(ctx); //this is done inside glfClear.
  668. //SPEC: mask can only be a bitwise or of GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT
  669. GLbitfield temp = (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT|GL_COLOR_BUFFER_WITH_IMAGE_BIT);
  670. if( (mask & temp)!= mask)
  671. {
  672. set_err(GL_INVALID_ENUM);
  673. return;
  674. }
  675. Plat::lockGPUSFR(__FUNCTION__);
  676. #if FIMG_PLATFORM == 1
  677. #if GLF_DRAW == ENABLE
  678. glfClear(ctx, mask);
  679. #endif
  680. #ifdef CACHE_MEM
  681. clean_cached_buffer();
  682. #endif
  683. #endif
  684. Plat::unlockGPUSFR(__FUNCTION__);
  685. }
  686. GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
  687. {
  688. GET_GL_STATE(ctx);
  689. //SPEC: NOTE: clear color's clamping behaviour must change if float textures are supported. The values should not be in that case
  690. // and instead are clamped by the hw dependent code to suit the specific rendertarget's format.
  691. ctx->clear_color_data.r = clamp(red);
  692. ctx->clear_color_data.b = clamp(blue);
  693. ctx->clear_color_data.g = clamp(green);
  694. ctx->clear_color_data.a = clamp(alpha);
  695. }
  696. GL_API void GL_APIENTRY glClearDepthf (GLclampf depth)
  697. {
  698. GET_GL_STATE(ctx);
  699. //SPEC: [value] is clamped to the range [0, 1] and converted to fixed-point according to the rules for a window z value given in section 2.11.1
  700. //TODO: check and code the computation to find the fixedpoint value of depth clear value.
  701. ctx->clear_depth = clamp(depth);
  702. }
  703. GL_API void GL_APIENTRY glClearStencil (GLint s)
  704. {
  705. GET_GL_STATE(ctx);
  706. //SPEC: s is masked to the number of bitplanes available
  707. //TODO: who does the masking?
  708. ctx->clear_stencil = s;
  709. }
  710. GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
  711. {
  712. GET_GL_STATE(ctx);
  713. ctx->color_mask_data.r = red;
  714. ctx->color_mask_data.g = green;
  715. ctx->color_mask_data.b = blue;
  716. ctx->color_mask_data.a = alpha;
  717. SetUpDateFlagPerFragment(ctx,GLF_UF_ColorBuffer);
  718. }
  719. GL_API void GL_APIENTRY glCullFace (GLenum mode)
  720. {
  721. GET_GL_STATE(ctx);
  722. switch(mode)
  723. {
  724. case GL_FRONT:
  725. case GL_BACK:
  726. case GL_FRONT_AND_BACK:
  727. ctx->cull_face_data.mode = mode; //intended fallthrough
  728. SetUpDateFlagRasterEngine(ctx,GLF_UF_BackfaceCull);
  729. //ctx->updateBits.re = UB_RE_ALL;
  730. break;
  731. default:
  732. set_err(GL_INVALID_ENUM);
  733. return;
  734. }
  735. }
  736. GL_API void GL_APIENTRY glDepthFunc (GLenum func)
  737. {
  738. GET_GL_STATE(ctx);
  739. if(isValidDepthFunc(func))
  740. {
  741. ctx->depth_test_func = func;
  742. SetUpDateFlagPerFragment(ctx,GLF_UF_DepthTest);
  743. }
  744. else
  745. {
  746. set_err(GL_INVALID_ENUM);
  747. }
  748. }
  749. GL_API void GL_APIENTRY glDepthMask (GLboolean flag)
  750. {
  751. GET_GL_STATE(ctx);
  752. ctx->depth_write_mask = flag;
  753. SetUpDateFlagPerFragment(ctx,GLF_UF_DepthTest);
  754. }
  755. GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar)
  756. {
  757. GET_GL_STATE(ctx);
  758. ctx->depth_range_data.near_depth = clamp(zNear);
  759. ctx->depth_range_data.far_depth = clamp(zFar);
  760. SetUpDateFlagPrimEngine(ctx,GLF_UF_DepthRange);
  761. }
  762. GL_API void GL_APIENTRY glDisable (GLenum cap)
  763. {
  764. GET_GL_STATE(ctx);
  765. switch(cap)
  766. {
  767. // case GL_VERTEX_PROGRAM_POINT_SIZE: ctx->is_enabled_vertex_program_point_size = GL_FALSE; break;
  768. case GL_CULL_FACE:
  769. ctx->cull_face_data.is_enabled = GL_FALSE;
  770. SetUpDateFlagRasterEngine(ctx,GLF_UF_BackfaceCull);
  771. //ctx->updateBits.re = UB_RE_ALL;
  772. break;
  773. case GL_POLYGON_OFFSET_FILL:
  774. ctx->polygon_offset_data.is_enabled_fill = GL_FALSE;
  775. SetUpDateFlagRasterEngine(ctx,GLF_UF_DepthOffset);
  776. //ctx->updateBits.re = UB_RE_ALL;
  777. break;
  778. case GL_SCISSOR_TEST:
  779. ctx->scissor_test_data.is_enabled = GL_FALSE;
  780. #if GLF_SCISSOR_IN_RA == ENABLE
  781. SetUpDateFlagRasterEngine(ctx,GLF_UF_ScissorTest);
  782. #else
  783. SetUpDateFlagPerFragment(ctx, GLF_UF_ScissorTest);
  784. #endif
  785. break;
  786. case GL_SAMPLE_COVERAGE: ctx->sample_coverage_data.is_enabled_coverage = GL_FALSE; break;
  787. case GL_SAMPLE_ALPHA_TO_COVERAGE: ctx->sample_coverage_data.is_enabled_alpha_to_coverage = GL_FALSE; break;
  788. case GL_STENCIL_TEST:
  789. ctx->stencil_test_data.is_enabled = GL_FALSE;
  790. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  791. break;
  792. case GL_DEPTH_TEST:
  793. ctx->is_enabled_depth = GL_FALSE;
  794. SetUpDateFlagPerFragment(ctx,GLF_UF_DepthTest);
  795. break;
  796. case GL_BLEND:
  797. ctx->blend_data.is_enabled = GL_FALSE;
  798. SetUpDateFlagPerFragment(ctx,GLF_UF_Blend);
  799. break;
  800. case GL_DITHER: ctx->is_enabled_dither = GL_FALSE; break;
  801. #ifdef EN_EXT_ALPHA_TEST_EXP
  802. case GL_ALPHA_TEST_EXP:
  803. ctx->alpha_test_data.is_enabled = GL_FALSE;
  804. SetUpDateFlagPerFragment(ctx,GLF_UF_AlphaTest);
  805. break;
  806. #endif
  807. #ifdef EN_EXT_LOGIC_OP_EXP
  808. case GL_COLOR_LOGIC_OP_EXP:
  809. ctx->is_logicOp_enabled = GL_FALSE;
  810. SetUpDateFlagPerFragment(ctx,GLF_UF_LogicalOp);
  811. break;
  812. #endif
  813. #ifdef EN_EXT_POINT_SPRITE_EXP
  814. case GL_POINT_SPRITE_OES_EXP:
  815. ctx->is_point_sprite_enable = GL_FALSE;
  816. break;
  817. #endif
  818. default:
  819. set_err(GL_INVALID_ENUM);
  820. }
  821. }
  822. GL_API void GL_APIENTRY glDisableVertexAttribArray (GLuint index)
  823. {
  824. GET_GL_STATE(ctx);
  825. if(index >= MAX_VERTEX_ATTRIBS)
  826. {
  827. set_err(GL_INVALID_VALUE);
  828. return ;
  829. }
  830. ctx->vertex_attrib_array_data[index].enabled = GL_FALSE;
  831. }
  832. bool isDrawVertexCountValid(GLenum mode, GLsizei count)
  833. {
  834. if( count <= 0 )
  835. return false;
  836. switch(mode)
  837. {
  838. case GL_POINTS: return count > 0;
  839. case GL_LINE_STRIP: return count > 1;
  840. case GL_LINE_LOOP: return count > 1;
  841. case GL_LINES: return count > 1 ;
  842. case GL_TRIANGLES: return count > 2 ;
  843. case GL_TRIANGLE_STRIP: return count > 2;
  844. case GL_TRIANGLE_FAN: return count > 2;
  845. }
  846. gAssert(false && "Invalid enum in mode");
  847. return false; //To silence the compiler
  848. }
  849. #ifdef USE_3D_PM
  850. void PM_glDrawArrays (GLenum mode, GLint first, GLsizei count);
  851. GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
  852. {
  853. lock3DCriticalSection();
  854. PM_glDrawArrays( mode, first, count);
  855. unlock3DCriticalSection();
  856. }
  857. void PM_glDrawArrays (GLenum mode, GLint first, GLsizei count)
  858. #else
  859. GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
  860. #endif
  861. {
  862. GET_GL_STATE(ctx);
  863. //Validation---------------
  864. //TODO: validate mode, first and count.
  865. //TODO: validate that this will not access out of the range?
  866. if(mode != GL_POINTS && mode != GL_LINE_STRIP && mode != GL_LINE_LOOP && mode != GL_LINES
  867. && mode != GL_TRIANGLES && mode != GL_TRIANGLE_STRIP && mode != GL_TRIANGLE_FAN){
  868. set_err(GL_INVALID_ENUM);
  869. return;
  870. }
  871. if(first < 0)
  872. {
  873. set_err(GL_INVALID_VALUE);
  874. return;
  875. }
  876. if(!isDrawVertexCountValid(mode, count))
  877. {
  878. //set_err(GL_INVALID_VALUE); //Sliently ignore
  879. return;
  880. }
  881. //Check if FB is complete
  882. if(!isFBrenderable(ctx))
  883. {
  884. set_err(GL_INVALID_FRAMEBUFFER_OPERATION);
  885. return;
  886. }
  887. //Set whether VPPS should be enabled or not. All other VPPS dependent state configurations are set based on this value!
  888. Executable *pExe = ctx->current_executable;
  889. if(pExe->pointSizeIndex == -1 || (mode != GL_POINTS ) ) {
  890. ctx->VPPSEnable = false;
  891. }else {
  892. ctx->VPPSEnable = true;
  893. }
  894. Plat::lockGPUSFR(__FUNCTION__);
  895. //Drawing------------------------------------------
  896. if(!stateFlush(ctx))
  897. {
  898. //LOGMSG("\nWARNING: state has not been flushed to hw, current draw call ignored\n");
  899. Plat::unlockGPUSFR(__FUNCTION__);
  900. return;
  901. }
  902. glfSetDrawMode(ctx,mode);
  903. glfDraw(ctx, mode, first, count);
  904. Plat::unlockGPUSFR(__FUNCTION__);
  905. }
  906. #ifdef USE_3D_PM
  907. void PM_glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
  908. GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices)
  909. {
  910. lock3DCriticalSection();
  911. PM_glDrawElements( mode, count, type, indices);
  912. unlock3DCriticalSection();
  913. }
  914. void PM_glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices)
  915. #else
  916. GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices)
  917. #endif
  918. {
  919. GET_GL_STATE(ctx);
  920. const void * inds = indices;
  921. //Validation---------------
  922. if(mode != GL_POINTS && mode != GL_LINE_STRIP && mode != GL_LINE_LOOP && mode != GL_LINES
  923. && mode != GL_TRIANGLES && mode != GL_TRIANGLE_STRIP && mode != GL_TRIANGLE_FAN){
  924. set_err(GL_INVALID_ENUM);
  925. return;
  926. }
  927. if(!isDrawVertexCountValid(mode, count)){
  928. //set_err(GL_INVALID_VALUE); //silently ignore
  929. return;
  930. }
  931. /*
  932. if(indices == NULL){
  933. set_err(GL_INVALID_VALUE);
  934. return;
  935. }
  936. */
  937. if(ctx->buffer_object_data.element_array_buffer_binding == NULL) {
  938. if(indices == NULL) {
  939. return;
  940. }
  941. } else {
  942. if(ctx->buffer_object_data.element_array_buffer_binding->data == NULL) {
  943. return;
  944. }
  945. int offset = (char *)indices - (char*)NULL;
  946. inds = (void*) ((char*)ctx->buffer_object_data.element_array_buffer_binding->data + offset);
  947. }
  948. if(type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT){
  949. set_err(GL_INVALID_ENUM);
  950. return;
  951. }
  952. //Check if FB is complete
  953. if(!isFBrenderable(ctx))
  954. {
  955. set_err(GL_INVALID_FRAMEBUFFER_OPERATION);
  956. return;
  957. }
  958. //Set whether VPPS should be enabled or not. All other VPPS dependent state configurations are set based on this value!
  959. Executable *pExe = ctx->current_executable;
  960. if(pExe->pointSizeIndex == -1 || (mode != GL_POINTS ) ) {
  961. ctx->VPPSEnable = false;
  962. }else {
  963. ctx->VPPSEnable = true;
  964. }
  965. Plat::lockGPUSFR(__FUNCTION__);
  966. //Drawing------------------------------------------
  967. // State flush
  968. if(!stateFlush(ctx))
  969. {
  970. //LOGMSG("\nWARNING: state has not been flushed to hw, current draw call ignored\n");
  971. Plat::unlockGPUSFR(__FUNCTION__);
  972. return;
  973. }
  974. glfSetDrawMode(ctx, mode);
  975. glfDrawElements(ctx, mode, count, type, inds);
  976. Plat::unlockGPUSFR(__FUNCTION__);
  977. }
  978. GL_API void GL_APIENTRY glEnable (GLenum cap)
  979. {
  980. GET_GL_STATE(ctx);
  981. switch(cap)
  982. {
  983. //case GL_VERTEX_PROGRAM_POINT_SIZE: ctx->is_enabled_vertex_program_point_size = GL_TRUE; break;
  984. case GL_CULL_FACE:
  985. ctx->cull_face_data.is_enabled = GL_TRUE;
  986. SetUpDateFlagRasterEngine(ctx,GLF_UF_BackfaceCull);
  987. //ctx->updateBits.re = UB_RE_ALL;
  988. break;
  989. case GL_POLYGON_OFFSET_FILL:
  990. ctx->polygon_offset_data.is_enabled_fill = GL_TRUE;
  991. SetUpDateFlagRasterEngine(ctx,GLF_UF_DepthOffset);
  992. //ctx->updateBits.re = UB_RE_ALL;
  993. break;
  994. case GL_SCISSOR_TEST:
  995. ctx->scissor_test_data.is_enabled = GL_TRUE;
  996. #if GLF_SCISSOR_IN_RA == ENABLE
  997. SetUpDateFlagRasterEngine(ctx,GLF_UF_ScissorTest);
  998. #else
  999. SetUpDateFlagPerFragment(ctx, GLF_UF_ScissorTest);
  1000. #endif
  1001. break;
  1002. case GL_SAMPLE_COVERAGE: ctx->sample_coverage_data.is_enabled_coverage = GL_TRUE; break;
  1003. case GL_SAMPLE_ALPHA_TO_COVERAGE: ctx->sample_coverage_data.is_enabled_alpha_to_coverage = GL_TRUE; break;
  1004. case GL_STENCIL_TEST:
  1005. ctx->stencil_test_data.is_enabled = GL_TRUE;
  1006. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  1007. break;
  1008. case GL_DEPTH_TEST:
  1009. ctx->is_enabled_depth = GL_TRUE;
  1010. SetUpDateFlagPerFragment(ctx,GLF_UF_DepthTest);
  1011. break;
  1012. case GL_BLEND:
  1013. ctx->blend_data.is_enabled = GL_TRUE;
  1014. SetUpDateFlagPerFragment(ctx,GLF_UF_Blend);
  1015. break;
  1016. case GL_DITHER: ctx->is_enabled_dither = GL_TRUE; break;
  1017. #ifdef EN_EXT_ALPHA_TEST_EXP
  1018. case GL_ALPHA_TEST_EXP:
  1019. ctx->alpha_test_data.is_enabled = GL_TRUE;
  1020. SetUpDateFlagPerFragment(ctx,GLF_UF_AlphaTest);
  1021. break;
  1022. #endif
  1023. #ifdef EN_EXT_LOGIC_OP_EXP
  1024. case GL_COLOR_LOGIC_OP_EXP:
  1025. ctx->is_logicOp_enabled = GL_TRUE;
  1026. SetUpDateFlagPerFragment(ctx,GLF_UF_LogicalOp);
  1027. break;
  1028. #endif
  1029. #ifdef EN_EXT_POINT_SPRITE_EXP
  1030. case GL_POINT_SPRITE_OES_EXP:
  1031. ctx->is_point_sprite_enable = GL_TRUE;
  1032. break;
  1033. #endif
  1034. default:
  1035. set_err(GL_INVALID_ENUM);
  1036. }
  1037. }
  1038. GL_API void GL_APIENTRY glEnableVertexAttribArray (GLuint index)
  1039. {
  1040. GET_GL_STATE(ctx);
  1041. if(index >= MAX_VERTEX_ATTRIBS)
  1042. {
  1043. set_err(GL_INVALID_VALUE);
  1044. return ;
  1045. }
  1046. ctx->vertex_attrib_array_data[index].enabled = GL_TRUE;
  1047. }
  1048. static inline void updateBuiltinUniforms(ShaderExecutable& se, OGLState* ctx) {
  1049. float* uniforms = se.constFloatMemBlock;
  1050. const GLESBuiltinUniforms& indices = se.builtinUniformIndices;
  1051. if(indices.depthRange_near != -1) {
  1052. uniforms[indices.depthRange_near] = ctx->depth_range_data.near_depth;
  1053. }
  1054. if(indices.depthRange_far != -1) {
  1055. uniforms[indices.depthRange_far] = ctx->depth_range_data.far_depth;
  1056. }
  1057. if(indices.depthRange_diff != -1) {
  1058. uniforms[indices.depthRange_diff] = ctx->depth_range_data.far_depth - ctx->depth_range_data.near_depth;
  1059. }
  1060. }
  1061. bool stateFlush(OGLState * ctx)
  1062. {
  1063. TextureState* pTexState = &(ctx->texState);
  1064. TextureObject* pTexObj;
  1065. bool zz=updateCurrentExecutable();
  1066. if(zz)
  1067. {
  1068. Executable *pExe = ctx->current_executable;
  1069. int texUnitUsage = 0;
  1070. for(int i = 0; i < MAX_TEXTURE_UNITS; i++)
  1071. {
  1072. if(pExe->fsSamplerMappings[i].isUsed == false)
  1073. continue;
  1074. int texUnit = pExe->fsSamplerMappings[i].glTexUnit;
  1075. if(texUnit >= MAX_TEXTURE_UNITS){
  1076. //TO DO
  1077. //LOGMSG(" the value of the texUNit is greater than max. texture unit : %s", __FUNCTION__);
  1078. return false;
  1079. }
  1080. GLenum texType = pExe->fsSamplerMappings[i].type;
  1081. //instead of below mentioned thing need to call GLVALIDATEPROGRAM ??? CHECK IN SPEC TO DO
  1082. //It is not allowed to have variables of different sampler types pointing to the
  1083. //same texture image unit within a program object.
  1084. int bitToSet = 1<<( 3 * texUnit + (texType - GL_SAMPLER_2D));
  1085. int previousSamplerValue = (texUnitUsage >> (3 * texUnit)) & 7 ;
  1086. if(previousSamplerValue == 0){
  1087. texUnitUsage |= bitToSet;
  1088. }
  1089. else if( previousSamplerValue != (1 << (texType - GL_SAMPLER_2D))){
  1090. fprintf(stderr, "error /n");
  1091. SET_ERR(ctx, GL_INVALID_OPERATION, "glTexImage2D");
  1092. return false;
  1093. }
  1094. if(texType == GL_SAMPLER_2D)
  1095. {
  1096. #if STORE_TEX_OBJ_POINTER == ENABLE
  1097. pTexObj = pTexState->ptexUnitBinding[texUnit].texture2D;
  1098. #else
  1099. pTexObj = GetTextureObject(GL_TEXTURE_2D,true,texUnit);
  1100. // fprintf(stderr, " %p %p \n", pTexObj , &(pTexState->defaultTexObjects[TEX_2D_DEFAULT]);
  1101. #endif
  1102. ////LOGMSG(" pTexObj=%d pTestTexObj=%d \n" , pTexObj , pTestTexObj);
  1103. //gAssert((pTexObj == pTestTexObj) && "texture object pointer is wrong");
  1104. }
  1105. else if(texType == GL_SAMPLER_CUBE)
  1106. {
  1107. #if STORE_TEX_OBJ_POINTER == ENABLE
  1108. pTexObj = pTexState->ptexUnitBinding[texUnit].cubeMap;
  1109. #else
  1110. pTexObj = GetTextureObject(GL_TEXTURE_CUBE_MAP,true,texUnit);
  1111. #endif
  1112. ////LOGMSG(" pTexObj=%d pTestTexObj=%d \n" , pTexObj , pTestTexObj);
  1113. //gAssert((pTexObj == pTestTexObj) && "texture object pointer is wrong");
  1114. }
  1115. else if(texType == GL_SAMPLER_3D)
  1116. {
  1117. #if STORE_TEX_OBJ_POINTER == ENABLE
  1118. pTexObj = pTexState->ptexUnitBinding[texUnit].texture3D;
  1119. #else
  1120. pTexObj = GetTextureObject(GL_TEXTURE_3D,true,texUnit);
  1121. #endif
  1122. ////LOGMSG(" pTexObj=%d pTestTexObj=%d \n" , pTexObj , pTestTexObj);
  1123. //gAssert((pTexObj == pTestTexObj) && "texture object pointer is wrong");
  1124. }
  1125. else
  1126. {
  1127. //LOGMSG("Type of Sampler unknown\n");
  1128. return false;
  1129. }
  1130. GLboolean res = pTexObj->Compile();
  1131. if(res)
  1132. {
  1133. //texDim need not be a valid index since these special texDim uniforms
  1134. //are generated only if a varying is used as a tex coord.
  1135. if(pExe->dimensions.tex[i] != -1)
  1136. {
  1137. pExe->fs.constFloatMemBlock[pExe->dimensions.tex[i]] = float(pTexObj->width);
  1138. pExe->fs.constFloatMemBlock[pExe->dimensions.tex[i]+1] = float(pTexObj->height);
  1139. }
  1140. pTexState->pTexObjectToConfigFimg[i].id = pTexObj->id;
  1141. pTexState->pTexObjectToConfigFimg[i].pTexFGLState = &(pTexObj->texFGLState);
  1142. }
  1143. else
  1144. {
  1145. //as compilation fails need to update with fallback texture
  1146. pTexState->pTexObjectToConfigFimg[i].id = 0;
  1147. if(texType == GL_SAMPLER_2D) {
  1148. pTexState->pTexObjectToConfigFimg[i].pTexFGLState = &(ctx->sharedState->sharedTexState.fallBackTexFGLstate[0]);
  1149. }
  1150. else if(texType == GL_SAMPLER_3D) {
  1151. pTexState->pTexObjectToConfigFimg[i].pTexFGLState = &(ctx->sharedState->sharedTexState.fallBackTexFGLstate[1]);
  1152. }
  1153. else if(texType == GL_SAMPLER_CUBE) {
  1154. pTexState->pTexObjectToConfigFimg[i].pTexFGLState = &(ctx->sharedState->sharedTexState.fallBackTexFGLstate[2]);
  1155. }
  1156. // //LOGMSG("Compile failed\n");
  1157. }
  1158. } //End of tex unit for loop
  1159. updateBuiltinUniforms(pExe->vs, ctx);
  1160. updateBuiltinUniforms(pExe->fs, ctx);
  1161. //#if FIMG_PLATFORM == 1
  1162. //No fimg setting on win32 :)
  1163. // glfFinish(ctx); just to see what happens
  1164. glfFlush(ctx);
  1165. //#endif
  1166. return true;
  1167. }
  1168. return false;
  1169. }
  1170. #ifdef USE_3D_PM
  1171. void PM_glFinish (void);
  1172. GL_API void GL_APIENTRY glFinish (void)
  1173. {
  1174. lock3DCriticalSection();
  1175. PM_glFinish();
  1176. unlock3DCriticalSection();
  1177. }
  1178. void PM_glFinish (void)
  1179. #else
  1180. GL_API void GL_APIENTRY glFinish (void)
  1181. #endif
  1182. {
  1183. Plat::lockGPUSFR(__FUNCTION__);
  1184. GET_GL_STATE(ctx);
  1185. #if FIMG_PLATFORM == 1
  1186. glfFinish(ctx);
  1187. #endif
  1188. #ifdef CACHE_MEM
  1189. invalidate_cached_buffer();
  1190. #endif
  1191. Plat::unlockGPUSFR(__FUNCTION__);
  1192. }
  1193. #ifdef USE_3D_PM
  1194. void PM_glFlush (void);
  1195. GL_API void GL_APIENTRY glFlush (void)
  1196. {
  1197. lock3DCriticalSection();
  1198. PM_glFlush();
  1199. unlock3DCriticalSection();
  1200. }
  1201. void PM_glFlush (void)
  1202. #else
  1203. GL_API void GL_APIENTRY glFlush (void)
  1204. #endif
  1205. {
  1206. Plat::lockGPUSFR(__FUNCTION__);
  1207. GET_GL_STATE(ctx);
  1208. if(!stateFlush(ctx))
  1209. {
  1210. //LOGMSG("\nWARNING: state has not been flushed to hw\n");
  1211. }
  1212. Plat::unlockGPUSFR(__FUNCTION__);
  1213. }
  1214. GL_API void GL_APIENTRY glFrontFace (GLenum mode)
  1215. {
  1216. GET_GL_STATE(ctx);
  1217. if((mode == GL_CW )||(mode == GL_CCW))
  1218. {
  1219. ctx->front_face_mode = mode;
  1220. SetUpDateFlagRasterEngine(ctx,GLF_UF_BackfaceCull);
  1221. //ctx->updateBits.re = UB_RE_ALL;
  1222. }
  1223. else
  1224. {
  1225. set_err(GL_INVALID_ENUM);
  1226. }
  1227. }
  1228. GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params)
  1229. {
  1230. GET_GL_STATE(ctx);
  1231. FramebufferData fbData = getFBData();
  1232. float tempValue[4] ;
  1233. if(params == NULL)
  1234. SET_ERR(ctx, GL_INVALID_VALUE, "glGetBooleanv*");
  1235. else
  1236. switch(pname)
  1237. {
  1238. //the state variable whose basic type is boolean
  1239. case GL_SAMPLE_COVERAGE_INVERT:
  1240. params[0] = ctx->sample_coverage_data.invert;
  1241. break;
  1242. case GL_COLOR_WRITEMASK:
  1243. params[0] = ctx->color_mask_data.r;
  1244. params[1] = ctx->color_mask_data.g;
  1245. params[2] = ctx->color_mask_data.b;
  1246. params[3] = ctx->color_mask_data.a;
  1247. break;
  1248. case GL_DEPTH_WRITEMASK:
  1249. params[0] = ctx->depth_write_mask;
  1250. break;
  1251. case GL_SHADER_COMPILER :
  1252. params[0] = GL_FALSE;
  1253. break;
  1254. //The state variable supported by glIsEnabled
  1255. case GL_CULL_FACE:
  1256. case GL_POLYGON_OFFSET_FILL:
  1257. case GL_SAMPLE_COVERAGE:
  1258. case GL_SAMPLE_ALPHA_TO_COVERAGE:
  1259. case GL_SCISSOR_TEST:
  1260. case GL_STENCIL_TEST:
  1261. case GL_DEPTH_TEST:
  1262. case GL_BLEND:
  1263. case GL_DITHER:
  1264. #ifdef EN_EXT_ALPHA_TEST_EXP
  1265. case GL_ALPHA_TEST_EXP:
  1266. #endif
  1267. #ifdef EN_EXT_LOGIC_OP_EXP
  1268. case GL_COLOR_LOGIC_OP:
  1269. #endif
  1270. params[0] = glIsEnabled(pname);
  1271. break;
  1272. //The state variable added from glGetInteger* and glGetFloat*
  1273. case GL_ARRAY_BUFFER_BINDING:
  1274. params[0] = 0;
  1275. if(ctx->buffer_object_data.array_buffer_binding != NULL){
  1276. if(ctx->buffer_object_data.array_buffer_binding->id != 0) params[0] = 1;
  1277. }
  1278. break;
  1279. case GL_ELEMENT_ARRAY_BUFFER_BINDING:
  1280. params[0] = 0;
  1281. if(ctx->buffer_object_data.element_array_buffer_binding != NULL){
  1282. if(ctx->buffer_object_data.element_array_buffer_binding->id != 0) params[0] = 1;
  1283. }
  1284. break;
  1285. case GL_VIEWPORT:
  1286. if(ctx->viewport_data.x != 0){
  1287. params[0] = 1;
  1288. }else params[0] = 0;
  1289. if(ctx->viewport_data.y != 0){
  1290. params[1] = 1;
  1291. }else params[0] = 0;
  1292. if(ctx->viewport_data.w != 0){
  1293. params[2] = 1;
  1294. }else params[0] = 0;
  1295. if(ctx->viewport_data.h != 0){
  1296. params[3] = 1;
  1297. }else params[0] = 0;
  1298. break;
  1299. case GL_DEPTH_RANGE:
  1300. if( ctx->depth_range_data.near_depth != 0){
  1301. params[0] = 1;
  1302. }else params[0] = 0;
  1303. if(ctx->depth_range_data.far_depth != 0){
  1304. params[1] = 1;
  1305. }else params[0] = 0;
  1306. break;
  1307. case GL_LINE_WIDTH:
  1308. if(ctx->line_width != 0){
  1309. params[0] = 1;
  1310. }else params[0] = 0;
  1311. break;
  1312. case GL_CULL_FACE_MODE:
  1313. if(ctx->cull_face_data.mode != 0){
  1314. params[0] = 1;
  1315. }else params[0] = 0;
  1316. break;
  1317. case GL_FRONT_FACE:
  1318. if(ctx->front_face_mode != 0){
  1319. params[0] = 1;
  1320. }else params[0] = 0;
  1321. break;
  1322. case GL_POLYGON_OFFSET_FACTOR:
  1323. if(ctx->polygon_offset_data.factor != 0){
  1324. params[0] = 1;
  1325. }else params[0] = 0;
  1326. break;
  1327. case GL_POLYGON_OFFSET_UNITS:
  1328. if(ctx->polygon_offset_data.units != 0){
  1329. params[0] = 1;
  1330. }else params[0] = 0;
  1331. break;
  1332. case GL_SAMPLE_COVERAGE_VALUE:
  1333. if(ctx->sample_coverage_data.value != 0){
  1334. params[0] = 1;
  1335. }else params[0] = 0;
  1336. break;
  1337. case GL_TEXTURE_BINDING_2D: //to check
  1338. if( ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture2D != 0){
  1339. params[0] = 1;
  1340. }else params[0] = 0;
  1341. break;
  1342. case GL_TEXTURE_BINDING_3D:
  1343. if(ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture3D != 0){
  1344. params[0] = 1;
  1345. }else params[0] = 0;
  1346. break;
  1347. case GL_TEXTURE_BINDING_CUBE_MAP:
  1348. if(ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].cubeMap != 0){
  1349. params[0] = 1;
  1350. }else params[0] = 0;
  1351. //params[0] = GetTexNameArrayIndex(params[0] );
  1352. break;
  1353. case GL_ACTIVE_TEXTURE:
  1354. if(ctx->texState.activeTexUnit != 0){
  1355. params[0] = 1;
  1356. }else params[0] = 0;
  1357. break;
  1358. case GL_STENCIL_WRITEMASK :
  1359. if(ctx->front_stencil_writemask != 0){
  1360. params[0] = 1;
  1361. }else params[0] = 0;
  1362. break;
  1363. case GL_STENCIL_BACK_WRITEMASK :
  1364. if(ctx->back_stencil_writemask != 0){
  1365. params[0] = 1;
  1366. }else params[0] = 0;
  1367. break;
  1368. case GL_COLOR_CLEAR_VALUE :
  1369. if( ctx->clear_color_data.r != 0){
  1370. params[0] = 1;
  1371. }else params[0] = 0;
  1372. if(ctx->clear_color_data.g != 0){
  1373. params[1] = 1;
  1374. }else params[0] = 0;
  1375. if( ctx->clear_color_data.b != 0){
  1376. params[2] = 1;
  1377. }else params[0] = 0;
  1378. if(ctx->clear_color_data.a != 0){
  1379. params[3] = 1;
  1380. }else params[0] = 0;
  1381. break;
  1382. case GL_DEPTH_CLEAR_VALUE :
  1383. if( ctx->clear_depth != 0){
  1384. params[0] = 1;
  1385. }else params[0] = 0;
  1386. break;
  1387. case GL_STENCIL_CLEAR_VALUE:
  1388. if(ctx->clear_stencil != 0){
  1389. params[0] = 1;
  1390. }else params[0] = 0;
  1391. break;
  1392. case GL_SCISSOR_BOX:
  1393. if(ctx->scissor_test_data.x != 0){
  1394. params[0] = 1;
  1395. }else params[0] = 0;
  1396. if(ctx->scissor_test_data.y != 0){
  1397. params[1] = 1;
  1398. }else params[0] = 0;
  1399. if( ctx->scissor_test_data.w != 0){
  1400. params[2] = 1;
  1401. }else params[0] = 0;
  1402. if(ctx->scissor_test_data.h != 0){
  1403. params[3] = 1;
  1404. }else params[0] = 0;
  1405. break;
  1406. case GL_STENCIL_FUNC:
  1407. if(ctx->stencil_test_data.front_face_func != 0){
  1408. params[0] =1;
  1409. }else params[0] = 0;
  1410. break;
  1411. case GL_STENCIL_VALUE_MASK:
  1412. if(ctx->stencil_test_data.front_face_mask != 0){
  1413. params[0] = 1;
  1414. }else params[0] = 0;
  1415. break;
  1416. case GL_STENCIL_REF :
  1417. if(ctx->stencil_test_data.front_face_ref != 0){
  1418. params[0] = 1;
  1419. }else params[0] = 0;
  1420. break;
  1421. case GL_STENCIL_FAIL :
  1422. if(ctx->stencil_test_data.front_face_fail != 0){
  1423. params[0] = 1;
  1424. }else params[0] = 0;
  1425. break;
  1426. case GL_STENCIL_PASS_DEPTH_FAIL :
  1427. if(ctx->stencil_test_data.front_face_zfail != 0){
  1428. params[0] = 1;
  1429. }else params[0] = 0;
  1430. break;
  1431. case GL_STENCIL_PASS_DEPTH_PASS :
  1432. if(ctx->stencil_test_data.front_face_zpass != 0){
  1433. params[0] = 1;
  1434. }else params[0] = 0;
  1435. break;
  1436. case GL_STENCIL_BACK_FUNC :
  1437. if( ctx->stencil_test_data.back_face_func != 0){
  1438. params[0] = 1;
  1439. }else params[0] = 0;
  1440. break;
  1441. case GL_STENCIL_BACK_VALUE_MASK :
  1442. if(ctx->stencil_test_data.back_face_mask != 0){
  1443. params[0] = 1;
  1444. }else params[0] = 0;
  1445. break;
  1446. case GL_STENCIL_BACK_REF :
  1447. if(ctx->stencil_test_data.back_face_ref != 0){
  1448. params[0] = 1;
  1449. }else params[0] = 0;
  1450. break;
  1451. case GL_STENCIL_BACK_FAIL :
  1452. if(ctx->stencil_test_data.back_face_fail != 0){
  1453. params[0] =1;
  1454. }else params[0] = 0;
  1455. break;
  1456. case GL_STENCIL_BACK_PASS_DEPTH_FAIL :
  1457. if(ctx->stencil_test_data.back_face_zfail != 0){
  1458. params[0] = 1;
  1459. }else params[0] = 0;
  1460. break;
  1461. case GL_STENCIL_BACK_PASS_DEPTH_PASS :
  1462. if( ctx->stencil_test_data.back_face_zpass != 0){
  1463. params[0] = 1;
  1464. }else params[0] = 0;
  1465. break;
  1466. case GL_DEPTH_FUNC:
  1467. if(ctx->depth_test_func != 0){
  1468. params[0] = 1;
  1469. }else params[0] = 0;
  1470. break;
  1471. case GL_BLEND_SRC_RGB :
  1472. //if((params[0] = ctx->blend_data.fn_srcRG)!=0){
  1473. // params[0] =1;
  1474. //}
  1475. //break;
  1476. case GL_BLEND_SRC_ALPHA:
  1477. if(ctx->blend_data.fn_srcAlpha != 0){
  1478. params[0] =1;
  1479. }else params[0] = 0;
  1480. break;
  1481. case GL_BLEND_DST_RGB :
  1482. if(ctx->blend_data.fn_dstRGB != 0){
  1483. params[0] = 1;
  1484. }else params[0] = 0;
  1485. break;
  1486. case GL_BLEND_DST_ALPHA:
  1487. if(ctx->blend_data.fn_dstAlpha != 0){
  1488. params[0] =1;
  1489. }else params[0] = 0;
  1490. break;
  1491. case GL_BLEND_EQUATION_RGB :
  1492. if(ctx->blend_data.eqn_modeRGB != 0){
  1493. params[0] = 1;
  1494. }else params[0] = 0;
  1495. break;
  1496. case GL_BLEND_EQUATION_ALPHA:
  1497. if(ctx->blend_data.eqn_modeAlpha != 0){
  1498. params[0] = 1;
  1499. }else params[0] = 0;
  1500. break;
  1501. case GL_BLEND_COLOR :
  1502. if( ctx->blend_data.blnd_clr_red != 0){
  1503. params[0] = 1;
  1504. }else params[0] = 0;
  1505. if(ctx->blend_data.blnd_clr_green != 0){
  1506. params[0] = 1;
  1507. }else params[0] = 0;
  1508. if(ctx->blend_data.blnd_clr_blue != 0){
  1509. params[2] = 1;
  1510. }else params[0] = 0;
  1511. if(ctx->blend_data.blnd_clr_alpha != 0){
  1512. params[3] = 1;
  1513. }else params[0] = 0;
  1514. break;
  1515. case GL_UNPACK_ALIGNMENT:
  1516. if(ctx->pixel_store_data.unpack_alignment != 0){
  1517. params[0] = 1;
  1518. }else params[0] = 0;
  1519. break;
  1520. case GL_PACK_ALIGNMENT:
  1521. if(ctx->pixel_store_data.pack_alignment != 0){
  1522. params[0] = 1;
  1523. }else params[0] = 0;
  1524. break;
  1525. case GL_CURRENT_PROGRAM:
  1526. if(ctx->current_program != 0){
  1527. params[0] = 1;
  1528. }else params[0] = 0;
  1529. break;
  1530. case GL_GENERATE_MIPMAP_HINT:
  1531. if(ctx->hint_data.generate_mipmap_hint != 0){
  1532. params[0] = 1;
  1533. }else params[0] = 0;
  1534. break;
  1535. case GL_MAX_TEXTURE_SIZE:
  1536. if( MAX_TEXTURE_SIZE != 0){
  1537. params[0] = 1;
  1538. }else params[0] = 0;
  1539. break;
  1540. case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
  1541. if( MAX_CUBEMAP_TEXTURE_SIZE != 0){
  1542. params[0] = 1;
  1543. }else params[0] = 0;
  1544. break;
  1545. case GL_MAX_VIEWPORT_DIMS:
  1546. if(MAX_VIEWPORT_DIMS != 0){
  1547. params[0] = 1;
  1548. params[1] = 1;
  1549. }else{ params[0] = 0; params[1] = 0;}
  1550. break;
  1551. case GL_MAX_ELEMENTS_INDICES :
  1552. if(MAX_ELEMENTS_INDICES != 0){
  1553. params[0] = 1;
  1554. }else params[0] = 0;
  1555. break;
  1556. case GL_MAX_ELEMENTS_VERTICES :
  1557. if(MAX_ELEMENTS_VERTICES != 0){
  1558. params[0] = 1;
  1559. }else params[0] = 0;
  1560. break;
  1561. case GL_SAMPLE_BUFFERS :
  1562. if(NO_OF_SAMPLES != 0){
  1563. params[0] = 1;
  1564. }else params[0] = 0;
  1565. break;
  1566. case GL_SAMPLES :
  1567. if(MULTISAMPLING != 0){
  1568. params[0] = 1;
  1569. }else params[0] = 0;
  1570. break;
  1571. case GL_COMPRESSED_TEXTURE_FORMATS :
  1572. if(NUM_COMPRESSED_TEXTURE_FORMATS != 0){
  1573. params[0] = 1;
  1574. }else params[0] = 0;
  1575. break;
  1576. case GL_NUM_COMPRESSED_TEXTURE_FORMATS :
  1577. if(NUM_COMPRESSED_TEXTURE_FORMATS != 0){
  1578. params[0] = 1;
  1579. }else params[0] = 0;
  1580. break;
  1581. case GL_NUM_SHADER_BINARY_FORMATS :
  1582. if((tempValue[0] = NUM_SHADER_BINARY_FORMATS) != 0){
  1583. params[0] = 1;
  1584. }else params[0] = 0;
  1585. break;
  1586. case GL_MAX_VERTEX_ATTRIBS :
  1587. if(MAX_VERTEX_ATTRIB_VARS != 0){
  1588. params[0] = 1;
  1589. }else params[0] = 0;
  1590. break;
  1591. case GL_MAX_VERTEX_UNIFORM_VECTORS :
  1592. if(MAX_UNIFORMS != 0){
  1593. params[0] = 1;
  1594. }else params[0] = 0;
  1595. break;
  1596. case GL_MAX_VARYING_VECTORS :
  1597. if(MAX_VARYING_VECTORS != 0){
  1598. params[0] = 1;
  1599. }else params[0] = 0;
  1600. break;
  1601. case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS :
  1602. if(MAX_VERTEX_TEXTURE_UNITS + MAX_TEXTURE_UNITS != 0){
  1603. params[0] = 1;
  1604. }else params[0] = 0;
  1605. break;
  1606. case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS :
  1607. if( MAX_VERTEX_TEXTURE_UNITS != 0){
  1608. params[0] = 1;
  1609. }else params[0] = 0;
  1610. break;
  1611. case GL_MAX_TEXTURE_IMAGE_UNITS :
  1612. if( MAX_TEXTURE_UNITS != 0){
  1613. params[0] = 1;
  1614. }else params[0] = 0;
  1615. break;
  1616. case GL_MAX_FRAGMENT_UNIFORM_VECTORS :
  1617. if(MAX_UNIFORMS != 0){
  1618. params[0] = 1;
  1619. }else params[0] = 0;
  1620. break;
  1621. case GL_MAX_RENDERBUFFER_SIZE :
  1622. if(MAX_RENDERBUFFER_SIZE != 0){
  1623. params[0] = 1;
  1624. }else params[0] = 0;
  1625. break;
  1626. case GL_RED_BITS :
  1627. if(determinePixelBitSize(fbData.nativeColorFormat,RED) != 0){
  1628. params[0] = 1;
  1629. }else params[0] = 0;
  1630. break;
  1631. case GL_GREEN_BITS:
  1632. if(determinePixelBitSize(fbData.nativeColorFormat,GREEN) != 0){
  1633. params[0] = 1;
  1634. }else params[0] = 0;
  1635. break;
  1636. case GL_BLUE_BITS :
  1637. if(determinePixelBitSize(fbData.nativeColorFormat,BLUE) != 0){
  1638. params[0] = 1;
  1639. }else params[0] = 0;
  1640. break;
  1641. case GL_ALPHA_BITS :
  1642. if(determinePixelBitSize(fbData.nativeColorFormat,ALPHA) != 0){
  1643. params[0] = 1;
  1644. }else params[0] = 0;
  1645. break;
  1646. case GL_DEPTH_BITS :
  1647. if(determinePixelBitSize(fbData.nativeDepthStencilFormat,DEPTH) != 0){
  1648. params[0] = 1;
  1649. }else params[0] = 0;
  1650. break;
  1651. case GL_STENCIL_BITS:
  1652. if(determinePixelBitSize(fbData.nativeDepthStencilFormat,STENCIL) != 0){
  1653. params[0] = 1;
  1654. }else params[0] = 0;
  1655. break;
  1656. case GL_IMPLEMENTATION_COLOR_READ_TYPE:
  1657. if(determineTypeFormat(translateToGLenum(fbData.nativeColorFormat), GL_FALSE) != 0){
  1658. params[0] = 1;
  1659. }else params[0] = 0;
  1660. break;
  1661. case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
  1662. if(determineTypeFormat(translateToGLenum(ctx->defFBData.nativeColorFormat), GL_TRUE) != 0){
  1663. params[0] = 1;
  1664. }else params[0] = 0;
  1665. break;
  1666. case GL_ALIASED_POINT_SIZE_RANGE:
  1667. //TODO max value need to be asked
  1668. break;
  1669. case GL_ALIASED_LINE_WIDTH_RANGE:
  1670. //TODO max value need to be asked
  1671. break;
  1672. case GL_SHADER_BINARY_FORMATS :
  1673. //TODO unknown format supported
  1674. break;
  1675. case GL_SUBPIXEL_BITS:
  1676. //TODO need to be asked
  1677. break;
  1678. default:
  1679. SET_ERR(ctx, GL_INVALID_ENUM, "glGetBooleanv*");
  1680. }
  1681. }
  1682. GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params)
  1683. {
  1684. GET_GL_STATE(ctx);
  1685. BufferObject* buf = NULL;
  1686. if(params == NULL)
  1687. {
  1688. set_err(GL_INVALID_VALUE);
  1689. return;
  1690. }
  1691. switch(target)
  1692. {
  1693. case GL_ARRAY_BUFFER:
  1694. buf = ctx->buffer_object_data.array_buffer_binding;
  1695. break;
  1696. case GL_ELEMENT_ARRAY_BUFFER:
  1697. buf = ctx->buffer_object_data.element_array_buffer_binding;
  1698. break;
  1699. default:
  1700. set_err(GL_INVALID_ENUM);
  1701. return;
  1702. }
  1703. if(buf == NULL)
  1704. {
  1705. set_err(GL_INVALID_ENUM);
  1706. return;
  1707. }
  1708. switch(pname)
  1709. {
  1710. case GL_BUFFER_SIZE:
  1711. *params = buf->size;
  1712. break;
  1713. case GL_BUFFER_USAGE:
  1714. *params = buf->usage;
  1715. break;
  1716. case GL_BUFFER_ACCESS:
  1717. *params = buf->access;
  1718. break;
  1719. default:
  1720. set_err(GL_INVALID_ENUM);
  1721. return;
  1722. }
  1723. }
  1724. GL_API GLenum GL_APIENTRY glGetError (void)
  1725. {
  1726. GET_GL_STATE(ctx);
  1727. GLenum error = ctx->error;
  1728. ctx->error = GL_NO_ERROR;
  1729. return error;
  1730. }
  1731. GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params)
  1732. {
  1733. GET_GL_STATE(ctx);
  1734. FramebufferData fbData = getFBData();
  1735. if(params == NULL)
  1736. SET_ERR(ctx, GL_INVALID_VALUE, "glGetFloatv*");
  1737. else
  1738. switch(pname)
  1739. {
  1740. case GL_ARRAY_BUFFER_BINDING:
  1741. if(ctx->buffer_object_data.array_buffer_binding != NULL){
  1742. params[0] = (float)ctx->buffer_object_data.array_buffer_binding->id;
  1743. }else params[0] = 0.0f;
  1744. break;
  1745. case GL_ELEMENT_ARRAY_BUFFER_BINDING:
  1746. if(ctx->buffer_object_data.element_array_buffer_binding != NULL){
  1747. params[0] = (float)ctx->buffer_object_data.element_array_buffer_binding->id;
  1748. }else params[0] = 0.0f;
  1749. break;
  1750. case GL_VIEWPORT:
  1751. params[0] = (float)ctx->viewport_data.x;
  1752. params[1] = (float)ctx->viewport_data.y;
  1753. params[2] = (float)ctx->viewport_data.w ;
  1754. params[3] = (float)ctx->viewport_data.h ;
  1755. break;
  1756. case GL_DEPTH_RANGE:
  1757. params[0] = ctx->depth_range_data.near_depth;
  1758. params[1] = ctx->depth_range_data.far_depth;
  1759. break;
  1760. case GL_POINT_SIZE:
  1761. params[0] = ctx->point_size;
  1762. break;
  1763. case GL_LINE_WIDTH:
  1764. params[0] = ctx->line_width;
  1765. break;
  1766. case GL_CULL_FACE_MODE:
  1767. params[0] = (float)ctx->cull_face_data.mode;
  1768. break;
  1769. case GL_FRONT_FACE:
  1770. params[0] = (float)ctx->front_face_mode;
  1771. break;
  1772. case GL_POLYGON_OFFSET_FACTOR:
  1773. params[0] = ctx->polygon_offset_data.factor;
  1774. break;
  1775. case GL_POLYGON_OFFSET_UNITS:
  1776. params[0] = ctx->polygon_offset_data.units;
  1777. break;
  1778. case GL_SAMPLE_COVERAGE_VALUE:
  1779. params[0] = ctx->sample_coverage_data.value;//to check
  1780. break;
  1781. case GL_SAMPLE_COVERAGE_INVERT:
  1782. params[0] = ctx->sample_coverage_data.invert;
  1783. break;
  1784. case GL_TEXTURE_BINDING_2D: //to check
  1785. params[0] = (float)ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture2D;
  1786. //params[0] = GetTexNameArrayIndex(params[0] );
  1787. break;
  1788. case GL_TEXTURE_BINDING_3D:
  1789. params[0] = (float)ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture3D;
  1790. //params[0] = GetTexNameArrayIndex(params[0] );
  1791. break;
  1792. case GL_TEXTURE_BINDING_CUBE_MAP:
  1793. params[0] = (float)ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].cubeMap;
  1794. //params[0] = GetTexNameArrayIndex(params[0] );
  1795. break;
  1796. case GL_ACTIVE_TEXTURE:
  1797. params[0] = (float)ctx->texState.activeTexUnit;
  1798. break;
  1799. case GL_COLOR_WRITEMASK:
  1800. params[0] = ctx->color_mask_data.r;
  1801. params[1] = ctx->color_mask_data.g ;
  1802. params[2] = ctx->color_mask_data.b ;
  1803. params[3] = ctx->color_mask_data.a;
  1804. break;
  1805. case GL_DEPTH_WRITEMASK:
  1806. params[0] = ctx->depth_write_mask;
  1807. break;
  1808. case GL_STENCIL_WRITEMASK :
  1809. params[0] = (float)ctx->front_stencil_writemask ;
  1810. break;
  1811. case GL_STENCIL_BACK_WRITEMASK :
  1812. params[0] = (float)ctx->back_stencil_writemask;
  1813. break;
  1814. case GL_COLOR_CLEAR_VALUE :
  1815. params[0] = ctx->clear_color_data.r;
  1816. params[1] = ctx->clear_color_data.g ;
  1817. params[2] = ctx->clear_color_data.b ;
  1818. params[3] = ctx->clear_color_data.a;
  1819. break;
  1820. case GL_DEPTH_CLEAR_VALUE :
  1821. params[0] = ctx->clear_depth;
  1822. break;
  1823. case GL_STENCIL_CLEAR_VALUE:
  1824. params[0] = (float)ctx->clear_stencil;
  1825. break;
  1826. case GL_SCISSOR_BOX:
  1827. params[0] = (float)ctx->scissor_test_data.x;
  1828. params[1] =(float) ctx->scissor_test_data.y;
  1829. params[2] = (float)ctx->scissor_test_data.w;
  1830. params[3] = (float)ctx->scissor_test_data.h;
  1831. break;
  1832. case GL_STENCIL_FUNC:
  1833. params[0] = (float)ctx->stencil_test_data.front_face_func;
  1834. break;
  1835. case GL_STENCIL_VALUE_MASK:
  1836. params[0] = (float)ctx->stencil_test_data.front_face_mask ;
  1837. break;
  1838. case GL_STENCIL_REF :
  1839. params[0] = (float)ctx->stencil_test_data.front_face_ref;
  1840. break;
  1841. case GL_STENCIL_FAIL :
  1842. params[0] = (float)ctx->stencil_test_data.front_face_fail;
  1843. break;
  1844. case GL_STENCIL_PASS_DEPTH_FAIL :
  1845. params[0] = (float)ctx->stencil_test_data.front_face_zfail;
  1846. break;
  1847. case GL_STENCIL_PASS_DEPTH_PASS :
  1848. params[0] = (float)ctx->stencil_test_data.front_face_zpass;
  1849. break;
  1850. case GL_STENCIL_BACK_FUNC :
  1851. params[0] = (float)ctx->stencil_test_data.back_face_func;
  1852. break;
  1853. case GL_STENCIL_BACK_VALUE_MASK :
  1854. params[0] = (float)ctx->stencil_test_data.back_face_mask;
  1855. break;
  1856. case GL_STENCIL_BACK_REF :
  1857. params[0] = (float)ctx->stencil_test_data.back_face_ref;
  1858. break;
  1859. case GL_STENCIL_BACK_FAIL :
  1860. params[0] = (float)ctx->stencil_test_data.back_face_fail;
  1861. break;
  1862. case GL_STENCIL_BACK_PASS_DEPTH_FAIL :
  1863. params[0] = (float)ctx->stencil_test_data.back_face_zfail;
  1864. break;
  1865. case GL_STENCIL_BACK_PASS_DEPTH_PASS :
  1866. params[0] = (float)ctx->stencil_test_data.back_face_zpass;
  1867. break;
  1868. case GL_DEPTH_FUNC:
  1869. params[0] = (float)ctx->depth_test_func;
  1870. break;
  1871. case GL_BLEND_SRC_RGB :
  1872. params[0] = (float)ctx->blend_data.fn_srcRGB;
  1873. break;
  1874. case GL_BLEND_SRC_ALPHA:
  1875. params[0] = (float)ctx->blend_data.fn_srcAlpha;
  1876. break;
  1877. case GL_BLEND_DST_RGB :
  1878. params[0] = (float)ctx->blend_data.fn_dstRGB;
  1879. break;
  1880. case GL_BLEND_DST_ALPHA:
  1881. params[0] = (float)ctx->blend_data.fn_dstAlpha;
  1882. break;
  1883. case GL_BLEND_EQUATION_RGB :
  1884. params[0] =(float)ctx->blend_data.eqn_modeRGB ;
  1885. break;
  1886. case GL_BLEND_EQUATION_ALPHA:
  1887. params[0] = (float)ctx->blend_data.eqn_modeAlpha;
  1888. break;
  1889. case GL_BLEND_COLOR :
  1890. params[0] = ctx->blend_data.blnd_clr_red ;
  1891. params[1] = ctx->blend_data.blnd_clr_green;
  1892. params[2] = ctx->blend_data.blnd_clr_blue;
  1893. params[3] = ctx->blend_data.blnd_clr_alpha;
  1894. break;
  1895. case GL_UNPACK_ALIGNMENT:
  1896. params[0] = (float)ctx->pixel_store_data.unpack_alignment;
  1897. break;
  1898. case GL_PACK_ALIGNMENT:
  1899. params[0] = (float)ctx->pixel_store_data.pack_alignment;
  1900. break;
  1901. case GL_CURRENT_PROGRAM:
  1902. params[0] = (float)ctx->current_program;
  1903. break;
  1904. case GL_GENERATE_MIPMAP_HINT:
  1905. params[0] = (float)ctx->hint_data.generate_mipmap_hint;
  1906. break;
  1907. case GL_SUBPIXEL_BITS:
  1908. //TODO
  1909. break;
  1910. case GL_MAX_TEXTURE_SIZE:
  1911. params[0] = MAX_TEXTURE_SIZE;
  1912. break;
  1913. case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
  1914. params[0] = MAX_CUBEMAP_TEXTURE_SIZE;
  1915. break;
  1916. case GL_MAX_VIEWPORT_DIMS:
  1917. params[0] = MAX_VIEWPORT_DIMS;
  1918. params[1] = MAX_VIEWPORT_DIMS;
  1919. break;
  1920. case GL_ALIASED_POINT_SIZE_RANGE:
  1921. //TODO
  1922. break;
  1923. case GL_ALIASED_LINE_WIDTH_RANGE:
  1924. //TODO
  1925. break;
  1926. case GL_MAX_ELEMENTS_INDICES :
  1927. params[0] = MAX_ELEMENTS_INDICES;
  1928. break;
  1929. case GL_MAX_ELEMENTS_VERTICES :
  1930. params[0] = MAX_ELEMENTS_VERTICES;
  1931. break;
  1932. case GL_SAMPLE_BUFFERS :
  1933. params[0] = NO_OF_SAMPLES;
  1934. break;
  1935. case GL_SAMPLES :
  1936. params[0] = MULTISAMPLING;
  1937. break;
  1938. case GL_COMPRESSED_TEXTURE_FORMATS :
  1939. params[0] = GL_PALETTE4_RGB8_OES;
  1940. params[1] = GL_PALETTE4_RGBA8_OES;
  1941. params[2] = GL_PALETTE4_R5_G6_B5_OES;
  1942. params[3] = GL_PALETTE4_RGBA4_OES;
  1943. params[4] = GL_PALETTE4_RGB5_A1_OES;
  1944. params[5] = GL_PALETTE8_RGB8_OES;
  1945. params[6] = GL_PALETTE8_RGBA8_OES;
  1946. params[7] = GL_PALETTE8_R5_G6_B5_OES;
  1947. params[8] = GL_PALETTE8_RGBA4_OES;
  1948. params[9] = GL_PALETTE8_RGB5_A1_OES;
  1949. params[10] = GL_RGB_S3TC_OES;
  1950. params[11] = GL_RGBA_S3TC_OES;
  1951. break;
  1952. case GL_NUM_COMPRESSED_TEXTURE_FORMATS :
  1953. params[0] = NUM_COMPRESSED_TEXTURE_FORMATS;
  1954. break;
  1955. //case GL_SHADER_BINARY_FORMATS :
  1956. //TODO unknown format supported
  1957. // break;
  1958. case GL_NUM_SHADER_BINARY_FORMATS :
  1959. params[0] = NUM_SHADER_BINARY_FORMATS;
  1960. break;
  1961. case GL_SHADER_COMPILER :
  1962. params[0] = GL_FALSE;
  1963. break;
  1964. case GL_MAX_VERTEX_ATTRIBS :
  1965. params[0] = MAX_VERTEX_ATTRIBS;
  1966. break;
  1967. case GL_MAX_VERTEX_UNIFORM_VECTORS :
  1968. params[0] = MAX_UNIFORMS;
  1969. break;
  1970. case GL_MAX_VARYING_VECTORS :
  1971. params[0] =MAX_VARYING_VECTORS;
  1972. break;
  1973. case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS :
  1974. params[0] =MAX_VERTEX_TEXTURE_UNITS + MAX_TEXTURE_UNITS;
  1975. break;
  1976. case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS :
  1977. params[0] = MAX_VERTEX_TEXTURE_UNITS;
  1978. break;
  1979. case GL_MAX_TEXTURE_IMAGE_UNITS :
  1980. params[0] = MAX_TEXTURE_UNITS;
  1981. break;
  1982. case GL_MAX_FRAGMENT_UNIFORM_VECTORS :
  1983. params[0] =MAX_UNIFORMS;
  1984. break;
  1985. case GL_MAX_RENDERBUFFER_SIZE :
  1986. params[0] = MAX_RENDERBUFFER_SIZE;
  1987. break;
  1988. case GL_RED_BITS :
  1989. params[0] = (float)determinePixelBitSize(fbData.nativeColorFormat,RED) ;
  1990. break;
  1991. case GL_GREEN_BITS:
  1992. params[0] = (float)determinePixelBitSize(fbData.nativeColorFormat,GREEN) ;
  1993. break;
  1994. case GL_BLUE_BITS :
  1995. params[0] = (float)determinePixelBitSize(fbData.nativeColorFormat,BLUE) ;
  1996. break;
  1997. case GL_ALPHA_BITS :
  1998. params[0] = (float)determinePixelBitSize(fbData.nativeColorFormat,ALPHA) ;
  1999. break;
  2000. case GL_DEPTH_BITS :
  2001. params[0] = (float)determinePixelBitSize(fbData.nativeDepthStencilFormat,DEPTH) ;
  2002. break;
  2003. case GL_STENCIL_BITS:
  2004. params[0] = (float)determinePixelBitSize(fbData.nativeDepthStencilFormat,STENCIL) ;
  2005. break;
  2006. case GL_IMPLEMENTATION_COLOR_READ_TYPE:
  2007. params[0] = (float)determineTypeFormat(translateToGLenum(fbData.nativeColorFormat), GL_FALSE);
  2008. break;
  2009. case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
  2010. params[0] = (float)determineTypeFormat(translateToGLenum(ctx->defFBData.nativeColorFormat), GL_TRUE);
  2011. break;
  2012. #ifdef EN_EXT_ALPHA_TEST_EXP
  2013. case GL_ALPHA_TEST_FUNC_EXP:
  2014. params[0] = (float)ctx->alpha_test_data.func;
  2015. break;
  2016. case GL_ALPHA_TEST_REF_EXP:
  2017. params[0] = ctx->alpha_test_data.refValue;
  2018. break;
  2019. #endif
  2020. #ifdef EN_EXT_LOGIC_OP_EXP
  2021. case GL_LOGIC_OP_MODE_EXP:
  2022. params[0] = ctx->is_logicOp_enabled;
  2023. break;
  2024. #endif
  2025. //all the parameter supported by glIsEnabled ahs to be supported by glGetBooleanv
  2026. case GL_CULL_FACE:
  2027. case GL_POLYGON_OFFSET_FILL:
  2028. case GL_SAMPLE_COVERAGE:
  2029. case GL_SAMPLE_ALPHA_TO_COVERAGE:
  2030. case GL_SCISSOR_TEST:
  2031. case GL_STENCIL_TEST:
  2032. case GL_DEPTH_TEST:
  2033. case GL_BLEND:
  2034. case GL_DITHER:
  2035. #ifdef EN_EXT_ALPHA_TEST_EXP
  2036. case GL_ALPHA_TEST_EXP:
  2037. #endif
  2038. #ifdef EN_EXT_LOGIC_OP_EXP
  2039. case GL_COLOR_LOGIC_OP:
  2040. #endif
  2041. params[0] = glIsEnabled(pname);
  2042. break;
  2043. default:
  2044. SET_ERR(ctx, GL_INVALID_ENUM, "glGetFloatv*");
  2045. }
  2046. }
  2047. GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params)
  2048. {
  2049. GET_GL_STATE(ctx);
  2050. FramebufferData fbData = getFBData();
  2051. if(params == NULL)
  2052. SET_ERR(ctx, GL_INVALID_VALUE, "glGetFloatv*");
  2053. else
  2054. switch(pname)
  2055. {
  2056. //the array buffer object's id currently binded to check
  2057. case GL_ARRAY_BUFFER_BINDING:
  2058. if(ctx->buffer_object_data.array_buffer_binding != NULL){
  2059. params[0] = ctx->buffer_object_data.array_buffer_binding->id;
  2060. }else params[0] = 0;
  2061. break;
  2062. //the element array buffer object's id currently binded to check
  2063. case GL_ELEMENT_ARRAY_BUFFER_BINDING:
  2064. if(ctx->buffer_object_data.element_array_buffer_binding != NULL){
  2065. params[0] = ctx->buffer_object_data.element_array_buffer_binding->id;
  2066. }else params[0] = 0;
  2067. break;
  2068. case GL_VIEWPORT:
  2069. params[0] = ctx->viewport_data.x;
  2070. params[1] = ctx->viewport_data.y;
  2071. params[2] = ctx->viewport_data.w ;
  2072. params[3] = ctx->viewport_data.h ;
  2073. break;
  2074. case GL_DEPTH_RANGE:
  2075. params[0] = (int)((pow(2.0, 32.0) - 1) * ctx->depth_range_data.near_depth -1)/2;
  2076. params[1] = (int)((pow(2.0, 32.0) - 1) * ctx->depth_range_data.far_depth - 1)/2;
  2077. break;
  2078. case GL_POINT_SIZE:
  2079. params[0] = (int)floor(ctx->point_size + 0.5);
  2080. break;
  2081. case GL_LINE_WIDTH:
  2082. params[0] = (int)floor(ctx->line_width + 0.5);
  2083. break;
  2084. case GL_CULL_FACE_MODE:
  2085. params[0] = ctx->cull_face_data.mode;
  2086. break;
  2087. case GL_FRONT_FACE:
  2088. params[0] = ctx->front_face_mode;
  2089. break;
  2090. case GL_POLYGON_OFFSET_FACTOR:
  2091. params[0] = (int)floor(ctx->polygon_offset_data.factor + 0.5);
  2092. break;
  2093. case GL_POLYGON_OFFSET_UNITS:
  2094. params[0] = (int)floor(ctx->polygon_offset_data.units + 0.5);
  2095. break;
  2096. case GL_SAMPLE_COVERAGE_VALUE:
  2097. params[0] = (int)floor(ctx->sample_coverage_data.value + 0.5);//to check
  2098. break;
  2099. case GL_SAMPLE_COVERAGE_INVERT:
  2100. params[0] = ctx->sample_coverage_data.invert;
  2101. break;
  2102. case GL_TEXTURE_BINDING_2D:
  2103. params[0] = ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture2D;//to check
  2104. //params[0] = GetTexNameArrayIndex(params[0] );
  2105. //params[0] = GetTextureObject(GL_TEXTURE_2D,false,0); not right commented
  2106. break;
  2107. case GL_TEXTURE_BINDING_3D:
  2108. params[0] = ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].texture3D;
  2109. //params[0] = GetTexNameArrayIndex(params[0] );
  2110. //params[0] = GetTextureObject(GL_TEXTURE_3D,false,0);
  2111. break;
  2112. case GL_TEXTURE_BINDING_CUBE_MAP:
  2113. params[0] = ctx->texState.texUnitBinding[ctx->texState.activeTexUnit].cubeMap;
  2114. //params[0] = GetTexNameArrayIndex(params[0] );
  2115. //params[0] = GetTextureObject(GL_TEXTURE_CUBE_MAP,false,0);
  2116. break;
  2117. case GL_ACTIVE_TEXTURE:
  2118. params[0] = ctx->texState.activeTexUnit;
  2119. break;
  2120. case GL_COLOR_WRITEMASK:
  2121. params[0] = ctx->color_mask_data.r;
  2122. params[1] = ctx->color_mask_data.g ;
  2123. params[2] = ctx->color_mask_data.b ;
  2124. params[3] = ctx->color_mask_data.a;
  2125. break;
  2126. case GL_DEPTH_WRITEMASK:
  2127. params[0] = ctx->depth_write_mask;
  2128. break;
  2129. case GL_STENCIL_WRITEMASK :
  2130. params[0] = ctx->front_stencil_writemask ;
  2131. break;
  2132. case GL_STENCIL_BACK_WRITEMASK :
  2133. params[0] = ctx->back_stencil_writemask;
  2134. break;
  2135. case GL_COLOR_CLEAR_VALUE :
  2136. params[0] = (int)((pow(2.0, 32.0) - 1) * ctx->clear_color_data.r - 1)/2;
  2137. params[1] = (int)((pow(2.0, 32.0) - 1) * ctx->clear_color_data.g - 1)/2;
  2138. params[2] = (int)((pow(2.0, 32.0) - 1) * ctx->clear_color_data.b - 1)/2;
  2139. params[3] = (int)((pow(2.0, 32.0) - 1) * ctx->clear_color_data.a - 1)/2;
  2140. break;
  2141. case GL_DEPTH_CLEAR_VALUE :
  2142. params[0] = (GLint)ctx->clear_depth;
  2143. break;
  2144. case GL_STENCIL_CLEAR_VALUE:
  2145. params[0] =ctx->clear_stencil;
  2146. break;
  2147. case GL_SCISSOR_BOX:
  2148. params[0] = ctx->scissor_test_data.x;
  2149. params[1] = ctx->scissor_test_data.y;
  2150. params[2] = ctx->scissor_test_data.w;
  2151. params[3] = ctx->scissor_test_data.h;
  2152. break;
  2153. case GL_STENCIL_FUNC:
  2154. params[0] = ctx->stencil_test_data.front_face_func;
  2155. break;
  2156. case GL_STENCIL_VALUE_MASK:
  2157. params[0] = ctx->stencil_test_data.front_face_mask ;
  2158. break;
  2159. case GL_STENCIL_REF :
  2160. params[0] = ctx->stencil_test_data.front_face_ref;
  2161. break;
  2162. case GL_STENCIL_FAIL :
  2163. params[0] = ctx->stencil_test_data.front_face_fail;
  2164. break;
  2165. case GL_STENCIL_PASS_DEPTH_FAIL :
  2166. params[0] = ctx->stencil_test_data.front_face_zfail;
  2167. break;
  2168. case GL_STENCIL_PASS_DEPTH_PASS :
  2169. params[0] = ctx->stencil_test_data.front_face_zpass;
  2170. break;
  2171. case GL_STENCIL_BACK_FUNC :
  2172. params[0] = ctx->stencil_test_data.back_face_func;
  2173. break;
  2174. case GL_STENCIL_BACK_VALUE_MASK :
  2175. params[0] = ctx->stencil_test_data.back_face_mask;
  2176. break;
  2177. case GL_STENCIL_BACK_REF :
  2178. params[0] = ctx->stencil_test_data.back_face_ref;
  2179. break;
  2180. case GL_STENCIL_BACK_FAIL :
  2181. params[0] = ctx->stencil_test_data.back_face_fail;
  2182. break;
  2183. case GL_STENCIL_BACK_PASS_DEPTH_FAIL :
  2184. params[0] = ctx->stencil_test_data.back_face_zfail;
  2185. break;
  2186. case GL_STENCIL_BACK_PASS_DEPTH_PASS :
  2187. params[0] = ctx->stencil_test_data.back_face_zpass;
  2188. break;
  2189. case GL_DEPTH_FUNC:
  2190. params[0] = ctx->depth_test_func;
  2191. break;
  2192. case GL_BLEND_SRC_RGB :
  2193. params[0] = ctx->blend_data.fn_srcRGB;
  2194. break;
  2195. case GL_BLEND_SRC_ALPHA:
  2196. params[0] = ctx->blend_data.fn_srcAlpha;
  2197. break;
  2198. case GL_BLEND_DST_RGB :
  2199. params[0] = ctx->blend_data.fn_dstRGB;
  2200. break;
  2201. case GL_BLEND_DST_ALPHA:
  2202. params[0] =ctx->blend_data.fn_dstAlpha;
  2203. break;
  2204. case GL_BLEND_EQUATION_RGB :
  2205. params[0] =ctx->blend_data.eqn_modeRGB ;
  2206. break;
  2207. case GL_BLEND_EQUATION_ALPHA:
  2208. params[0] =ctx->blend_data.eqn_modeAlpha;
  2209. break;
  2210. case GL_BLEND_COLOR :
  2211. params[0] = (int)((pow(2.0, 32.0) - 1) * ctx->blend_data.blnd_clr_red - 1)/2 ;
  2212. params[1] = (int)((pow(2.0, 32.0) - 1) * ctx->blend_data.blnd_clr_green - 1)/2;
  2213. params[2] = (int)((pow(2.0, 32.0) - 1) * ctx->blend_data.blnd_clr_blue - 1)/2;
  2214. params[3] = (int)((pow(2.0, 32.0) - 1) * ctx->blend_data.blnd_clr_alpha - 1)/2;
  2215. break;
  2216. case GL_UNPACK_ALIGNMENT:
  2217. params[0] =ctx->pixel_store_data.unpack_alignment;
  2218. break;
  2219. case GL_PACK_ALIGNMENT:
  2220. params[0] =ctx->pixel_store_data.pack_alignment;
  2221. break;
  2222. case GL_CURRENT_PROGRAM:
  2223. params[0] = ctx->current_program;
  2224. break;
  2225. case GL_GENERATE_MIPMAP_HINT:
  2226. params[0] = ctx->hint_data.generate_mipmap_hint;
  2227. break;
  2228. case GL_SUBPIXEL_BITS:
  2229. //TODO
  2230. break;
  2231. case GL_MAX_TEXTURE_SIZE:
  2232. params[0] = MAX_TEXTURE_SIZE;
  2233. break;
  2234. case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
  2235. params[0] = MAX_CUBEMAP_TEXTURE_SIZE;
  2236. break;
  2237. case GL_MAX_VIEWPORT_DIMS:
  2238. params[0] = MAX_VIEWPORT_DIMS;
  2239. params[1] = MAX_VIEWPORT_DIMS;
  2240. break;
  2241. case GL_MAX_ELEMENTS_INDICES :
  2242. params[0] = MAX_ELEMENTS_INDICES;
  2243. break;
  2244. case GL_MAX_ELEMENTS_VERTICES :
  2245. params[0] = MAX_ELEMENTS_VERTICES;
  2246. break;
  2247. case GL_SAMPLE_BUFFERS :
  2248. params[0] = NO_OF_SAMPLES;
  2249. break;
  2250. case GL_SAMPLES :
  2251. params[0] = MULTISAMPLING;
  2252. break;
  2253. case GL_COMPRESSED_TEXTURE_FORMATS :
  2254. params[0] = GL_PALETTE4_RGB8_OES;
  2255. params[1] = GL_PALETTE4_RGBA8_OES;
  2256. params[2] = GL_PALETTE4_R5_G6_B5_OES;
  2257. params[3] = GL_PALETTE4_RGBA4_OES;
  2258. params[4] = GL_PALETTE4_RGB5_A1_OES;
  2259. params[5] = GL_PALETTE8_RGB8_OES;
  2260. params[6] = GL_PALETTE8_RGBA8_OES;
  2261. params[7] = GL_PALETTE8_R5_G6_B5_OES;
  2262. params[8] = GL_PALETTE8_RGBA4_OES;
  2263. params[9] = GL_PALETTE8_RGB5_A1_OES;
  2264. params[10] = GL_RGB_S3TC_OES;
  2265. params[11] = GL_RGBA_S3TC_OES;
  2266. break;
  2267. case GL_NUM_COMPRESSED_TEXTURE_FORMATS :
  2268. params[0] = NUM_COMPRESSED_TEXTURE_FORMATS;
  2269. break;
  2270. //case GL_SHADER_BINARY_FORMATS :
  2271. //TODO
  2272. // break;
  2273. case GL_NUM_SHADER_BINARY_FORMATS :
  2274. params[0] = NUM_SHADER_BINARY_FORMATS;
  2275. break;
  2276. case GL_SHADER_COMPILER :
  2277. params[0] = GL_FALSE;
  2278. break;
  2279. case GL_MAX_VERTEX_ATTRIBS :
  2280. params[0] = MAX_VERTEX_ATTRIBS;
  2281. break;
  2282. case GL_MAX_VERTEX_UNIFORM_VECTORS :
  2283. params[0] = MAX_UNIFORMS;
  2284. break;
  2285. case GL_MAX_VARYING_VECTORS :
  2286. params[0] = MAX_VARYING_VECTORS;
  2287. break;
  2288. case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS :
  2289. params[0] =MAX_VERTEX_TEXTURE_UNITS + MAX_TEXTURE_UNITS;
  2290. break;
  2291. case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS :
  2292. params[0] = MAX_VERTEX_TEXTURE_UNITS;
  2293. break;
  2294. case GL_MAX_TEXTURE_IMAGE_UNITS :
  2295. params[0] = MAX_TEXTURE_UNITS;
  2296. break;
  2297. case GL_MAX_FRAGMENT_UNIFORM_VECTORS :
  2298. params[0] = MAX_UNIFORMS;
  2299. break;
  2300. case GL_MAX_RENDERBUFFER_SIZE :
  2301. params[0] = MAX_RENDERBUFFER_SIZE;
  2302. break;
  2303. case GL_RED_BITS :
  2304. params[0] = determinePixelBitSize(fbData.nativeColorFormat,RED) ;
  2305. break;
  2306. case GL_GREEN_BITS:
  2307. params[0] = determinePixelBitSize(fbData.nativeColorFormat,GREEN) ;
  2308. break;
  2309. case GL_BLUE_BITS :
  2310. params[0] = determinePixelBitSize(fbData.nativeColorFormat,BLUE) ;
  2311. break;
  2312. case GL_ALPHA_BITS :
  2313. params[0] = determinePixelBitSize(fbData.nativeColorFormat,ALPHA) ;
  2314. break;
  2315. case GL_DEPTH_BITS :
  2316. params[0] = determinePixelBitSize(fbData.nativeDepthStencilFormat,DEPTH);
  2317. break;
  2318. case GL_STENCIL_BITS:
  2319. params[0] = determinePixelBitSize(fbData.nativeDepthStencilFormat,STENCIL);
  2320. break;
  2321. case GL_IMPLEMENTATION_COLOR_READ_TYPE:
  2322. params[0] = determineTypeFormat(translateToGLenum(fbData.nativeColorFormat), GL_FALSE);
  2323. break;
  2324. case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
  2325. params[0] = determineTypeFormat( translateToGLenum(ctx->defFBData.nativeColorFormat), GL_TRUE);
  2326. break;
  2327. #ifdef EN_EXT_ALPHA_TEST_EXP
  2328. case GL_ALPHA_TEST_FUNC_EXP:
  2329. params[0] = ctx->alpha_test_data.func;
  2330. break;
  2331. case GL_ALPHA_TEST_REF_EXP:
  2332. params[0] = (int)ctx->alpha_test_data.refValue;
  2333. break;
  2334. #endif
  2335. #ifdef EN_EXT_LOGIC_OP_EXP
  2336. case GL_LOGIC_OP_MODE_EXP:
  2337. // params[0] = ctx->is_logicOp_enabled;
  2338. params[0] = ctx->logicOp;
  2339. break;
  2340. #endif
  2341. case GL_CULL_FACE:
  2342. case GL_POLYGON_OFFSET_FILL:
  2343. case GL_SAMPLE_COVERAGE:
  2344. case GL_SAMPLE_ALPHA_TO_COVERAGE:
  2345. case GL_SCISSOR_TEST:
  2346. case GL_STENCIL_TEST:
  2347. case GL_DEPTH_TEST:
  2348. case GL_BLEND:
  2349. case GL_DITHER:
  2350. #ifdef EN_EXT_ALPHA_TEST_EXP
  2351. case GL_ALPHA_TEST_EXP:
  2352. #endif
  2353. #ifdef EN_EXT_LOGIC_OP_EXP
  2354. case GL_COLOR_LOGIC_OP:
  2355. #endif
  2356. params[0] = glIsEnabled(pname);
  2357. break;
  2358. default:
  2359. SET_ERR(ctx, GL_INVALID_ENUM, "glGetIntegerv*");
  2360. }
  2361. }
  2362. GL_API void GL_APIENTRY glGetPointerv (GLenum pname, void **params)
  2363. {
  2364. //GET_GL_STATE(ctx);
  2365. //NOT TO BE IMPLEMENTED FOR ES2.0
  2366. }
  2367. GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name)
  2368. {
  2369. GET_GL_STATE(ctx);
  2370. switch(name)
  2371. {
  2372. case GL_VERSION:
  2373. //return (GLubyte*)ctx->str_data.version;
  2374. return (const GLubyte*)GLES2_VERSION_STRING;
  2375. break;
  2376. case GL_VENDOR:
  2377. return (const GLubyte*)ctx->str_data.vendor;
  2378. break;
  2379. case GL_EXTENSIONS:
  2380. return (const GLubyte*)ctx->str_data.extensions;
  2381. break;
  2382. case GL_RENDERER:
  2383. return (const GLubyte*)ctx->str_data.renderer;
  2384. break;
  2385. case GL_SHADING_LANGUAGE_VERSION:
  2386. return (const GLubyte*)ctx->str_data.shadingLangVersion;
  2387. break;
  2388. default:
  2389. SET_ERR(ctx, GL_INVALID_ENUM, "glGetString");
  2390. };
  2391. return 0;
  2392. }
  2393. GLuint GetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params)
  2394. {
  2395. GET_GL_STATE(ctx);
  2396. if( (index < 0) || (index >=MAX_VERTEX_ATTRIBS) ) //modified by chanchal
  2397. {
  2398. set_err(GL_INVALID_VALUE);
  2399. return 0;
  2400. }
  2401. switch(pname)
  2402. {
  2403. case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
  2404. *params = ctx->vertex_attrib_array_data[index].enabled;
  2405. return 1;
  2406. break;
  2407. case GL_VERTEX_ATTRIB_ARRAY_SIZE:
  2408. *params = (GLfloat) ctx->vertex_attrib_array_data[index].size;
  2409. return 1;
  2410. break;
  2411. case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
  2412. *params = (GLfloat) ctx->vertex_attrib_array_data[index].stride;
  2413. return 1;
  2414. break;
  2415. case GL_VERTEX_ATTRIB_ARRAY_TYPE:
  2416. *params = (GLfloat) ctx->vertex_attrib_array_data[index].type;
  2417. return 1;
  2418. break;
  2419. case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
  2420. *params = (GLfloat) ctx->vertex_attrib_array_data[index].normalized;
  2421. return 1;
  2422. break;
  2423. //has to be moved to glGetVertexAttributes but new gl.h doen not have this API
  2424. case GL_CURRENT_VERTEX_ATTRIB:
  2425. Plat::memcpy(params, ctx->vertex_attribs[index], 4 * sizeof(GLfloat));
  2426. return 4;
  2427. break;
  2428. case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
  2429. *params = (GLfloat) ctx->vertex_attrib_array_data[index].vboID;
  2430. return 1;
  2431. break;
  2432. default:
  2433. set_err(GL_INVALID_ENUM);
  2434. return 0;
  2435. }
  2436. }
  2437. GL_API void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params)
  2438. {
  2439. GetVertexAttribfv(index, pname, params);
  2440. }
  2441. GL_API void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params)
  2442. {
  2443. GLfloat p[4];
  2444. GLint count = GetVertexAttribfv(index, pname, p);
  2445. switch(count){
  2446. case 4: params[3] = (GLint) p[3];
  2447. case 3: params[2] = (GLint) p[2];
  2448. case 2: params[1] = (GLint) p[1];
  2449. case 1: params[0] = (GLint) p[0];
  2450. }
  2451. }
  2452. GL_API void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer)
  2453. {
  2454. GET_GL_STATE(ctx);
  2455. if(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
  2456. {
  2457. set_err(GL_INVALID_ENUM);
  2458. return;
  2459. }
  2460. if((index < 0) ||(index >=MAX_VERTEX_ATTRIBS) || (pointer == NULL)) //modified by chanchal
  2461. {
  2462. set_err(GL_INVALID_VALUE);
  2463. return;
  2464. }
  2465. if (ctx->vertex_attrib_array_data[index].vboID == 0)
  2466. {
  2467. *pointer = (void *) ctx->vertex_attrib_array_data[index].ptr;
  2468. }
  2469. else
  2470. {
  2471. *pointer = (void *) ((int)ctx->vertex_attrib_array_data[index].ptr -(int) ctx->vertex_attrib_array_data[index].vertex_attrib_ptr_binding->data );
  2472. }
  2473. }
  2474. GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode)
  2475. {
  2476. GET_GL_STATE(ctx);
  2477. //validate mode
  2478. switch(mode)
  2479. {
  2480. case GL_DONT_CARE:
  2481. case GL_NICEST:
  2482. case GL_FASTEST:
  2483. break; //intended fallthrough
  2484. default:
  2485. set_err(GL_INVALID_ENUM);
  2486. return;
  2487. }
  2488. //validate target and set the state for the target
  2489. switch(target)
  2490. {
  2491. case GL_GENERATE_MIPMAP_HINT:
  2492. ctx->hint_data.generate_mipmap_hint = mode;
  2493. break;
  2494. case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
  2495. ctx->hint_data.fragment_shader_derivative_hint = mode;
  2496. break;
  2497. default:
  2498. set_err(GL_INVALID_ENUM);
  2499. return;
  2500. }
  2501. }
  2502. GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer)
  2503. {
  2504. GET_GL_STATE(ctx);
  2505. int i;
  2506. BufferObjectData* p = &ctx->buffer_object_data;
  2507. for(i = 0; i < p->buffer_objects_last_index; i++)
  2508. {
  2509. if( p->buffer_objects[i].in_use &&
  2510. p->buffer_objects[i].id == buffer)
  2511. {
  2512. return GL_TRUE;
  2513. }
  2514. }
  2515. return GL_FALSE;
  2516. }
  2517. GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap)
  2518. {
  2519. GET_GL_STATE(ctx);
  2520. switch(cap)
  2521. {
  2522. case GL_CULL_FACE:
  2523. return ctx->cull_face_data.is_enabled;
  2524. break;
  2525. case GL_POLYGON_OFFSET_FILL:
  2526. return ctx->polygon_offset_data.is_enabled_fill;
  2527. break;
  2528. case GL_SAMPLE_COVERAGE:
  2529. return ctx->sample_coverage_data.is_enabled_coverage;
  2530. break;
  2531. case GL_SAMPLE_ALPHA_TO_COVERAGE:
  2532. return ctx->sample_coverage_data.is_enabled_alpha_to_coverage;
  2533. break;
  2534. case GL_SCISSOR_TEST:
  2535. return ctx->scissor_test_data.is_enabled ;
  2536. break;
  2537. case GL_STENCIL_TEST:
  2538. return ctx->stencil_test_data.is_enabled;
  2539. break;
  2540. case GL_DEPTH_TEST:
  2541. return ctx->is_enabled_depth ;
  2542. break;
  2543. case GL_BLEND:
  2544. return ctx->blend_data.is_enabled;
  2545. break;
  2546. case GL_DITHER:
  2547. return ctx->is_enabled_dither;
  2548. break;
  2549. #ifdef EN_EXT_ALPHA_TEST_EXP
  2550. case GL_ALPHA_TEST_EXP:
  2551. return ctx->alpha_test_data.is_enabled;
  2552. break;
  2553. #endif
  2554. #ifdef EN_EXT_LOGIC_OP_EXP
  2555. case GL_COLOR_LOGIC_OP:
  2556. return ctx->is_logicOp_enabled;
  2557. break;
  2558. #endif
  2559. #ifdef EN_EXT_POINT_SPRITE_EXP
  2560. case GL_POINT_SPRITE_OES_EXP:
  2561. return ctx->is_point_sprite_enable;
  2562. break;
  2563. #endif
  2564. default:
  2565. set_err(GL_INVALID_ENUM);
  2566. }
  2567. return GL_FALSE;
  2568. }
  2569. GL_API void GL_APIENTRY glLineWidth (GLfloat width)
  2570. {
  2571. GET_GL_STATE(ctx);
  2572. if(width <= 0.0)
  2573. {
  2574. set_err(GL_INVALID_VALUE);
  2575. return;
  2576. }
  2577. //TODO: clamp to max value?
  2578. ctx->line_width = width;
  2579. SetUpDateFlagRasterEngine(ctx,GLF_UF_LWidth);
  2580. //ctx->updateBits.re = UB_RE_ALL;
  2581. }
  2582. GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param)
  2583. {
  2584. GET_GL_STATE(ctx);
  2585. switch(param)
  2586. {
  2587. case 1:
  2588. case 2:
  2589. case 4:
  2590. case 8:
  2591. break; //Intended fallthough
  2592. default:
  2593. set_err(GL_INVALID_VALUE);
  2594. return;
  2595. }
  2596. switch (pname)
  2597. {
  2598. case GL_PACK_ALIGNMENT:
  2599. ctx->pixel_store_data.pack_alignment = param;
  2600. break ;
  2601. case GL_UNPACK_ALIGNMENT:
  2602. ctx->pixel_store_data.unpack_alignment = param;
  2603. break;
  2604. default:
  2605. set_err(GL_INVALID_ENUM);
  2606. return;
  2607. }
  2608. }
  2609. GL_API void GL_APIENTRY glPointSize (GLfloat size)
  2610. {
  2611. GET_GL_STATE(ctx);
  2612. if(size <= 0.0)
  2613. {
  2614. set_err(GL_INVALID_VALUE);
  2615. }
  2616. //TODO: some clamping to be done?
  2617. ctx->point_size = size;
  2618. SetUpDateFlagRasterEngine(ctx,GLF_UF_PWidth);
  2619. //ctx->updateBits.re = UB_RE_ALL;
  2620. }
  2621. GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units)
  2622. {
  2623. GET_GL_STATE(ctx);
  2624. ctx->polygon_offset_data.factor = factor;
  2625. ctx->polygon_offset_data.units = units;
  2626. SetUpDateFlagRasterEngine(ctx,GLF_UF_DepthOffset);
  2627. //ctx->updateBits.re = UB_RE_ALL;
  2628. }
  2629. #ifdef USE_3D_PM
  2630. void PM_glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
  2631. GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
  2632. {
  2633. lock3DCriticalSection();
  2634. PM_glReadPixels ( x, y, width, height, format, type, pixels);
  2635. unlock3DCriticalSection();
  2636. }
  2637. void PM_glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
  2638. #else
  2639. GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)
  2640. #endif
  2641. {
  2642. GET_GL_STATE(ctx);
  2643. FramebufferData fbData = getFBData();
  2644. GLenum nativeType = determineTypeFormat(translateToGLenum(fbData.nativeColorFormat), GL_FALSE);
  2645. GLenum nativeFmt = determineTypeFormat( translateToGLenum(ctx->defFBData.nativeColorFormat), GL_TRUE);
  2646. if(!((format == GL_RGBA && type== GL_UNSIGNED_BYTE) || (format == nativeFmt) && (type == nativeType)))
  2647. {
  2648. SET_ERR(ctx, GL_INVALID_ENUM, "glReadPixels");
  2649. return;
  2650. }
  2651. if(width < 0 || height < 0)
  2652. {
  2653. SET_ERR(ctx, GL_INVALID_VALUE, "glReadPixels");
  2654. return;
  2655. }
  2656. //Check if FB is complete
  2657. if(!isFBrenderable(ctx))
  2658. {
  2659. set_err(GL_INVALID_FRAMEBUFFER_OPERATION);
  2660. return;
  2661. }
  2662. //Get info from FrameBuffer...
  2663. // FramebufferData fbData = getFBData();
  2664. //GLenum FrameBufFormat = GLenum(fbData.colorFormat);
  2665. //GLenum FrameType = GLenum(fbData.colorType);
  2666. void* FramePixels = fbData.colorAddr.vaddr;
  2667. int FrameWidth = fbData.width;
  2668. int FrameHeight = fbData.height;
  2669. int cpyWidth = width;
  2670. int cpyHeight = height;
  2671. int dstX = 0;
  2672. int dstY = 0;
  2673. /*To take care of the case when the point x,y is such that the rectangle to be copied is outside the system's FB area*/
  2674. if( (x + width) <= 0 || (x >= FrameWidth) || (y + height) <= 0 || (y >= FrameHeight) )
  2675. return;
  2676. if(x < 0)
  2677. {
  2678. cpyWidth += x;
  2679. dstX = -x;
  2680. x = 0;
  2681. }
  2682. if( (cpyWidth + x) > FrameWidth)
  2683. cpyWidth = FrameWidth - x;
  2684. if(y < 0)
  2685. {
  2686. cpyHeight += y;
  2687. dstY = -y;
  2688. y = 0;
  2689. }
  2690. if( (cpyHeight + y) > FrameHeight)
  2691. cpyHeight = FrameHeight - y;
  2692. GLint alignment = ctx->pixel_store_data.pack_alignment;
  2693. int pixelSize = GetPixelSize(format,type);
  2694. GLint rowSize = width * pixelSize;
  2695. GLint padding = rowSize%alignment;
  2696. PxFmt fmtData = translateGLInternal(format,type);
  2697. //PxFmt fmtFB = translateGLSizedInternal(FrameBufFormat);
  2698. PxFmt fmtFB = fbData.nativeColorFormat;
  2699. GLint dir = 1;
  2700. if(fbData.flipped == 0)
  2701. dir = -1;//y = FrameHeight - y - height + 1*(!(!y));//-1 so as to read in reverse direction...
  2702. else dir = 1;
  2703. ////LOGMSG("dir = %d",dir);
  2704. FimgFinish(ctx);
  2705. convertPixels( fmtData, pixels, width, height, 0,
  2706. dstX, dstY, 0,
  2707. fmtFB, FramePixels, FrameWidth, FrameHeight, 0,
  2708. x, y, 0,
  2709. cpyWidth, cpyHeight, 0 , padding , 0,dir);
  2710. SwapRB((GLubyte*)pixels,format,type,width,height,0,0,0,0,width,height,0,pixelSize);
  2711. #ifdef CACHE_MEM
  2712. clean_invalidate_cached_buffer();
  2713. #endif
  2714. }
  2715. GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert)
  2716. {
  2717. GET_GL_STATE(ctx);
  2718. ctx->sample_coverage_data.value = clamp(value);
  2719. ctx->sample_coverage_data.invert = invert;
  2720. }
  2721. GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
  2722. {
  2723. GET_GL_STATE(ctx);
  2724. //TODO: x<0 and y<0 is not an invalid value according to the spec, so clamp to zero? Spec doesn't say anything about this!
  2725. if(/*(x < 0) || (y < 0) || */(width < 0) || (height < 0))
  2726. {
  2727. set_err(GL_INVALID_VALUE);
  2728. return ;
  2729. }
  2730. ctx->scissor_test_data.x = x;
  2731. ctx->scissor_test_data.y = y;
  2732. ctx->scissor_test_data.w = width;
  2733. ctx->scissor_test_data.h = height;
  2734. #if GLF_SCISSOR_IN_RA == ENABLE
  2735. SetUpDateFlagRasterEngine(ctx,GLF_UF_ScissorTest);
  2736. #else
  2737. SetUpDateFlagPerFragment(ctx, GLF_UF_ScissorTest);
  2738. #endif
  2739. }
  2740. GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask)
  2741. {
  2742. //GET_GL_STATE(ctx);
  2743. glStencilFuncSeparate(GL_FRONT_AND_BACK, func, ref, mask);
  2744. }
  2745. GL_API void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask)
  2746. {
  2747. GET_GL_STATE(ctx);
  2748. //TODO: ref should be clamped to the range [0, 2^n -1], where n is the number of bitplanes in the stencil buffer.
  2749. // should this be done here or while setting the state to the hw? What should glGet return for this?
  2750. //TODO: use the common func .. the one used by depth
  2751. switch(func) //check if func is a valid enum
  2752. {
  2753. case GL_NEVER:
  2754. case GL_ALWAYS:
  2755. case GL_LESS:
  2756. case GL_LEQUAL:
  2757. case GL_EQUAL:
  2758. case GL_GEQUAL:
  2759. case GL_GREATER:
  2760. case GL_NOTEQUAL:
  2761. break; //intended fallthrough
  2762. default:
  2763. set_err(GL_INVALID_ENUM);
  2764. return;
  2765. }
  2766. switch(face)
  2767. {
  2768. case GL_FRONT:
  2769. ctx->stencil_test_data.front_face_func = func;
  2770. ctx->stencil_test_data.front_face_ref = ref;
  2771. ctx->stencil_test_data.front_face_mask = mask;
  2772. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2773. break;
  2774. case GL_BACK:
  2775. ctx->stencil_test_data.back_face_func = func;
  2776. ctx->stencil_test_data.back_face_ref = ref;
  2777. ctx->stencil_test_data.back_face_mask = mask;
  2778. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2779. break;
  2780. case GL_FRONT_AND_BACK:
  2781. ctx->stencil_test_data.front_face_func = func;
  2782. ctx->stencil_test_data.front_face_ref = ref;
  2783. ctx->stencil_test_data.front_face_mask = mask;
  2784. ctx->stencil_test_data.back_face_func = func;
  2785. ctx->stencil_test_data.back_face_ref = ref;
  2786. ctx->stencil_test_data.back_face_mask = mask;
  2787. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2788. break;
  2789. default:
  2790. set_err(GL_INVALID_ENUM);
  2791. return;
  2792. }
  2793. }
  2794. GL_API void GL_APIENTRY glStencilMask (GLuint mask)
  2795. {
  2796. //GET_GL_STATE(ctx);
  2797. glStencilMaskSeparate(GL_FRONT_AND_BACK, mask);
  2798. }
  2799. GL_API void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask)
  2800. {
  2801. GET_GL_STATE(ctx);
  2802. switch(face)
  2803. {
  2804. case GL_FRONT:
  2805. ctx->front_stencil_writemask = mask;
  2806. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2807. break;
  2808. case GL_BACK:
  2809. ctx->front_stencil_writemask = mask;
  2810. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2811. break;
  2812. case GL_FRONT_AND_BACK:
  2813. ctx->front_stencil_writemask = mask;
  2814. ctx->back_stencil_writemask = mask;
  2815. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2816. break;
  2817. default:
  2818. set_err(GL_INVALID_ENUM);
  2819. return;
  2820. }
  2821. }
  2822. GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
  2823. {
  2824. //GET_GL_STATE(ctx);
  2825. glStencilOpSeparate(GL_FRONT_AND_BACK, fail, zfail, zpass);
  2826. }
  2827. GL_API void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum fail, GLenum zfail, GLenum zpass)
  2828. {
  2829. GET_GL_STATE(ctx);
  2830. // fail, zfail, zpass can only take the following values: GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, and GL_INVERT
  2831. //so validate
  2832. if( (isValidStencilOp(fail) == GL_FALSE)
  2833. || (isValidStencilOp(zfail) == GL_FALSE)
  2834. || (isValidStencilOp(zpass) == GL_FALSE))
  2835. {
  2836. set_err(GL_INVALID_ENUM);
  2837. return;
  2838. }
  2839. switch(face)
  2840. {
  2841. case GL_FRONT:
  2842. ctx->stencil_test_data.front_face_fail = fail;
  2843. ctx->stencil_test_data.front_face_zfail = zfail;
  2844. ctx->stencil_test_data.front_face_zpass = zpass;
  2845. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2846. break;
  2847. case GL_BACK:
  2848. ctx->stencil_test_data.back_face_fail = fail;
  2849. ctx->stencil_test_data.back_face_zfail = zfail;
  2850. ctx->stencil_test_data.back_face_zpass = zpass;
  2851. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2852. break;
  2853. case GL_FRONT_AND_BACK:
  2854. ctx->stencil_test_data.front_face_fail = fail;
  2855. ctx->stencil_test_data.front_face_zfail = zfail;
  2856. ctx->stencil_test_data.front_face_zpass = zpass;
  2857. ctx->stencil_test_data.back_face_fail = fail;
  2858. ctx->stencil_test_data.back_face_zfail = zfail;
  2859. ctx->stencil_test_data.back_face_zpass = zpass;
  2860. SetUpDateFlagPerFragment(ctx,GLF_UF_StencilTest);
  2861. break;
  2862. default:
  2863. set_err(GL_INVALID_ENUM);
  2864. return;
  2865. }
  2866. }
  2867. #ifdef EN_EXT_ALPHA_TEST_EXP
  2868. GL_API void GL_APIENTRY glAlphaFuncEXP (GLenum func, GLclampf ref)
  2869. {
  2870. GET_GL_STATE(ctx);
  2871. switch(func) //check if func is a valid enum
  2872. {
  2873. case GL_NEVER:
  2874. case GL_ALWAYS:
  2875. case GL_LESS:
  2876. case GL_LEQUAL:
  2877. case GL_EQUAL:
  2878. case GL_GEQUAL:
  2879. case GL_GREATER:
  2880. case GL_NOTEQUAL:
  2881. break; //intended fallthrough
  2882. default:
  2883. set_err(GL_INVALID_ENUM);
  2884. return;
  2885. }
  2886. ctx->alpha_test_data.func = func;
  2887. ctx->alpha_test_data.refValue = ref;
  2888. SetUpDateFlagPerFragment(ctx,GLF_UF_AlphaTest);
  2889. }
  2890. #endif
  2891. #ifdef EN_EXT_LOGIC_OP_EXP
  2892. GL_API void GL_APIENTRY glLogicOpEXP(GLenum op)
  2893. {
  2894. GET_GL_STATE(ctx);
  2895. switch(op)
  2896. {
  2897. case GL_CLEAR_EXP:
  2898. case GL_AND_EXP:
  2899. case GL_AND_REVERSE_EXP:
  2900. case GL_COPY_EXP:
  2901. case GL_AND_INVERTED_EXP:
  2902. case GL_NOOP_EXP:
  2903. case GL_XOR_EXP:
  2904. case GL_OR_EXP:
  2905. case GL_NOR_EXP:
  2906. case GL_EQUIV_EXP:
  2907. case GL_INVERT_EXP:
  2908. case GL_OR_REVERSE_EXP:
  2909. case GL_COPY_INVERTED_EXP:
  2910. case GL_OR_INVERTED_EXP:
  2911. case GL_NAND_EXP:
  2912. case GL_SET_EXP:
  2913. ctx->logicOp = op;
  2914. SetUpDateFlagPerFragment(ctx,GLF_UF_LogicalOp);
  2915. break;
  2916. default:
  2917. set_err(GL_INVALID_ENUM);
  2918. }
  2919. }
  2920. #endif
  2921. GL_API void GL_APIENTRY glVertexAttrib1f (GLuint indx, GLfloat x)
  2922. {
  2923. //GET_GL_STATE(ctx);
  2924. glVertexAttrib4f(indx, x, 0.0, 0.0, 1.0);
  2925. }
  2926. GL_API void GL_APIENTRY glVertexAttrib2f (GLuint indx, GLfloat x, GLfloat y)
  2927. {
  2928. //GET_GL_STATE(ctx);
  2929. glVertexAttrib4f(indx, x, y, 0.0, 1.0);
  2930. }
  2931. GL_API void GL_APIENTRY glVertexAttrib3f (GLuint indx, GLfloat x, GLfloat y, GLfloat z)
  2932. {
  2933. //GET_GL_STATE(ctx);
  2934. glVertexAttrib4f(indx, x, y, z, 1.0);
  2935. }
  2936. GL_API void GL_APIENTRY glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
  2937. {
  2938. GET_GL_STATE(ctx);
  2939. if((indx >= MAX_VERTEX_ATTRIBS))
  2940. {
  2941. set_err(GL_INVALID_VALUE);
  2942. return ;
  2943. }
  2944. ctx->vertex_attribs[indx][0] = x;
  2945. ctx->vertex_attribs[indx][1] = y;
  2946. ctx->vertex_attribs[indx][2] = z;
  2947. ctx->vertex_attribs[indx][3] = w;
  2948. }
  2949. GL_API void GL_APIENTRY glVertexAttrib1fv (GLuint indx, const GLfloat *values)
  2950. {
  2951. //GET_GL_STATE(ctx);
  2952. if(values == NULL)
  2953. {
  2954. set_err(GL_INVALID_VALUE);
  2955. return ;
  2956. }
  2957. glVertexAttrib4f(indx, values[0], 0.0, 0.0, 1.0);
  2958. }
  2959. GL_API void GL_APIENTRY glVertexAttrib2fv (GLuint indx, const GLfloat *values)
  2960. {
  2961. //GET_GL_STATE(ctx);
  2962. if(values == NULL)
  2963. {
  2964. set_err(GL_INVALID_VALUE);
  2965. return ;
  2966. }
  2967. glVertexAttrib4f(indx, values[0], values[1], 0.0, 1.0);
  2968. }
  2969. GL_API void GL_APIENTRY glVertexAttrib3fv (GLuint indx, const GLfloat *values)
  2970. {
  2971. //GET_GL_STATE(ctx);
  2972. if(values == NULL)
  2973. {
  2974. set_err(GL_INVALID_VALUE);
  2975. return ;
  2976. }
  2977. glVertexAttrib4f(indx, values[0], values[1], values[2], 1.0);
  2978. }
  2979. GL_API void GL_APIENTRY glVertexAttrib4fv (GLuint indx, const GLfloat *values)
  2980. {
  2981. //GET_GL_STATE(ctx);
  2982. if(values == NULL)
  2983. {
  2984. set_err(GL_INVALID_VALUE);
  2985. return ;
  2986. }
  2987. glVertexAttrib4f(indx, values[0], values[1], values[2], values[3]);
  2988. }
  2989. GL_API void GL_APIENTRY glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *ptr)
  2990. {
  2991. GET_GL_STATE(ctx);
  2992. if((indx < 0) || (indx >= MAX_VERTEX_ATTRIBS))
  2993. {
  2994. set_err(GL_INVALID_VALUE);
  2995. return ;
  2996. }
  2997. ctx->vertex_attrib_array_data[indx].size = size;
  2998. ctx->vertex_attrib_array_data[indx].type = type;
  2999. ctx->vertex_attrib_array_data[indx].normalized = normalized;
  3000. ctx->vertex_attrib_array_data[indx].stride = stride;
  3001. if(ctx->buffer_object_data.array_buffer_binding)
  3002. {
  3003. //Vertex buffer object
  3004. int offset = (char*)ptr - (char*)NULL;
  3005. if(ctx->buffer_object_data.array_buffer_binding->data)
  3006. {
  3007. ctx->vertex_attrib_array_data[indx].ptr = (char*)(ctx->buffer_object_data.array_buffer_binding->data)+offset;
  3008. ctx->vertex_attrib_array_data[indx].vboID = ctx->buffer_object_data.array_buffer_binding->id;
  3009. ctx->vertex_attrib_array_data[indx].vertex_attrib_ptr_binding = ctx->buffer_object_data.array_buffer_binding;
  3010. }
  3011. }
  3012. else
  3013. {
  3014. //Vertex arrays
  3015. ctx->vertex_attrib_array_data[indx].ptr = ptr;
  3016. ctx->vertex_attrib_array_data[indx].vboID = 0;
  3017. ctx->vertex_attrib_array_data[indx].vertex_attrib_ptr_binding = NULL;
  3018. }
  3019. /*
  3020. //Working for vertex arrays.
  3021. ctx->buffer_object_data.vertex_attrib_ptr_binding[indx] = ctx->buffer_object_data.array_buffer_binding;
  3022. ctx->vertex_attrib_array_data[indx].size = size;
  3023. ctx->vertex_attrib_array_data[indx].type = type;
  3024. ctx->vertex_attrib_array_data[indx].normalized = normalized;
  3025. ctx->vertex_attrib_array_data[indx].stride = stride;
  3026. ctx->vertex_attrib_array_data[indx].ptr = ptr;
  3027. */
  3028. }
  3029. GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
  3030. {
  3031. GET_GL_STATE(ctx);
  3032. if((width < 0) || (height < 0))
  3033. {
  3034. set_err(GL_INVALID_VALUE);
  3035. return ;
  3036. }
  3037. ctx->viewport_data.x = x;
  3038. ctx->viewport_data.y = y;
  3039. ctx->viewport_data.w = width;
  3040. ctx->viewport_data.h = height;
  3041. SetUpDateFlagPrimEngine(ctx,GLF_UF_ViewPort);
  3042. SetUpDateFlagRasterEngine(ctx,GLF_UF_Clipping);
  3043. }
  3044. /****************************** BUFFER OBJECTS ******************************/
  3045. GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer)
  3046. {
  3047. GET_GL_STATE(ctx);
  3048. int i;
  3049. BufferObjectData* p = &ctx->buffer_object_data;
  3050. if( (target != GL_ARRAY_BUFFER && target != GL_ELEMENT_ARRAY_BUFFER))
  3051. {
  3052. set_err(GL_INVALID_VALUE);
  3053. return;
  3054. }
  3055. if(buffer == 0)
  3056. {
  3057. if(target == GL_ARRAY_BUFFER)
  3058. {
  3059. p->array_buffer_binding = NULL;
  3060. }
  3061. else
  3062. {
  3063. p->element_array_buffer_binding = NULL;
  3064. }
  3065. return;
  3066. }
  3067. /* if the Buffer Object already exists, bind it to (Element) Array Buffer */
  3068. for(i = 0; i < p->buffer_objects_last_index; i++)
  3069. {
  3070. if( p->buffer_objects[i].in_use &&
  3071. p->buffer_objects[i].id == buffer)
  3072. {
  3073. if(target == GL_ARRAY_BUFFER)
  3074. {
  3075. p->array_buffer_binding = &p->buffer_objects[i];
  3076. }
  3077. else
  3078. {
  3079. p->element_array_buffer_binding = &p->buffer_objects[i];
  3080. }
  3081. break;
  3082. }
  3083. }
  3084. /* else, create a new Buffer Object, and then bind to (Element) Array Buffer */
  3085. if(i == p->buffer_objects_last_index)
  3086. {
  3087. for(i = 0; i < p->buffer_objects_last_index; i++)
  3088. {
  3089. if(!p->buffer_objects[i].in_use)
  3090. {
  3091. break;
  3092. }
  3093. }
  3094. if(i >= MAX_BUFFER_OBJECTS )
  3095. {
  3096. set_err(GL_OUT_OF_MEMORY);
  3097. return;
  3098. }
  3099. p->buffer_objects[i].data = NULL;
  3100. p->buffer_objects[i].size = 0;
  3101. p->buffer_objects[i].usage = GL_STATIC_DRAW;
  3102. p->buffer_objects[i].access = GL_WRITE_ONLY;
  3103. p->buffer_objects[i].in_use = GL_TRUE;
  3104. p->buffer_objects[i].id = buffer;
  3105. //added for buffer map
  3106. p->buffer_objects[i].mapped = GL_FALSE;
  3107. p->buffer_objects[i].map_ptr = NULL;
  3108. if(i == p->buffer_objects_last_index)
  3109. {
  3110. p->buffer_objects_last_index++;
  3111. }
  3112. if(target == GL_ARRAY_BUFFER)
  3113. {
  3114. p->array_buffer_binding = &p->buffer_objects[i];
  3115. }
  3116. else
  3117. {
  3118. p->element_array_buffer_binding = &p->buffer_objects[i];
  3119. }
  3120. }
  3121. if(buffer > p->generated_so_far)
  3122. {
  3123. p->generated_so_far = buffer;
  3124. }
  3125. }
  3126. GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers)
  3127. {
  3128. GET_GL_STATE(ctx);
  3129. int i;
  3130. if(!buffers)
  3131. {
  3132. return;
  3133. }
  3134. if(n < 0)
  3135. {
  3136. set_err(GL_INVALID_VALUE);
  3137. return ;
  3138. }
  3139. for(i = 0; i < n; i++)
  3140. {
  3141. buffers[i] = ++ctx->buffer_object_data.generated_so_far;
  3142. }
  3143. }
  3144. GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers)
  3145. {
  3146. GET_GL_STATE(ctx);
  3147. int i;
  3148. int j;
  3149. int k;
  3150. BufferObjectData* buf = &ctx->buffer_object_data;
  3151. if((n < 0) || (buffers == NULL))
  3152. {
  3153. set_err(GL_INVALID_VALUE);
  3154. return ;
  3155. }
  3156. for (i = 0 ; i < n; i ++)
  3157. {
  3158. for(j = 0; j < buf->buffer_objects_last_index; j++)
  3159. {
  3160. if(buf->buffer_objects[j].id == buffers[i])
  3161. {
  3162. /* remove all existing bindings */
  3163. if(buf->array_buffer_binding == &buf->buffer_objects[j])
  3164. {
  3165. buf->array_buffer_binding = NULL;
  3166. }
  3167. if(buf->element_array_buffer_binding == &buf->buffer_objects[j])
  3168. {
  3169. buf->element_array_buffer_binding = NULL;
  3170. }
  3171. for(k = 0; k < MAX_VERTEX_ATTRIBS; k++)
  3172. {
  3173. if(ctx->vertex_attrib_array_data[k].vertex_attrib_ptr_binding == &buf->buffer_objects[j])
  3174. {
  3175. //remove all bindings from vertex attrib
  3176. ctx->vertex_attrib_array_data[k].vertex_attrib_ptr_binding = NULL;
  3177. ctx->vertex_attrib_array_data[k].vboID = 0;
  3178. }
  3179. }
  3180. /* free buffer object */
  3181. Plat::safe_free(buf->buffer_objects[j].data);
  3182. buf->buffer_objects[j].data = NULL;
  3183. buf->buffer_objects[j].in_use = GL_FALSE;
  3184. // not sure added
  3185. buf->buffer_objects[i].map_ptr = NULL;
  3186. break;
  3187. }
  3188. }
  3189. }
  3190. }
  3191. GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage)
  3192. {
  3193. GET_GL_STATE(ctx);
  3194. BufferObject* buf;
  3195. if(( target != GL_ARRAY_BUFFER ) && (target != GL_ELEMENT_ARRAY_BUFFER ))
  3196. {
  3197. set_err(GL_INVALID_ENUM);
  3198. return ;
  3199. }
  3200. if(( usage != GL_STATIC_DRAW ) && (usage != GL_DYNAMIC_DRAW ) && (usage != GL_STREAM_DRAW))
  3201. {
  3202. set_err(GL_INVALID_ENUM);
  3203. return ;
  3204. }
  3205. if(size < 0) //TODO: spec ambiguity
  3206. {
  3207. set_err(GL_INVALID_VALUE);
  3208. return ;
  3209. }
  3210. if( target == GL_ARRAY_BUFFER )
  3211. {
  3212. buf = ctx->buffer_object_data.array_buffer_binding;
  3213. }
  3214. else
  3215. {
  3216. buf = ctx->buffer_object_data.element_array_buffer_binding;
  3217. }
  3218. if(buf == NULL)
  3219. {
  3220. set_err(GL_INVALID_OPERATION);
  3221. return ;
  3222. }
  3223. if(buf->mapped == GL_TRUE){
  3224. buf->map_ptr = NULL;
  3225. }
  3226. Plat::safe_free(buf->data);
  3227. buf->data = Plat::malloc(size);
  3228. if(buf->data == NULL)
  3229. {
  3230. set_err(GL_OUT_OF_MEMORY);
  3231. return ;
  3232. }
  3233. buf->size = size;
  3234. buf->usage = usage;
  3235. if(data != NULL)
  3236. {
  3237. Plat::memcpy(buf->data, data, size);
  3238. }
  3239. }
  3240. GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data)
  3241. {
  3242. GET_GL_STATE(ctx);
  3243. BufferObject* buf;
  3244. if (( target != GL_ARRAY_BUFFER ) && (target != GL_ELEMENT_ARRAY_BUFFER ))
  3245. {
  3246. set_err(GL_INVALID_ENUM);
  3247. return ;
  3248. }
  3249. if((size < 0) || ( offset < 0 ))
  3250. {
  3251. set_err(GL_INVALID_VALUE);
  3252. return ;
  3253. }
  3254. if(data == NULL)
  3255. {
  3256. return;
  3257. }
  3258. if ( target == GL_ARRAY_BUFFER )
  3259. {
  3260. buf = ctx->buffer_object_data.array_buffer_binding ;
  3261. }
  3262. else
  3263. {
  3264. buf = ctx->buffer_object_data.element_array_buffer_binding;
  3265. }
  3266. if ( buf == NULL )
  3267. {
  3268. set_err(GL_INVALID_OPERATION);
  3269. return ;
  3270. }
  3271. //added for the case of mapped buffer u can not modify the value
  3272. if(buf->mapped == GL_TRUE){
  3273. set_err(GL_INVALID_OPERATION);
  3274. return ;
  3275. }
  3276. if ( (size + offset) > buf->size)
  3277. {
  3278. set_err(GL_INVALID_VALUE);
  3279. return ;
  3280. }
  3281. Plat::memcpy((char *) buf->data + offset, data, size);
  3282. }
  3283. GL_API void GL_APIENTRY *glMapBuffer (GLenum target, GLenum access)
  3284. {
  3285. GET_GL_STATE(ctx);
  3286. BufferObject* buf;
  3287. //target have to be ARRAY BUFFER
  3288. if (target != GL_ARRAY_BUFFER)
  3289. {
  3290. set_err(GL_INVALID_ENUM);
  3291. return NULL;
  3292. }
  3293. if(access != GL_WRITE_ONLY)
  3294. {
  3295. set_err(GL_INVALID_ENUM);
  3296. return NULL;
  3297. }
  3298. buf = ctx->buffer_object_data.array_buffer_binding;
  3299. // if no binding has been done so far
  3300. if(buf == NULL)
  3301. {
  3302. set_err(GL_INVALID_OPERATION);
  3303. return NULL ;
  3304. }
  3305. //If the buffer data store is already in the mapped state
  3306. if(buf->mapped == GL_TRUE){
  3307. set_err(GL_INVALID_OPERATION);
  3308. return NULL;
  3309. }
  3310. //if buffer data has not been mapped and data is available
  3311. if(buf->data != NULL){
  3312. buf->mapped = GL_TRUE;
  3313. buf->access = access;
  3314. return buf->data;
  3315. }
  3316. //in all other cases ie. buf is present but the data is not present???
  3317. set_err(GL_OUT_OF_MEMORY);
  3318. return NULL;
  3319. }
  3320. GL_API GLboolean GL_APIENTRY glUnmapBuffer (GLenum target)
  3321. {
  3322. GET_GL_STATE(ctx);
  3323. BufferObject* buf;
  3324. //target have to be ARRAY BUFFER
  3325. if (target != GL_ARRAY_BUFFER)
  3326. {
  3327. set_err(GL_INVALID_ENUM);
  3328. return GL_FALSE;
  3329. }
  3330. buf = ctx->buffer_object_data.array_buffer_binding;
  3331. //unmapping that occurs as a side effect of buffer deletion or reinitialization is not an error???
  3332. if(buf == NULL)
  3333. {
  3334. //set_err(GL_INVALID_OPERATION); //TO DO
  3335. return GL_FALSE;
  3336. }
  3337. //unmapping that occur as the efefct of buffer reinitialization is not na error
  3338. if((buf->mapped == GL_TRUE)&&(buf->map_ptr == NULL)){
  3339. return GL_FALSE;
  3340. }
  3341. //if data is corrupted. not on our case.
  3342. //if already in the unmapped state
  3343. if(buf->mapped == GL_FALSE){
  3344. set_err(GL_INVALID_OPERATION);
  3345. return GL_FALSE ;
  3346. }
  3347. else{
  3348. buf->map_ptr = NULL;
  3349. buf->mapped = GL_FALSE;
  3350. return GL_TRUE;
  3351. }
  3352. }