Home | History | Annotate | Download | only in pixelflinger
      1 /*
      2  * Copyright (C) 2007 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_PIXELFLINGER_H
     18 #define ANDROID_PIXELFLINGER_H
     19 
     20 #include <stdint.h>
     21 #include <sys/types.h>
     22 
     23 #include <pixelflinger/format.h>
     24 
     25 // GGL types
     26 
     27 typedef int8_t			GGLbyte;		// b
     28 typedef int16_t			GGLshort;		// s
     29 typedef int32_t			GGLint;			// i
     30 typedef ssize_t			GGLsizei;		// i
     31 typedef int32_t			GGLfixed;		// x
     32 typedef int32_t			GGLclampx;		// x
     33 typedef float			GGLfloat;		// f
     34 typedef float			GGLclampf;		// f
     35 typedef double			GGLdouble;		// d
     36 typedef double			GGLclampd;		// d
     37 typedef uint8_t			GGLubyte;		// ub
     38 typedef uint8_t			GGLboolean;		// ub
     39 typedef uint16_t		GGLushort;		// us
     40 typedef uint32_t		GGLuint;		// ui
     41 typedef unsigned int	GGLenum;		// ui
     42 typedef unsigned int	GGLbitfield;	// ui
     43 typedef void			GGLvoid;
     44 typedef int32_t         GGLfixed32;
     45 typedef	int32_t         GGLcolor;
     46 typedef int32_t         GGLcoord;
     47 
     48 // ----------------------------------------------------------------------------
     49 
     50 #define GGL_MAX_VIEWPORT_DIMS           4096
     51 #define GGL_MAX_TEXTURE_SIZE            4096
     52 #define GGL_MAX_ALIASED_POINT_SIZE      0x7FFFFFF
     53 #define GGL_MAX_SMOOTH_POINT_SIZE       2048
     54 #define GGL_MAX_SMOOTH_LINE_WIDTH       2048
     55 
     56 // ----------------------------------------------------------------------------
     57 
     58 // All these names are compatible with their OpenGL equivalents
     59 // some of them are listed only for completeness
     60 enum GGLNames {
     61 	GGL_FALSE						= 0,
     62 	GGL_TRUE						= 1,
     63 
     64 	// enable/disable
     65     GGL_SCISSOR_TEST                = 0x0C11,
     66 	GGL_TEXTURE_2D					= 0x0DE1,
     67 	GGL_ALPHA_TEST					= 0x0BC0,
     68 	GGL_BLEND						= 0x0BE2,
     69 	GGL_COLOR_LOGIC_OP				= 0x0BF2,
     70 	GGL_DITHER						= 0x0BD0,
     71 	GGL_STENCIL_TEST				= 0x0B90,
     72 	GGL_DEPTH_TEST					= 0x0B71,
     73     GGL_AA                          = 0x80000001,
     74     GGL_W_LERP                      = 0x80000004,
     75     GGL_POINT_SMOOTH_NICE           = 0x80000005,
     76 
     77     // buffers, pixel drawing/reading
     78     GGL_COLOR                       = 0x1800,
     79 
     80     // fog
     81     GGL_FOG                         = 0x0B60,
     82 
     83 	// shade model
     84 	GGL_FLAT						= 0x1D00,
     85 	GGL_SMOOTH						= 0x1D01,
     86 
     87 	// Texture parameter name
     88 	GGL_TEXTURE_MIN_FILTER			= 0x2801,
     89 	GGL_TEXTURE_MAG_FILTER			= 0x2800,
     90 	GGL_TEXTURE_WRAP_S				= 0x2802,
     91 	GGL_TEXTURE_WRAP_T				= 0x2803,
     92 	GGL_TEXTURE_WRAP_R				= 0x2804,
     93 
     94 	// Texture Filter
     95 	GGL_NEAREST						= 0x2600,
     96 	GGL_LINEAR						= 0x2601,
     97 	GGL_NEAREST_MIPMAP_NEAREST		= 0x2700,
     98 	GGL_LINEAR_MIPMAP_NEAREST		= 0x2701,
     99 	GGL_NEAREST_MIPMAP_LINEAR		= 0x2702,
    100 	GGL_LINEAR_MIPMAP_LINEAR		= 0x2703,
    101 
    102 	// Texture Wrap Mode
    103 	GGL_CLAMP						= 0x2900,
    104 	GGL_REPEAT						= 0x2901,
    105     GGL_CLAMP_TO_EDGE               = 0x812F,
    106 
    107 	// Texture Env Mode
    108 	GGL_REPLACE						= 0x1E01,
    109 	GGL_MODULATE					= 0x2100,
    110 	GGL_DECAL						= 0x2101,
    111 	GGL_ADD							= 0x0104,
    112 
    113 	// Texture Env Parameter
    114 	GGL_TEXTURE_ENV_MODE			= 0x2200,
    115 	GGL_TEXTURE_ENV_COLOR			= 0x2201,
    116 
    117 	// Texture Env Target
    118 	GGL_TEXTURE_ENV					= 0x2300,
    119 
    120     // Texture coord generation
    121     GGL_TEXTURE_GEN_MODE            = 0x2500,
    122     GGL_S                           = 0x2000,
    123     GGL_T                           = 0x2001,
    124     GGL_R                           = 0x2002,
    125     GGL_Q                           = 0x2003,
    126     GGL_ONE_TO_ONE                  = 0x80000002,
    127     GGL_AUTOMATIC                   = 0x80000003,
    128 
    129     // AlphaFunction
    130     GGL_NEVER                       = 0x0200,
    131     GGL_LESS                        = 0x0201,
    132     GGL_EQUAL                       = 0x0202,
    133     GGL_LEQUAL                      = 0x0203,
    134     GGL_GREATER                     = 0x0204,
    135     GGL_NOTEQUAL                    = 0x0205,
    136     GGL_GEQUAL                      = 0x0206,
    137     GGL_ALWAYS                      = 0x0207,
    138 
    139     // LogicOp
    140     GGL_CLEAR                       = 0x1500,   // 0
    141     GGL_AND                         = 0x1501,   // s & d
    142     GGL_AND_REVERSE                 = 0x1502,   // s & ~d
    143     GGL_COPY                        = 0x1503,   // s
    144     GGL_AND_INVERTED                = 0x1504,   // ~s & d
    145     GGL_NOOP                        = 0x1505,   // d
    146     GGL_XOR                         = 0x1506,   // s ^ d
    147     GGL_OR                          = 0x1507,   // s | d
    148     GGL_NOR                         = 0x1508,   // ~(s | d)
    149     GGL_EQUIV                       = 0x1509,   // ~(s ^ d)
    150     GGL_INVERT                      = 0x150A,   // ~d
    151     GGL_OR_REVERSE                  = 0x150B,   // s | ~d
    152     GGL_COPY_INVERTED               = 0x150C,   // ~s
    153     GGL_OR_INVERTED                 = 0x150D,   // ~s | d
    154     GGL_NAND                        = 0x150E,   // ~(s & d)
    155     GGL_SET                         = 0x150F,   // 1
    156 
    157 	// blending equation & function
    158 	GGL_ZERO                        = 0,		// SD
    159 	GGL_ONE                         = 1,		// SD
    160 	GGL_SRC_COLOR                   = 0x0300,	//  D
    161 	GGL_ONE_MINUS_SRC_COLOR         = 0x0301,	//	D
    162 	GGL_SRC_ALPHA                   = 0x0302,	// SD
    163 	GGL_ONE_MINUS_SRC_ALPHA			= 0x0303,	// SD
    164 	GGL_DST_ALPHA					= 0x0304,	// SD
    165 	GGL_ONE_MINUS_DST_ALPHA			= 0x0305,	// SD
    166 	GGL_DST_COLOR					= 0x0306,	// S
    167 	GGL_ONE_MINUS_DST_COLOR			= 0x0307,	// S
    168 	GGL_SRC_ALPHA_SATURATE			= 0x0308,	// S
    169 
    170     // clear bits
    171     GGL_DEPTH_BUFFER_BIT            = 0x00000100,
    172     GGL_STENCIL_BUFFER_BIT          = 0x00000400,
    173     GGL_COLOR_BUFFER_BIT            = 0x00004000,
    174 
    175     // errors
    176     GGL_NO_ERROR                    = 0,
    177     GGL_INVALID_ENUM                = 0x0500,
    178     GGL_INVALID_VALUE               = 0x0501,
    179     GGL_INVALID_OPERATION           = 0x0502,
    180     GGL_STACK_OVERFLOW              = 0x0503,
    181     GGL_STACK_UNDERFLOW             = 0x0504,
    182     GGL_OUT_OF_MEMORY               = 0x0505
    183 };
    184 
    185 // ----------------------------------------------------------------------------
    186 
    187 typedef struct {
    188     GGLsizei    version;    // always set to sizeof(GGLSurface)
    189     GGLuint     width;      // width in pixels
    190     GGLuint     height;     // height in pixels
    191     GGLint      stride;     // stride in pixels
    192     GGLubyte*   data;       // pointer to the bits
    193     GGLubyte    format;     // pixel format
    194     GGLubyte    rfu[3];     // must be zero
    195     // these values are dependent on the used format
    196     union {
    197         GGLint  compressedFormat;
    198         GGLint  vstride;
    199     };
    200     void*       reserved;
    201 } GGLSurface;
    202 
    203 
    204 typedef struct {
    205     // immediate rendering
    206     void (*pointx)(void *con, const GGLcoord* v, GGLcoord r);
    207     void (*linex)(void *con,
    208             const GGLcoord* v0, const GGLcoord* v1, GGLcoord width);
    209     void (*recti)(void* c, GGLint l, GGLint t, GGLint r, GGLint b);
    210     void (*trianglex)(void* c,
    211             GGLcoord const* v0, GGLcoord const* v1, GGLcoord const* v2);
    212 
    213     // scissor
    214     void (*scissor)(void* c, GGLint x, GGLint y, GGLsizei width, GGLsizei height);
    215 
    216     // Set the textures and color buffers
    217     void (*activeTexture)(void* c, GGLuint tmu);
    218     void (*bindTexture)(void* c, const GGLSurface* surface);
    219     void (*colorBuffer)(void* c, const GGLSurface* surface);
    220     void (*readBuffer)(void* c, const GGLSurface* surface);
    221     void (*depthBuffer)(void* c, const GGLSurface* surface);
    222     void (*bindTextureLod)(void* c, GGLuint tmu, const GGLSurface* surface);
    223 
    224     // enable/disable features
    225     void (*enable)(void* c, GGLenum name);
    226     void (*disable)(void* c, GGLenum name);
    227     void (*enableDisable)(void* c, GGLenum name, GGLboolean en);
    228 
    229     // specify the fragment's color
    230     void (*shadeModel)(void* c, GGLenum mode);
    231     void (*color4xv)(void* c, const GGLclampx* color);
    232     // specify color iterators (16.16)
    233     void (*colorGrad12xv)(void* c, const GGLcolor* grad);
    234 
    235     // specify Z coordinate iterators (0.32)
    236     void (*zGrad3xv)(void* c, const GGLfixed32* grad);
    237 
    238     // specify W coordinate iterators (16.16)
    239     void (*wGrad3xv)(void* c, const GGLfixed* grad);
    240 
    241     // specify fog iterator & color (16.16)
    242     void (*fogGrad3xv)(void* c, const GGLfixed* grad);
    243     void (*fogColor3xv)(void* c, const GGLclampx* color);
    244 
    245     // specify blending parameters
    246     void (*blendFunc)(void* c, GGLenum src, GGLenum dst);
    247     void (*blendFuncSeparate)(void* c,  GGLenum src, GGLenum dst,
    248                                         GGLenum srcAlpha, GGLenum dstAplha);
    249 
    250     // texture environnement (REPLACE / MODULATE / DECAL / BLEND)
    251     void (*texEnvi)(void* c,    GGLenum target,
    252                                 GGLenum pname,
    253                                 GGLint param);
    254 
    255     void (*texEnvxv)(void* c, GGLenum target,
    256             GGLenum pname, const GGLfixed* params);
    257 
    258     // texture parameters (Wrapping, filter)
    259     void (*texParameteri)(void* c,  GGLenum target,
    260                                     GGLenum pname,
    261                                     GGLint param);
    262 
    263     // texture iterators (16.16)
    264     void (*texCoord2i)(void* c, GGLint s, GGLint t);
    265     void (*texCoord2x)(void* c, GGLfixed s, GGLfixed t);
    266 
    267     // s, dsdx, dsdy, scale, t, dtdx, dtdy, tscale
    268     // This api uses block floating-point for S and T texture coordinates.
    269     // All values are given in 16.16, scaled by 'scale'. In other words,
    270     // set scale to 0, for 16.16 values.
    271     void (*texCoordGradScale8xv)(void* c, GGLint tmu, const int32_t* grad8);
    272 
    273     void (*texGeni)(void* c, GGLenum coord, GGLenum pname, GGLint param);
    274 
    275     // masking
    276     void (*colorMask)(void* c,  GGLboolean red,
    277                                 GGLboolean green,
    278                                 GGLboolean blue,
    279                                 GGLboolean alpha);
    280 
    281     void (*depthMask)(void* c, GGLboolean flag);
    282 
    283     void (*stencilMask)(void* c, GGLuint mask);
    284 
    285     // alpha func
    286     void (*alphaFuncx)(void* c, GGLenum func, GGLclampx ref);
    287 
    288     // depth func
    289     void (*depthFunc)(void* c, GGLenum func);
    290 
    291     // logic op
    292     void (*logicOp)(void* c, GGLenum opcode);
    293 
    294     // clear
    295     void (*clear)(void* c, GGLbitfield mask);
    296     void (*clearColorx)(void* c,
    297             GGLclampx r, GGLclampx g, GGLclampx b, GGLclampx a);
    298     void (*clearDepthx)(void* c, GGLclampx depth);
    299     void (*clearStencil)(void* c, GGLint s);
    300 
    301     // framebuffer operations
    302     void (*copyPixels)(void* c, GGLint x, GGLint y,
    303             GGLsizei width, GGLsizei height, GGLenum type);
    304     void (*rasterPos2x)(void* c, GGLfixed x, GGLfixed y);
    305     void (*rasterPos2i)(void* c, GGLint x, GGLint y);
    306 } GGLContext;
    307 
    308 // ----------------------------------------------------------------------------
    309 
    310 #ifdef __cplusplus
    311 extern "C" {
    312 #endif
    313 
    314 // construct / destroy the context
    315 ssize_t gglInit(GGLContext** context);
    316 ssize_t gglUninit(GGLContext* context);
    317 
    318 GGLint gglBitBlit(
    319         GGLContext* c,
    320         int tmu,
    321         GGLint crop[4],
    322         GGLint where[4]);
    323 
    324 #ifdef __cplusplus
    325 };
    326 #endif
    327 
    328 // ----------------------------------------------------------------------------
    329 
    330 #endif // ANDROID_PIXELFLINGER_H
    331