Home | History | Annotate | Download | only in scriptc
      1 /*
      2  * Copyright (C) 2011-2012 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 /** @file rs_graphics.rsh
     18  *  \brief RenderScript graphics API
     19  *
     20  *  A set of graphics functions used by RenderScript.
     21  *
     22  */
     23 #ifndef __RS_GRAPHICS_RSH__
     24 #define __RS_GRAPHICS_RSH__
     25 
     26 #include "rs_mesh.rsh"
     27 #include "rs_program.rsh"
     28 
     29 #if (defined(RS_VERSION) && (RS_VERSION >= 14))
     30 /**
     31  * Set the color target used for all subsequent rendering calls
     32  * @param colorTarget
     33  * @param slot
     34  */
     35 extern void __attribute__((overloadable))
     36     rsgBindColorTarget(rs_allocation colorTarget, uint slot);
     37 
     38 /**
     39  * Clear the previously set color target
     40  * @param slot
     41  */
     42 extern void __attribute__((overloadable))
     43     rsgClearColorTarget(uint slot);
     44 
     45 /**
     46  * Set the depth target used for all subsequent rendering calls
     47  * @param depthTarget
     48  */
     49 extern void __attribute__((overloadable))
     50     rsgBindDepthTarget(rs_allocation depthTarget);
     51 
     52 /**
     53  * Clear the previously set depth target
     54  */
     55 extern void __attribute__((overloadable))
     56     rsgClearDepthTarget(void);
     57 
     58 /**
     59  * Clear all color and depth targets and resume rendering into
     60  * the framebuffer
     61  */
     62 extern void __attribute__((overloadable))
     63     rsgClearAllRenderTargets(void);
     64 
     65 /**
     66  * Force RenderScript to finish all rendering commands
     67  */
     68 extern uint __attribute__((overloadable))
     69     rsgFinish(void);
     70 
     71 #endif //defined(RS_VERSION) && (RS_VERSION >= 14)
     72 
     73 /**
     74  * Bind a new ProgramFragment to the rendering context.
     75  *
     76  * @param pf
     77  */
     78 extern void __attribute__((overloadable))
     79     rsgBindProgramFragment(rs_program_fragment pf);
     80 
     81 /**
     82  * Bind a new ProgramStore to the rendering context.
     83  *
     84  * @param ps
     85  */
     86 extern void __attribute__((overloadable))
     87     rsgBindProgramStore(rs_program_store ps);
     88 
     89 /**
     90  * Bind a new ProgramVertex to the rendering context.
     91  *
     92  * @param pv
     93  */
     94 extern void __attribute__((overloadable))
     95     rsgBindProgramVertex(rs_program_vertex pv);
     96 
     97 /**
     98  * Bind a new ProgramRaster to the rendering context.
     99  *
    100  * @param pr
    101  */
    102 extern void __attribute__((overloadable))
    103     rsgBindProgramRaster(rs_program_raster pr);
    104 
    105 /**
    106  * Bind a new Sampler object to a ProgramFragment.  The sampler will
    107  * operate on the texture bound at the matching slot.
    108  *
    109  * @param slot
    110  */
    111 extern void __attribute__((overloadable))
    112     rsgBindSampler(rs_program_fragment, uint slot, rs_sampler);
    113 
    114 /**
    115  * Bind a new Allocation object to a ProgramFragment.  The
    116  * Allocation must be a valid texture for the Program.  The sampling
    117  * of the texture will be controled by the Sampler bound at the
    118  * matching slot.
    119  *
    120  * @param slot
    121  */
    122 extern void __attribute__((overloadable))
    123     rsgBindTexture(rs_program_fragment, uint slot, rs_allocation);
    124 
    125 /**
    126  * Load the projection matrix for a currently bound fixed function
    127  * vertex program. Calling this function with a custom vertex shader
    128  * would result in an error.
    129  * @param proj projection matrix
    130  */
    131 extern void __attribute__((overloadable))
    132     rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *proj);
    133 /**
    134  * Load the model matrix for a currently bound fixed function
    135  * vertex program. Calling this function with a custom vertex shader
    136  * would result in an error.
    137  * @param model model matrix
    138  */
    139 extern void __attribute__((overloadable))
    140     rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *model);
    141 /**
    142  * Load the texture matrix for a currently bound fixed function
    143  * vertex program. Calling this function with a custom vertex shader
    144  * would result in an error.
    145  * @param tex texture matrix
    146  */
    147 extern void __attribute__((overloadable))
    148     rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *tex);
    149 /**
    150  * Get the projection matrix for a currently bound fixed function
    151  * vertex program. Calling this function with a custom vertex shader
    152  * would result in an error.
    153  * @param proj matrix to store the current projection matrix into
    154  */
    155 extern void __attribute__((overloadable))
    156     rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *proj);
    157 
    158 /**
    159  * Set the constant color for a fixed function emulation program.
    160  *
    161  * @param pf
    162  * @param r
    163  * @param g
    164  * @param b
    165  * @param a
    166  */
    167 extern void __attribute__((overloadable))
    168     rsgProgramFragmentConstantColor(rs_program_fragment pf, float r, float g, float b, float a);
    169 
    170 /**
    171  * Bind a new Allocation object to a ProgramFragment.  The
    172  * Allocation must be a valid constant input for the Program.
    173  *
    174  * @param ps program object
    175  * @param slot index of the constant buffer on the program
    176  * @param c constants to bind
    177  */
    178 extern void __attribute__((overloadable))
    179     rsgBindConstant(rs_program_fragment ps, uint slot, rs_allocation c);
    180 
    181 /**
    182  * Bind a new Allocation object to a ProgramVertex.  The
    183  * Allocation must be a valid constant input for the Program.
    184  *
    185  * @param pv program object
    186  * @param slot index of the constant buffer on the program
    187  * @param c constants to bind
    188  */
    189 extern void __attribute__((overloadable))
    190     rsgBindConstant(rs_program_vertex pv, uint slot, rs_allocation c);
    191 
    192 /**
    193  * Get the width of the current rendering surface.
    194  *
    195  * @return uint
    196  */
    197 extern uint __attribute__((overloadable))
    198     rsgGetWidth(void);
    199 
    200 /**
    201  * Get the height of the current rendering surface.
    202  *
    203  * @return uint
    204  */
    205 extern uint __attribute__((overloadable))
    206     rsgGetHeight(void);
    207 
    208 
    209 /**
    210  * Sync the contents of an allocation from its SCRIPT memory space to its HW
    211  * memory spaces.
    212  *
    213  * @param alloc
    214  */
    215 extern void __attribute__((overloadable))
    216     rsgAllocationSyncAll(rs_allocation alloc);
    217 
    218 #if (defined(RS_VERSION) && (RS_VERSION >= 14))
    219 
    220 /**
    221  * Sync the contents of an allocation from memory space
    222  * specified by source.
    223  *
    224  * @param alloc
    225  * @param source
    226  */
    227 extern void __attribute__((overloadable))
    228     rsgAllocationSyncAll(rs_allocation alloc,
    229                          rs_allocation_usage_type source);
    230 
    231 #endif //defined(RS_VERSION) && (RS_VERSION >= 14)
    232 
    233 /**
    234  * Low performance utility function for drawing a simple rectangle.  Not
    235  * intended for drawing large quantities of geometry.
    236  *
    237  * @param x1
    238  * @param y1
    239  * @param x2
    240  * @param y2
    241  * @param z
    242  */
    243 extern void __attribute__((overloadable))
    244     rsgDrawRect(float x1, float y1, float x2, float y2, float z);
    245 
    246 /**
    247  * Low performance utility function for drawing a simple quad.  Not intended for
    248  * drawing large quantities of geometry.
    249  *
    250  * @param x1
    251  * @param y1
    252  * @param z1
    253  * @param x2
    254  * @param y2
    255  * @param z2
    256  * @param x3
    257  * @param y3
    258  * @param z3
    259  * @param x4
    260  * @param y4
    261  * @param z4
    262  */
    263 extern void __attribute__((overloadable))
    264     rsgDrawQuad(float x1, float y1, float z1,
    265                 float x2, float y2, float z2,
    266                 float x3, float y3, float z3,
    267                 float x4, float y4, float z4);
    268 
    269 
    270 /**
    271  * Low performance utility function for drawing a textured quad.  Not intended
    272  * for drawing large quantities of geometry.
    273  *
    274  * @param x1
    275  * @param y1
    276  * @param z1
    277  * @param u1
    278  * @param v1
    279  * @param x2
    280  * @param y2
    281  * @param z2
    282  * @param u2
    283  * @param v2
    284  * @param x3
    285  * @param y3
    286  * @param z3
    287  * @param u3
    288  * @param v3
    289  * @param x4
    290  * @param y4
    291  * @param z4
    292  * @param u4
    293  * @param v4
    294  */
    295 extern void __attribute__((overloadable))
    296     rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
    297                          float x2, float y2, float z2, float u2, float v2,
    298                          float x3, float y3, float z3, float u3, float v3,
    299                          float x4, float y4, float z4, float u4, float v4);
    300 
    301 
    302 /**
    303  * Low performance function for drawing rectangles in screenspace.  This
    304  * function uses the default passthough ProgramVertex.  Any bound ProgramVertex
    305  * is ignored.  This function has considerable overhead and should not be used
    306  * for drawing in shipping applications.
    307  *
    308  * @param x
    309  * @param y
    310  * @param z
    311  * @param w
    312  * @param h
    313  */
    314 extern void __attribute__((overloadable))
    315     rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h);
    316 
    317 extern void __attribute__((overloadable))
    318     rsgDrawPath(rs_path p);
    319 
    320 /**
    321  * Draw a mesh using the current context state.  The whole mesh is
    322  * rendered.
    323  *
    324  * @param ism
    325  */
    326 extern void __attribute__((overloadable))
    327     rsgDrawMesh(rs_mesh ism);
    328 /**
    329  * Draw part of a mesh using the current context state.
    330  * @param ism mesh object to render
    331  * @param primitiveIndex for meshes that contain multiple primitive groups
    332  *        this parameter specifies the index of the group to draw.
    333  */
    334 extern void __attribute__((overloadable))
    335     rsgDrawMesh(rs_mesh ism, uint primitiveIndex);
    336 /**
    337  * Draw specified index range of part of a mesh using the current context state.
    338  * @param ism mesh object to render
    339  * @param primitiveIndex for meshes that contain multiple primitive groups
    340  *        this parameter specifies the index of the group to draw.
    341  * @param start starting index in the range
    342  * @param len number of indices to draw
    343  */
    344 extern void __attribute__((overloadable))
    345     rsgDrawMesh(rs_mesh ism, uint primitiveIndex, uint start, uint len);
    346 
    347 /**
    348  * Clears the rendering surface to the specified color.
    349  *
    350  * @param r
    351  * @param g
    352  * @param b
    353  * @param a
    354  */
    355 extern void __attribute__((overloadable))
    356     rsgClearColor(float r, float g, float b, float a);
    357 
    358 /**
    359  * Clears the depth suface to the specified value.
    360  */
    361 extern void __attribute__((overloadable))
    362     rsgClearDepth(float value);
    363 /**
    364  * Draws text given a string and location
    365  */
    366 extern void __attribute__((overloadable))
    367     rsgDrawText(const char *, int x, int y);
    368 /**
    369  * \overload
    370  */
    371 extern void __attribute__((overloadable))
    372     rsgDrawText(rs_allocation, int x, int y);
    373 /**
    374  * Binds the font object to be used for all subsequent font rendering calls
    375  * @param font object to bind
    376  */
    377 extern void __attribute__((overloadable))
    378     rsgBindFont(rs_font font);
    379 /**
    380  * Sets the font color for all subsequent rendering calls
    381  * @param r red component
    382  * @param g green component
    383  * @param b blue component
    384  * @param a alpha component
    385  */
    386 extern void __attribute__((overloadable))
    387     rsgFontColor(float r, float g, float b, float a);
    388 /**
    389  * Returns the bounding box of the text relative to (0, 0)
    390  * Any of left, right, top, bottom could be NULL
    391  */
    392 extern void __attribute__((overloadable))
    393     rsgMeasureText(const char *, int *left, int *right, int *top, int *bottom);
    394 /**
    395  * \overload
    396  */
    397 extern void __attribute__((overloadable))
    398     rsgMeasureText(rs_allocation, int *left, int *right, int *top, int *bottom);
    399 /**
    400  * Computes an axis aligned bounding box of a mesh object
    401  */
    402 extern void __attribute__((overloadable))
    403     rsgMeshComputeBoundingBox(rs_mesh mesh, float *minX, float *minY, float *minZ,
    404                                                 float *maxX, float *maxY, float *maxZ);
    405 /**
    406  * \overload
    407  */
    408 __inline__ static void __attribute__((overloadable, always_inline))
    409 rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) {
    410     float x1, y1, z1, x2, y2, z2;
    411     rsgMeshComputeBoundingBox(mesh, &x1, &y1, &z1, &x2, &y2, &z2);
    412     bBoxMin->x = x1;
    413     bBoxMin->y = y1;
    414     bBoxMin->z = z1;
    415     bBoxMax->x = x2;
    416     bBoxMax->y = y2;
    417     bBoxMax->z = z2;
    418 }
    419 
    420 #endif
    421 
    422