• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 #include "utils/Timers.h"
24 #include "driver/rsdVertexArray.h"
25 #include "driver/rsdShaderCache.h"
26 #include "driver/rsdCore.h"
27 
28 #define GL_GLEXT_PROTOTYPES
29 
30 #include <GLES/gl.h>
31 #include <GLES/glext.h>
32 #include <GLES2/gl2.h>
33 #include <GLES2/gl2ext.h>
34 
35 #include <time.h>
36 
37 using namespace android;
38 using namespace android::renderscript;
39 
40 namespace android {
41 namespace renderscript {
42 
43 //////////////////////////////////////////////////////////////////////////////
44 // Context
45 //////////////////////////////////////////////////////////////////////////////
46 
rsrBindTexture(Context * rsc,Script * sc,ProgramFragment * pf,uint32_t slot,Allocation * a)47 void rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
48     CHECK_OBJ_OR_NULL(a);
49     CHECK_OBJ(pf);
50     pf->bindTexture(rsc, slot, a);
51 }
52 
rsrBindSampler(Context * rsc,Script * sc,ProgramFragment * pf,uint32_t slot,Sampler * s)53 void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
54     CHECK_OBJ_OR_NULL(vs);
55     CHECK_OBJ(vpf);
56     pf->bindSampler(rsc, slot, s);
57 }
58 
rsrBindProgramStore(Context * rsc,Script * sc,ProgramStore * ps)59 void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
60     CHECK_OBJ_OR_NULL(ps);
61     rsc->setProgramStore(ps);
62 }
63 
rsrBindProgramFragment(Context * rsc,Script * sc,ProgramFragment * pf)64 void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
65     CHECK_OBJ_OR_NULL(pf);
66     rsc->setProgramFragment(pf);
67 }
68 
rsrBindProgramVertex(Context * rsc,Script * sc,ProgramVertex * pv)69 void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
70     CHECK_OBJ_OR_NULL(pv);
71     rsc->setProgramVertex(pv);
72 }
73 
rsrBindProgramRaster(Context * rsc,Script * sc,ProgramRaster * pr)74 void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
75     CHECK_OBJ_OR_NULL(pr);
76     rsc->setProgramRaster(pr);
77 }
78 
rsrBindFrameBufferObjectColorTarget(Context * rsc,Script * sc,Allocation * a,uint32_t slot)79 void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
80     CHECK_OBJ(va);
81     rsc->mFBOCache.bindColorTarget(rsc, a, slot);
82 }
83 
rsrBindFrameBufferObjectDepthTarget(Context * rsc,Script * sc,Allocation * a)84 void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
85     CHECK_OBJ(va);
86     rsc->mFBOCache.bindDepthTarget(rsc, a);
87 }
88 
rsrClearFrameBufferObjectColorTarget(Context * rsc,Script * sc,uint32_t slot)89 void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
90     rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
91 }
92 
rsrClearFrameBufferObjectDepthTarget(Context * rsc,Script * sc)93 void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
94     rsc->mFBOCache.bindDepthTarget(rsc, NULL);
95 }
96 
rsrClearFrameBufferObjectTargets(Context * rsc,Script * sc)97 void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
98     rsc->mFBOCache.resetAll(rsc);
99 }
100 
101 //////////////////////////////////////////////////////////////////////////////
102 // VP
103 //////////////////////////////////////////////////////////////////////////////
104 
rsrVpLoadProjectionMatrix(Context * rsc,Script * sc,const rsc_Matrix * m)105 void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
106     rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
107 }
108 
rsrVpLoadModelMatrix(Context * rsc,Script * sc,const rsc_Matrix * m)109 void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
110     rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
111 }
112 
rsrVpLoadTextureMatrix(Context * rsc,Script * sc,const rsc_Matrix * m)113 void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
114     rsc->getProgramVertex()->setTextureMatrix(rsc, m);
115 }
116 
rsrPfConstantColor(Context * rsc,Script * sc,ProgramFragment * pf,float r,float g,float b,float a)117 void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
118                         float r, float g, float b, float a) {
119     CHECK_OBJ(pf);
120     pf->setConstantColor(rsc, r, g, b, a);
121 }
122 
rsrVpGetProjectionMatrix(Context * rsc,Script * sc,rsc_Matrix * m)123 void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
124     rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
125 }
126 
127 //////////////////////////////////////////////////////////////////////////////
128 // Drawing
129 //////////////////////////////////////////////////////////////////////////////
130 
rsrDrawQuadTexCoords(Context * rsc,Script * sc,float x1,float y1,float z1,float u1,float v1,float x2,float y2,float z2,float u2,float v2,float x3,float y3,float z3,float u3,float v3,float x4,float y4,float z4,float u4,float v4)131 void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
132                           float x1, float y1, float z1, float u1, float v1,
133                           float x2, float y2, float z2, float u2, float v2,
134                           float x3, float y3, float z3, float u3, float v3,
135                           float x4, float y4, float z4, float u4, float v4) {
136     if (!rsc->setupCheck()) {
137         return;
138     }
139 
140     RsdHal *dc = (RsdHal *)rsc->mHal.drv;
141     if (!dc->gl.shaderCache->setup(rsc)) {
142         return;
143     }
144 
145     //LOGE("Quad");
146     //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
147     //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
148     //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
149     //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
150 
151     float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
152     const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
153 
154     RsdVertexArray::Attrib attribs[2];
155     attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
156     attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
157 
158     RsdVertexArray va(attribs, 2);
159     va.setup(rsc);
160 
161     RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
162 }
163 
rsrDrawQuad(Context * rsc,Script * sc,float x1,float y1,float z1,float x2,float y2,float z2,float x3,float y3,float z3,float x4,float y4,float z4)164 void rsrDrawQuad(Context *rsc, Script *sc,
165                  float x1, float y1, float z1,
166                  float x2, float y2, float z2,
167                  float x3, float y3, float z3,
168                  float x4, float y4, float z4) {
169     rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
170                                   x2, y2, z2, 1, 1,
171                                   x3, y3, z3, 1, 0,
172                                   x4, y4, z4, 0, 0);
173 }
174 
rsrDrawSpriteScreenspace(Context * rsc,Script * sc,float x,float y,float z,float w,float h)175 void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
176                               float x, float y, float z, float w, float h) {
177     ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
178     rsc->setProgramVertex(rsc->getDefaultProgramVertex());
179     //rsc->setupCheck();
180 
181     //GLint crop[4] = {0, h, w, -h};
182 
183     float sh = rsc->getHeight();
184 
185     rsrDrawQuad(rsc, sc,
186                 x,   sh - y,     z,
187                 x+w, sh - y,     z,
188                 x+w, sh - (y+h), z,
189                 x,   sh - (y+h), z);
190     rsc->setProgramVertex((ProgramVertex *)tmp.get());
191 }
192 
rsrDrawRect(Context * rsc,Script * sc,float x1,float y1,float x2,float y2,float z)193 void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
194     //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
195     rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
196 }
197 
rsrDrawMesh(Context * rsc,Script * sc,Mesh * sm)198 void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
199     CHECK_OBJ(sm);
200     if (!rsc->setupCheck()) {
201         return;
202     }
203     sm->render(rsc);
204 }
205 
rsrDrawMeshPrimitive(Context * rsc,Script * sc,Mesh * sm,uint32_t primIndex)206 void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
207     CHECK_OBJ(sm);
208     if (!rsc->setupCheck()) {
209         return;
210     }
211     sm->renderPrimitive(rsc, primIndex);
212 }
213 
rsrDrawMeshPrimitiveRange(Context * rsc,Script * sc,Mesh * sm,uint32_t primIndex,uint32_t start,uint32_t len)214 void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
215                                uint32_t start, uint32_t len) {
216     CHECK_OBJ(sm);
217     if (!rsc->setupCheck()) {
218         return;
219     }
220     sm->renderPrimitiveRange(rsc, primIndex, start, len);
221 }
222 
rsrMeshComputeBoundingBox(Context * rsc,Script * sc,Mesh * sm,float * minX,float * minY,float * minZ,float * maxX,float * maxY,float * maxZ)223 void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
224                                float *minX, float *minY, float *minZ,
225                                float *maxX, float *maxY, float *maxZ) {
226     CHECK_OBJ(sm);
227     sm->computeBBox();
228     *minX = sm->mBBoxMin[0];
229     *minY = sm->mBBoxMin[1];
230     *minZ = sm->mBBoxMin[2];
231     *maxX = sm->mBBoxMax[0];
232     *maxY = sm->mBBoxMax[1];
233     *maxZ = sm->mBBoxMax[2];
234 }
235 
236 
237 //////////////////////////////////////////////////////////////////////////////
238 //
239 //////////////////////////////////////////////////////////////////////////////
240 
241 
rsrColor(Context * rsc,Script * sc,float r,float g,float b,float a)242 void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
243     ProgramFragment *pf = rsc->getProgramFragment();
244     pf->setConstantColor(rsc, r, g, b, a);
245 }
246 
rsrFinish(Context * rsc,Script * sc)247 void rsrFinish(Context *rsc, Script *sc) {
248     RSD_CALL_GL(glFinish);
249 }
250 
251 
rsrClearColor(Context * rsc,Script * sc,float r,float g,float b,float a)252 void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
253     rsc->mFBOCache.setup(rsc);
254     rsc->setupProgramStore();
255 
256     RSD_CALL_GL(glClearColor, r, g, b, a);
257     RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
258 }
259 
rsrClearDepth(Context * rsc,Script * sc,float v)260 void rsrClearDepth(Context *rsc, Script *sc, float v) {
261     rsc->mFBOCache.setup(rsc);
262     rsc->setupProgramStore();
263 
264     RSD_CALL_GL(glClearDepthf, v);
265     RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
266 }
267 
rsrGetWidth(Context * rsc,Script * sc)268 uint32_t rsrGetWidth(Context *rsc, Script *sc) {
269     return rsc->getWidth();
270 }
271 
rsrGetHeight(Context * rsc,Script * sc)272 uint32_t rsrGetHeight(Context *rsc, Script *sc) {
273     return rsc->getHeight();
274 }
275 
rsrDrawTextAlloc(Context * rsc,Script * sc,Allocation * a,int x,int y)276 void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
277     const char *text = (const char *)a->getPtr();
278     size_t allocSize = a->getType()->getSizeBytes();
279     rsc->mStateFont.renderText(text, allocSize, x, y);
280 }
281 
rsrDrawText(Context * rsc,Script * sc,const char * text,int x,int y)282 void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
283     size_t textLen = strlen(text);
284     rsc->mStateFont.renderText(text, textLen, x, y);
285 }
286 
SetMetrics(Font::Rect * metrics,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)287 static void SetMetrics(Font::Rect *metrics,
288                        int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
289     if (left) {
290         *left = metrics->left;
291     }
292     if (right) {
293         *right = metrics->right;
294     }
295     if (top) {
296         *top = metrics->top;
297     }
298     if (bottom) {
299         *bottom = metrics->bottom;
300     }
301 }
302 
rsrMeasureTextAlloc(Context * rsc,Script * sc,Allocation * a,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)303 void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
304                          int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
305     CHECK_OBJ(a);
306     const char *text = (const char *)a->getPtr();
307     size_t textLen = a->getType()->getSizeBytes();
308     Font::Rect metrics;
309     rsc->mStateFont.measureText(text, textLen, &metrics);
310     SetMetrics(&metrics, left, right, top, bottom);
311 }
312 
rsrMeasureText(Context * rsc,Script * sc,const char * text,int32_t * left,int32_t * right,int32_t * top,int32_t * bottom)313 void rsrMeasureText(Context *rsc, Script *sc, const char *text,
314                     int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
315     size_t textLen = strlen(text);
316     Font::Rect metrics;
317     rsc->mStateFont.measureText(text, textLen, &metrics);
318     SetMetrics(&metrics, left, right, top, bottom);
319 }
320 
rsrBindFont(Context * rsc,Script * sc,Font * font)321 void rsrBindFont(Context *rsc, Script *sc, Font *font) {
322     CHECK_OBJ(font);
323     rsi_ContextBindFont(rsc, font);
324 }
325 
rsrFontColor(Context * rsc,Script * sc,float r,float g,float b,float a)326 void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
327     rsc->mStateFont.setFontColor(r, g, b, a);
328 }
329 
330 }
331 }
332