1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/codeflinger/GGLAssembler.h
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#ifndef ANDROID_GGLASSEMBLER_H
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_GGLASSEMBLER_H
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h>
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <private/pixelflinger/ggl_context.h>
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/ARMAssemblerProxy.h"
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android {
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define CONTEXT_LOAD(REG, FIELD) \
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    LDR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD)))
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define CONTEXT_STORE(REG, FIELD) \
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    STR(AL, REG, mBuilderContext.Rctx, immed12_pre(GGL_OFFSETOF(FIELD)))
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass RegisterAllocator
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic:
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    class RegisterFile;
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    RegisterFile&   registerFile();
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             reserveReg(int reg);
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             obtainReg();
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void            recycleReg(int reg);
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void            reset();
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    class RegisterFile
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    public:
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            RegisterFile();
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            RegisterFile(const RegisterFile& rhs);
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            ~RegisterFile();
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                void        reset();
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                bool operator == (const RegisterFile& rhs) const;
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                bool operator != (const RegisterFile& rhs) const {
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    return !operator == (rhs);
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                }
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                int         reserve(int reg);
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                void        reserveSeveral(uint32_t regMask);
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                void        recycle(int reg);
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                void        recycleSeveral(uint32_t regMask);
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                int         obtain();
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        inline  int         isUsed(int reg) const;
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                bool        hasFreeRegs() const;
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                int         countFreeRegs() const;
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                uint32_t    touched() const;
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        inline  uint32_t    status() const { return mStatus; }
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        enum {
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            OUT_OF_REGISTERS = 0x1
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    private:
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    mRegs;
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    mTouched;
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    mStatus;
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    class Scratch
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    public:
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            Scratch(RegisterFile& regFile)
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : mRegFile(regFile), mScratch(0) {
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            ~Scratch() {
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                mRegFile.recycleSeveral(mScratch);
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int obtain() {
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int reg = mRegFile.obtain();
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            mScratch |= 1<<reg;
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return reg;
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        void recycle(int reg) {
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            mRegFile.recycle(reg);
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            mScratch &= ~(1<<reg);
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool isUsed(int reg) {
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return (mScratch & (1<<reg));
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int countFreeRegs() {
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            return mRegFile.countFreeRegs();
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    private:
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        RegisterFile&   mRegFile;
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t        mScratch;
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    class Spill
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    public:
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        Spill(RegisterFile& regFile, ARMAssemblerInterface& gen, uint32_t reglist)
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            : mRegFile(regFile), mGen(gen), mRegList(reglist), mCount(0)
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        {
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (reglist) {
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                int count = 0;
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                while (reglist) {
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    count++;
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    reglist &= ~(1 << (31 - __builtin_clz(reglist)));
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                }
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                if (count == 1) {
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    int reg = 31 - __builtin_clz(mRegList);
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    mGen.STR(mGen.AL, reg, mGen.SP, mGen.immed12_pre(-4, 1));
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                } else {
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    mGen.STM(mGen.AL, mGen.DB, mGen.SP, 1, mRegList);
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                }
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                mRegFile.recycleSeveral(mRegList);
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                mCount = count;
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ~Spill() {
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (mRegList) {
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                if (mCount == 1) {
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    int reg = 31 - __builtin_clz(mRegList);
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    mGen.LDR(mGen.AL, reg, mGen.SP, mGen.immed12_post(4));
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                } else {
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    mGen.LDM(mGen.AL, mGen.IA, mGen.SP, 1, mRegList);
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                }
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                mRegFile.reserveSeveral(mRegList);
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    private:
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        RegisterFile&           mRegFile;
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        ARMAssemblerInterface&  mGen;
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t                mRegList;
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int                     mCount;
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprivate:
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    RegisterFile    mRegs;
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass GGLAssembler : public ARMAssemblerProxy, public RegisterAllocator
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic:
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    GGLAssembler(ARMAssemblerInterface* target);
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        virtual     ~GGLAssembler();
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t*   base() const { return 0; } // XXX
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    uint32_t*   pc() const { return 0; } // XXX
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void        reset(int opt_level);
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    virtual void    prolog();
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    virtual void    epilog(uint32_t touched);
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        // generate scanline code for given needs
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int         scanline(const needs_t& needs, context_t const* c);
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int         scanline_core(const needs_t& needs, context_t const* c);
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        enum {
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            CLEAR_LO    = 0x0001,
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            CLEAR_HI    = 0x0002,
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            CORRUPTIBLE = 0x0004,
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            FIRST       = 0x0008
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        enum { //load/store flags
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            WRITE_BACK  = 0x0001
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        struct reg_t {
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            reg_t() : reg(-1), flags(0) {
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            reg_t(int r, int f=0)
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg(r), flags(f) {
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            void setTo(int r, int f=0) {
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                reg=r; flags=f;
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int         reg;
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            uint16_t    flags;
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        struct integer_t : public reg_t {
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            integer_t() : reg_t(), s(0) {
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            integer_t(int r, int sz=32, int f=0)
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(r, f), s(sz) {
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            void setTo(int r, int sz=32, int f=0) {
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                reg_t::setTo(r, f); s=sz;
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int8_t s;
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int size() const { return s; }
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        struct pixel_t : public reg_t {
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            pixel_t() : reg_t() {
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                memset(&format, 0, sizeof(GGLFormat));
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            pixel_t(int r, const GGLFormat* fmt, int f=0)
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(r, f), format(*fmt) {
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            void setTo(int r, const GGLFormat* fmt, int f=0) {
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                reg_t::setTo(r, f); format = *fmt;
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            GGLFormat format;
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int hi(int c) const { return format.c[c].h; }
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int low(int c) const { return format.c[c].l; }
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int mask(int c) const { return ((1<<size(c))-1) << low(c); }
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int size() const { return format.size*8; }
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int size(int c) const { return component_size(c); }
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int component_size(int c) const { return hi(c) - low(c); }
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        struct component_t : public reg_t {
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            component_t() : reg_t(), h(0), l(0) {
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            component_t(int r, int f=0)
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(r, f), h(0), l(0) {
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            component_t(int r, int lo, int hi, int f=0)
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(r, f), h(hi), l(lo) {
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            explicit component_t(const integer_t& rhs)
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(rhs.reg, rhs.flags), h(rhs.s), l(0) {
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            explicit component_t(const pixel_t& rhs, int component) {
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                setTo(  rhs.reg,
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        rhs.format.c[component].l,
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        rhs.format.c[component].h,
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        rhs.flags|CLEAR_LO|CLEAR_HI);
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            void setTo(int r, int lo=0, int hi=0, int f=0) {
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                reg_t::setTo(r, f); h=hi; l=lo;
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int8_t h;
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int8_t l;
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            inline int size() const { return h-l; }
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        struct pointer_t : public reg_t {
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            pointer_t() : reg_t(), size(0) {
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            pointer_t(int r, int s, int f=0)
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                : reg_t(r, f), size(s) {
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            void setTo(int r, int s, int f=0) {
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                reg_t::setTo(r, f); size=s;
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            int8_t size;
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        };
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprivate:
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct tex_coord_t {
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       s;
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       t;
284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pointer_t   ptr;
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct fragment_parts_t {
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    packed  : 1;
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    reload  : 2;
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint32_t    iterated_packed  : 1;
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pixel_t     iterated;
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pointer_t   cbPtr;
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pointer_t   covPtr;
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       count;
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       argb[4];
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       argb_dx[4];
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       z;
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        reg_t       dither;
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        pixel_t     texel[GGL_TEXTURE_UNIT_COUNT];
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        tex_coord_t coords[GGL_TEXTURE_UNIT_COUNT];
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct texture_unit_t {
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         format_idx;
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        GGLFormat   format;
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         bits;
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         swrap;
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         twrap;
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         env;
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         pot;
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int         linear;
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t     mask;
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t     replaced;
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct texture_machine_t {
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        texture_unit_t  tmu[GGL_TEXTURE_UNIT_COUNT];
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t         mask;
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t         replaced;
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t         directTexture;
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        uint8_t         activeUnits;
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct component_info_t {
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    masked      : 1;
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    inDest      : 1;
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    needed      : 1;
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    replaced    : 1;
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    iterated    : 1;
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    smooth      : 1;
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    blend       : 1;
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        bool    fog         : 1;
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    struct builder_context_t {
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        context_t const*    c;
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        needs_t             needs;
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        int                 Rctx;
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template <typename T>
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void modify(T& r, Scratch& regs)
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    {
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        if (!(r.flags & CORRUPTIBLE)) {
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            r.reg = regs.obtain();
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            r.flags |= CORRUPTIBLE;
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // helpers
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    base_offset(const pointer_t& d, const pointer_t& b, const reg_t& o);
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // texture environement
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    modulate(   component_t& dest,
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        const component_t& incoming,
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        const pixel_t& texel, int component);
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    decal(  component_t& dest,
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const component_t& incoming,
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const pixel_t& texel, int component);
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    blend(  component_t& dest,
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const component_t& incoming,
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const pixel_t& texel, int component, int tmu);
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    add(  component_t& dest,
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const component_t& incoming,
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                    const pixel_t& texel, int component);
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    // load/store stuff
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    store(const pointer_t& addr, const pixel_t& src, uint32_t flags=0);
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    load(const pointer_t& addr, const pixel_t& dest, uint32_t flags=0);
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    extract(integer_t& d, const pixel_t& s, int component);
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    extract(component_t& d, const pixel_t& s, int component);
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    extract(integer_t& d, int s, int h, int l, int bits=32);
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    expand(integer_t& d, const integer_t& s, int dbits);
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    expand(integer_t& d, const component_t& s, int dbits);
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    expand(component_t& d, const component_t& s, int dbits);
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    downshift(pixel_t& d, int component, component_t s, const reg_t& dither);
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    mul_factor( component_t& d,
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        const integer_t& v,
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        const integer_t& f);
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    mul_factor_add( component_t& d,
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const integer_t& v,
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const integer_t& f,
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const component_t& a);
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    component_add(  component_t& d,
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const integer_t& dst,
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const integer_t& src);
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    component_sat(  const component_t& v);
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_scanline_prolog(  fragment_parts_t& parts,
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const needs_t& needs);
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_smooth_shade(const fragment_parts_t& parts);
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_component(    pixel_t& pixel,
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                const fragment_parts_t& parts,
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                int component,
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                Scratch& global_scratches);
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_incoming_component(
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                component_t& temp,
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                int dst_size,
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                const fragment_parts_t& parts,
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                int component,
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                Scratch& scratches,
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                Scratch& global_scratches);
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    init_iterated_color(fragment_parts_t& parts, const reg_t& x);
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_iterated_color(   component_t& fragment,
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const fragment_parts_t& parts,
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    int component,
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    Scratch& regs);
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    decodeLogicOpNeeds(const needs_t& needs);
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    decodeTMUNeeds(const needs_t& needs, context_t const* c);
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    init_textures(  tex_coord_t* coords,
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const reg_t& x,
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            const reg_t& y);
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_textures( fragment_parts_t& parts,
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                            Scratch& regs);
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    filter8(   const fragment_parts_t& parts,
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        pixel_t& texel, const texture_unit_t& tmu,
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int U, int V, pointer_t& txPtr,
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int FRAC_BITS);
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    filter16(   const fragment_parts_t& parts,
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        pixel_t& texel, const texture_unit_t& tmu,
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int U, int V, pointer_t& txPtr,
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int FRAC_BITS);
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    filter24(   const fragment_parts_t& parts,
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        pixel_t& texel, const texture_unit_t& tmu,
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int U, int V, pointer_t& txPtr,
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int FRAC_BITS);
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    filter32(   const fragment_parts_t& parts,
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        pixel_t& texel, const texture_unit_t& tmu,
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int U, int V, pointer_t& txPtr,
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int FRAC_BITS);
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_texture_environment(  component_t& fragment,
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        const fragment_parts_t& parts,
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        int component,
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        Scratch& regs);
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    wrapping(   int d,
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int coord, int size,
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int tx_wrap, int tx_linear);
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_fog(  component_t& temp,
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        int component,
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        Scratch& parent_scratches);
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_blending(     component_t& in_out,
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                const pixel_t& pixel,
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                int component,
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                Scratch& parent_scratches);
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_blend_factor(
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                integer_t& factor, int f, int component,
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                const pixel_t& dst_pixel,
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                integer_t& fragment,
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                integer_t& fb,
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                Scratch& scratches);
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_blendFOneMinusF(  component_t& temp,
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& factor,
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& fragment,
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& fb);
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void    build_blendOneMinusFF(  component_t& temp,
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& factor,
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& fragment,
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const integer_t& fb);
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_coverage_application(component_t& fragment,
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    const fragment_parts_t& parts,
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                    Scratch& regs);
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_alpha_test(component_t& fragment, const fragment_parts_t& parts);
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum { Z_TEST=1, Z_WRITE=2 };
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_depth_test(const fragment_parts_t& parts, uint32_t mask);
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_iterate_z(const fragment_parts_t& parts);
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_iterate_f(const fragment_parts_t& parts);
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_iterate_texture_coordinates(const fragment_parts_t& parts);
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_logic_op(pixel_t& pixel, Scratch& regs);
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_masking(pixel_t& pixel, Scratch& regs);
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    void build_and_immediate(int d, int s, uint32_t mask, int bits);
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    bool    isAlphaSourceNeeded() const;
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        FACTOR_SRC=1, FACTOR_DST=2, BLEND_SRC=4, BLEND_DST=8
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        LOGIC_OP=1, LOGIC_OP_SRC=2, LOGIC_OP_DST=4
515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    static int blending_codes(int fs, int fd);
518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    builder_context_t   mBuilderContext;
520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    texture_machine_t   mTextureMachine;
521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    component_info_t    mInfo[4];
522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mBlending;
523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mMasking;
524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mAllMasked;
525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mLogicOp;
526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mAlphaTest;
527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mAA;
528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mDithering;
529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int                 mDepthTest;
530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mSmooth;
532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mFog;
533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    pixel_t         mDstPixel;
534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    GGLFormat       mCbFormat;
536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBlendFactorCached;
538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    integer_t       mAlphaSource;
539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBaseRegister;
541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBlendSrc;
543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBlendDst;
544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBlendSrcA;
545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mBlendDstA;
546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    int             mOptLevel;
548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ----------------------------------------------------------------------------
551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android
553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ANDROID_GGLASSEMBLER_H
555