void glDrawArrays(GLenum mode, GLint first, GLsizei count) { if (mode == GL_QUAD_STRIP) mode = GL_TRIANGLE_STRIP; displaylist_t *active = state.list.active; if (active) { block_t *block = block_from_arrays(mode, first, count); bl_end(block); dl_append_block(active, block); return; } if (should_intercept_render(mode)) { block_t *block = block_from_arrays(mode, first, count); bl_end(block); bl_draw(block); bl_free(block); } else { LOAD_GLES(glDrawArrays); gles_glDrawArrays(mode, first, count); } }
void glDrawArrays(GLenum mode, GLint first, GLsizei count) { if (mode == GL_QUAD_STRIP) mode = GL_TRIANGLE_STRIP; renderlist_t *list, *active = state.list.active; if (active && state.list.compiling) { list = state.list.active = extend_renderlist(active); arrays_to_renderlist(list, mode, first, count); return; } if (should_intercept_render(mode)) { list = arrays_to_renderlist(NULL, mode, first, count); end_renderlist(list); draw_renderlist(list); free_renderlist(list); } else { // TODO: some draw states require us to use the full pipeline here // like texgen, stipple, npot LOAD_GLES(glDrawArrays); gles_glDrawArrays(mode, first, count); } }
void render_raster() { if (!state.viewport.width || !state.viewport.height || !state.raster.buf) return; // FIXME #ifndef USE_ES2 glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); GLfloat vert[] = { -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0, }; float sw = state.viewport.width / (GLfloat)state.viewport.nwidth; float sh = state.viewport.height / (GLfloat)state.viewport.nheight; GLfloat tex[] = { 0, sh, sw, sh, sw, 0, 0, 0, }; glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT | GL_CLIENT_PIXEL_STORE_BIT); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vert); glTexCoordPointer(2, GL_FLOAT, 0, tex); glEnable(GL_BLEND); glEnable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA, GL_ONE); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glPixelStorei(GL_PACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, state.viewport.nwidth, state.viewport.nheight, 0, GL_RGBA, GL_UNSIGNED_BYTE, state.raster.buf); LOAD_GLES(glDrawArrays); gles_glDrawArrays(GL_TRIANGLE_FAN, 0, 4); glDeleteTextures(1, &texture); glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glPopClientAttrib(); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPopAttrib(); #endif free(state.raster.buf); state.raster.buf = NULL; }