Home | History | Annotate | Download | only in pixelflinger
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_GGL_CONTEXT_H
     18 #define ANDROID_GGL_CONTEXT_H
     19 
     20 #include <stdint.h>
     21 #include <stddef.h>
     22 #include <string.h>
     23 #include <sys/types.h>
     24 #include <endian.h>
     25 
     26 #include <pixelflinger/pixelflinger.h>
     27 #include <private/pixelflinger/ggl_fixed.h>
     28 
     29 namespace android {
     30 
     31 // ----------------------------------------------------------------------------
     32 
     33 #if BYTE_ORDER == LITTLE_ENDIAN
     34 
     35 inline uint32_t GGL_RGBA_TO_HOST(uint32_t v) {
     36     return v;
     37 }
     38 inline uint32_t GGL_HOST_TO_RGBA(uint32_t v) {
     39     return v;
     40 }
     41 
     42 #else
     43 
     44 inline uint32_t GGL_RGBA_TO_HOST(uint32_t v) {
     45     return (v<<24) | (v>>24) | ((v<<8)&0xff0000) | ((v>>8)&0xff00);
     46 }
     47 inline uint32_t GGL_HOST_TO_RGBA(uint32_t v) {
     48     return (v<<24) | (v>>24) | ((v<<8)&0xff0000) | ((v>>8)&0xff00);
     49 }
     50 
     51 #endif
     52 
     53 // ----------------------------------------------------------------------------
     54 
     55 const int GGL_DITHER_BITS = 6;  // dither weights stored on 6 bits
     56 const int GGL_DITHER_ORDER_SHIFT= 3;
     57 const int GGL_DITHER_ORDER      = (1<<GGL_DITHER_ORDER_SHIFT);
     58 const int GGL_DITHER_SIZE       = GGL_DITHER_ORDER * GGL_DITHER_ORDER;
     59 const int GGL_DITHER_MASK       = GGL_DITHER_ORDER-1;
     60 
     61 // ----------------------------------------------------------------------------
     62 
     63 const int GGL_SUBPIXEL_BITS = 4;
     64 
     65 // TRI_FRACTION_BITS defines the number of bits we want to use
     66 // for the sub-pixel coordinates during the edge stepping, the
     67 // value shouldn't be more than 7, or bad things are going to
     68 // happen when drawing large triangles (8 doesn't work because
     69 // 32 bit muls will loose the sign bit)
     70 
     71 #define  TRI_FRACTION_BITS  (GGL_SUBPIXEL_BITS)
     72 #define  TRI_ONE            (1 << TRI_FRACTION_BITS)
     73 #define  TRI_HALF           (1 << (TRI_FRACTION_BITS-1))
     74 #define  TRI_FROM_INT(x)    ((x) << TRI_FRACTION_BITS)
     75 #define  TRI_FRAC(x)        ((x)                 &  (TRI_ONE-1))
     76 #define  TRI_FLOOR(x)       ((x)                 & ~(TRI_ONE-1))
     77 #define  TRI_CEIL(x)        (((x) + (TRI_ONE-1)) & ~(TRI_ONE-1))
     78 #define  TRI_ROUND(x)       (((x) +  TRI_HALF  ) & ~(TRI_ONE-1))
     79 
     80 #define  TRI_ROUDNING       (1 << (16 - TRI_FRACTION_BITS - 1))
     81 #define  TRI_FROM_FIXED(x)  (((x)+TRI_ROUDNING) >> (16-TRI_FRACTION_BITS))
     82 
     83 #define  TRI_SNAP_NEXT_HALF(x)   (TRI_CEIL((x)+TRI_HALF) - TRI_HALF)
     84 #define  TRI_SNAP_PREV_HALF(x)   (TRI_CEIL((x)-TRI_HALF) - TRI_HALF)
     85 
     86 // ----------------------------------------------------------------------------
     87 
     88 const int GGL_COLOR_BITS = 24;
     89 
     90 // To maintain 8-bits color chanels, with a maximum GGLSurface
     91 // size of 4096 and GGL_SUBPIXEL_BITS=4, we need 8 + 12 + 4 = 24 bits
     92 // for encoding the color iterators
     93 
     94 inline GGLcolor gglFixedToIteratedColor(GGLfixed c) {
     95     return (c << 8) - c;
     96 }
     97 
     98 // ----------------------------------------------------------------------------
     99 
    100 template<bool> struct CTA;
    101 template<> struct CTA<true> { };
    102 
    103 #define GGL_CONTEXT(con, c)         context_t *con = static_cast<context_t *>(c)
    104 #define GGL_OFFSETOF(field)         int(&(((context_t*)0)->field))
    105 #define GGL_INIT_PROC(p, f)         p.f = ggl_ ## f;
    106 #define GGL_BETWEEN(x, L, H)        (uint32_t((x)-(L)) <= ((H)-(L)))
    107 
    108 #define ggl_likely(x)	__builtin_expect(!!(x), 1)
    109 #define ggl_unlikely(x)	__builtin_expect(!!(x), 0)
    110 
    111 const int GGL_TEXTURE_UNIT_COUNT    = 2;
    112 const int GGL_TMU_STATE             = 0x00000001;
    113 const int GGL_CB_STATE              = 0x00000002;
    114 const int GGL_PIXEL_PIPELINE_STATE  = 0x00000004;
    115 
    116 // ----------------------------------------------------------------------------
    117 
    118 #define GGL_RESERVE_NEEDS(name, l, s)                               \
    119     const uint32_t  GGL_NEEDS_##name##_MASK = (((1LU<<(s))-1)<<l);  \
    120     const uint32_t  GGL_NEEDS_##name##_SHIFT = (l);
    121 
    122 #define GGL_BUILD_NEEDS(val, name)                                  \
    123     (((val)<<(GGL_NEEDS_##name##_SHIFT)) & GGL_NEEDS_##name##_MASK)
    124 
    125 #define GGL_READ_NEEDS(name, n)                                     \
    126     (uint32_t(n & GGL_NEEDS_##name##_MASK) >> GGL_NEEDS_##name##_SHIFT)
    127 
    128 #define GGL_NEED_MASK(name)     (uint32_t(GGL_NEEDS_##name##_MASK))
    129 #define GGL_NEED(name, val)     GGL_BUILD_NEEDS(val, name)
    130 
    131 GGL_RESERVE_NEEDS( CB_FORMAT,       0, 6 )
    132 GGL_RESERVE_NEEDS( SHADE,           6, 1 )
    133 GGL_RESERVE_NEEDS( W,               7, 1 )
    134 GGL_RESERVE_NEEDS( BLEND_SRC,       8, 4 )
    135 GGL_RESERVE_NEEDS( BLEND_DST,      12, 4 )
    136 GGL_RESERVE_NEEDS( BLEND_SRCA,     16, 4 )
    137 GGL_RESERVE_NEEDS( BLEND_DSTA,     20, 4 )
    138 GGL_RESERVE_NEEDS( LOGIC_OP,       24, 4 )
    139 GGL_RESERVE_NEEDS( MASK_ARGB,      28, 4 )
    140 
    141 GGL_RESERVE_NEEDS( P_ALPHA_TEST,    0, 3 )
    142 GGL_RESERVE_NEEDS( P_AA,            3, 1 )
    143 GGL_RESERVE_NEEDS( P_DEPTH_TEST,    4, 3 )
    144 GGL_RESERVE_NEEDS( P_MASK_Z,        7, 1 )
    145 GGL_RESERVE_NEEDS( P_DITHER,        8, 1 )
    146 GGL_RESERVE_NEEDS( P_FOG,           9, 1 )
    147 GGL_RESERVE_NEEDS( P_RESERVED1,    10,22 )
    148 
    149 GGL_RESERVE_NEEDS( T_FORMAT,        0, 6 )
    150 GGL_RESERVE_NEEDS( T_RESERVED0,     6, 1 )
    151 GGL_RESERVE_NEEDS( T_POT,           7, 1 )
    152 GGL_RESERVE_NEEDS( T_S_WRAP,        8, 2 )
    153 GGL_RESERVE_NEEDS( T_T_WRAP,       10, 2 )
    154 GGL_RESERVE_NEEDS( T_ENV,          12, 3 )
    155 GGL_RESERVE_NEEDS( T_LINEAR,       15, 1 )
    156 
    157 const int GGL_NEEDS_WRAP_CLAMP_TO_EDGE  = 0;
    158 const int GGL_NEEDS_WRAP_REPEAT         = 1;
    159 const int GGL_NEEDS_WRAP_11             = 2;
    160 
    161 inline uint32_t ggl_wrap_to_needs(uint32_t e) {
    162     switch (e) {
    163     case GGL_CLAMP:         return GGL_NEEDS_WRAP_CLAMP_TO_EDGE;
    164     case GGL_REPEAT:        return GGL_NEEDS_WRAP_REPEAT;
    165     }
    166     return 0;
    167 }
    168 
    169 inline uint32_t ggl_blendfactor_to_needs(uint32_t b) {
    170     if (b <= 1) return b;
    171     return (b & 0xF)+2;
    172 }
    173 
    174 inline uint32_t ggl_needs_to_blendfactor(uint32_t n) {
    175     if (n <= 1) return n;
    176     return (n - 2) + 0x300;
    177 }
    178 
    179 inline uint32_t ggl_env_to_needs(uint32_t e) {
    180     switch (e) {
    181     case GGL_REPLACE:   return 0;
    182     case GGL_MODULATE:  return 1;
    183     case GGL_DECAL:     return 2;
    184     case GGL_BLEND:     return 3;
    185     case GGL_ADD:       return 4;
    186     }
    187     return 0;
    188 }
    189 
    190 inline uint32_t ggl_needs_to_env(uint32_t n) {
    191     const uint32_t envs[] = { GGL_REPLACE, GGL_MODULATE,
    192             GGL_DECAL, GGL_BLEND, GGL_ADD };
    193     return envs[n];
    194 
    195 }
    196 
    197 // ----------------------------------------------------------------------------
    198 
    199 enum {
    200     GGL_ENABLE_BLENDING     = 0x00000001,
    201     GGL_ENABLE_SMOOTH       = 0x00000002,
    202     GGL_ENABLE_AA           = 0x00000004,
    203     GGL_ENABLE_LOGIC_OP     = 0x00000008,
    204     GGL_ENABLE_ALPHA_TEST   = 0x00000010,
    205     GGL_ENABLE_SCISSOR_TEST = 0x00000020,
    206     GGL_ENABLE_TMUS         = 0x00000040,
    207     GGL_ENABLE_DEPTH_TEST   = 0x00000080,
    208     GGL_ENABLE_STENCIL_TEST = 0x00000100,
    209     GGL_ENABLE_W            = 0x00000200,
    210     GGL_ENABLE_DITHER       = 0x00000400,
    211     GGL_ENABLE_FOG          = 0x00000800,
    212     GGL_ENABLE_POINT_AA_NICE= 0x00001000
    213 };
    214 
    215 // ----------------------------------------------------------------------------
    216 
    217 class needs_filter_t;
    218 struct needs_t {
    219     inline int match(const needs_filter_t& filter);
    220     inline bool operator == (const needs_t& rhs) const {
    221         return  (n==rhs.n) &&
    222                 (p==rhs.p) &&
    223                 (t[0]==rhs.t[0]) &&
    224                 (t[1]==rhs.t[1]);
    225     }
    226     inline bool operator != (const needs_t& rhs) const {
    227         return !operator == (rhs);
    228     }
    229     uint32_t    n;
    230     uint32_t    p;
    231     uint32_t    t[GGL_TEXTURE_UNIT_COUNT];
    232 };
    233 
    234 inline int compare_type(const needs_t& lhs, const needs_t& rhs) {
    235     return memcmp(&lhs, &rhs, sizeof(needs_t));
    236 }
    237 
    238 struct needs_filter_t {
    239     needs_t     value;
    240     needs_t     mask;
    241 };
    242 
    243 int needs_t::match(const needs_filter_t& filter) {
    244     uint32_t result =
    245         ((filter.value.n ^ n)       & filter.mask.n)    |
    246         ((filter.value.p ^ p)       & filter.mask.p)    |
    247         ((filter.value.t[0] ^ t[0]) & filter.mask.t[0]) |
    248         ((filter.value.t[1] ^ t[1]) & filter.mask.t[1]);
    249     return (result == 0);
    250 }
    251 
    252 // ----------------------------------------------------------------------------
    253 
    254 struct context_t;
    255 class Assembly;
    256 
    257 struct blend_state_t {
    258 	uint32_t			src;
    259 	uint32_t			dst;
    260 	uint32_t			src_alpha;
    261 	uint32_t			dst_alpha;
    262 	uint8_t				reserved;
    263 	uint8_t				alpha_separate;
    264 	uint8_t				operation;
    265 	uint8_t				equation;
    266 };
    267 
    268 struct mask_state_t {
    269     uint8_t             color;
    270     uint8_t             depth;
    271     uint32_t            stencil;
    272 };
    273 
    274 struct clear_state_t {
    275     GGLclampx           r;
    276     GGLclampx           g;
    277     GGLclampx           b;
    278     GGLclampx           a;
    279     GGLclampx           depth;
    280     GGLint              stencil;
    281     uint32_t            colorPacked;
    282     uint32_t            depthPacked;
    283     uint32_t            stencilPacked;
    284     uint32_t            dirty;
    285 };
    286 
    287 struct fog_state_t {
    288     uint8_t     color[4];
    289 };
    290 
    291 struct logic_op_state_t {
    292     uint16_t            opcode;
    293 };
    294 
    295 struct alpha_test_state_t {
    296     uint16_t            func;
    297     GGLcolor            ref;
    298 };
    299 
    300 struct depth_test_state_t {
    301     uint16_t            func;
    302     GGLclampx           clearValue;
    303 };
    304 
    305 struct scissor_t {
    306     uint32_t            user_left;
    307     uint32_t            user_right;
    308     uint32_t            user_top;
    309     uint32_t            user_bottom;
    310     uint32_t            left;
    311     uint32_t            right;
    312     uint32_t            top;
    313     uint32_t            bottom;
    314 };
    315 
    316 struct pixel_t {
    317     uint32_t    c[4];
    318     uint8_t     s[4];
    319 };
    320 
    321 struct surface_t {
    322     union {
    323         GGLSurface      s;
    324         struct {
    325         uint32_t            reserved;
    326         uint32_t			width;
    327         uint32_t			height;
    328         int32_t             stride;
    329         uint8_t*			data;
    330         uint8_t				format;
    331         uint8_t				dirty;
    332         uint8_t				pad[2];
    333         };
    334     };
    335     void                (*read) (const surface_t* s, context_t* c,
    336                                 uint32_t x, uint32_t y, pixel_t* pixel);
    337     void                (*write)(const surface_t* s, context_t* c,
    338                                 uint32_t x, uint32_t y, const pixel_t* pixel);
    339 };
    340 
    341 // ----------------------------------------------------------------------------
    342 
    343 struct texture_shade_t {
    344     union {
    345         struct {
    346             int32_t             is0;
    347             int32_t             idsdx;
    348             int32_t             idsdy;
    349             int                 sscale;
    350             int32_t             it0;
    351             int32_t             idtdx;
    352             int32_t             idtdy;
    353             int                 tscale;
    354         };
    355         struct {
    356             int32_t             v;
    357             int32_t             dx;
    358             int32_t             dy;
    359             int                 scale;
    360         } st[2];
    361     };
    362 };
    363 
    364 struct texture_iterators_t {
    365     // these are not encoded in the same way than in the
    366     // texture_shade_t structure
    367     union {
    368         struct {
    369             GGLfixed			ydsdy;
    370             GGLfixed            dsdx;
    371             GGLfixed            dsdy;
    372             int                 sscale;
    373             GGLfixed			ydtdy;
    374             GGLfixed            dtdx;
    375             GGLfixed            dtdy;
    376             int                 tscale;
    377         };
    378         struct {
    379             GGLfixed			ydvdy;
    380             GGLfixed            dvdx;
    381             GGLfixed            dvdy;
    382             int                 scale;
    383         } st[2];
    384     };
    385 };
    386 
    387 struct texture_t {
    388 	surface_t			surface;
    389 	texture_iterators_t	iterators;
    390     texture_shade_t     shade;
    391 	uint32_t			s_coord;
    392 	uint32_t            t_coord;
    393 	uint16_t			s_wrap;
    394 	uint16_t            t_wrap;
    395 	uint16_t            min_filter;
    396 	uint16_t            mag_filter;
    397     uint16_t            env;
    398     uint8_t             env_color[4];
    399 	uint8_t				enable;
    400 	uint8_t				dirty;
    401 };
    402 
    403 struct raster_t {
    404     GGLfixed            x;
    405     GGLfixed            y;
    406 };
    407 
    408 struct framebuffer_t {
    409     surface_t           color;
    410     surface_t           read;
    411 	surface_t			depth;
    412 	surface_t			stencil;
    413     int16_t             *coverage;
    414     size_t              coverageBufferSize;
    415 };
    416 
    417 // ----------------------------------------------------------------------------
    418 
    419 struct iterators_t {
    420 	int32_t             xl;
    421 	int32_t             xr;
    422     int32_t             y;
    423 	GGLcolor			ydady;
    424 	GGLcolor			ydrdy;
    425 	GGLcolor			ydgdy;
    426 	GGLcolor			ydbdy;
    427 	GGLfixed			ydzdy;
    428 	GGLfixed			ydwdy;
    429 	GGLfixed			ydfdy;
    430 };
    431 
    432 struct shade_t {
    433 	GGLcolor			a0;
    434     GGLcolor            dadx;
    435     GGLcolor            dady;
    436 	GGLcolor			r0;
    437     GGLcolor            drdx;
    438     GGLcolor            drdy;
    439 	GGLcolor			g0;
    440     GGLcolor            dgdx;
    441     GGLcolor            dgdy;
    442 	GGLcolor			b0;
    443     GGLcolor            dbdx;
    444     GGLcolor            dbdy;
    445 	uint32_t            z0;
    446     GGLfixed32          dzdx;
    447     GGLfixed32          dzdy;
    448 	GGLfixed            w0;
    449     GGLfixed            dwdx;
    450     GGLfixed            dwdy;
    451 	uint32_t			f0;
    452     GGLfixed            dfdx;
    453     GGLfixed            dfdy;
    454 };
    455 
    456 // these are used in the generated code
    457 // we use this mirror structure to improve
    458 // data locality in the pixel pipeline
    459 struct generated_tex_vars_t {
    460     uint32_t    width;
    461     uint32_t    height;
    462     uint32_t    stride;
    463     int32_t     data;
    464     int32_t     dsdx;
    465     int32_t     dtdx;
    466     int32_t     spill[2];
    467 };
    468 
    469 struct generated_vars_t {
    470     struct {
    471         int32_t c;
    472         int32_t dx;
    473     } argb[4];
    474     int32_t     aref;
    475     int32_t     dzdx;
    476     int32_t     zbase;
    477     int32_t     f;
    478     int32_t     dfdx;
    479     int32_t     spill[3];
    480     generated_tex_vars_t    texture[GGL_TEXTURE_UNIT_COUNT];
    481     int32_t     rt;
    482     int32_t     lb;
    483 };
    484 
    485 // ----------------------------------------------------------------------------
    486 
    487 struct state_t {
    488 	framebuffer_t		buffers;
    489 	texture_t			texture[GGL_TEXTURE_UNIT_COUNT];
    490     scissor_t           scissor;
    491     raster_t            raster;
    492 	blend_state_t		blend;
    493     alpha_test_state_t  alpha_test;
    494     depth_test_state_t  depth_test;
    495     mask_state_t        mask;
    496     clear_state_t       clear;
    497     fog_state_t         fog;
    498     logic_op_state_t    logic_op;
    499     uint32_t            enables;
    500     uint32_t            enabled_tmu;
    501     needs_t             needs;
    502 };
    503 
    504 // ----------------------------------------------------------------------------
    505 
    506 struct context_t {
    507 	GGLContext          procs;
    508 	state_t             state;
    509     shade_t             shade;
    510 	iterators_t         iterators;
    511     generated_vars_t    generated_vars                __attribute__((aligned(32)));
    512     uint8_t             ditherMatrix[GGL_DITHER_SIZE] __attribute__((aligned(32)));
    513     uint32_t            packed;
    514     uint32_t            packed8888;
    515     const GGLFormat*    formats;
    516     uint32_t            dirty;
    517     texture_t*          activeTMU;
    518     uint32_t            activeTMUIndex;
    519 
    520     void                (*init_y)(context_t* c, int32_t y);
    521 	void                (*step_y)(context_t* c);
    522 	void                (*scanline)(context_t* c);
    523     void                (*span)(context_t* c);
    524     void                (*rect)(context_t* c, size_t yc);
    525 
    526     void*               base;
    527     Assembly*           scanline_as;
    528     GGLenum             error;
    529 };
    530 
    531 // ----------------------------------------------------------------------------
    532 
    533 void ggl_init_context(context_t* context);
    534 void ggl_uninit_context(context_t* context);
    535 void ggl_error(context_t* c, GGLenum error);
    536 int64_t ggl_system_time();
    537 
    538 // ----------------------------------------------------------------------------
    539 
    540 };
    541 
    542 #endif // ANDROID_GGL_CONTEXT_H
    543 
    544