Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2009 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 #include "rsContext.h"
     18 #include "rsScriptC.h"
     19 
     20 #include "utils/Timers.h"
     21 
     22 #include <time.h>
     23 
     24 namespace android {
     25 namespace renderscript {
     26 
     27 
     28 //////////////////////////////////////////////////////////////////////////////
     29 // Context
     30 //////////////////////////////////////////////////////////////////////////////
     31 
     32 void rsrBindTexture(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *);
     33 void rsrBindConstant(Context *, Script *, ProgramFragment *, uint32_t slot, Allocation *);
     34 void rsrBindConstant(Context *, Script *, ProgramVertex*, uint32_t slot, Allocation *);
     35 void rsrBindSampler(Context *, Script *, ProgramFragment *, uint32_t slot, Sampler *);
     36 void rsrBindProgramStore(Context *, Script *, ProgramStore *);
     37 void rsrBindProgramFragment(Context *, Script *, ProgramFragment *);
     38 void rsrBindProgramVertex(Context *, Script *, ProgramVertex *);
     39 void rsrBindProgramRaster(Context *, Script *, ProgramRaster *);
     40 void rsrBindFrameBufferObjectColorTarget(Context *, Script *, Allocation *, uint32_t slot);
     41 void rsrBindFrameBufferObjectDepthTarget(Context *, Script *, Allocation *);
     42 void rsrClearFrameBufferObjectColorTarget(Context *, Script *, uint32_t slot);
     43 void rsrClearFrameBufferObjectDepthTarget(Context *, Script *);
     44 void rsrClearFrameBufferObjectTargets(Context *, Script *);
     45 
     46 //////////////////////////////////////////////////////////////////////////////
     47 // VP
     48 //////////////////////////////////////////////////////////////////////////////
     49 
     50 void rsrVpLoadProjectionMatrix(Context *, Script *, const rsc_Matrix *m);
     51 void rsrVpLoadModelMatrix(Context *, Script *, const rsc_Matrix *m);
     52 void rsrVpLoadTextureMatrix(Context *, Script *, const rsc_Matrix *m);
     53 void rsrPfConstantColor(Context *, Script *, ProgramFragment *, float r, float g, float b, float a);
     54 void rsrVpGetProjectionMatrix(Context *, Script *, rsc_Matrix *m);
     55 
     56 //////////////////////////////////////////////////////////////////////////////
     57 // Drawing
     58 //////////////////////////////////////////////////////////////////////////////
     59 
     60 void rsrDrawQuadTexCoords(Context *, Script *,
     61                           float x1, float y1, float z1, float u1, float v1,
     62                           float x2, float y2, float z2, float u2, float v2,
     63                           float x3, float y3, float z3, float u3, float v3,
     64                           float x4, float y4, float z4, float u4, float v4);
     65 void rsrDrawQuad(Context *, Script *,
     66                  float x1, float y1, float z1,
     67                  float x2, float y2, float z2,
     68                  float x3, float y3, float z3,
     69                  float x4, float y4, float z4);
     70 void rsrDrawSpriteScreenspace(Context *, Script *,
     71                               float x, float y, float z, float w, float h);
     72 void rsrDrawRect(Context *, Script *, float x1, float y1, float x2, float y2, float z);
     73 void rsrDrawPath(Context *, Script *, Path *);
     74 void rsrDrawMesh(Context *, Script *, Mesh *);
     75 void rsrDrawMeshPrimitive(Context *, Script *, Mesh *, uint32_t primIndex);
     76 void rsrDrawMeshPrimitiveRange(Context *, Script *, Mesh *,
     77                                uint32_t primIndex, uint32_t start, uint32_t len);
     78 void rsrMeshComputeBoundingBox(Context *, Script *, Mesh *,
     79                                float *minX, float *minY, float *minZ,
     80                                float *maxX, float *maxY, float *maxZ);
     81 
     82 
     83 //////////////////////////////////////////////////////////////////////////////
     84 //
     85 //////////////////////////////////////////////////////////////////////////////
     86 
     87 
     88 void rsrColor(Context *, Script *, float r, float g, float b, float a);
     89 void rsrAllocationSyncAll(Context *, Script *, Allocation *);
     90 
     91 void rsrAllocationCopy1DRange(Context *, Allocation *dstAlloc,
     92                               uint32_t dstOff,
     93                               uint32_t dstMip,
     94                               uint32_t count,
     95                               Allocation *srcAlloc,
     96                               uint32_t srcOff, uint32_t srcMip);
     97 void rsrAllocationCopy2DRange(Context *, Allocation *dstAlloc,
     98                               uint32_t dstXoff, uint32_t dstYoff,
     99                               uint32_t dstMip, uint32_t dstFace,
    100                               uint32_t width, uint32_t height,
    101                               Allocation *srcAlloc,
    102                               uint32_t srcXoff, uint32_t srcYoff,
    103                               uint32_t srcMip, uint32_t srcFace);
    104 
    105 void rsrPrepareClear(Context *, Script *);
    106 uint32_t rsrGetWidth(Context *, Script *);
    107 uint32_t rsrGetHeight(Context *, Script *);
    108 void rsrDrawTextAlloc(Context *, Script *, Allocation *, int x, int y);
    109 void rsrDrawText(Context *, Script *, const char *text, int x, int y);
    110 void rsrSetMetrics(Context *, Script *, Font::Rect *metrics,
    111                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
    112 void rsrMeasureTextAlloc(Context *, Script *, Allocation *,
    113                          int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
    114 void rsrMeasureText(Context *, Script *, const char *text,
    115                     int32_t *left, int32_t *right, int32_t *top, int32_t *bottom);
    116 void rsrBindFont(Context *, Script *, Font *);
    117 void rsrFontColor(Context *, Script *, float r, float g, float b, float a);
    118 
    119 //////////////////////////////////////////////////////////////////////////////
    120 // Time routines
    121 //////////////////////////////////////////////////////////////////////////////
    122 
    123 float rsrGetDt(Context *, Script *);
    124 time_t rsrTime(Context *, Script *, time_t *timer);
    125 tm* rsrLocalTime(Context *, Script *, tm *local, time_t *timer);
    126 int64_t rsrUptimeMillis(Context *, Script *);
    127 int64_t rsrUptimeNanos(Context *, Script *);
    128 
    129 //////////////////////////////////////////////////////////////////////////////
    130 // Message routines
    131 //////////////////////////////////////////////////////////////////////////////
    132 
    133 uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len);
    134 uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len);
    135 
    136 //////////////////////////////////////////////////////////////////////////////
    137 //
    138 //////////////////////////////////////////////////////////////////////////////
    139 
    140 void rsrSetObject(const Context *, const Script *, ObjectBase **dst, ObjectBase * src);
    141 void rsrClearObject(const Context *, const Script *, ObjectBase **dst);
    142 bool rsrIsObject(const Context *, const Script *, const ObjectBase *src);
    143 
    144 void rsrAllocationIncRefs(const Context *, const Allocation *, void *ptr,
    145                           size_t elementCount, size_t startOffset);
    146 void rsrAllocationDecRefs(const Context *, const Allocation *, void *ptr,
    147                           size_t elementCount, size_t startOffset);
    148 
    149 
    150 uint32_t rsrToClient(Context *, Script *, int cmdID, void *data, int len);
    151 uint32_t rsrToClientBlocking(Context *, Script *, int cmdID, void *data, int len);
    152 const Allocation * rsrGetAllocation(Context *, Script *, const void *ptr);
    153 
    154 void rsrAllocationMarkDirty(Context *, Script *, RsAllocation a);
    155 void rsrAllocationSyncAll(Context *, Script *, Allocation *a, RsAllocationUsageType source);
    156 
    157 
    158 void rsrForEach(Context *, Script *, Script *target,
    159                 Allocation *in,
    160                 Allocation *out,
    161                 const void *usr,
    162                  uint32_t usrBytes,
    163                 const RsScriptCall *call);
    164 
    165 
    166 //////////////////////////////////////////////////////////////////////////////
    167 // Heavy math functions
    168 //////////////////////////////////////////////////////////////////////////////
    169 
    170 
    171 void rsrMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
    172 float rsrMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
    173 void rsrMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
    174 float rsrMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
    175 void rsrMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
    176 float rsrMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
    177 void rsrMatrixLoadIdentity_4x4(rs_matrix4x4 *m);
    178 void rsrMatrixLoadIdentity_3x3(rs_matrix3x3 *m);
    179 void rsrMatrixLoadIdentity_2x2(rs_matrix2x2 *m);
    180 void rsrMatrixLoad_4x4_f(rs_matrix4x4 *m, const float *v);
    181 void rsrMatrixLoad_3x3_f(rs_matrix3x3 *m, const float *v);
    182 void rsrMatrixLoad_2x2_f(rs_matrix2x2 *m, const float *v);
    183 void rsrMatrixLoad_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *v);
    184 void rsrMatrixLoad_4x4_3x3(rs_matrix4x4 *m, const rs_matrix3x3 *v);
    185 void rsrMatrixLoad_4x4_2x2(rs_matrix4x4 *m, const rs_matrix2x2 *v);
    186 void rsrMatrixLoad_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *v);
    187 void rsrMatrixLoad_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *v);
    188 void rsrMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
    189 void rsrMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
    190 void rsrMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
    191 void rsrMatrixLoadMultiply_4x4_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *lhs,
    192                                        const rs_matrix4x4 *rhs);
    193 void rsrMatrixMultiply_4x4_4x4(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
    194 void rsrMatrixLoadMultiply_3x3_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *lhs,
    195                                        const rs_matrix3x3 *rhs);
    196 void rsrMatrixMultiply_3x3_3x3(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
    197 void rsrMatrixLoadMultiply_2x2_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *lhs,
    198                                        const rs_matrix2x2 *rhs);
    199 void rsrMatrixMultiply_2x2_2x2(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
    200 void rsrMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
    201 void rsrMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
    202 void rsrMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
    203 void rsrMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right,
    204                         float bottom, float top, float near, float far);
    205 void rsrMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right,
    206                           float bottom, float top, float near, float far);
    207 void rsrMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
    208 
    209 // Returns true if the matrix was successfully inversed
    210 bool rsrMatrixInverse_4x4(rs_matrix4x4 *m);
    211 // Returns true if the matrix was successfully inversed
    212 bool rsrMatrixInverseTranspose_4x4(rs_matrix4x4 *m);
    213 
    214 void rsrMatrixTranspose_4x4(rs_matrix4x4 *m);
    215 void rsrMatrixTranspose_3x3(rs_matrix3x3 *m);
    216 void rsrMatrixTranspose_2x2(rs_matrix2x2 *m);
    217 
    218 }
    219 }
    220