pixelflinger.cpp revision fa36f2c3b7707865867ce2b4710efeaeef993b1d
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/pixelflinger.cpp
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project**
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Copyright 2006, The Android Open Source Project
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project**
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** you may not use this file except in compliance with the License.
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** You may obtain a copy of the License at
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project**
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project**
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** See the License for the specific language governing permissions and
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** limitations under the License.
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <assert.h>
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/time.h>
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <pixelflinger/pixelflinger.h>
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <private/pixelflinger/ggl_context.h>
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "buffer.h"
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "clear.h"
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "picker.h"
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "raster.h"
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "scanline.h"
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "trap.h"
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/GGLAssembler.h"
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/CodeCache.h"
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h>
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android {
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// 8x8 Bayer dither matrix
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const uint8_t gDitherMatrix[GGL_DITHER_SIZE] = {
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     0, 32,  8, 40,  2, 34, 10, 42,
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    48, 16, 56, 24, 50, 18, 58, 26,
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    12, 44,  4, 36, 14, 46,  6, 38,
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    60, 28, 52, 20, 62, 30, 54, 22,
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project     3, 35, 11, 43,  1, 33,  9, 41,
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    51, 19, 59, 27, 49, 17, 57, 25,
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    15, 47,  7, 39, 13, 45,  5, 37,
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    63, 31, 55, 23, 61, 29, 53, 21
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_init_procs(context_t* c);
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_set_scissor(context_t* c);
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_blending(context_t* c, int enable);
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_scissor_test(context_t* c, int enable);
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_alpha_test(context_t* c, int enable);
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_logic_op(context_t* c, int enable);
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_dither(context_t* c, int enable);
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_stencil_test(context_t* c, int enable);
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_depth_test(context_t* c, int enable);
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_aa(context_t* c, int enable);
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_point_aa_nice(context_t* c, int enable);
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_texture2d(context_t* c, int enable);
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_w_lerp(context_t* c, int enable);
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_fog(context_t* c, int enable);
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int min(int a, int b) CONST;
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int min(int a, int b) {
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return a < b ? a : b;
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int max(int a, int b) CONST;
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int max(int a, int b) {
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return a < b ? b : a;
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_error(context_t* c, GGLenum error)
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->error == GGL_NO_ERROR)
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->error = error;
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_bindTexture(void* con, const GGLSurface* surface)
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (surface->format != c->activeTMU->surface.format)
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_TMU_STATE);
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_surface(c, &(c->activeTMU->surface), surface);
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_bindTextureLod(void* con, GGLuint tmu,const GGLSurface* surface)
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // All LODs must have the same format
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_surface(c, &c->state.texture[tmu].surface, surface);
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_colorBuffer(void* con, const GGLSurface* surface)
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (surface->format != c->state.buffers.color.format)
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_CB_STATE);
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (surface->width > c->state.buffers.coverageBufferSize) {
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // allocate the coverage factor buffer
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        free(c->state.buffers.coverage);
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.buffers.coverage = (int16_t*)malloc(surface->width * 2);
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.buffers.coverageBufferSize =
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                c->state.buffers.coverage ? surface->width : 0;
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_surface(c, &(c->state.buffers.color), surface);
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.buffers.read.format == 0) {
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_set_surface(c, &(c->state.buffers.read), surface);
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_scissor(c);
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_readBuffer(void* con, const GGLSurface* surface)
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_surface(c, &(c->state.buffers.read), surface);
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_depthBuffer(void* con, const GGLSurface* surface)
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (surface->format == GGL_PIXEL_FORMAT_Z_16) {
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_set_surface(c, &(c->state.buffers.depth), surface);
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.buffers.depth.format = GGL_PIXEL_FORMAT_NONE;
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_enable_depth_test(c, 0);
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_scissor(void* con, GGLint x, GGLint y,
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLsizei width, GGLsizei height)
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.scissor.user_left = x;
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.scissor.user_top = y;
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.scissor.user_right = x + width;
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.scissor.user_bottom = y + height;
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_set_scissor(c);
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void enable_disable(context_t* c, GGLenum name, int en)
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    switch (name) {
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_BLEND:             ggl_enable_blending(c, en);      break;
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_SCISSOR_TEST:      ggl_enable_scissor_test(c, en);  break;
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_ALPHA_TEST:        ggl_enable_alpha_test(c, en);    break;
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_COLOR_LOGIC_OP:    ggl_enable_logic_op(c, en);      break;
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_DITHER:            ggl_enable_dither(c, en);        break;
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_STENCIL_TEST:      ggl_enable_stencil_test(c, en);  break;
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_DEPTH_TEST:        ggl_enable_depth_test(c, en);    break;
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_AA:                ggl_enable_aa(c, en);            break;
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_2D:        ggl_enable_texture2d(c, en);     break;
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_W_LERP:            ggl_enable_w_lerp(c, en);        break;
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_FOG:               ggl_enable_fog(c, en);           break;
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_POINT_SMOOTH_NICE: ggl_enable_point_aa_nice(c, en); break;
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable(void* con, GGLenum name)
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enable_disable(c, name, 1);
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_disable(void* con, GGLenum name)
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enable_disable(c, name, 0);
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enableDisable(void* con, GGLenum name, GGLboolean en)
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enable_disable(c, name, en ? 1 : 0);
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_shadeModel(void* con, GGLenum mode)
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    switch (mode) {
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_FLAT:
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (c->state.enables & GGL_ENABLE_SMOOTH) {
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            c->state.enables &= ~GGL_ENABLE_SMOOTH;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_SMOOTH:
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (!(c->state.enables & GGL_ENABLE_SMOOTH)) {
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            c->state.enables |= GGL_ENABLE_SMOOTH;
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    default:
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_color4xv(void* con, const GGLclampx* color)
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.r0 = gglFixedToIteratedColor(color[0]);
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.g0 = gglFixedToIteratedColor(color[1]);
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.b0 = gglFixedToIteratedColor(color[2]);
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.a0 = gglFixedToIteratedColor(color[3]);
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_colorGrad12xv(void* con, const GGLcolor* grad)
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // it is very important to round the iterated value here because
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // the rasterizer doesn't clamp them, therefore the iterated value
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    //must absolutely be correct.
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // GGLColor is encoded as 8.16 value
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int32_t round = 0x8000;
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.r0   = grad[ 0] + round;
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.drdx = grad[ 1];
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.drdy = grad[ 2];
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.g0   = grad[ 3] + round;
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dgdx = grad[ 4];
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dgdy = grad[ 5];
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.b0   = grad[ 6] + round;
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dbdx = grad[ 7];
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dbdy = grad[ 8];
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.a0   = grad[ 9] + round;
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dadx = grad[10];
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dady = grad[11];
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_zGrad3xv(void* con, const GGLfixed32* grad)
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // z iterators are encoded as 0.32 fixed point and the z-buffer
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // holds 16 bits, the rounding value is 0x8000.
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const uint32_t round = 0x8000;
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.z0   = grad[0] + round;
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dzdx = grad[1];
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dzdy = grad[2];
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_wGrad3xv(void* con, const GGLfixed* grad)
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.w0   = grad[0];
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dwdx = grad[1];
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dwdy = grad[2];
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_fogGrad3xv(void* con, const GGLfixed* grad)
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.f0     = grad[0];
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dfdx   = grad[1];
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->shade.dfdy   = grad[2];
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_fogColor3xv(void* con, const GGLclampx* color)
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int32_t r = gglClampx(color[0]);
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int32_t g = gglClampx(color[1]);
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int32_t b = gglClampx(color[2]);
284fa36f2c3b7707865867ce2b4710efeaeef993b1dMathias Agopian    c->state.fog.color[GGLFormat::ALPHA]= 0xFF; // unused
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->state.fog.color[GGLFormat::RED]  = (r - (r>>8))>>8;
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->state.fog.color[GGLFormat::GREEN]= (g - (g>>8))>>8;
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->state.fog.color[GGLFormat::BLUE] = (b - (b>>8))>>8;
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_enable_fog(context_t* c, int enable)
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_FOG)?1:0;
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_FOG;
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_FOG;
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_blendFunc(void* con, GGLenum src, GGLenum dst)
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src = src;
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src_alpha = src;
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst = dst;
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst_alpha = dst;
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.alpha_separate = 0;
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.enables & GGL_ENABLE_BLENDING) {
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_blendFuncSeparate(void* con,
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLenum src, GGLenum dst,
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLenum srcAlpha, GGLenum dstAplha)
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src = src;
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src_alpha = srcAlpha;
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst = dst;
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst_alpha = dstAplha;
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.alpha_separate = 1;
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.enables & GGL_ENABLE_BLENDING) {
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texEnvi(void* con,	GGLenum target,
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project							GGLenum pname,
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project							GGLint param)
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (target != GGL_TEXTURE_ENV || pname != GGL_TEXTURE_ENV_MODE) {
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    switch (param) {
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_REPLACE:
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_MODULATE:
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_DECAL:
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_BLEND:
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_ADD:
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (c->activeTMU->env != param) {
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            c->activeTMU->env = param;
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ggl_state_changed(c, GGL_TMU_STATE);
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    default:
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texEnvxv(void* con, GGLenum target,
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLenum pname, const GGLfixed* params)
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (target != GGL_TEXTURE_ENV) {
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    switch (pname) {
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_ENV_MODE:
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_texEnvi(con, target, pname, params[0]);
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_ENV_COLOR: {
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t* const color = c->activeTMU->env_color;
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const GGLclampx r = gglClampx(params[0]);
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const GGLclampx g = gglClampx(params[1]);
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const GGLclampx b = gglClampx(params[2]);
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const GGLclampx a = gglClampx(params[3]);
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        color[0] = (a-(a>>8))>>8;
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        color[1] = (r-(r>>8))>>8;
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        color[2] = (g-(g>>8))>>8;
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        color[3] = (b-(b>>8))>>8;
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    default:
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texParameteri(void* con,
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLenum target,
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLenum pname,
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLint param)
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (target != GGL_TEXTURE_2D) {
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (param == GGL_CLAMP_TO_EDGE)
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        param = GGL_CLAMP;
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint16_t* what = 0;
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    switch (pname) {
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_WRAP_S:
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if ((param == GGL_CLAMP) ||
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_REPEAT)) {
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            what = &c->activeTMU->s_wrap;
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_WRAP_T:
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if ((param == GGL_CLAMP) ||
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_REPEAT)) {
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            what = &c->activeTMU->t_wrap;
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_MIN_FILTER:
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if ((param == GGL_NEAREST) ||
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_NEAREST_MIPMAP_NEAREST) ||
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_NEAREST_MIPMAP_LINEAR)) {
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            what = &c->activeTMU->min_filter;
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            param = GGL_NEAREST;
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if ((param == GGL_LINEAR) ||
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_LINEAR_MIPMAP_NEAREST) ||
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_LINEAR_MIPMAP_LINEAR)) {
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            what = &c->activeTMU->min_filter;
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            param = GGL_LINEAR;
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    case GGL_TEXTURE_MAG_FILTER:
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if ((param == GGL_NEAREST) ||
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            (param == GGL_LINEAR)) {
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            what = &c->activeTMU->mag_filter;
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        break;
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!what) {
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (*what != param) {
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        *what = param;
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_TMU_STATE);
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texCoordGradScale8xv(void* con, GGLint tmu, const int32_t* grad)
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    texture_t& u = c->state.texture[tmu];
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.is0   = grad[0];
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.idsdx = grad[1];
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.idsdy = grad[2];
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.it0   = grad[3];
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.idtdx = grad[4];
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	u.shade.idtdy = grad[5];
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    u.shade.sscale= grad[6];
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    u.shade.tscale= grad[7];
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texCoord2x(void* con, GGLfixed s, GGLfixed t)
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->activeTMU->shade.is0 = s;
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c->activeTMU->shade.it0 = t;
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->activeTMU->shade.sscale= 0;
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->activeTMU->shade.tscale= 0;
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texCoord2i(void* con, GGLint s, GGLint t)
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_texCoord2x(con, s<<16, t<<16);
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_texGeni(void* con, GGLenum coord, GGLenum pname, GGLint param)
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (pname != GGL_TEXTURE_GEN_MODE) {
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t* coord_ptr = 0;
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (coord == GGL_S)         coord_ptr = &(c->activeTMU->s_coord);
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    else if (coord == GGL_T)    coord_ptr = &(c->activeTMU->t_coord);
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (coord_ptr) {
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (*coord_ptr != uint32_t(param)) {
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            *coord_ptr = uint32_t(param);
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ggl_state_changed(c, GGL_TMU_STATE);
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_activeTexture(void* con, GGLuint tmu)
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (tmu >= GGLuint(GGL_TEXTURE_UNIT_COUNT)) {
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->activeTMUIndex = tmu;
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->activeTMU = &(c->state.texture[tmu]);
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_colorMask(void* con, GGLboolean r,
513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                     GGLboolean g,
514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                     GGLboolean b,
515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                     GGLboolean a)
516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int mask = 0;
519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (a)  mask |= 1 << GGLFormat::ALPHA;
520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (r)  mask |= 1 << GGLFormat::RED;
521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (g)  mask |= 1 << GGLFormat::GREEN;
522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (b)  mask |= 1 << GGLFormat::BLUE;
523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.mask.color != mask) {
524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.mask.color = mask;
525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_depthMask(void* con, GGLboolean flag)
530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.mask.depth != flag?1:0) {
533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.mask.depth = flag?1:0;
534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_stencilMask(void* con, GGLuint mask)
539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.mask.stencil != mask) {
542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.mask.stencil = mask;
543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_alphaFuncx(void* con, GGLenum func, GGLclampx ref)
550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((func < GGL_NEVER) || (func > GGL_ALWAYS)) {
553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.alpha_test.ref = gglFixedToIteratedColor(gglClampx(ref));
557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.alpha_test.func != func) {
558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.alpha_test.func = func;
559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_depthFunc(void* con, GGLenum func)
566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((func < GGL_NEVER) || (func > GGL_ALWAYS)) {
569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.depth_test.func != func) {
573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.depth_test.func = func;
574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void ggl_logicOp(void* con, GGLenum opcode)
581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, con);
583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if ((opcode < GGL_CLEAR) || (opcode > GGL_SET)) {
584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_error(c, GGL_INVALID_ENUM);
585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return;
586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.logic_op.opcode != opcode) {
588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.logic_op.opcode = opcode;
589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_set_scissor(context_t* c)
597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.enables & GGL_ENABLE_SCISSOR_TEST) {
599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const int32_t l = c->state.scissor.user_left;
600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const int32_t t = c->state.scissor.user_top;
601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const int32_t r = c->state.scissor.user_right;
602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const int32_t b = c->state.scissor.user_bottom;
603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.left   = max(0, l);
604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.right  = min(c->state.buffers.color.width, r);
605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.top    = max(0, t);
606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.bottom = min(c->state.buffers.color.height, b);
607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.left   = 0;
609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.top    = 0;
610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.right  = c->state.buffers.color.width;
611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->state.scissor.bottom = c->state.buffers.color.height;
612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_blending(context_t* c, int enable)
616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_BLENDING)?1:0;
618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_BLENDING;
620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_BLENDING;
621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_scissor_test(context_t* c, int enable)
626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_SCISSOR_TEST)?1:0;
628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_SCISSOR_TEST;
630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_SCISSOR_TEST;
631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_set_scissor(c);
632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_alpha_test(context_t* c, int enable)
636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_ALPHA_TEST)?1:0;
638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_ALPHA_TEST;
640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_ALPHA_TEST;
641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_logic_op(context_t* c, int enable)
646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_LOGIC_OP)?1:0;
648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_LOGIC_OP;
650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_LOGIC_OP;
651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_dither(context_t* c, int enable)
656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_DITHER)?1:0;
658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_DITHER;
660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_DITHER;
661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_stencil_test(context_t* c, int enable)
666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_depth_test(context_t* c, int enable)
670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->state.buffers.depth.format == 0)
672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        enable = 0;
673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_DEPTH_TEST)?1:0;
674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_DEPTH_TEST;
676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_DEPTH_TEST;
677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_aa(context_t* c, int enable)
682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_AA)?1:0;
684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_AA;
686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_AA;
687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_point_aa_nice(context_t* c, int enable)
692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_POINT_AA_NICE)?1:0;
694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_POINT_AA_NICE;
696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_POINT_AA_NICE;
697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_w_lerp(context_t* c, int enable)
702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    const int e = (c->state.enables & GGL_ENABLE_W)?1:0;
704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (e != enable) {
705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable) c->state.enables |= GGL_ENABLE_W;
706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else        c->state.enables &= ~GGL_ENABLE_W;
707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_PIXEL_PIPELINE_STATE);
708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_enable_texture2d(context_t* c, int enable)
712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (c->activeTMU->enable != enable) {
714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const uint32_t tmu = c->activeTMUIndex;
715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->activeTMU->enable = enable;
716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        const uint32_t mask = 1UL << tmu;
717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (enable)                 c->state.enabled_tmu |= mask;
718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else                        c->state.enabled_tmu &= ~mask;
719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (c->state.enabled_tmu)   c->state.enables |= GGL_ENABLE_TMUS;
720dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        else                        c->state.enables &= ~GGL_ENABLE_TMUS;
721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_state_changed(c, GGL_TMU_STATE);
722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint64_t ggl_system_time()
729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if defined(HAVE_POSIX_CLOCKS)
731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct timespec t;
732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    t.tv_sec = t.tv_nsec = 0;
733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t);
734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return int64_t(t.tv_sec)*1000000000LL + t.tv_nsec;
735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // we don't support the clocks here.
737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct timeval t;
738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    t.tv_sec = t.tv_usec = 0;
739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    gettimeofday(&t, NULL);
740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return int64_t(t.tv_sec)*1000000000LL + int64_t(t.tv_usec)*1000LL;
741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_init_procs(context_t* c)
747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGLContext& procs = *(GGLContext*)c;
749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, scissor);
750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, activeTexture);
751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, bindTexture);
752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, bindTextureLod);
753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, colorBuffer);
754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, readBuffer);
755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, depthBuffer);
756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, enable);
757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, disable);
758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, enableDisable);
759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, shadeModel);
760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, color4xv);
761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, colorGrad12xv);
762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, zGrad3xv);
763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, wGrad3xv);
764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, fogGrad3xv);
765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, fogColor3xv);
766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, blendFunc);
767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, blendFuncSeparate);
768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texEnvi);
769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texEnvxv);
770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texParameteri);
771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texCoord2i);
772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texCoord2x);
773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texCoordGradScale8xv);
774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, texGeni);
775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, colorMask);
776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, depthMask);
777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, stencilMask);
778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, alphaFuncx);
779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, depthFunc);
780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_INIT_PROC(procs, logicOp);
781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_clear(c);
782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_init_context(context_t* c)
785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    memset(c, 0, sizeof(context_t));
787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_procs(c);
788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_trap(c);
789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_scanline(c);
790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_texture(c);
791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_picker(c);
792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_init_raster(c);
793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->formats = gglGetPixelFormatTable();
794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src = GGL_ONE;
795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst = GGL_ZERO;
796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.src_alpha = GGL_ONE;
797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.blend.dst_alpha = GGL_ZERO;
798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.mask.color = 0xF;
799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.mask.depth = 0;
800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.mask.stencil = 0xFFFFFFFF;
801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.logic_op.opcode = GGL_COPY;
802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.alpha_test.func = GGL_ALWAYS;
803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.depth_test.func = GGL_LESS;
804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->state.depth_test.clearValue = FIXED_ONE;
805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    c->shade.w0 = FIXED_ONE;
806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    memcpy(c->ditherMatrix, gDitherMatrix, sizeof(gDitherMatrix));
807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_uninit_context(context_t* c)
810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_uninit_scanline(c);
812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android
816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectusing namespace android;
821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectssize_t gglInit(GGLContext** context)
823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void* const base = malloc(sizeof(context_t) + 32);
825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (base) {
826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // always align the context on cache lines
827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        context_t *c = (context_t *)((ptrdiff_t(base)+31) & ~0x1FL);
828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ggl_init_context(c);
829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        c->base = base;
830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		*context = (GGLContext*)c;
831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else {
832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return -1;
833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return 0;
835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectssize_t gglUninit(GGLContext* con)
838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGL_CONTEXT(c, (void*)con);
840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    ggl_uninit_context(c);
841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	free(c->base);
842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return 0;
843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
845