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