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