scanline.cpp revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* libs/pixelflinger/scanline.cpp 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Copyright 2006, The Android Open Source Project 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** you may not use this file except in compliance with the License. 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** You may obtain a copy of the License at 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** See the License for the specific language governing permissions and 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project** limitations under the License. 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define LOG_TAG "pixelflinger" 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <assert.h> 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/memory.h> 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <cutils/log.h> 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "buffer.h" 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "scanline.h" 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/CodeCache.h" 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/GGLAssembler.h" 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "codeflinger/ARMAssembler.h" 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project//#include "codeflinger/ARMAssemblerOptimizer.h" 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CODEGEN_GENERIC 0 // force generic pixel pipeline 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CODEGEN_C 1 // hand-written C, fallback generic 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CODEGEN_ASM 2 // hand-written asm, fallback generic 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_CODEGEN_GENERATED 3 // hand-written asm, fallback codegen 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef NDEBUG 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_RELEASE 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_CODEGEN ANDROID_CODEGEN_GENERATED 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_DEBUG 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_CODEGEN ANDROID_CODEGEN_GENERATED 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if defined(__arm__) 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_ARM_CODEGEN 1 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project# define ANDROID_ARM_CODEGEN 0 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define DEBUG__CODEGEN_ONLY 0 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ASSEMBLY_SCRATCH_SIZE 2048 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void init_y(context_t*, int32_t); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void init_y_noop(context_t*, int32_t); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void init_y_packed(context_t*, int32_t); 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void init_y_error(context_t*, int32_t); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void step_y__generic(context_t* c); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void step_y__nop(context_t*); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void step_y__smooth(context_t* c); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void step_y__tmu(context_t* c); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void step_y__w(context_t* c); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline(context_t* c); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_perspective(context_t* c); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_perspective_single(context_t* c); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_t32cb16blend(context_t* c); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_t32cb16(context_t* c); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_memcpy(context_t* c); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_memset8(context_t* c); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_memset16(context_t* c); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_memset32(context_t* c); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_noop(context_t* c); 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_set(context_t* c); 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void scanline_clear(context_t* c); 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void rect_generic(context_t* c, size_t yc); 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void rect_memcpy(context_t* c, size_t yc); 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" void scanline_t32cb16blend_arm(uint16_t*, uint32_t*, size_t); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" void scanline_t32cb16_arm(uint16_t *dst, uint32_t *src, size_t ct); 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct shortcut_t { 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs_filter_t filter; 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const char* desc; 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void (*scanline)(context_t*); 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void (*init_y)(context_t*, int32_t); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// Keep in sync with needs 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic shortcut_t shortcuts[] = { 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x03515104, 0x00000077, { 0x00000A01, 0x00000000 } }, 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "565 fb, 8888 tx, blend", scanline_t32cb16blend, init_y_noop }, 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x03010104, 0x00000077, { 0x00000A01, 0x00000000 } }, 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFFFFFFFF, 0xFFFFFFFF, { 0xFFFFFFFF, 0x0000003F } } }, 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "565 fb, 8888 tx", scanline_t32cb16, init_y_noop }, 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x00000000, 0x00000007, { 0x00000000, 0x00000000 } } }, 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(nop) alpha test", scanline_noop, init_y_noop }, 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x00000000, 0x00000070, { 0x00000000, 0x00000000 } } }, 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(nop) depth test", scanline_noop, init_y_noop }, 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x05000000, 0x00000000, { 0x00000000, 0x00000000 } }, 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x0F000000, 0x00000080, { 0x00000000, 0x00000000 } } }, 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(nop) logic_op", scanline_noop, init_y_noop }, 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0xF0000000, 0x00000000, { 0x00000000, 0x00000000 } }, 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xF0000000, 0x00000080, { 0x00000000, 0x00000000 } } }, 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(nop) color mask", scanline_noop, init_y_noop }, 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x0F000000, 0x00000077, { 0x00000000, 0x00000000 } }, 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFF000000, 0x000000F7, { 0x00000000, 0x00000000 } } }, 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(set) logic_op", scanline_set, init_y_noop }, 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x00000000, 0x00000077, { 0x00000000, 0x00000000 } }, 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFF000000, 0x000000F7, { 0x00000000, 0x00000000 } } }, 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(clear) logic_op", scanline_clear, init_y_noop }, 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x03000000, 0x00000077, { 0x00000000, 0x00000000 } }, 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFFFFFF00, 0x000000F7, { 0x00000000, 0x00000000 } } }, 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(clear) blending 0/0", scanline_clear, init_y_noop }, 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { { { 0x00000000, 0x00000000, { 0x00000000, 0x00000000 } }, 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x0000003F, 0x00000000, { 0x00000000, 0x00000000 } } }, 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project "(error) invalid color-buffer format", scanline_noop, init_y_error }, 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const needs_filter_t noblend1to1 = { 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (disregard dithering, see below) 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x03010100, 0x00000077, { 0x00000A00, 0x00000000 } }, 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFFFFFFC0, 0xFFFFFEFF, { 0xFFFFFFC0, 0x0000003F } } 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic const needs_filter_t fill16noblend = { 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0x03010100, 0x00000077, { 0x00000000, 0x00000000 } }, 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 0xFFFFFFC0, 0xFFFFFFFF, { 0x0000003F, 0x0000003F } } 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_ARM_CODEGEN 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic CodeCache gCodeCache(12 * 1024); 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectclass ScanlineAssembly : public Assembly { 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project AssemblyKey<needs_t> mKey; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectpublic: 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ScanlineAssembly(needs_t needs, size_t size) 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project : Assembly(size), mKey(needs) { } 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const AssemblyKey<needs_t>& key() const { return mKey; } 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_init_scanline(context_t* c) 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__generic; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline; 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_uninit_scanline(context_t* c) 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.buffers.coverage) 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(c->state.buffers.coverage); 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_ARM_CODEGEN 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->scanline_as) 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline_as->decStrong(c); 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void pick_scanline(context_t* c) 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if (!defined(DEBUG__CODEGEN_ONLY) || (DEBUG__CODEGEN_ONLY == 0)) 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_CODEGEN == ANDROID_CODEGEN_GENERIC 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y; 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__generic; 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline; 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //printf("*** needs [%08lx:%08lx:%08lx:%08lx]\n", 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // c->state.needs.n, c->state.needs.p, 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // c->state.needs.t[0], c->state.needs.t[1]); 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // first handle the special case that we cannot test with a filter 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t cb_format = GGL_READ_NEEDS(CB_FORMAT, c->state.needs.n); 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0]) == cb_format) { 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.needs.match(noblend1to1)) { 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // this will match regardless of dithering state, since both 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // src and dest have the same format anyway, there is no dithering 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // to be done. 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat* f = 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &(c->formats[GGL_READ_NEEDS(T_FORMAT, c->state.needs.t[0])]); 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((f->components == GGL_RGB) || 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (f->components == GGL_RGBA) || 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (f->components == GGL_LUMINANCE) || 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (f->components == GGL_LUMINANCE_ALPHA)) 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // format must have all of RGB components 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (so the current color doesn't show through) 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline_memcpy; 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y_noop; 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.needs.match(fill16noblend)) { 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y_packed; 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c->formats[cb_format].size) { 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 1: c->scanline = scanline_memset8; return; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 2: c->scanline = scanline_memset16; return; 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case 4: c->scanline = scanline_memset32; return; 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int numFilters = sizeof(shortcuts)/sizeof(shortcut_t); 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<numFilters ; i++) { 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.needs.match(shortcuts[i].filter)) { 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = shortcuts[i].scanline; 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = shortcuts[i].init_y; 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // DEBUG__CODEGEN_ONLY 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y; 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__generic; 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_ARM_CODEGEN 246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we're going to have to generate some code... 247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // here, generate code for our pixel pipeline 248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const AssemblyKey<needs_t> key(c->state.needs); 249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<Assembly> assembly = gCodeCache.lookup(key); 250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (assembly == 0) { 251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // create a new assembly region 252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<ScanlineAssembly> a = new ScanlineAssembly(c->state.needs, 253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ASSEMBLY_SCRATCH_SIZE); 254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // initialize our assembler 255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLAssembler assembler( new ARMAssembler(a) ); 256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //GGLAssembler assembler( 257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // new ARMAssemblerOptimizer(new ARMAssembler(a)) ); 258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // generate the scanline code for the given needs 259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err = assembler.scanline(c->state.needs, c); 260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ggl_likely(!err)) { 261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // finally, cache this assembly 262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = gCodeCache.cache(a->key(), a); 263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ggl_unlikely(err)) { 265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOGE("error generating or caching assembly. Reverting to NOP."); 266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline_noop; 267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->init_y = init_y_noop; 268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__nop; 269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return; 270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project assembly = a; 272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // release the previous assembly 275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->scanline_as) { 276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline_as->decStrong(c); 277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project //LOGI("using generated pixel-pipeline"); 280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline_as = assembly.get(); 281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline_as->incStrong(c); // hold on to assembly 282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = (void(*)(context_t* c))assembly->base(); 283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// LOGW("using generic (slow) pixel-pipeline"); 285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline; 286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid ggl_pick_scanline(context_t* c) 290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pick_scanline(c); 292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((c->state.enables & GGL_ENABLE_W) && 293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (c->state.enables & GGL_ENABLE_TMUS)) 294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->span = c->scanline; 296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline_perspective; 297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!(c->state.enabled_tmu & (c->state.enabled_tmu - 1))) { 298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // only one TMU enabled 299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline = scanline_perspective_single; 300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void blending(context_t* c, pixel_t* fragment, pixel_t* fb); 307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void blend_factor(context_t* c, pixel_t* r, uint32_t factor, 308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const pixel_t* src, const pixel_t* dst); 309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void rescale(uint32_t& u, uint8_t& su, uint32_t& v, uint8_t& sv); 310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_ARM_CODEGEN && (ANDROID_CODEGEN == ANDROID_CODEGEN_GENERATED) 312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// no need to compile the generic-pipeline, it can't be reached 314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline(context_t*) 315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid rescale(uint32_t& u, uint8_t& su, uint32_t& v, uint8_t& sv) 321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (su && sv) { 323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (su > sv) { 324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v = ggl_expand(v, sv, su); 325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sv = su; 326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (su < sv) { 327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u = ggl_expand(u, su, sv); 328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project su = sv; 329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid blending(context_t* c, pixel_t* fragment, pixel_t* fb) 334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(fragment->c[0], fragment->s[0], fb->c[0], fb->s[0]); 336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(fragment->c[1], fragment->s[1], fb->c[1], fb->s[1]); 337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(fragment->c[2], fragment->s[2], fb->c[2], fb->s[2]); 338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(fragment->c[3], fragment->s[3], fb->c[3], fb->s[3]); 339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t sf, df; 341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blend_factor(c, &sf, c->state.blend.src, fragment, fb); 342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blend_factor(c, &df, c->state.blend.dst, fragment, fb); 343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[1] = 345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglMulAddx(fragment->c[1], sf.c[1], gglMulx(fb->c[1], df.c[1])); 346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[2] = 347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglMulAddx(fragment->c[2], sf.c[2], gglMulx(fb->c[2], df.c[2])); 348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[3] = 349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglMulAddx(fragment->c[3], sf.c[3], gglMulx(fb->c[3], df.c[3])); 350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.blend.alpha_separate) { 352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blend_factor(c, &sf, c->state.blend.src_alpha, fragment, fb); 353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blend_factor(c, &df, c->state.blend.dst_alpha, fragment, fb); 354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[0] = 357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglMulAddx(fragment->c[0], sf.c[0], gglMulx(fb->c[0], df.c[0])); 358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // clamp to 1.0 360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fragment->c[0] >= (1LU<<fragment->s[0])) 361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[0] = (1<<fragment->s[0])-1; 362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fragment->c[1] >= (1LU<<fragment->s[1])) 363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[1] = (1<<fragment->s[1])-1; 364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fragment->c[2] >= (1LU<<fragment->s[2])) 365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[2] = (1<<fragment->s[2])-1; 366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (fragment->c[3] >= (1LU<<fragment->s[3])) 367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment->c[3] = (1<<fragment->s[3])-1; 368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline int blendfactor(uint32_t x, uint32_t size, uint32_t def = 0) 371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!size) 373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return def; 374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // scale to 16 bits 376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (size > 16) { 377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x >>= (size - 16); 378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (size < 16) { 379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x = ggl_expand(x, size, 16); 380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x += x >> 15; 382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return x; 383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid blend_factor(context_t* c, pixel_t* r, 386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t factor, const pixel_t* src, const pixel_t* dst) 387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (factor) { 389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ZERO: 390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = 0; 394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ONE: 396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = FIXED_ONE; 400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_DST_COLOR: 402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = blendfactor(dst->c[1], dst->s[1]); 403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = blendfactor(dst->c[2], dst->s[2]); 404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = blendfactor(dst->c[3], dst->s[3]); 405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = blendfactor(dst->c[0], dst->s[0]); 406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_SRC_COLOR: 408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = blendfactor(src->c[1], src->s[1]); 409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = blendfactor(src->c[2], src->s[2]); 410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = blendfactor(src->c[3], src->s[3]); 411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = blendfactor(src->c[0], src->s[0]); 412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ONE_MINUS_DST_COLOR: 414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = FIXED_ONE - blendfactor(dst->c[1], dst->s[1]); 415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = FIXED_ONE - blendfactor(dst->c[2], dst->s[2]); 416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = FIXED_ONE - blendfactor(dst->c[3], dst->s[3]); 417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = FIXED_ONE - blendfactor(dst->c[0], dst->s[0]); 418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ONE_MINUS_SRC_COLOR: 420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = FIXED_ONE - blendfactor(src->c[1], src->s[1]); 421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = FIXED_ONE - blendfactor(src->c[2], src->s[2]); 422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = FIXED_ONE - blendfactor(src->c[3], src->s[3]); 423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = FIXED_ONE - blendfactor(src->c[0], src->s[0]); 424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_SRC_ALPHA: 426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = blendfactor(src->c[0], src->s[0], FIXED_ONE); 430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ONE_MINUS_SRC_ALPHA: 432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = FIXED_ONE - blendfactor(src->c[0], src->s[0], FIXED_ONE); 436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_DST_ALPHA: 438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = blendfactor(dst->c[0], dst->s[0], FIXED_ONE); 442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ONE_MINUS_DST_ALPHA: 444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[1] = 445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[2] = 446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[3] = 447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r->c[0] = FIXED_ONE - blendfactor(dst->c[0], dst->s[0], FIXED_ONE); 448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_SRC_ALPHA_SATURATE: 450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // XXX: GGL_SRC_ALPHA_SATURATE 451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic GGLfixed wrapping(int32_t coord, uint32_t size, int tx_wrap) 456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLfixed d; 458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx_wrap == GGL_REPEAT) { 459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = (uint32_t(coord)>>16) * size; 460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (tx_wrap == GGL_CLAMP) { // CLAMP_TO_EDGE semantics 461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLfixed clamp_min = FIXED_HALF; 462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLfixed clamp_max = (size << 16) - FIXED_HALF; 463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (coord < clamp_min) coord = clamp_min; 464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (coord > clamp_max) coord = clamp_max; 465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = coord; 466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { // 1:1 467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLfixed clamp_min = 0; 468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLfixed clamp_max = (size << 16); 469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (coord < clamp_min) coord = clamp_min; 470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (coord > clamp_max) coord = clamp_max; 471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = coord; 472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return d; 474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline 477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectGGLcolor ADJUST_COLOR_ITERATOR(GGLcolor v, GGLcolor dvdx, int len) 478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t end = dvdx * (len-1) + v; 480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (end < 0) 481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v -= end; 482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v &= ~(v>>31); 483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return v; 484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline(context_t* c) 487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t enables = c->state.enables; 489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int xs = c->iterators.xl; 490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int x1 = c->iterators.xr; 491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int xc = x1 - xs; 492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int16_t* covPtr = c->state.buffers.coverage + xs; 493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // All iterated values are sampled at the pixel center 495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // reset iterators for that scanline... 497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLcolor r, g, b, a; 498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) { 500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = (xs * c->shade.drdx) + ci.ydrdy; 501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g = (xs * c->shade.dgdx) + ci.ydgdy; 502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project b = (xs * c->shade.dbdx) + ci.ydbdy; 503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project a = (xs * c->shade.dadx) + ci.ydady; 504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = ADJUST_COLOR_ITERATOR(r, c->shade.drdx, xc); 505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g = ADJUST_COLOR_ITERATOR(g, c->shade.dgdx, xc); 506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project b = ADJUST_COLOR_ITERATOR(b, c->shade.dbdx, xc); 507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project a = ADJUST_COLOR_ITERATOR(a, c->shade.dadx, xc); 508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r = ci.ydrdy; 510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g = ci.ydgdy; 511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project b = ci.ydbdy; 512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project a = ci.ydady; 513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // z iterators are 1.31 516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLfixed z = (xs * c->shade.dzdx) + ci.ydzdy; 517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLfixed f = (xs * c->shade.dfdx) + ci.ydfdy; 518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct { 520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLfixed s, t; 521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } tc[GGL_TEXTURE_UNIT_COUNT]; 522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { 523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.texture[i].enable) { 525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = c->state.texture[i].iterators; 526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_W) { 527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].s = ti.ydsdy; 528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].t = ti.ydtdy; 529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].s = (xs * ti.dsdx) + ti.ydsdy; 531dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].t = (xs * ti.dtdx) + ti.ydtdy; 532dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 533dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 534dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 535dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 536dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 537dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t fragment; 538dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t texel; 539dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t fb; 540dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 541dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t x = xs; 542dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t y = c->iterators.y; 543dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 544dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (xc--) { 545dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 546dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { // just a scope 547dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 548dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // read color (convert to 8 bits by keeping only the integer part) 549dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.s[1] = fragment.s[2] = 550dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.s[3] = fragment.s[0] = 8; 551dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[1] = r >> (GGL_COLOR_BITS-8); 552dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[2] = g >> (GGL_COLOR_BITS-8); 553dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[3] = b >> (GGL_COLOR_BITS-8); 554dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[0] = a >> (GGL_COLOR_BITS-8); 555dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 556dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // texturing 557dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { 558dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 559dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_t& tx = c->state.texture[i]; 560dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!tx.enable) 561dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 562dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = tx.iterators; 563dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t u, v; 564dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 565dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // s-coordinate 566dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.s_coord != GGL_ONE_TO_ONE) { 567dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int w = tx.surface.width; 568dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u = wrapping(tc[i].s, w, tx.s_wrap); 569dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].s += ti.dsdx; 570dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 571dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u = (((tx.shade.is0>>16) + x)<<16) + FIXED_HALF; 572dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 573dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 574dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // t-coordinate 575dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.t_coord != GGL_ONE_TO_ONE) { 576dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int h = tx.surface.height; 577dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v = wrapping(tc[i].t, h, tx.t_wrap); 578dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].t += ti.dtdx; 579dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 580dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v = (((tx.shade.it0>>16) + y)<<16) + FIXED_HALF; 581dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 582dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 583dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // read texture 584dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.mag_filter == GGL_NEAREST && 585dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.min_filter == GGL_NEAREST) 586dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 587dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u >>= 16; 588dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v >>= 16; 589dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.surface.read(&tx.surface, c, u, v, &texel); 590dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 591dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int w = tx.surface.width; 592dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int h = tx.surface.height; 593dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u -= FIXED_HALF; 594dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v -= FIXED_HALF; 595dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int u0 = u >> 16; 596dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int v0 = v >> 16; 597dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int u1 = u0 + 1; 598dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int v1 = v0 + 1; 599dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.s_wrap == GGL_REPEAT) { 600dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u0<0) u0 += w; 601dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u1<0) u1 += w; 602dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u0>=w) u0 -= w; 603dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u1>=w) u1 -= w; 604dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 605dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u0<0) u0 = 0; 606dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u1<0) u1 = 0; 607dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u0>=w) u0 = w-1; 608dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (u1>=w) u1 = w-1; 609dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 610dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tx.t_wrap == GGL_REPEAT) { 611dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v0<0) v0 += h; 612dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v1<0) v1 += h; 613dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v0>=h) v0 -= h; 614dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v1>=h) v1 -= h; 615dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 616dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v0<0) v0 = 0; 617dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v1<0) v1 = 0; 618dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v0>=h) v0 = h-1; 619dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (v1>=h) v1 = h-1; 620dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 621dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project pixel_t texels[4]; 622dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t mm[4]; 623dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.surface.read(&tx.surface, c, u0, v0, &texels[0]); 624dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.surface.read(&tx.surface, c, u0, v1, &texels[1]); 625dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.surface.read(&tx.surface, c, u1, v0, &texels[2]); 626dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tx.surface.read(&tx.surface, c, u1, v1, &texels[3]); 627dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u = (u >> 12) & 0xF; 628dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v = (v >> 12) & 0xF; 629dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project u += u>>3; 630dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project v += v>>3; 631dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mm[0] = (0x10 - u) * (0x10 - v); 632dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mm[1] = (0x10 - u) * v; 633dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mm[2] = u * (0x10 - v); 634dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mm[3] = 0x100 - (mm[0] + mm[1] + mm[2]); 635dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int j=0 ; j<4 ; j++) { 636dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texel.s[j] = texels[0].s[j]; 637dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!texel.s[j]) continue; 638dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texel.s[j] += 8; 639dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texel.c[j] = texels[0].c[j]*mm[0] + 640dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texels[1].c[j]*mm[1] + 641dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texels[2].c[j]*mm[2] + 642dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texels[3].c[j]*mm[3] ; 643dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 644dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 645dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 646dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // Texture environnement... 647dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int j=0 ; j<4 ; j++) { 648dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t& Cf = fragment.c[j]; 649dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t& Ct = texel.c[j]; 650dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t& sf = fragment.s[j]; 651dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t& st = texel.s[j]; 652dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t At = texel.c[0]; 653dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t sat = texel.s[0]; 654dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (tx.env) { 655dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_REPLACE: 656dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (st) { 657dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Cf = Ct; 658dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sf = st; 659dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 660dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 661dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_MODULATE: 662dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (st) { 663dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t factor = Ct + (Ct>>(st-1)); 664dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Cf = (Cf * factor) >> st; 665dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 666dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 667dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_DECAL: 668dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sat) { 669dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(Cf, sf, Ct, st); 670dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Cf += ((Ct - Cf) * (At + (At>>(sat-1)))) >> sat; 671dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 672dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 673dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_BLEND: 674dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (st) { 675dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t Cc = tx.env_color[i]; 676dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sf>8) Cc = (Cc * ((1<<sf)-1))>>8; 677dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (sf<8) Cc = (Cc - (Cc>>(8-sf)))>>(8-sf); 678dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t factor = Ct + (Ct>>(st-1)); 679dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Cf = ((((1<<st) - factor) * Cf) + Ct*Cc)>>st; 680dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 681dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 682dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_ADD: 683dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (st) { 684dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rescale(Cf, sf, Ct, st); 685dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project Cf += Ct; 686dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 687dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 688dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 689dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 690dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 691dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 692dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 693dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // coverage application 694dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_AA) { 695dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int16_t cf = *covPtr++; 696dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[0] = (int64_t(fragment.c[0]) * cf) >> 15; 697dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 698dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 699dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // alpha-test 700dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_ALPHA_TEST) { 701dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLcolor ref = c->state.alpha_test.ref; 702dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLcolor alpha = (uint64_t(fragment.c[0]) * 703dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((1<<GGL_COLOR_BITS)-1)) / ((1<<fragment.s[0])-1); 704dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c->state.alpha_test.func) { 705dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_NEVER: goto discard; 706dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_LESS: if (alpha<ref) break; goto discard; 707dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_EQUAL: if (alpha==ref) break; goto discard; 708dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_LEQUAL: if (alpha<=ref) break; goto discard; 709dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_GREATER: if (alpha>ref) break; goto discard; 710dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_NOTEQUAL: if (alpha!=ref) break; goto discard; 711dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_GEQUAL: if (alpha>=ref) break; goto discard; 712dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 713dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 714dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 715dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // depth test 716dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.buffers.depth.format) { 717dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_DEPTH_TEST) { 718dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.depth); 719dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t* p = (uint16_t*)(cb->data)+(x+(cb->stride*y)); 720dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t zz = uint32_t(z)>>(16); 721dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t depth = *p; 722dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (c->state.depth_test.func) { 723dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_NEVER: goto discard; 724dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_LESS: if (zz<depth) break; goto discard; 725dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_EQUAL: if (zz==depth) break; goto discard; 726dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_LEQUAL: if (zz<=depth) break; goto discard; 727dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_GREATER: if (zz>depth) break; goto discard; 728dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_NOTEQUAL: if (zz!=depth) break; goto discard; 729dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case GGL_GEQUAL: if (zz>=depth) break; goto discard; 730dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 731dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // depth buffer is not enabled, if depth-test is not enabled 732dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 733dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.s[1] = fragment.s[2] = 734dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.s[3] = fragment.s[0] = 8; 735dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[1] = 736dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[2] = 737dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[3] = 738dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fragment.c[0] = 255 - (zz>>8); 739dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project*/ 740dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.mask.depth) { 741dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *p = zz; 742dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 743dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 744dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 745dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 746dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // fog 747dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_FOG) { 748dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=1 ; i<=3 ; i++) { 749dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLfixed fc = (c->state.fog.color[i] * 0x10000) / 0xFF; 750dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t& c = fragment.c[i]; 751dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t& s = fragment.s[i]; 752dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = (c * 0x10000) / ((1<<s)-1); 753dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c = gglMulAddx(c, f, gglMulx(fc, 0x10000 - f)); 754dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = 16; 755dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 756dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 757dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 758dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // blending 759dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_BLENDING) { 760dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fb.c[1] = fb.c[2] = fb.c[3] = fb.c[0] = 0; // placate valgrind 761dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fb.s[1] = fb.s[2] = fb.s[3] = fb.s[0] = 0; 762dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->state.buffers.color.read( 763dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &(c->state.buffers.color), c, x, y, &fb); 764dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project blending( c, &fragment, &fb ); 765dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 766dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 767dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // write 768dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->state.buffers.color.write( 769dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project &(c->state.buffers.color), c, x, y, &fragment); 770dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 771dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 772dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectdiscard: 773dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // iterate... 774dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project x += 1; 775dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) { 776dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project r += c->shade.drdx; 777dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project g += c->shade.dgdx; 778dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project b += c->shade.dbdx; 779dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project a += c->shade.dadx; 780dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 781dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project z += c->shade.dzdx; 782dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f += c->shade.dfdx; 783dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 784dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 785dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 786dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ANDROID_ARM_CODEGEN && (ANDROID_CODEGEN == ANDROID_CODEGEN_GENERATED) 787dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 788dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 789dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 790dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#pragma mark - 791dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#pragma mark Scanline 792dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 793dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 794dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T, typename U> 795dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline __attribute__((const)) 796dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectT interpolate(int y, T v0, U dvdx, U dvdy) { 797dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // interpolates in pixel's centers 798dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // v = v0 + (y + 0.5) * dvdy + (0.5 * dvdx) 799dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (y * dvdy) + (v0 + ((dvdy + dvdx) >> 1)); 800dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 801dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 802dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 803dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 804dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#pragma mark - 805dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 806dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 807dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid init_y(context_t* c, int32_t ys) 808dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 809dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t enables = c->state.enables; 810dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 811dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // compute iterators... 812dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 813dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 814dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // sample in the center 815dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.y = ys; 816dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 817dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & (GGL_ENABLE_DEPTH_TEST|GGL_ENABLE_W|GGL_ENABLE_FOG)) { 818dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydzdy = interpolate(ys, c->shade.z0, c->shade.dzdx, c->shade.dzdy); 819dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydwdy = interpolate(ys, c->shade.w0, c->shade.dwdx, c->shade.dwdy); 820dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydfdy = interpolate(ys, c->shade.f0, c->shade.dfdx, c->shade.dfdy); 821dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 822dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 823dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ggl_unlikely(enables & GGL_ENABLE_SMOOTH)) { 824dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy = interpolate(ys, c->shade.r0, c->shade.drdx, c->shade.drdy); 825dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydgdy = interpolate(ys, c->shade.g0, c->shade.dgdx, c->shade.dgdy); 826dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydbdy = interpolate(ys, c->shade.b0, c->shade.dbdx, c->shade.dbdy); 827dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydady = interpolate(ys, c->shade.a0, c->shade.dadx, c->shade.dady); 828dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__smooth; 829dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 830dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy = c->shade.r0; 831dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydgdy = c->shade.g0; 832dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydbdy = c->shade.b0; 833dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydady = c->shade.a0; 834dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // XXX: do only if needed, or make sure this is fast 835dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->packed = ggl_pack_color(c, c->state.buffers.color.format, 836dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy, ci.ydgdy, ci.ydbdy, ci.ydady); 837dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->packed8888 = ggl_pack_color(c, GGL_PIXEL_FORMAT_RGBA_8888, 838dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy, ci.ydgdy, ci.ydbdy, ci.ydady); 839dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 840dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 841dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // initialize the variables we need in the shader 842dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project generated_vars_t& gen = c->generated_vars; 843dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::ALPHA].c = ci.ydady; 844dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::ALPHA].dx = c->shade.dadx; 845dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::RED ].c = ci.ydrdy; 846dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::RED ].dx = c->shade.drdx; 847dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::GREEN].c = ci.ydgdy; 848dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::GREEN].dx = c->shade.dgdx; 849dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::BLUE ].c = ci.ydbdy; 850dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.argb[GGLFormat::BLUE ].dx = c->shade.dbdx; 851dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dzdx = c->shade.dzdx; 852dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.f = ci.ydfdy; 853dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dfdx = c->shade.dfdx; 854dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 855dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_TMUS) { 856dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 857dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_t& t = c->state.texture[i]; 858dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!t.enable) continue; 859dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 860dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = t.iterators; 861dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (t.s_coord == GGL_ONE_TO_ONE && t.t_coord == GGL_ONE_TO_ONE) { 862dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // we need to set all of these to 0 because in some cases 863dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // step_y__generic() or step_y__tmu() will be used and 864dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // therefore will update dtdy, however, in 1:1 mode 865dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // this is always done by the scanline rasterizer. 866dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdx = ti.dsdy = ti.dtdx = ti.dtdy = 0; 867dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy = t.shade.is0; 868dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy = t.shade.it0; 869dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 870dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int adjustSWrap = ((t.s_wrap==GGL_CLAMP)?0:16); 871dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int adjustTWrap = ((t.t_wrap==GGL_CLAMP)?0:16); 872dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.sscale = t.shade.sscale + adjustSWrap; 873dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.tscale = t.shade.tscale + adjustTWrap; 874dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!(enables & GGL_ENABLE_W)) { 875dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // S coordinate 876dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t sscale = ti.sscale; 877dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t sy = interpolate(ys, 878dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t.shade.is0, t.shade.idsdx, t.shade.idsdy); 879dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sscale>=0) { 880dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy= sy << sscale; 881dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdx = t.shade.idsdx << sscale; 882dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdy = t.shade.idsdy << sscale; 883dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 884dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy= sy >> -sscale; 885dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdx = t.shade.idsdx >> -sscale; 886dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdy = t.shade.idsdy >> -sscale; 887dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 888dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // T coordinate 889dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t tscale = ti.tscale; 890dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t ty = interpolate(ys, 891dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t.shade.it0, t.shade.idtdx, t.shade.idtdy); 892dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tscale>=0) { 893dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy= ty << tscale; 894dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdx = t.shade.idtdx << tscale; 895dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdy = t.shade.idtdy << tscale; 896dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 897dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy= ty >> -tscale; 898dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdx = t.shade.idtdx >> -tscale; 899dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdy = t.shade.idtdy >> -tscale; 900dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 901dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 902dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 903dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // mirror for generated code... 904dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project generated_tex_vars_t& gen = c->generated_vars.texture[i]; 905dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.width = t.surface.width; 906dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.height = t.surface.height; 907dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.stride = t.surface.stride; 908dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.data = int32_t(t.surface.data); 909dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dsdx = ti.dsdx; 910dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dtdx = ti.dtdx; 911dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 912dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 913dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 914dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // choose the y-stepper 915dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__nop; 916dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_FOG) { 917dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__generic; 918dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (enables & GGL_ENABLE_TMUS) { 919dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) { 920dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__generic; 921dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if (enables & GGL_ENABLE_W) { 922dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__w; 923dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 924dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__tmu; 925dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 926dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 927dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) { 928dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__smooth; 929dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 930dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 931dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 932dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // choose the rectangle blitter 933dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_generic; 934dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((c->step_y == step_y__nop) && 935dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (c->scanline == scanline_memcpy)) 936dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 937dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_memcpy; 938dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 939dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 940dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 941dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid init_y_packed(context_t* c, int32_t y0) 942dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 943dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t f = c->state.buffers.color.format; 944dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->packed = ggl_pack_color(c, f, 945dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->shade.r0, c->shade.g0, c->shade.b0, c->shade.a0); 946dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.y = y0; 947dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__nop; 948dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // choose the rectangle blitter 949dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_generic; 950dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->scanline == scanline_memcpy) { 951dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_memcpy; 952dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 953dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 954dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 955dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid init_y_noop(context_t* c, int32_t y0) 956dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 957dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.y = y0; 958dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y = step_y__nop; 959dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // choose the rectangle blitter 960dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_generic; 961dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->scanline == scanline_memcpy) { 962dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->rect = rect_memcpy; 963dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 964dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 965dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 966dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid init_y_error(context_t* c, int32_t y0) 967dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 968dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // woooops, shoud never happen, 969dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // fail gracefully (don't display anything) 970dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_y_noop(c, y0); 971dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project LOGE("color-buffer has an invalid format!"); 972dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 973dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 974dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 975dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 976dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#pragma mark - 977dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 978dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 979dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid step_y__generic(context_t* c) 980dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 981dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t enables = c->state.enables; 982dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 983dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // iterate... 984dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 985dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.y += 1; 986dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 987dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & GGL_ENABLE_SMOOTH) { 988dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy += c->shade.drdy; 989dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydgdy += c->shade.dgdy; 990dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydbdy += c->shade.dbdy; 991dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydady += c->shade.dady; 992dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 993dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 994dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t mask = 995dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGL_ENABLE_DEPTH_TEST | 996dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGL_ENABLE_W | 997dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGL_ENABLE_FOG; 998dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (enables & mask) { 999dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydzdy += c->shade.dzdy; 1000dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydwdy += c->shade.dwdy; 1001dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydfdy += c->shade.dfdy; 1002dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1003dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1004dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if ((enables & GGL_ENABLE_TMUS) && (!(enables & GGL_ENABLE_W))) { 1005dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 1006dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.texture[i].enable) { 1007dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = c->state.texture[i].iterators; 1008dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy += ti.dsdy; 1009dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy += ti.dtdy; 1010dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1011dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1012dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1013dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1014dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1015dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid step_y__nop(context_t* c) 1016dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1017dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.y += 1; 1018dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.ydzdy += c->shade.dzdy; 1019dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1020dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1021dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid step_y__smooth(context_t* c) 1022dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1023dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 1024dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.y += 1; 1025dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydrdy += c->shade.drdy; 1026dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydgdy += c->shade.dgdy; 1027dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydbdy += c->shade.dbdy; 1028dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydady += c->shade.dady; 1029dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydzdy += c->shade.dzdy; 1030dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1031dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1032dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid step_y__w(context_t* c) 1033dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1034dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 1035dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.y += 1; 1036dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydzdy += c->shade.dzdy; 1037dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydwdy += c->shade.dwdy; 1038dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1039dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1040dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid step_y__tmu(context_t* c) 1041dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1042dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iterators_t& ci = c->iterators; 1043dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.y += 1; 1044dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ci.ydzdy += c->shade.dzdy; 1045dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 1046dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->state.texture[i].enable) { 1047dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = c->state.texture[i].iterators; 1048dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy += ti.dsdy; 1049dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy += ti.dtdy; 1050dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1051dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1052dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1053dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1054dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 1055dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0 1056dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#pragma mark - 1057dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1058dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1059dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_perspective(context_t* c) 1060dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1061dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct { 1062dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union { 1063dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct { 1064dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t s, sq; 1065dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t t, tq; 1066dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 1067dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct { 1068dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t v, q; 1069dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } st[2]; 1070dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 1071dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } tc[GGL_TEXTURE_UNIT_COUNT] __attribute__((aligned(16))); 1072dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1073dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // XXX: we should have a special case when dwdx = 0 1074dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1075dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 32 pixels spans works okay. 16 is a lot better, 1076dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // but hey, it's a software renderer... 1077dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t SPAN_BITS = 5; 1078dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t ys = c->iterators.y; 1079dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t xs = c->iterators.xl; 1080dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t x1 = c->iterators.xr; 1081dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t xc = x1 - xs; 1082dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t remainder = xc & ((1<<SPAN_BITS)-1); 1083dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t numSpans = xc >> SPAN_BITS; 1084dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1085dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const iterators_t& ci = c->iterators; 1086dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t w0 = (xs * c->shade.dwdx) + ci.ydwdy; 1087dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t q0 = gglRecipQ(w0, 30); 1088dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int iwscale = 32 - gglClz(q0); 1089dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1090dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t dwdx = c->shade.dwdx << SPAN_BITS; 1091dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t xl = c->iterators.xl; 1092dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1093dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // We process s & t with a loop to reduce the code size 1094dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // (and i-cache pressure). 1095dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1096dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 1097dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const texture_t& tmu = c->state.texture[i]; 1098dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!tmu.enable) continue; 1099dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t s = tmu.shade.is0 + 1100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (tmu.shade.idsdy * ys) + (tmu.shade.idsdx * xs) + 1101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((tmu.shade.idsdx + tmu.shade.idsdy)>>1); 1102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t t = tmu.shade.it0 + 1103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (tmu.shade.idtdy * ys) + (tmu.shade.idtdx * xs) + 1104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((tmu.shade.idtdx + tmu.shade.idtdy)>>1); 1105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].s = s; 1106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].t = t; 1107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].sq = gglMulx(s, q0, iwscale); 1108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].tq = gglMulx(t, q0, iwscale); 1109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t span = 0; 1112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 1113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t w1; 1114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ggl_likely(numSpans)) { 1115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project w1 = w0 + dwdx; 1116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (remainder) { 1118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // finish off the scanline... 1119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project span = remainder; 1120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project w1 = (c->shade.dwdx * span) + w0; 1121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 1123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t q1 = gglRecipQ(w1, 30); 1126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int i=0 ; i<GGL_TEXTURE_UNIT_COUNT ; ++i) { 1127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_t& tmu = c->state.texture[i]; 1128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!tmu.enable) continue; 1129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = tmu.iterators; 1130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project for (int j=0 ; j<2 ; j++) { 1132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t v = tc[i].st[j].v; 1133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (span) v += (tmu.shade.st[j].dx)*span; 1134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else v += (tmu.shade.st[j].dx)<<SPAN_BITS; 1135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v0 = tc[i].st[j].q; 1136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v1 = gglMulx(v, q1, iwscale); 1137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t dvdx = v1 - v0; 1138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (span) dvdx /= span; 1139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else dvdx >>= SPAN_BITS; 1140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].st[j].v = v; 1141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tc[i].st[j].q = v1; 1142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int scale = ti.st[j].scale + (iwscale - 30); 1144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (scale >= 0) { 1145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.st[j].ydvdy = v0 << scale; 1146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.st[j].dvdx = dvdx << scale; 1147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.st[j].ydvdy = v0 >> -scale; 1149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.st[j].dvdx = dvdx >> -scale; 1150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project generated_tex_vars_t& gen = c->generated_vars.texture[i]; 1153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dsdx = ti.st[0].dvdx; 1154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dtdx = ti.st[1].dvdx; 1155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xl = xl; 1157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xr = xl = xl + (span ? span : (1<<SPAN_BITS)); 1158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project w0 = w1; 1159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project q0 = q1; 1160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->span(c); 1161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while(numSpans--); 1162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_perspective_single(context_t* c) 1165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // 32 pixels spans works okay. 16 is a lot better, 1167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // but hey, it's a software renderer... 1168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t SPAN_BITS = 5; 1169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t ys = c->iterators.y; 1170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t xs = c->iterators.xl; 1171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t x1 = c->iterators.xr; 1172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const uint32_t xc = x1 - xs; 1173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const iterators_t& ci = c->iterators; 1175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t w = (xs * c->shade.dwdx) + ci.ydwdy; 1176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t iw = gglRecipQ(w, 30); 1177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int iwscale = 32 - gglClz(iw); 1178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int i = 31 - gglClz(c->state.enabled_tmu); 1180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project generated_tex_vars_t& gen = c->generated_vars.texture[i]; 1181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_t& tmu = c->state.texture[i]; 1182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project texture_iterators_t& ti = tmu.iterators; 1183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int sscale = ti.sscale + (iwscale - 30); 1184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int tscale = ti.tscale + (iwscale - 30); 1185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t s = tmu.shade.is0 + 1186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (tmu.shade.idsdy * ys) + (tmu.shade.idsdx * xs) + 1187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((tmu.shade.idsdx + tmu.shade.idsdy)>>1); 1188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t t = tmu.shade.it0 + 1189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (tmu.shade.idtdy * ys) + (tmu.shade.idtdx * xs) + 1190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((tmu.shade.idtdx + tmu.shade.idtdy)>>1); 1191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t s0 = gglMulx(s, iw, iwscale); 1192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t t0 = gglMulx(t, iw, iwscale); 1193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t xl = c->iterators.xl; 1194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t sq, tq, dsdx, dtdx; 1196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t premainder = xc & ((1<<SPAN_BITS)-1); 1197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t numSpans = xc >> SPAN_BITS; 1198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (c->shade.dwdx == 0) { 1199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project // XXX: we could choose to do this if the error is small enough 1200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project numSpans = 0; 1201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project premainder = xc; 1202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto no_perspective; 1203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (premainder) { 1206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project w += c->shade.dwdx * premainder; 1207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iw = gglRecipQ(w, 30); 1208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectno_perspective: 1209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s += tmu.shade.idsdx * premainder; 1210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t += tmu.shade.idtdx * premainder; 1211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sq = gglMulx(s, iw, iwscale); 1212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tq = gglMulx(t, iw, iwscale); 1213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dsdx = (sq - s0) / premainder; 1214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dtdx = (tq - t0) / premainder; 1215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xl = xl; 1216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xr = xl = xl + premainder; 1217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto finish; 1218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (numSpans--) { 1221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project w += c->shade.dwdx << SPAN_BITS; 1222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s += tmu.shade.idsdx << SPAN_BITS; 1223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t += tmu.shade.idtdx << SPAN_BITS; 1224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project iw = gglRecipQ(w, 30); 1225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sq = gglMulx(s, iw, iwscale); 1226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project tq = gglMulx(t, iw, iwscale); 1227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dsdx = (sq - s0) >> SPAN_BITS; 1228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dtdx = (tq - t0) >> SPAN_BITS; 1229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xl = xl; 1230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->iterators.xr = xl = xl + (1<<SPAN_BITS); 1231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfinish: 1232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (sscale >= 0) { 1233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy = s0 << sscale; 1234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdx = dsdx << sscale; 1235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydsdy = s0 >>-sscale; 1237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dsdx = dsdx >>-sscale; 1238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (tscale >= 0) { 1240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy = t0 << tscale; 1241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdx = dtdx << tscale; 1242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.ydtdy = t0 >>-tscale; 1244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ti.dtdx = dtdx >>-tscale; 1245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s0 = sq; 1247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project t0 = tq; 1248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dsdx = ti.dsdx; 1249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gen.dtdx = ti.dtdx; 1250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->span(c); 1251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 1255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_t32cb16(context_t* c) 1257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project union { 1263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t* dst; 1264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t* dst32; 1265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 1266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst = reinterpret_cast<uint16_t*>(cb->data) + (x+(cb->stride*y)); 1267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* tex = &(c->state.texture[0].surface); 1269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t u = (c->state.texture[0].shade.is0>>16) + x; 1270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v = (c->state.texture[0].shade.it0>>16) + y; 1271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t *src = reinterpret_cast<uint32_t*>(tex->data)+(u+(tex->stride*v)); 1272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sR, sG, sB; 1273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t s, d; 1274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ct==1 || uint32_t(dst)&2) { 1276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlast_one: 1277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = GGL_RGBA_TO_HOST( *src++ ); 1278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sR = (s >> ( 3))&0x1F; 1279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sG = (s >> ( 8+2))&0x3F; 1280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sB = (s >> (16+3))&0x1F; 1281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = uint16_t((sR<<11)|(sG<<5)|sB); 1282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ct--; 1283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (ct >= 2) { 1286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = GGL_RGBA_TO_HOST( *src++ ); 1287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sR = (s >> ( 3))&0x1F; 1288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sG = (s >> ( 8+2))&0x3F; 1289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sB = (s >> (16+3))&0x1F; 1290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = (sR<<11)|(sG<<5)|sB; 1291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = GGL_RGBA_TO_HOST( *src++ ); 1293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sR = (s >> ( 3))&0x1F; 1294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sG = (s >> ( 8+2))&0x3F; 1295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sB = (s >> (16+3))&0x1F; 1296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d |= ((sR<<11)|(sG<<5)|sB)<<16; 1297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if BYTE_ORDER == BIG_ENDIAN 1299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d = (d>>16) | (d<<16); 1300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst32++ = d; 1303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ct -= 2; 1304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ct > 0) { 1307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project goto last_one; 1308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_t32cb16blend(context_t* c) 1312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t* dst = reinterpret_cast<uint16_t*>(cb->data) + (x+(cb->stride*y)); 1318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* tex = &(c->state.texture[0].surface); 1320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t u = (c->state.texture[0].shade.is0>>16) + x; 1321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v = (c->state.texture[0].shade.it0>>16) + y; 1322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t *src = reinterpret_cast<uint32_t*>(tex->data)+(u+(tex->stride*v)); 1323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ((ANDROID_CODEGEN >= ANDROID_CODEGEN_ASM) && defined(__arm__)) 1325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project scanline_t32cb16blend_arm(dst, src, ct); 1326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 1327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (ct--) { 1328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t s = *src++; 1329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!s) { 1330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst++; 1331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project continue; 1332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t d = *dst; 1334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s = GGL_RGBA_TO_HOST(s); 1335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sR = (s >> ( 3))&0x1F; 1336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sG = (s >> ( 8+2))&0x3F; 1337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sB = (s >> (16+3))&0x1F; 1338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int sA = (s>>24); 1339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int f = 0x100 - (sA + (sA>>7)); 1340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dR = (d>>11)&0x1f; 1341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dG = (d>>5)&0x3f; 1342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int dB = (d)&0x1f; 1343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sR += (f*dR)>>8; 1344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sG += (f*dG)>>8; 1345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sB += (f*dB)>>8; 1346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *dst++ = uint16_t((sR<<11)|(sG<<5)|sB); 1347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_memcpy(context_t* c) 1352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat* fp = &(c->formats[cb->format]); 1358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t* dst = reinterpret_cast<uint8_t*>(cb->data) + 1359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (x + (cb->stride * y)) * fp->size; 1360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* tex = &(c->state.texture[0].surface); 1362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t u = (c->state.texture[0].shade.is0>>16) + x; 1363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v = (c->state.texture[0].shade.it0>>16) + y; 1364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t *src = reinterpret_cast<uint8_t*>(tex->data) + 1365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (u + (tex->stride * v)) * fp->size; 1366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = ct * fp->size; 1368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(dst, src, size); 1369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_memset8(context_t* c) 1372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t* dst = reinterpret_cast<uint8_t*>(cb->data) + (x+(cb->stride*y)); 1378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t packed = c->packed; 1379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(dst, packed, ct); 1380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_memset16(context_t* c) 1383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint16_t* dst = reinterpret_cast<uint16_t*>(cb->data) + (x+(cb->stride*y)); 1389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t packed = c->packed; 1390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_memset16(dst, packed, ct*2); 1391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_memset32(context_t* c) 1394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t* dst = reinterpret_cast<uint32_t*>(cb->data) + (x+(cb->stride*y)); 1400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint32_t packed = GGL_HOST_TO_RGBA(c->packed); 1401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project android_memset32(dst, packed, ct*4); 1402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_clear(context_t* c) 1405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat* fp = &(c->formats[cb->format]); 1411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t* dst = reinterpret_cast<uint8_t*>(cb->data) + 1412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (x + (cb->stride * y)) * fp->size; 1413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = ct * fp->size; 1414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(dst, 0, size); 1415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_set(context_t* c) 1418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat* fp = &(c->formats[cb->format]); 1424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t* dst = reinterpret_cast<uint8_t*>(cb->data) + 1425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (x + (cb->stride * y)) * fp->size; 1426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = ct * fp->size; 1427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(dst, 0xFF, size); 1428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid scanline_noop(context_t* c) 1431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid rect_generic(context_t* c, size_t yc) 1435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 1437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->scanline(c); 1438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project c->step_y(c); 1439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--yc); 1440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid rect_memcpy(context_t* c, size_t yc) 1443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t x = c->iterators.xl; 1445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t ct = c->iterators.xr - x; 1446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int32_t y = c->iterators.y; 1447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* cb = &(c->state.buffers.color); 1448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const GGLFormat* fp = &(c->formats[cb->format]); 1449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t* dst = reinterpret_cast<uint8_t*>(cb->data) + 1450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (x + (cb->stride * y)) * fp->size; 1451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project surface_t* tex = &(c->state.texture[0].surface); 1453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t u = (c->state.texture[0].shade.is0>>16) + x; 1454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const int32_t v = (c->state.texture[0].shade.it0>>16) + y; 1455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project uint8_t *src = reinterpret_cast<uint8_t*>(tex->data) + 1456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project (u + (tex->stride * v)) * fp->size; 1457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (cb->stride == tex->stride && ct == size_t(cb->stride)) { 1459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(dst, src, ct * fp->size * yc); 1460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 1461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t size = ct * fp->size; 1462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t dbpr = cb->stride * fp->size; 1463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project const size_t sbpr = tex->stride * fp->size; 1464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project do { 1465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(dst, src, size); 1466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dst += dbpr; 1467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project src += sbpr; 1468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } while (--yc); 1469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------- 1472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 1473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectusing namespace android; 1475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectextern "C" void ggl_test_codegen(uint32_t n, uint32_t p, uint32_t t0, uint32_t t1) 1476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 1477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if ANDROID_ARM_CODEGEN 1478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLContext* c; 1479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglInit(&c); 1480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs_t needs; 1481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs.n = n; 1482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs.p = p; 1483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs.t[0] = t0; 1484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project needs.t[1] = t1; 1485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sp<ScanlineAssembly> a(new ScanlineAssembly(needs, ASSEMBLY_SCRATCH_SIZE)); 1486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project GGLAssembler assembler( new ARMAssembler(a) ); 1487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err = assembler.scanline(needs, (context_t*)c); 1488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err != 0) { 1489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("error %08x (%s)\n", err, strerror(-err)); 1490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 1491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project gglUninit(c); 1492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else 1493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("This test runs only on ARM\n"); 1494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif 1495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 1496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 1497