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