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