Home | History | Annotate | Download | only in rs
      1 /*
      2  * Copyright (C) 2011 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 #include "rsMatrix4x4.h"
     20 #include "rsMatrix3x3.h"
     21 #include "rsMatrix2x2.h"
     22 #include "rsMesh.h"
     23 #include "rsgApiStructs.h"
     24 
     25 #include "driver/rsdVertexArray.h"
     26 #include "driver/rsdShaderCache.h"
     27 #include "driver/rsdCore.h"
     28 
     29 #define GL_GLEXT_PROTOTYPES
     30 
     31 #include <GLES/gl.h>
     32 #include <GLES/glext.h>
     33 #include <GLES2/gl2.h>
     34 #include <GLES2/gl2ext.h>
     35 
     36 #include <time.h>
     37 
     38 namespace android {
     39 namespace renderscript {
     40 
     41 //////////////////////////////////////////////////////////////////////////////
     42 // Context
     43 //////////////////////////////////////////////////////////////////////////////
     44 
     45 void rsrBindTexture(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
     46     CHECK_OBJ_OR_NULL(a);
     47     CHECK_OBJ(pf);
     48     pf->bindTexture(rsc, slot, a);
     49 }
     50 
     51 void rsrBindConstant(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
     52     CHECK_OBJ_OR_NULL(a);
     53     CHECK_OBJ(pf);
     54     pf->bindAllocation(rsc, a, slot);
     55 }
     56 
     57 void rsrBindConstant(Context *rsc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
     58     CHECK_OBJ_OR_NULL(a);
     59     CHECK_OBJ(pv);
     60     pv->bindAllocation(rsc, a, slot);
     61 }
     62 
     63 void rsrBindSampler(Context *rsc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
     64     CHECK_OBJ_OR_NULL(vs);
     65     CHECK_OBJ(vpf);
     66     pf->bindSampler(rsc, slot, s);
     67 }
     68 
     69 void rsrBindProgramStore(Context *rsc, ProgramStore *ps) {
     70     CHECK_OBJ_OR_NULL(ps);
     71     rsc->setProgramStore(ps);
     72 }
     73 
     74 void rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) {
     75     CHECK_OBJ_OR_NULL(pf);
     76     rsc->setProgramFragment(pf);
     77 }
     78 
     79 void rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) {
     80     CHECK_OBJ_OR_NULL(pv);
     81     rsc->setProgramVertex(pv);
     82 }
     83 
     84 void rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) {
     85     CHECK_OBJ_OR_NULL(pr);
     86     rsc->setProgramRaster(pr);
     87 }
     88 
     89 void rsrBindFrameBufferObjectColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
     90     CHECK_OBJ(va);
     91     rsc->mFBOCache.bindColorTarget(rsc, a, slot);
     92     rsc->mStateVertex.updateSize(rsc);
     93 }
     94 
     95 void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) {
     96     CHECK_OBJ(va);
     97     rsc->mFBOCache.bindDepthTarget(rsc, a);
     98     rsc->mStateVertex.updateSize(rsc);
     99 }
    100 
    101 void rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) {
    102     rsc->mFBOCache.bindColorTarget(rsc, nullptr, slot);
    103     rsc->mStateVertex.updateSize(rsc);
    104 }
    105 
    106 void rsrClearFrameBufferObjectDepthTarget(Context *rsc) {
    107     rsc->mFBOCache.bindDepthTarget(rsc, nullptr);
    108     rsc->mStateVertex.updateSize(rsc);
    109 }
    110 
    111 void rsrClearFrameBufferObjectTargets(Context *rsc) {
    112     rsc->mFBOCache.resetAll(rsc);
    113     rsc->mStateVertex.updateSize(rsc);
    114 }
    115 
    116 //////////////////////////////////////////////////////////////////////////////
    117 // VP
    118 //////////////////////////////////////////////////////////////////////////////
    119 
    120 void rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) {
    121     rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
    122 }
    123 
    124 void rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) {
    125     rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
    126 }
    127 
    128 void rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) {
    129     rsc->getProgramVertex()->setTextureMatrix(rsc, m);
    130 }
    131 
    132 void rsrPfConstantColor(Context *rsc, ProgramFragment *pf,
    133                         float r, float g, float b, float a) {
    134     CHECK_OBJ(pf);
    135     pf->setConstantColor(rsc, r, g, b, a);
    136 }
    137 
    138 void rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) {
    139     rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
    140 }
    141 
    142 //////////////////////////////////////////////////////////////////////////////
    143 // Drawing
    144 //////////////////////////////////////////////////////////////////////////////
    145 
    146 
    147 void rsrDrawPath(Context *rsc, Path *sm) {
    148     // Never shipped in a working state
    149 }
    150 
    151 void rsrDrawMesh(Context *rsc, Mesh *sm) {
    152     CHECK_OBJ(sm);
    153     if (!rsc->setupCheck()) {
    154         return;
    155     }
    156     sm->render(rsc);
    157 }
    158 
    159 void rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) {
    160     CHECK_OBJ(sm);
    161     if (!rsc->setupCheck()) {
    162         return;
    163     }
    164     sm->renderPrimitive(rsc, primIndex);
    165 }
    166 
    167 void rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex,
    168                                uint32_t start, uint32_t len) {
    169     CHECK_OBJ(sm);
    170     if (!rsc->setupCheck()) {
    171         return;
    172     }
    173     sm->renderPrimitiveRange(rsc, primIndex, start, len);
    174 }
    175 
    176 void rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm,
    177                                float *minX, float *minY, float *minZ,
    178                                float *maxX, float *maxY, float *maxZ) {
    179     CHECK_OBJ(sm);
    180     sm->computeBBox(rsc);
    181     *minX = sm->mBBoxMin[0];
    182     *minY = sm->mBBoxMin[1];
    183     *minZ = sm->mBBoxMin[2];
    184     *maxX = sm->mBBoxMax[0];
    185     *maxY = sm->mBBoxMax[1];
    186     *maxZ = sm->mBBoxMax[2];
    187 }
    188 
    189 
    190 //////////////////////////////////////////////////////////////////////////////
    191 //
    192 //////////////////////////////////////////////////////////////////////////////
    193 
    194 
    195 void rsrColor(Context *rsc, float r, float g, float b, float a) {
    196     ProgramFragment *pf = rsc->getProgramFragment();
    197     pf->setConstantColor(rsc, r, g, b, a);
    198 }
    199 
    200 void rsrPrepareClear(Context *rsc) {
    201     rsc->mFBOCache.setup(rsc);
    202     rsc->setupProgramStore();
    203 }
    204 
    205 uint32_t rsrGetWidth(Context *rsc) {
    206     return rsc->getWidth();
    207 }
    208 
    209 uint32_t rsrGetHeight(Context *rsc) {
    210     return rsc->getHeight();
    211 }
    212 
    213 void rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) {
    214     const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
    215     size_t allocSize = a->getType()->getPackedSizeBytes();
    216     rsc->mStateFont.renderText(text, allocSize, x, y);
    217     rsc->mHal.funcs.allocation.unlock1D(rsc, a);
    218 }
    219 
    220 void rsrDrawText(Context *rsc, const char *text, int x, int y) {
    221     size_t textLen = strlen(text);
    222     rsc->mStateFont.renderText(text, textLen, x, y);
    223 }
    224 
    225 static void SetMetrics(Font::Rect *metrics,
    226                        int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
    227     if (left) {
    228         *left = metrics->left;
    229     }
    230     if (right) {
    231         *right = metrics->right;
    232     }
    233     if (top) {
    234         *top = metrics->top;
    235     }
    236     if (bottom) {
    237         *bottom = metrics->bottom;
    238     }
    239 }
    240 
    241 void rsrMeasureTextAlloc(Context *rsc, Allocation *a,
    242                          int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
    243     CHECK_OBJ(a);
    244     const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
    245     size_t textLen = a->getType()->getPackedSizeBytes();
    246     Font::Rect metrics;
    247     rsc->mStateFont.measureText(text, textLen, &metrics);
    248     SetMetrics(&metrics, left, right, top, bottom);
    249     rsc->mHal.funcs.allocation.unlock1D(rsc, a);
    250 }
    251 
    252 void rsrMeasureText(Context *rsc, const char *text,
    253                     int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
    254     size_t textLen = strlen(text);
    255     Font::Rect metrics;
    256     rsc->mStateFont.measureText(text, textLen, &metrics);
    257     SetMetrics(&metrics, left, right, top, bottom);
    258 }
    259 
    260 void rsrBindFont(Context *rsc, Font *font) {
    261     CHECK_OBJ(font);
    262     rsi_ContextBindFont(rsc, font);
    263 }
    264 
    265 void rsrFontColor(Context *rsc, float r, float g, float b, float a) {
    266     rsc->mStateFont.setFontColor(r, g, b, a);
    267 }
    268 
    269 } // namespace renderscript
    270 } // namespace android
    271