array.cpp revision 92dc3fc52cf097bd105460cf377779bdcf146d62
1076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 4076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Licensed under the Apache License, Version 2.0 (the "License"); 5076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** you may not use this file except in compliance with the License. 6076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 8076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** 10076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** Unless required by applicable law or agreed to in writing, software 11076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** distributed under the License is distributed on an "AS IS" BASIS, 12076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian** See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h> 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "context.h" 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "fp.h" 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "state.h" 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "matrix.h" 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "vertex.h" 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "light.h" 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "primitives.h" 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "texture.h" 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "BufferObjectManager.h" 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VC_CACHE_STATISTICS 0 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VC_CACHE_TYPE_NONE 0 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VC_CACHE_TYPE_INDEXED 1 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VC_CACHE_TYPE_LRU 2 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define VC_CACHE_TYPE VC_CACHE_TYPE_INDEXED 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Timers.h> 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void validate_arrays(ogles_context_t* c, GLenum mode); 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void compileElements__generic(ogles_context_t*, 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t*, GLint, GLsizei); 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void compileElement__generic(ogles_context_t*, 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t*, GLint); 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesPoints(ogles_context_t*, GLint, GLsizei); 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesLineStrip(ogles_context_t*, GLint, GLsizei); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesLineLoop(ogles_context_t*, GLint, GLsizei); 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesLines(ogles_context_t*, GLint, GLsizei); 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesTriangleStrip(ogles_context_t*, GLint, GLsizei); 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesTriangleFan(ogles_context_t*, GLint, GLsizei); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesTriangles(ogles_context_t*, GLint, GLsizei); 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesPoints(ogles_context_t*, 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesLineStrip(ogles_context_t*, 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesLineLoop(ogles_context_t*, 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesLines(ogles_context_t*, 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesTriangleStrip(ogles_context_t*, 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesTriangleFan(ogles_context_t*, 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesTriangles(ogles_context_t*, 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei, const GLvoid*); 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttypedef void (*arrays_prims_fct_t)(ogles_context_t*, GLint, GLsizei); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const arrays_prims_fct_t drawArraysPrims[] = { 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesPoints, 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesLines, 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesLineLoop, 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesLineStrip, 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangles, 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleStrip, 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleFan 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttypedef void (*elements_prims_fct_t)(ogles_context_t*, GLsizei, const GLvoid*); 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const elements_prims_fct_t drawElementsPrims[] = { 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesPoints, 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesLines, 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesLineLoop, 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesLineStrip, 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangles, 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleStrip, 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleFan 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_init_array(ogles_context_t* c) 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.size = 4; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.type = GL_FLOAT; 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.color.size = 4; 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.color.type = GL_FLOAT; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.normal.size = 4; 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.normal.type = GL_FLOAT; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) { 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.texture[i].size = 4; 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.texture[i].type = GL_FLOAT; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.init(); 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->vc.vBuffer) { 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this could have failed 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_OUT_OF_MEMORY); 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid ogles_uninit_array(ogles_context_t* c) 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.uninit(); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Array fetchers 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void currentColor(ogles_context_t* c, GLfixed* v, const GLvoid*) { 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, c->current.color.v, sizeof(vec4_t)); 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void currentColor_clamp(ogles_context_t* c, GLfixed* v, const GLvoid*) { 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, c->currentColorClamped.v, sizeof(vec4_t)); 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void currentNormal(ogles_context_t* c, GLfixed* v, const GLvoid*) { 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, c->currentNormal.v, sizeof(vec3_t)); 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void currentTexCoord(ogles_context_t* c, GLfixed* v, const GLvoid*) { 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, c->current.texture[c->arrays.tmu].v, sizeof(vec4_t)); 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchNop(ogles_context_t*, GLfixed*, const GLvoid*) { 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch2b(ogles_context_t*, GLfixed* v, const GLbyte* p) { 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch2s(ogles_context_t*, GLfixed* v, const GLshort* p) { 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch2x(ogles_context_t*, GLfixed* v, const GLfixed* p) { 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, p, 2*sizeof(GLfixed)); 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch2f(ogles_context_t*, GLfixed* v, const GLfloat* p) { 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglFloatToFixed(p[0]); 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglFloatToFixed(p[1]); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch3b(ogles_context_t*, GLfixed* v, const GLbyte* p) { 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglIntToFixed(p[2]); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch3s(ogles_context_t*, GLfixed* v, const GLshort* p) { 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglIntToFixed(p[2]); 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch3x(ogles_context_t*, GLfixed* v, const GLfixed* p) { 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, p, 3*sizeof(GLfixed)); 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch3f(ogles_context_t*, GLfixed* v, const GLfloat* p) { 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglFloatToFixed(p[0]); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglFloatToFixed(p[1]); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglFloatToFixed(p[2]); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch4b(ogles_context_t*, GLfixed* v, const GLbyte* p) { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglIntToFixed(p[2]); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = gglIntToFixed(p[3]); 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch4s(ogles_context_t*, GLfixed* v, const GLshort* p) { 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglIntToFixed(p[0]); 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglIntToFixed(p[1]); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglIntToFixed(p[2]); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = gglIntToFixed(p[3]); 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch4x(ogles_context_t*, GLfixed* v, const GLfixed* p) { 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(v, p, 4*sizeof(GLfixed)); 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetch4f(ogles_context_t*, GLfixed* v, const GLfloat* p) { 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglFloatToFixed(p[0]); 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglFloatToFixed(p[1]); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglFloatToFixed(p[2]); 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = gglFloatToFixed(p[3]); 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchExpand4ub(ogles_context_t*, GLfixed* v, const GLubyte* p) { 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = GGL_UB_TO_X(p[0]); 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = GGL_UB_TO_X(p[1]); 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = GGL_UB_TO_X(p[2]); 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = GGL_UB_TO_X(p[3]); 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchClamp4x(ogles_context_t*, GLfixed* v, const GLfixed* p) { 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglClampx(p[0]); 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglClampx(p[1]); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglClampx(p[2]); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = gglClampx(p[3]); 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchClamp4f(ogles_context_t*, GLfixed* v, const GLfloat* p) { 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglClampx(gglFloatToFixed(p[0])); 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglClampx(gglFloatToFixed(p[1])); 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglClampx(gglFloatToFixed(p[2])); 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = gglClampx(gglFloatToFixed(p[3])); 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchExpand3ub(ogles_context_t*, GLfixed* v, const GLubyte* p) { 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = GGL_UB_TO_X(p[0]); 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = GGL_UB_TO_X(p[1]); 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = GGL_UB_TO_X(p[2]); 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = 0x10000; 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchClamp3x(ogles_context_t*, GLfixed* v, const GLfixed* p) { 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglClampx(p[0]); 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglClampx(p[1]); 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglClampx(p[2]); 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = 0x10000; 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchClamp3f(ogles_context_t*, GLfixed* v, const GLfloat* p) { 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = gglClampx(gglFloatToFixed(p[0])); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = gglClampx(gglFloatToFixed(p[1])); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = gglClampx(gglFloatToFixed(p[2])); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[3] = 0x10000; 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchExpand3b(ogles_context_t*, GLfixed* v, const GLbyte* p) { 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = GGL_B_TO_X(p[0]); 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = GGL_B_TO_X(p[1]); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = GGL_B_TO_X(p[2]); 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void fetchExpand3s(ogles_context_t*, GLfixed* v, const GLshort* p) { 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0] = GGL_S_TO_X(p[0]); 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1] = GGL_S_TO_X(p[1]); 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[2] = GGL_S_TO_X(p[2]); 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 253076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiantypedef array_t::fetcher_t fn_t; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const fn_t color_fct[2][16] = { // size={3,4}, type={ub,f,x} 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 0, (fn_t)fetchExpand3ub, 0, 0, 0, 0, 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3f, 0, 0, 0, 0, 0, 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3x }, 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 0, (fn_t)fetchExpand4ub, 0, 0, 0, 0, 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4f, 0, 0, 0, 0, 0, 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4x }, 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const fn_t color_clamp_fct[2][16] = { // size={3,4}, type={ub,f,x} 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 0, (fn_t)fetchExpand3ub, 0, 0, 0, 0, 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetchClamp3f, 0, 0, 0, 0, 0, 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetchClamp3x }, 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 0, (fn_t)fetchExpand4ub, 0, 0, 0, 0, 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetchClamp4f, 0, 0, 0, 0, 0, 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetchClamp4x }, 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const fn_t normal_fct[1][16] = { // size={3}, type={b,s,f,x} 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetchExpand3b, 0, 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetchExpand3s, 0, 0, 0, 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3f, 0, 0, 0, 0, 0, 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3x }, 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const fn_t vertex_fct[3][16] = { // size={2,3,4}, type={b,s,f,x} 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch2b, 0, 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch2s, 0, 0, 0, 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch2f, 0, 0, 0, 0, 0, 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3x }, 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch3b, 0, 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3s, 0, 0, 0, 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3f, 0, 0, 0, 0, 0, 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3x }, 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch4b, 0, 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4s, 0, 0, 0, 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4f, 0, 0, 0, 0, 0, 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4x } 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic const fn_t texture_fct[3][16] = { // size={2,3,4}, type={b,s,f,x} 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch2b, 0, 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch2s, 0, 0, 0, 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch2f, 0, 0, 0, 0, 0, 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch2x }, 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch3b, 0, 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3s, 0, 0, 0, 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3f, 0, 0, 0, 0, 0, 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch3x }, 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { (fn_t)fetch4b, 0, 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4s, 0, 0, 0, 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4f, 0, 0, 0, 0, 0, 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (fn_t)fetch4x } 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark array_t 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid array_t::init( 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLvoid *pointer, const buffer_t* bo, GLsizei count) 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!stride) { 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stride = size; 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_SHORT: 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stride *= 2; 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project stride *= 4; 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->size = size; 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->type = type; 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->stride = stride; 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->pointer = pointer; 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->bo = bo; 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this->bounds = count; 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 337076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianinline void array_t::resolve() 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project physical_pointer = (bo) ? (bo->data + uintptr_t(pointer)) : pointer; 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark vertex_cache_t 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vertex_cache_t::init() 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // make sure the size of vertex_t allows cache-line alignment 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project CTA<(sizeof(vertex_t) & 0x1F) == 0> assertAlignedSize; 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int align = 32; 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t s = VERTEX_BUFFER_SIZE + VERTEX_CACHE_SIZE; 355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t size = s*sizeof(vertex_t) + align; 356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project base = malloc(size); 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (base) { 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memset(base, 0, size); 359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vBuffer = (vertex_t*)((size_t(base) + align - 1) & ~(align-1)); 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vCache = vBuffer + VERTEX_BUFFER_SIZE; 361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sequence = 0; 362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vertex_cache_t::uninit() 366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project free(base); 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project base = vBuffer = vCache = 0; 369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vertex_cache_t::clear() 372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project startTime = systemTime(SYSTEM_TIME_THREAD); 375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project total = 0; 376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project misses = 0; 377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_TYPE == VC_CACHE_TYPE_LRU 380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = vBuffer; 381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t count = VERTEX_BUFFER_SIZE + VERTEX_CACHE_SIZE; 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->mru = 0; 384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sequence += INDEX_SEQ; 389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (sequence >= 0x80000000LU) { 390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sequence = INDEX_SEQ; 391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = vBuffer; 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project size_t count = VERTEX_BUFFER_SIZE + VERTEX_CACHE_SIZE; 393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = 0; 395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 40092dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn#if VC_CACHE_STATISTICS 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vertex_cache_t::dump_stats(GLenum mode) 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nsecs_t time = systemTime(SYSTEM_TIME_THREAD) - startTime; 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t hits = total - misses; 405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t prim_count; 406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: prim_count = total; break; 408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: prim_count = total - 1; break; 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: prim_count = total - 1; break; 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: prim_count = total / 2; break; 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_STRIP: prim_count = total - 2; break; 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_FAN: prim_count = total - 2; break; 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLES: prim_count = total / 3; break; 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: return; 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printf( "total=%5u, hits=%5u, miss=%5u, hitrate=%3u%%," 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project " prims=%5u, time=%6u us, prims/s=%d, v/t=%f\n", 418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project total, hits, misses, (hits*100)/total, 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project prim_count, int(ns2us(time)), int(prim_count*float(seconds(1))/time), 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project float(misses) / prim_count); 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 42292dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn#else 42392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzynvoid vertex_cache_t::dump_stats(GLenum /*mode*/) 42492dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn{ 42592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn} 42692dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn#endif 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid enableDisableClientState(ogles_context_t* c, GLenum array, bool enable) 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int tmu = c->arrays.activeTexture; 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project array_t* a; 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (array) { 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_COLOR_ARRAY: a = &c->arrays.color; break; 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_NORMAL_ARRAY: a = &c->arrays.normal; break; 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TEXTURE_COORD_ARRAY: a = &c->arrays.texture[tmu]; break; 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_VERTEX_ARRAY: a = &c->arrays.vertex; break; 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project a->enable = enable ? GL_TRUE : GL_FALSE; 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Vertex Cache 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvertex_t* cache_vertex(ogles_context_t* c, vertex_t* v, uint32_t index) 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project #if VC_CACHE_STATISTICS 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.misses++; 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project #endif 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(v->locked)) { 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we're just looking for an entry in the cache that is not locked. 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // and we know that there cannot be more than 2 locked entries 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // because a triangle needs at most 3 vertices. 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We never use the first and second entries because they might be in 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // use by the striper or faner. Any other entry will do as long as 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it's not locked. 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We compute directly the index of a "free" entry from the locked 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // state of v[2] and v[3]. 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 2; 472076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v += v[0].locked | (v[1].locked<<1); 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // note: compileElement clears v->flags 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v, index); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 1; 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v; 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvertex_t* fetch_vertex(ogles_context_t* c, size_t index) 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index |= c->vc.sequence; 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_TYPE == VC_CACHE_TYPE_INDEXED 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* const v = c->vc.vCache + 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (index & (vertex_cache_t::VERTEX_CACHE_SIZE-1)); 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v->index == index)) { 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 1; 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v; 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, v, index); 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#elif VC_CACHE_TYPE == VC_CACHE_TYPE_LRU 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* v = c->vc.vCache + 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (index & ((vertex_cache_t::VERTEX_CACHE_SIZE-1)>>1))*2; 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always record LRU in v[0] 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v[0].index == index)) { 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].locked = 1; 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = 0; 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return &v[0]; 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v[1].index == index)) { 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1].locked = 1; 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = 1; 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return &v[1]; 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int lru = 1 - v[0].mru; 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = lru; 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, &v[lru], index); 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#elif VC_CACHE_TYPE == VC_CACHE_TYPE_NONE 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // just for debugging... 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer + 2; 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, v, index); 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Primitive Assembly 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesPoints(ogles_context_t* c, GLint first, GLsizei count) 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 1)) 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 1 539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (vertex_cache_t::VERTEX_BUFFER_SIZE + 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE); 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 544076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags; 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderPoint(c, v); 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLineStrip(ogles_context_t* c, GLint first, GLsizei count) 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t *v, *v0, *v1; 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, c->vc.vBuffer, first); 572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += 1; 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 1 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (vertex_cache_t::VERTEX_BUFFER_SIZE + 578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE - 1); 579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v0 = c->vc.vBuffer + 0; 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 1; 582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = v++; 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // copy back the last processed vertex 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[0] = *v0; 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = v0->flags & vertex_t::CLIP_ALL; 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLineLoop(ogles_context_t* c, GLint first, GLsizei count) 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 605edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesLineStrip(c, first, count); 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(count >= 3)) { 609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* v0 = c->vc.vBuffer; 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1 = c->vc.vBuffer + 1; 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v1, first); 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLines(ogles_context_t* c, GLint first, GLsizei count) 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 620edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 2 624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 625edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE) / 2) * 2; 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 2; 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags & v[1].flags; 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v, v+1); 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v += 2; 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 2; 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num >= 0); 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 2); 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesTriangleFanOrStrip(ogles_context_t* c, 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count, int winding) 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 2 : fan 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 1 : strip 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t *v, *v0, *v1, *v2; 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, c->vc.vBuffer, first, 2); 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += 2; 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 665edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 2. This is extremely important 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // because it allows us to preserve the same winding when the whole 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // batch is culled. We also need 2 extra vertices in the array, because 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we always keep the two first ones. 669076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 670edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE - 2) / 2) * 2; 672edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 673076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v0 = c->vc.vBuffer + 0; 674076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v1 = c->vc.vBuffer + 1; 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 2; 676076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2 = v++; 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project swap(((winding^=1) ? v1 : v0), v2); 688edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 689edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count) { 692e3586182ec7a5942b758610fe9d084a82486307eMathias Agopian v0 = c->vc.vBuffer + 2 + vcs - 2; 693e3586182ec7a5942b758610fe9d084a82486307eMathias Agopian v1 = c->vc.vBuffer + 2 + vcs - 1; 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((winding&2) == 0) { 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for strips copy back the two last compiled vertices 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[0] = *v0; 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[1] = *v1; 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = v0->flags & v1->flags & vertex_t::CLIP_ALL; 700edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count > 0); 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 704076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid drawPrimitivesTriangleStrip(ogles_context_t* c, 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count) { 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleFanOrStrip(c, first, count, 1); 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesTriangleFan(ogles_context_t* c, 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count) { 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleFanOrStrip(c, first, count, 2); 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesTriangles(ogles_context_t* c, GLint first, GLsizei count) 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 3 720076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 721edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE) / 3) * 3; 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 725076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 3; 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags & v[1].flags & v[2].flags; 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v, v+1, v+2); 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v += 3; 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 3; 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num >= 0); 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 3); 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// this looks goofy, but gcc does a great job with this... 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline unsigned int read_index(int type, const GLvoid*& p) { 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project unsigned int r; 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (type) { 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r = *(const GLubyte*)p; 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p = (const GLubyte*)p + 1; 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r = *(const GLushort*)p; 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p = (const GLushort*)p + 1; 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return r; 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesPoints(ogles_context_t* c, 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 1)) 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * v = fetch_vertex(c, read_index(type, indices)); 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(v->flags & vertex_t::CLIP_ALL))) 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderPoint(c, v); 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 0; 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while(count); 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLineStrip(ogles_context_t* c, 782edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 786076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1; 790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = fetch_vertex(c, read_index(type, indices)); 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLineLoop(ogles_context_t* c, 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 809edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count <= 2)) { 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesLines(c, count, indices); 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1; 817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = fetch_vertex(c, read_index(type, indices)); 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 828edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v1 = c->vc.vBuffer; 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLines(ogles_context_t* c, 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, read_index(type, indices)); 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, read_index(type, indices)); 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesTriangleFanOrStrip(ogles_context_t* c, 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices, int winding) 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 2 : fan 864edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 1 : strip 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 868076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1 = v+1; 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v2; 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v1, read_index(type, indices)); 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // note: GCC 4.1.1 here makes a prety interesting optimization 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // where it duplicates the loop below based on c->arrays.indicesType 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2 = fetch_vertex(c, read_index(type, indices)); 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* & consumed = ((winding^=1) ? v1 : v0); 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project consumed->locked = 0; 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project consumed = v2; 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = v1->locked = 0; 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangleStrip(ogles_context_t* c, 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) { 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleFanOrStrip(c, count, indices, 1); 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangleFan(ogles_context_t* c, 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) { 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleFanOrStrip(c, count, indices, 2); 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangles(ogles_context_t* c, 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(c->arrays.indicesType == GL_UNSIGNED_SHORT)) { 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // This case is probably our most common case... 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint16_t const * p = (uint16_t const *)indices; 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, *p++); 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, *p++); 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v2 = fetch_vertex(c, *p++); 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t const * p = (uint8_t const *)indices; 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, *p++); 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, *p++); 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v2 = fetch_vertex(c, *p++); 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Array compilers 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElement__generic(ogles_context_t* c, 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first) 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 954edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = 0; 955edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first; 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first &= vertex_cache_t::INDEX_MASK; 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLubyte* vp = c->arrays.vertex.element(first); 95869ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.z = 0; 95969ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.w = 0x10000; 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.fetch(c, v->obj.v, vp); 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform(&c->transforms.mvp, &v->clip, &v->obj); 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective(c, v); 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElements__generic(ogles_context_t* c, 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first, GLsizei count) 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLubyte* vp = c->arrays.vertex.element( 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first & vertex_cache_t::INDEX_MASK); 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t stride = c->arrays.vertex.stride; 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_t const* const mvp = &c->transforms.mvp; 972edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = 0; 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first++; 97569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.z = 0; 97669ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.w = 0x10000; 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.fetch(c, v->obj.v, vp); 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform(mvp, &v->clip, &v->obj); 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective(c, v); 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vp += stride; 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElements__3x_full(ogles_context_t* c, 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first, GLsizei count) 988edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* vp = (const GLfixed*)c->arrays.vertex.element(first); 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t stride = c->arrays.vertex.stride / 4; 991edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// const GLfixed* const& m = c->transforms.mvp.matrix.m; 992076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed m[16]; 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(&m, c->transforms.mvp.matrix.m, sizeof(m)); 995076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = vp[0]; 998edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = vp[1]; 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rz = vp[2]; 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vp += stride; 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first++; 1002076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v->clip.x = mla3a(rx, m[ 0], ry, m[ 4], rz, m[ 8], m[12]); 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.y = mla3a(rx, m[ 1], ry, m[ 5], rz, m[ 9], m[13]); 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.z = mla3a(rx, m[ 2], ry, m[ 6], rz, m[10], m[14]); 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.w = mla3a(rx, m[ 3], ry, m[ 7], rz, m[11], m[15]); 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed w = v->clip.w; 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t clip = 0; 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.x < -w) clip |= vertex_t::CLIP_L; 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.x > w) clip |= vertex_t::CLIP_R; 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.y < -w) clip |= vertex_t::CLIP_B; 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.y > w) clip |= vertex_t::CLIP_T; 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.z < -w) clip |= vertex_t::CLIP_N; 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.z > w) clip |= vertex_t::CLIP_F; 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = clip; 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull &= clip; 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //c->arrays.perspective(c, v); 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1026edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark clippers 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1030076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void clipVec4(vec4_t& nv, 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vec4_t& s, const vec4_t& p) 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0; i<4 ; i++) 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv.v[i] = gglMulAddx(t, s.v[i] - p.v[i], p.v[i], 28); 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertex(ogles_context_t* c, vertex_t* nv, 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->clip, t, s->clip, p->clip); 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->fog = gglMulAddx(t, s->fog - p->fog, p->fog, 28); 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_vertex_project(c, nv); 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->flags |= vertex_t::LIT | vertex_t::EYE | vertex_t::TT; 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->flags &= ~vertex_t::CLIP_ALL; 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexC(ogles_context_t* c, vertex_t* nv, 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->color, t, s->color, p->color); 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertex(c, nv, t, s, p); 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexT(ogles_context_t* c, vertex_t* nv, 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) { 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->rasterizer.state.texture[i].enable) 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->texture[i], t, s->texture[i], p->texture[i]); 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertex(c, nv, t, s, p); 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexAll(ogles_context_t* c, vertex_t* nv, 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->color, t, s->color, p->color); 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertexT(c, nv, t, s, p); 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipEye(ogles_context_t* c, vertex_t* nv, 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->clear(); 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.clipVertex(c, nv, t, p, s); 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->eye, t, s->eye, p->eye); 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid validate_arrays(ogles_context_t* c, GLenum mode) 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t enables = c->rasterizer.state.enables; 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Perspective correction is not need if Ortho transform, but 1089edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the user can still provide the w coordinate manually, so we can't 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // automatically turn it off (in fact we could when the 4th coordinate 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // is not spcified in the vertex array). 1092edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // W interpolation is never needed for points. 1093076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLboolean perspective = 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->perspective && mode!=GL_POINTS && (enables & GGL_ENABLE_TMUS); 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.enableDisable(c, GGL_W_LERP, perspective); 1096076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // set anti-aliasing 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLboolean smooth = GL_FALSE; 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project smooth = c->point.smooth; 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project smooth = c->line.smooth; 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (((enables & GGL_ENABLE_AA)?1:0) != smooth) 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.enableDisable(c, GGL_AA, smooth); 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // set the shade model for this primitive 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.shadeModel(c, 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mode == GL_POINTS) ? GL_FLAT : c->lighting.shadeModel); 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute all the matrices we'll need... 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t want = 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::MVP | 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::VIEWPORT; 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->lighting.enable) { // needs normal transforms and eye coords 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MVUI; 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MODELVIEW; 1123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { // needs texture transforms 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::TEXTURE; 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1127076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (c->clipPlanes.enable || (enables & GGL_ENABLE_FOG)) { 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MODELVIEW; // needs eye coords 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_transform(c, want); 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // textures... 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_texture(c); 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex compilers 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement = compileElement__generic; 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements = compileElements__generic; 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex transform 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform = 1142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvp.pointv[c->arrays.vertex.size - 2]; 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mv_transform = 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.modelview.transform.pointv[c->arrays.vertex.size - 2]; 1146076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 1148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * *********************************************************************** 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * pick fetchers 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * *********************************************************************** 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1152076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project array_machine_t& am = c->arrays; 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.fetch = fetchNop; 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.fetch = currentNormal; 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = currentColor; 1157076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.vertex.enable) { 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.resolve(); 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.vertex.bo || am.vertex.pointer) { 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.fetch = vertex_fct[am.vertex.size-2][am.vertex.type & 0xF]; 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.normal.enable) { 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.resolve(); 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.normal.bo || am.normal.pointer) { 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.fetch = normal_fct[am.normal.size-3][am.normal.type & 0xF]; 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.enable) { 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.resolve(); 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->lighting.enable) { 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.bo || am.color.pointer) { 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = color_fct[am.color.size-3][am.color.type & 0xF]; 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.bo || am.color.pointer) { 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = color_clamp_fct[am.color.size-3][am.color.type & 0xF]; 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int activeTmuCount = 0; 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) { 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].fetch = currentTexCoord; 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->rasterizer.state.texture[i].enable) { 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture fetchers... 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.texture[i].enable) { 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].resolve(); 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.texture[i].bo || am.texture[i].pointer) { 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].fetch = texture_fct[am.texture[i].size-2][am.texture[i].type & 0xF]; 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture transform... 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int index = c->arrays.texture[i].size - 2; 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.tex_transform[i] = 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.texture[i].transform.pointv[index]; 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.tmu = i; 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project activeTmuCount++; 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pick the vertex-clipper 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t clipper = 0; 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we must reload 'enables' here 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enables = c->rasterizer.state.enables; 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipper |= 1; // we need to interpolate colors 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipper |= 2; // we need to interpolate textures 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (clipper) { 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 0: c->arrays.clipVertex = clipVertex; break; 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: c->arrays.clipVertex = clipVertexC; break; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: c->arrays.clipVertex = clipVertexT; break; 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: c->arrays.clipVertex = clipVertexAll; break; 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.clipEye = clipEye; 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pick the primitive rasterizer 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_primitives(c); 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark array API 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glVertexPointer( 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<2 || size>4 || stride<0) { 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.init(size, type, stride, pointer, c->arrays.array_buffer, 0); 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glColorPointer( 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1264c5f0155d7f60b4eeb3194898c7772e18fd011402Mathias Agopian if (size!=4 || stride<0) { 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_BYTE: 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.color.init(size, type, stride, pointer, c->arrays.array_buffer, 0); 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glNormalPointer( 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum type, GLsizei stride, const GLvoid *pointer) 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (stride<0) { 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.normal.init(3, type, stride, pointer, c->arrays.array_buffer, 0); 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexCoordPointer( 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<2 || size>4 || stride<0) { 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int tmu = c->arrays.activeTexture; 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.texture[tmu].init(size, type, stride, pointer, 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer, 0); 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glEnableClientState(GLenum array) { 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enableDisableClientState(c, array, true); 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDisableClientState(GLenum array) { 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enableDisableClientState(c, array, false); 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClientActiveTexture(GLenum texture) 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (texture<GL_TEXTURE0 || texture>=GL_TEXTURE0+GGL_TEXTURE_UNIT_COUNT) { 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.activeTexture = texture - GL_TEXTURE0; 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawArrays(GLenum mode, GLint first, GLsizei count) 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count<0) { 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_STRIP: 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_FAN: 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLES: 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count == 0 || !c->arrays.vertex.enable) 1367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((c->cull.enable) && (c->cull.cullFace == GL_FRONT_AND_BACK)) 1369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; // all triangles are culled 1370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13710926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project validate_arrays(c, mode); 13730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 13740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian const uint32_t enables = c->rasterizer.state.enables; 13750926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 13760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_lock_textures(c); 13770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawArraysPrims[mode](c, first, count); 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13800926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 13810926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_unlock_textures(c); 13820926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.total = count; 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.dump_stats(mode); 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawElements( 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count<0) { 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_STRIP: 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_FAN: 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLES: 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_BYTE: 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_SHORT: 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.indicesType = type; 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count == 0 || !c->arrays.vertex.enable) 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((c->cull.enable) && (c->cull.cullFace == GL_FRONT_AND_BACK)) 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; // all triangles are culled 1423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // clear the vertex-cache 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.clear(); 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project validate_arrays(c, mode); 1427076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if indices are in a buffer object, the pointer is treated as an 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // offset in that buffer. 1430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->arrays.element_array_buffer) { 1431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project indices = c->arrays.element_array_buffer->data + uintptr_t(indices); 1432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14340926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian const uint32_t enables = c->rasterizer.state.enables; 14350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 14360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_lock_textures(c); 14370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawElementsPrims[mode](c, count, indices); 14390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 14400926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 14410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_unlock_textures(c); 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14430926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.total = count; 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.dump_stats(mode); 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// buffers 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBindBuffer(GLenum target, GLuint buffer) 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // create a buffer object, or bind an existing one 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer_t const* bo = 0; 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (buffer) { 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bo = c->bufferObjectManager->bind(buffer); 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!bo) { 1466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_OUT_OF_MEMORY); 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1470076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ((target == GL_ARRAY_BUFFER) ? 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer) = bo; 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<0) { 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((usage!=GL_STATIC_DRAW) && (usage!=GL_DYNAMIC_DRAW)) { 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_t const* bo = ((target == GL_ARRAY_BUFFER) ? 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer); 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (bo == 0) { 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can't modify buffer 0 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_OPERATION); 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer_t* edit_bo = const_cast<buffer_t*>(bo); 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->bufferObjectManager->allocateStore(edit_bo, size, usage) != 0) { 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_OUT_OF_MEMORY); 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (data) { 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(bo->data, data, size); 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (offset<0 || size<0 || data==0) { 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_t const* bo = ((target == GL_ARRAY_BUFFER) ? 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer); 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (bo == 0) { 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can't modify buffer 0 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_OPERATION); 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (offset+size > bo->size) { 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(bo->data + offset, data, size); 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDeleteBuffers(GLsizei n, const GLuint* buffers) 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (n<0) { 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<n ; i++) { 1543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLuint name = buffers[i]; 1544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (name) { 1545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // unbind bound deleted buffers... 1546a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.element_array_buffer) { 1547a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.element_array_buffer->name == name) { 1548a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.element_array_buffer = 0; 1549a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1551a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.array_buffer) { 1552a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.array_buffer->name == name) { 1553a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.array_buffer = 0; 1554a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1556a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.vertex.bo) { 1557a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.vertex.bo->name == name) { 1558a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.vertex.bo = 0; 1559a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1561a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.normal.bo) { 1562a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.normal.bo->name == name) { 1563a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.normal.bo = 0; 1564a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1566a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.color.bo) { 1567a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.color.bo->name == name) { 1568a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.color.bo = 0; 1569a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int t=0 ; t<GGL_TEXTURE_UNIT_COUNT ; t++) { 1572a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.texture[t].bo) { 1573a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.texture[t].bo->name == name) { 1574a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.texture[t].bo = 0; 1575a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->deleteBuffers(n, buffers); 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->recycleTokens(n, buffers); 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glGenBuffers(GLsizei n, GLuint* buffers) 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (n<0) { 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->getToken(n, buffers); 1592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1593