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