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