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 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid vertex_cache_t::dump_stats(GLenum mode) 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 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#endif 422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid enableDisableClientState(ogles_context_t* c, GLenum array, bool enable) 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int tmu = c->arrays.activeTexture; 433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project array_t* a; 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (array) { 435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_COLOR_ARRAY: a = &c->arrays.color; break; 436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_NORMAL_ARRAY: a = &c->arrays.normal; break; 437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TEXTURE_COORD_ARRAY: a = &c->arrays.texture[tmu]; break; 438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_VERTEX_ARRAY: a = &c->arrays.vertex; break; 439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project a->enable = enable ? GL_TRUE : GL_FALSE; 444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Vertex Cache 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvertex_t* cache_vertex(ogles_context_t* c, vertex_t* v, uint32_t index) 454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project #if VC_CACHE_STATISTICS 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.misses++; 457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project #endif 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(v->locked)) { 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we're just looking for an entry in the cache that is not locked. 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // and we know that there cannot be more than 2 locked entries 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // because a triangle needs at most 3 vertices. 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We never use the first and second entries because they might be in 463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // use by the striper or faner. Any other entry will do as long as 464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // it's not locked. 465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // We compute directly the index of a "free" entry from the locked 466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // state of v[2] and v[3]. 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 2; 468076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v += v[0].locked | (v[1].locked<<1); 469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // note: compileElement clears v->flags 471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v, index); 472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 1; 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v; 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic __attribute__((noinline)) 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvertex_t* fetch_vertex(ogles_context_t* c, size_t index) 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project index |= c->vc.sequence; 480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_TYPE == VC_CACHE_TYPE_INDEXED 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* const v = c->vc.vCache + 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (index & (vertex_cache_t::VERTEX_CACHE_SIZE-1)); 485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v->index == index)) { 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 1; 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return v; 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, v, index); 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#elif VC_CACHE_TYPE == VC_CACHE_TYPE_LRU 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 494076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* v = c->vc.vCache + 495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (index & ((vertex_cache_t::VERTEX_CACHE_SIZE-1)>>1))*2; 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // always record LRU in v[0] 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v[0].index == index)) { 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].locked = 1; 500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = 0; 501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return &v[0]; 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(v[1].index == index)) { 505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[1].locked = 1; 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = 1; 507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return &v[1]; 508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int lru = 1 - v[0].mru; 511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v[0].mru = lru; 512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, &v[lru], index); 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#elif VC_CACHE_TYPE == VC_CACHE_TYPE_NONE 515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // just for debugging... 517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer + 2; 518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return cache_vertex(c, v, index); 519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Primitive Assembly 527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesPoints(ogles_context_t* c, GLint first, GLsizei count) 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 1)) 532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 1 535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (vertex_cache_t::VERTEX_BUFFER_SIZE + 537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE); 538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 542edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 543edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 544edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags; 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderPoint(c, v); 551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLineStrip(ogles_context_t* c, GLint first, GLsizei count) 561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 562edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 563edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 564edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 565edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t *v, *v0, *v1; 566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, c->vc.vBuffer, first); 568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += 1; 569edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 570edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 571edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 1 572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (vertex_cache_t::VERTEX_BUFFER_SIZE + 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE - 1); 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v0 = c->vc.vBuffer + 0; 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 1; 578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = v++; 586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 589edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 590edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 591edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 592edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // copy back the last processed vertex 594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[0] = *v0; 595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = v0->flags & vertex_t::CLIP_ALL; 596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 597edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 599edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLineLoop(ogles_context_t* c, GLint first, GLsizei count) 600edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 601edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 602edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 603edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesLineStrip(c, first, count); 604edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(count >= 3)) { 605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian vertex_t* v0 = c->vc.vBuffer; 606edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1 = c->vc.vBuffer + 1; 607edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v1, first); 608edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 609edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 610edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 611edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 612edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 613edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesLines(ogles_context_t* c, GLint first, GLsizei count) 615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 2 620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 621edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 622edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE) / 2) * 2; 623edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 624edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 625076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 626edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 627edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 628edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 629edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 630edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 631edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 632edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 2; 633edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags & v[1].flags; 635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v, v+1); 637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v += 2; 638edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 2; 639edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num >= 0); 640edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 641edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 2); 642edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 643edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 644edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 645edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 646edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawPrimitivesTriangleFanOrStrip(ogles_context_t* c, 647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count, int winding) 648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 2 : fan 650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 1 : strip 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 653edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 654edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 655edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t *v, *v0, *v1, *v2; 656edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 657edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, c->vc.vBuffer, first, 2); 658edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += 2; 659edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 660edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 661edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 2. This is extremely important 662edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // because it allows us to preserve the same winding when the whole 663edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // batch is culled. We also need 2 extra vertices in the array, because 664edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we always keep the two first ones. 665076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 666edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 667edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE - 2) / 2) * 2; 668edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 669076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v0 = c->vc.vBuffer + 0; 670076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v1 = c->vc.vBuffer + 1; 671edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v = c->vc.vBuffer + 2; 672076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 673edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 674edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 675edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 676edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 677edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 678edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 679edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2 = v++; 680edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 681edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 682edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 683edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project swap(((winding^=1) ? v1 : v0), v2); 684edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num--; 685edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num); 686edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 687edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count) { 688e3586182ec7a5942b758610fe9d084a82486307eMathias Agopian v0 = c->vc.vBuffer + 2 + vcs - 2; 689e3586182ec7a5942b758610fe9d084a82486307eMathias Agopian v1 = c->vc.vBuffer + 2 + vcs - 1; 690edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((winding&2) == 0) { 691edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // for strips copy back the two last compiled vertices 692edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[0] = *v0; 693edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 694edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.vBuffer[1] = *v1; 695edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = v0->flags & v1->flags & vertex_t::CLIP_ALL; 696edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 697edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count > 0); 698edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 699edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 700076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid drawPrimitivesTriangleStrip(ogles_context_t* c, 701edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count) { 702edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleFanOrStrip(c, first, count, 1); 703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 705edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesTriangleFan(ogles_context_t* c, 706edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint first, GLsizei count) { 707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawPrimitivesTriangleFanOrStrip(c, first, count, 2); 708edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 709edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 710edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawPrimitivesTriangles(ogles_context_t* c, GLint first, GLsizei count) 711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 712edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 713edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 714edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 715edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex cache size must be multiple of 3 716076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian const GLsizei vcs = 717edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ((vertex_cache_t::VERTEX_BUFFER_SIZE + 718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_cache_t::VERTEX_CACHE_SIZE) / 3) * 3; 719edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 720edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v = c->vc.vBuffer; 721076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLsizei num = count > vcs ? vcs : count; 722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull = vertex_t::CLIP_ALL; 723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements(c, v, first, num); 724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first += num; 725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= num; 726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!c->arrays.cull) { 727edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // quick/trivial reject of the whole batch 728edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 3; 729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v[0].flags & v[1].flags & v[2].flags; 731edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v, v+1, v+2); 733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v += 3; 734edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project num -= 3; 735edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (num >= 0); 736edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 737edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 3); 738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 743edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 744edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 745edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// this looks goofy, but gcc does a great job with this... 746edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic inline unsigned int read_index(int type, const GLvoid*& p) { 747edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project unsigned int r; 748edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (type) { 749edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r = *(const GLubyte*)p; 750edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p = (const GLubyte*)p + 1; 751edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 752edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project r = *(const GLushort*)p; 753edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p = (const GLushort*)p + 1; 754edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 755edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return r; 756edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 757edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 758edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 759edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 760edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesPoints(ogles_context_t* c, 761edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 762edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 763edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 1)) 764edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 765edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 766edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 767edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * v = fetch_vertex(c, read_index(type, indices)); 768edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(v->flags & vertex_t::CLIP_ALL))) 769edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderPoint(c, v); 770edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->locked = 0; 771edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 772edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while(count); 773edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 774edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 775edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 776edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 777edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLineStrip(ogles_context_t* c, 778edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 779edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 780edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 781edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 782076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 783edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 784edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 785edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1; 786076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 787edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 788edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 789edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 790edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 791edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = fetch_vertex(c, read_index(type, indices)); 792edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 793edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 794edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 795edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 796edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 797edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 798edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 799edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 800edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 801edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 802edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLineLoop(ogles_context_t* c, 803edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 804edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 805edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count <= 2)) { 806edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesLines(c, count, indices); 807edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 808edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 809076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 810edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 811edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 812edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1; 813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 814edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 815edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 816edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 1; 817edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 818edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1 = fetch_vertex(c, read_index(type, indices)); 819edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 820edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 821edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 822edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 823edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0 = v1; 824edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 825edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 826edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 827edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v1 = c->vc.vBuffer; 829edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 830edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 831edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 832edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 833edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 834edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesLines(ogles_context_t* c, 835edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 836edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 837edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 2)) 838edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 839edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 840edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 841edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, read_index(type, indices)); 844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, read_index(type, indices)); 845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags; 846edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 847edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderLine(c, v0, v1); 848edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 849edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 850edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 851edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 852edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 853edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 854edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 855edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 856edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void drawIndexedPrimitivesTriangleFanOrStrip(ogles_context_t* c, 857edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices, int winding) 858edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 859edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 2 : fan 860edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // winding == 1 : strip 861edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 862edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 863edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 864076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 865edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t * const v = c->vc.vBuffer; 866edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v0 = v; 867edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v1 = v+1; 868edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v2; 869edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 870edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int type = (c->arrays.indicesType == GL_UNSIGNED_BYTE); 871edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v0, read_index(type, indices)); 872edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement(c, v1, read_index(type, indices)); 873edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 2; 874edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 875edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // note: GCC 4.1.1 here makes a prety interesting optimization 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // where it duplicates the loop below based on c->arrays.indicesType 877edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 878edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 879edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2 = fetch_vertex(c, read_index(type, indices)); 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 881edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 882edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 883edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* & consumed = ((winding^=1) ? v1 : v0); 884edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project consumed->locked = 0; 885edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project consumed = v2; 886edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count--; 887edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count); 888edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = v1->locked = 0; 889edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 890edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 891edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 892edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangleStrip(ogles_context_t* c, 893edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) { 894edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleFanOrStrip(c, count, indices, 1); 895edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 896edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 897edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangleFan(ogles_context_t* c, 898edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) { 899edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawIndexedPrimitivesTriangleFanOrStrip(c, count, indices, 2); 900edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 901edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 902edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid drawIndexedPrimitivesTriangles(ogles_context_t* c, 903edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLsizei count, const GLvoid *indices) 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_unlikely(count < 3)) 906edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 907edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 908edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 909edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(c->arrays.indicesType == GL_UNSIGNED_SHORT)) { 910edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // This case is probably our most common case... 911edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint16_t const * p = (uint16_t const *)indices; 912edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 913edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, *p++); 914edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, *p++); 915edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v2 = fetch_vertex(c, *p++); 916edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 917edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 918edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 919edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 920edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 921edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 922edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 923edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 924edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 925edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint8_t const * p = (uint8_t const *)indices; 926edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 927edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v0 = fetch_vertex(c, *p++); 928edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v1 = fetch_vertex(c, *p++); 929edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* const v2 = fetch_vertex(c, *p++); 930edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t cc = v0->flags & v1->flags & v2->flags; 931edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ggl_likely(!(cc & vertex_t::CLIP_ALL))) 932edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->prims.renderTriangle(c, v0, v1, v2); 933edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v0->locked = 0; 934edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v1->locked = 0; 935edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v2->locked = 0; 936edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project count -= 3; 937edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (count >= 0); 938edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 939edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 940edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 941edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 942edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 943edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 944edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark Array compilers 945edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 946edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 947edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElement__generic(ogles_context_t* c, 948edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first) 949edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 950edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = 0; 951edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first; 952edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first &= vertex_cache_t::INDEX_MASK; 953edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLubyte* vp = c->arrays.vertex.element(first); 95469ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.z = 0; 95569ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.w = 0x10000; 956edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.fetch(c, v->obj.v, vp); 957edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform(&c->transforms.mvp, &v->clip, &v->obj); 958edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective(c, v); 959edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 960edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 961edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElements__generic(ogles_context_t* c, 962edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first, GLsizei count) 963edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 964edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLubyte* vp = c->arrays.vertex.element( 965edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project first & vertex_cache_t::INDEX_MASK); 966edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t stride = c->arrays.vertex.stride; 967edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_t const* const mvp = &c->transforms.mvp; 968edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 969edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = 0; 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first++; 97169ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.z = 0; 97269ca17a12444ef619952b783ddaac121a0d438e5Mathias Agopian v->obj.w = 0x10000; 973edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.fetch(c, v->obj.v, vp); 974edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform(mvp, &v->clip, &v->obj); 975edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.perspective(c, v); 976edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vp += stride; 977edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 978edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 979edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 980edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 981edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 982edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid compileElements__3x_full(ogles_context_t* c, 983edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vertex_t* v, GLint first, GLsizei count) 984edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 985edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed* vp = (const GLfixed*)c->arrays.vertex.element(first); 986edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t stride = c->arrays.vertex.stride / 4; 987edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// const GLfixed* const& m = c->transforms.mvp.matrix.m; 988076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 989edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed m[16]; 990edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(&m, c->transforms.mvp.matrix.m, sizeof(m)); 991076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 992edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project do { 993edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rx = vp[0]; 994edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed ry = vp[1]; 995edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed rz = vp[2]; 996edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project vp += stride; 997edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->index = first++; 998076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian v->clip.x = mla3a(rx, m[ 0], ry, m[ 4], rz, m[ 8], m[12]); 999edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.y = mla3a(rx, m[ 1], ry, m[ 5], rz, m[ 9], m[13]); 1000edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.z = mla3a(rx, m[ 2], ry, m[ 6], rz, m[10], m[14]); 1001edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->clip.w = mla3a(rx, m[ 3], ry, m[ 7], rz, m[11], m[15]); 1002edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1003edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const GLfixed w = v->clip.w; 1004edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t clip = 0; 1005edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.x < -w) clip |= vertex_t::CLIP_L; 1006edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.x > w) clip |= vertex_t::CLIP_R; 1007edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.y < -w) clip |= vertex_t::CLIP_B; 1008edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.y > w) clip |= vertex_t::CLIP_T; 1009edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.z < -w) clip |= vertex_t::CLIP_N; 1010edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (v->clip.z > w) clip |= vertex_t::CLIP_F; 1011edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v->flags = clip; 1012edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.cull &= clip; 1013edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1014edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project //c->arrays.perspective(c, v); 1015edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project v++; 1016edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } while (--count); 1017edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1018edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/ 1019edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1020edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1021edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1022edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1023edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark clippers 1024edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1025edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1026076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatic void clipVec4(vec4_t& nv, 1027edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vec4_t& s, const vec4_t& p) 1028edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1029edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0; i<4 ; i++) 1030edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv.v[i] = gglMulAddx(t, s.v[i] - p.v[i], p.v[i], 28); 1031edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1032edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1033edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertex(ogles_context_t* c, vertex_t* nv, 1034edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1035edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1036edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->clip, t, s->clip, p->clip); 1037edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->fog = gglMulAddx(t, s->fog - p->fog, p->fog, 28); 1038edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_vertex_project(c, nv); 1039edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->flags |= vertex_t::LIT | vertex_t::EYE | vertex_t::TT; 1040edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->flags &= ~vertex_t::CLIP_ALL; 1041edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1042edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1043edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexC(ogles_context_t* c, vertex_t* nv, 1044edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1046edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->color, t, s->color, p->color); 1047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertex(c, nv, t, s, p); 1048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1049edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1050edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexT(ogles_context_t* c, vertex_t* nv, 1051edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1052edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1053edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) { 1054edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->rasterizer.state.texture[i].enable) 1055edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->texture[i], t, s->texture[i], p->texture[i]); 1056edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1057edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertex(c, nv, t, s, p); 1058edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1059edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1060edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipVertexAll(ogles_context_t* c, vertex_t* nv, 1061edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1062edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1063edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->color, t, s->color, p->color); 1064edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVertexT(c, nv, t, s, p); 1065edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1066edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1067edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic void clipEye(ogles_context_t* c, vertex_t* nv, 1068edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLfixed t, const vertex_t* s, const vertex_t* p) 1069edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1070edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project nv->clear(); 1071edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.clipVertex(c, nv, t, p, s); 1072edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipVec4(nv->eye, t, s->eye, p->eye); 1073edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1074edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1075edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1076edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1077edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1078edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1079edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1080edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid validate_arrays(ogles_context_t* c, GLenum mode) 1081edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1082edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t enables = c->rasterizer.state.enables; 1083edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1084edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Perspective correction is not need if Ortho transform, but 1085edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the user can still provide the w coordinate manually, so we can't 1086edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // automatically turn it off (in fact we could when the 4th coordinate 1087edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // is not spcified in the vertex array). 1088edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // W interpolation is never needed for points. 1089076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian GLboolean perspective = 1090edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->perspective && mode!=GL_POINTS && (enables & GGL_ENABLE_TMUS); 1091edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.enableDisable(c, GGL_W_LERP, perspective); 1092076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1093edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // set anti-aliasing 1094edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLboolean smooth = GL_FALSE; 1095edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1096edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1097edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project smooth = c->point.smooth; 1098edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1099edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project smooth = c->line.smooth; 1103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (((enables & GGL_ENABLE_AA)?1:0) != smooth) 1106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.enableDisable(c, GGL_AA, smooth); 1107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // set the shade model for this primitive 1109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->rasterizer.procs.shadeModel(c, 1110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (mode == GL_POINTS) ? GL_FLAT : c->lighting.shadeModel); 1111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // compute all the matrices we'll need... 1113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t want = 1114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::MVP | 1115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project transform_state_t::VIEWPORT; 1116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->lighting.enable) { // needs normal transforms and eye coords 1117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MVUI; 1118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MODELVIEW; 1119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { // needs texture transforms 1121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::TEXTURE; 1122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1123076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian if (c->clipPlanes.enable || (enables & GGL_ENABLE_FOG)) { 1124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project want |= transform_state_t::MODELVIEW; // needs eye coords 1125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_transform(c, want); 1127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // textures... 1129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) 1130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_texture(c); 1131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex compilers 1133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElement = compileElement__generic; 1134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.compileElements = compileElements__generic; 1135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // vertex transform 1137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mvp_transform = 1138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.mvp.pointv[c->arrays.vertex.size - 2]; 1139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.mv_transform = 1141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.modelview.transform.pointv[c->arrays.vertex.size - 2]; 1142076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project /* 1144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * *********************************************************************** 1145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * pick fetchers 1146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * *********************************************************************** 1147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1148076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project array_machine_t& am = c->arrays; 1150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.fetch = fetchNop; 1151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.fetch = currentNormal; 1152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = currentColor; 1153076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.vertex.enable) { 1155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.resolve(); 1156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.vertex.bo || am.vertex.pointer) { 1157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.vertex.fetch = vertex_fct[am.vertex.size-2][am.vertex.type & 0xF]; 1158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.normal.enable) { 1162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.resolve(); 1163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.normal.bo || am.normal.pointer) { 1164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.normal.fetch = normal_fct[am.normal.size-3][am.normal.type & 0xF]; 1165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.enable) { 1169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.resolve(); 1170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->lighting.enable) { 1171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.bo || am.color.pointer) { 1172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = color_fct[am.color.size-3][am.color.type & 0xF]; 1173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.color.bo || am.color.pointer) { 1176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.color.fetch = color_clamp_fct[am.color.size-3][am.color.type & 0xF]; 1177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int activeTmuCount = 0; 1182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; i++) { 1183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].fetch = currentTexCoord; 1184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->rasterizer.state.texture[i].enable) { 1185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture fetchers... 1187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.texture[i].enable) { 1188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].resolve(); 1189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (am.texture[i].bo || am.texture[i].pointer) { 1190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.texture[i].fetch = texture_fct[am.texture[i].size-2][am.texture[i].type & 0xF]; 1191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // texture transform... 1195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int index = c->arrays.texture[i].size - 2; 1196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.tex_transform[i] = 1197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->transforms.texture[i].transform.pointv[index]; 1198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project am.tmu = i; 1200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project activeTmuCount++; 1201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pick the vertex-clipper 1205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t clipper = 0; 1206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // we must reload 'enables' here 1207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enables = c->rasterizer.state.enables; 1208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) 1209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipper |= 1; // we need to interpolate colors 1210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (enables & GGL_ENABLE_TMUS) 1211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project clipper |= 2; // we need to interpolate textures 1212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (clipper) { 1213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 0: c->arrays.clipVertex = clipVertex; break; 1214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 1: c->arrays.clipVertex = clipVertexC; break; 1215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 2: c->arrays.clipVertex = clipVertexT; break; 1216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case 3: c->arrays.clipVertex = clipVertexAll; break; 1217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.clipEye = clipEye; 1219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // pick the primitive rasterizer 1221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_validate_primitives(c); 1222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 1226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectusing namespace android; 1229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if 0 1231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark - 1232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#pragma mark array API 1233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glVertexPointer( 1236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<2 || size>4 || stride<0) { 1240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.vertex.init(size, type, stride, pointer, c->arrays.array_buffer, 0); 1254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glColorPointer( 1257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1260c5f0155d7f60b4eeb3194898c7772e18fd011402Mathias Agopian if (size!=4 || stride<0) { 1261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_BYTE: 1266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.color.init(size, type, stride, pointer, c->arrays.array_buffer, 0); 1274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glNormalPointer( 1277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum type, GLsizei stride, const GLvoid *pointer) 1278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (stride<0) { 1281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.normal.init(3, type, stride, pointer, c->arrays.array_buffer, 0); 1295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glTexCoordPointer( 1298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) 1299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<2 || size>4 || stride<0) { 1302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_BYTE: 1307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_SHORT: 1308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FIXED: 1309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_FLOAT: 1310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const int tmu = c->arrays.activeTexture; 1316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.texture[tmu].init(size, type, stride, pointer, 1317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer, 0); 1318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glEnableClientState(GLenum array) { 1322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enableDisableClientState(c, array, true); 1324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDisableClientState(GLenum array) { 1327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enableDisableClientState(c, array, false); 1329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glClientActiveTexture(GLenum texture) 1332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (texture<GL_TEXTURE0 || texture>=GL_TEXTURE0+GGL_TEXTURE_UNIT_COUNT) { 1335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.activeTexture = texture - GL_TEXTURE0; 1339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawArrays(GLenum mode, GLint first, GLsizei count) 1342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count<0) { 1345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_STRIP: 1354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_FAN: 1355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLES: 1356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count == 0 || !c->arrays.vertex.enable) 1363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((c->cull.enable) && (c->cull.cullFace == GL_FRONT_AND_BACK)) 1365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; // all triangles are culled 1366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project validate_arrays(c, mode); 13690926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 13700926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian const uint32_t enables = c->rasterizer.state.enables; 13710926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 13720926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_lock_textures(c); 13730926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawArraysPrims[mode](c, first, count); 1375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13760926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 13770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_unlock_textures(c); 13780926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 1380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.total = count; 1381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.dump_stats(mode); 1382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDrawElements( 1386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) 1387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count<0) { 1390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (mode) { 1394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_POINTS: 1395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_STRIP: 1396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINE_LOOP: 1397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_LINES: 1398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_STRIP: 1399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLE_FAN: 1400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_TRIANGLES: 1401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project switch (type) { 1407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_BYTE: 1408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project case GL_UNSIGNED_SHORT: 1409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.indicesType = type; 1410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 1411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project default: 1412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (count == 0 || !c->arrays.vertex.enable) 1416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((c->cull.enable) && (c->cull.cullFace == GL_FRONT_AND_BACK)) 1418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; // all triangles are culled 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // clear the vertex-cache 1421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.clear(); 1422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project validate_arrays(c, mode); 1423076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian 1424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // if indices are in a buffer object, the pointer is treated as an 1425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // offset in that buffer. 1426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->arrays.element_array_buffer) { 1427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project indices = c->arrays.element_array_buffer->data + uintptr_t(indices); 1428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14300926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian const uint32_t enables = c->rasterizer.state.enables; 14310926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 14320926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_lock_textures(c); 14330926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project drawElementsPrims[mode](c, count, indices); 14350926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 14360926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian if (enables & GGL_ENABLE_TMUS) 14370926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian ogles_unlock_textures(c); 1438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 14390926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian 1440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if VC_CACHE_STATISTICS 1441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.total = count; 1442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->vc.dump_stats(mode); 1443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 1444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// buffers 1448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBindBuffer(GLenum target, GLuint buffer) 1451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1455edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // create a buffer object, or bind an existing one 1458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer_t const* bo = 0; 1459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (buffer) { 1460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bo = c->bufferObjectManager->bind(buffer); 1461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!bo) { 1462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_OUT_OF_MEMORY); 1463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1466076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian ((target == GL_ARRAY_BUFFER) ? 1467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer) = bo; 1468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1469edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage) 1471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (size<0) { 1478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((usage!=GL_STATIC_DRAW) && (usage!=GL_DYNAMIC_DRAW)) { 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_t const* bo = ((target == GL_ARRAY_BUFFER) ? 1486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer); 1487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (bo == 0) { 1489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can't modify buffer 0 1490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_OPERATION); 1491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project buffer_t* edit_bo = const_cast<buffer_t*>(bo); 1495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (c->bufferObjectManager->allocateStore(edit_bo, size, usage) != 0) { 1496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_OUT_OF_MEMORY); 1497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (data) { 1500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(bo->data, data, size); 1501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data) 1505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((target!=GL_ARRAY_BUFFER) && (target!=GL_ELEMENT_ARRAY_BUFFER)) { 1508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_ENUM); 1509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (offset<0 || size<0 || data==0) { 1512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1515076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian buffer_t const* bo = ((target == GL_ARRAY_BUFFER) ? 1516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->arrays.array_buffer : c->arrays.element_array_buffer); 1517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (bo == 0) { 1519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // can't modify buffer 0 1520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_OPERATION); 1521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1522edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1523edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (offset+size > bo->size) { 1524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(bo->data + offset, data, size); 1528edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1529edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glDeleteBuffers(GLsizei n, const GLuint* buffers) 1531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (n<0) { 1534edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1537edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int i=0 ; i<n ; i++) { 1539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project GLuint name = buffers[i]; 1540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (name) { 1541edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // unbind bound deleted buffers... 1542a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.element_array_buffer) { 1543a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.element_array_buffer->name == name) { 1544a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.element_array_buffer = 0; 1545a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1547a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.array_buffer) { 1548a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.array_buffer->name == name) { 1549a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.array_buffer = 0; 1550a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1552a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.vertex.bo) { 1553a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.vertex.bo->name == name) { 1554a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.vertex.bo = 0; 1555a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1557a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.normal.bo) { 1558a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.normal.bo->name == name) { 1559a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.normal.bo = 0; 1560a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1562a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.color.bo) { 1563a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.color.bo->name == name) { 1564a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.color.bo = 0; 1565a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (int t=0 ; t<GGL_TEXTURE_UNIT_COUNT ; t++) { 1568a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.texture[t].bo) { 1569a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian if (c->arrays.texture[t].bo->name == name) { 1570a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian c->arrays.texture[t].bo = 0; 1571a750fc0bf8bdfd47e058ac51a719716440c7aa98Mathias Agopian } 1572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1573edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian } 1576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->deleteBuffers(n, buffers); 1577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->recycleTokens(n, buffers); 1578edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1579edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid glGenBuffers(GLsizei n, GLuint* buffers) 1581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_context_t* c = ogles_context_t::get(); 1583edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (n<0) { 1584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ogles_error(c, GL_INVALID_VALUE); 1585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 1586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project c->bufferObjectManager->getToken(n, buffers); 1588edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1589