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