blob: 995cef2d3baecfada483475fed181ddfcdeee3fe [file] [log] [blame]
Jason Samsaeb094b2010-05-18 13:35:45 -07001/*
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -07002 * Copyright (C) 2011 The Android Open Source Project
Jason Samsaeb094b2010-05-18 13:35:45 -07003 *
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"
Jason Sams87fe59a2011-04-20 15:09:01 -070019#include "rsMatrix4x4.h"
20#include "rsMatrix3x3.h"
21#include "rsMatrix2x2.h"
Alex Sakhartchouk4edf0302012-03-09 10:47:27 -080022#include "rsMesh.h"
23#include "rsgApiStructs.h"
Jason Samsaeb094b2010-05-18 13:35:45 -070024
Jason Samsaeb094b2010-05-18 13:35:45 -070025#include "utils/Timers.h"
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -070026#include "driver/rsdVertexArray.h"
27#include "driver/rsdShaderCache.h"
28#include "driver/rsdCore.h"
Jason Samsaeb094b2010-05-18 13:35:45 -070029
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
39using namespace android;
40using namespace android::renderscript;
41
Jason Sams87fe59a2011-04-20 15:09:01 -070042namespace android {
43namespace renderscript {
Jason Samsaeb094b2010-05-18 13:35:45 -070044
45//////////////////////////////////////////////////////////////////////////////
Jason Samsaeb094b2010-05-18 13:35:45 -070046// Context
47//////////////////////////////////////////////////////////////////////////////
48
Jason Sams87fe59a2011-04-20 15:09:01 -070049void rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
50 CHECK_OBJ_OR_NULL(a);
51 CHECK_OBJ(pf);
52 pf->bindTexture(rsc, slot, a);
Jason Samsaeb094b2010-05-18 13:35:45 -070053}
54
Alex Sakhartchouka720a142012-01-10 10:16:52 -080055void rsrBindConstant(Context *rsc, Script *sc, 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
Alex Sakhartchouk8e6bde72012-01-10 14:30:34 -080061void rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
Alex Sakhartchouka720a142012-01-10 10:16:52 -080062 CHECK_OBJ_OR_NULL(a);
Alex Sakhartchouk8e6bde72012-01-10 14:30:34 -080063 CHECK_OBJ(pv);
64 pv->bindAllocation(rsc, a, slot);
Alex Sakhartchouka720a142012-01-10 10:16:52 -080065}
66
Jason Sams87fe59a2011-04-20 15:09:01 -070067void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Sams605048a2010-09-30 18:15:52 -070068 CHECK_OBJ_OR_NULL(vs);
69 CHECK_OBJ(vpf);
Jason Sams87fe59a2011-04-20 15:09:01 -070070 pf->bindSampler(rsc, slot, s);
Jason Samsaeb094b2010-05-18 13:35:45 -070071}
72
Jason Sams87fe59a2011-04-20 15:09:01 -070073void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
74 CHECK_OBJ_OR_NULL(ps);
75 rsc->setProgramStore(ps);
Jason Samsaeb094b2010-05-18 13:35:45 -070076}
77
Jason Sams87fe59a2011-04-20 15:09:01 -070078void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
Jason Sams605048a2010-09-30 18:15:52 -070079 CHECK_OBJ_OR_NULL(pf);
Jason Sams87fe59a2011-04-20 15:09:01 -070080 rsc->setProgramFragment(pf);
Jason Samsaeb094b2010-05-18 13:35:45 -070081}
82
Jason Sams87fe59a2011-04-20 15:09:01 -070083void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
Jason Sams605048a2010-09-30 18:15:52 -070084 CHECK_OBJ_OR_NULL(pv);
Jason Sams87fe59a2011-04-20 15:09:01 -070085 rsc->setProgramVertex(pv);
Jason Samsaeb094b2010-05-18 13:35:45 -070086}
87
Jason Sams87fe59a2011-04-20 15:09:01 -070088void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
89 CHECK_OBJ_OR_NULL(pr);
90 rsc->setProgramRaster(pr);
Jason Samsaeb094b2010-05-18 13:35:45 -070091}
92
Jason Sams87fe59a2011-04-20 15:09:01 -070093void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070094 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070095 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080096 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070097}
98
Jason Sams87fe59a2011-04-20 15:09:01 -070099void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700100 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -0700101 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800102 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700103}
104
Jason Sams87fe59a2011-04-20 15:09:01 -0700105void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700106 rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800107 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700108}
109
Jason Sams87fe59a2011-04-20 15:09:01 -0700110void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700111 rsc->mFBOCache.bindDepthTarget(rsc, NULL);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800112 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700113}
114
Jason Sams87fe59a2011-04-20 15:09:01 -0700115void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700116 rsc->mFBOCache.resetAll(rsc);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800117 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700118}
119
Jason Samsaeb094b2010-05-18 13:35:45 -0700120//////////////////////////////////////////////////////////////////////////////
121// VP
122//////////////////////////////////////////////////////////////////////////////
123
Jason Sams87fe59a2011-04-20 15:09:01 -0700124void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800125 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millera490f102010-07-28 14:46:22 -0700126}
127
Jason Sams87fe59a2011-04-20 15:09:01 -0700128void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800129 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700130}
131
Jason Sams87fe59a2011-04-20 15:09:01 -0700132void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800133 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700134}
135
Jason Sams87fe59a2011-04-20 15:09:01 -0700136void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
137 float r, float g, float b, float a) {
138 CHECK_OBJ(pf);
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700139 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams6445e522010-08-04 17:50:20 -0700140}
141
Jason Sams87fe59a2011-04-20 15:09:01 -0700142void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800143 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchouk95333f92010-08-16 17:40:10 -0700144}
145
Jason Samsaeb094b2010-05-18 13:35:45 -0700146//////////////////////////////////////////////////////////////////////////////
147// Drawing
148//////////////////////////////////////////////////////////////////////////////
149
Jason Sams87fe59a2011-04-20 15:09:01 -0700150void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
151 float x1, float y1, float z1, float u1, float v1,
152 float x2, float y2, float z2, float u2, float v2,
153 float x3, float y3, float z3, float u3, float v3,
154 float x4, float y4, float z4, float u4, float v4) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700155 if (!rsc->setupCheck()) {
156 return;
157 }
158
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700159 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
160 if (!dc->gl.shaderCache->setup(rsc)) {
161 return;
162 }
163
Steve Blockaf12ac62012-01-06 19:20:56 +0000164 //ALOGE("Quad");
165 //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
166 //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
167 //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
168 //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
Jason Samsaeb094b2010-05-18 13:35:45 -0700169
170 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
171 const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
172
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700173 RsdVertexArray::Attrib attribs[2];
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800174 attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
175 attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
176
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700177 RsdVertexArray va(attribs, 2);
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700178 va.setup(rsc);
Jason Samsaeb094b2010-05-18 13:35:45 -0700179
Jason Sams2382aba2011-09-13 15:41:01 -0700180 RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
Jason Samsaeb094b2010-05-18 13:35:45 -0700181}
182
Jason Sams87fe59a2011-04-20 15:09:01 -0700183void rsrDrawQuad(Context *rsc, Script *sc,
184 float x1, float y1, float z1,
185 float x2, float y2, float z2,
186 float x3, float y3, float z3,
187 float x4, float y4, float z4) {
188 rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
189 x2, y2, z2, 1, 1,
190 x3, y3, z3, 1, 0,
191 x4, y4, z4, 0, 0);
Jason Samsaeb094b2010-05-18 13:35:45 -0700192}
193
Jason Sams87fe59a2011-04-20 15:09:01 -0700194void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
195 float x, float y, float z, float w, float h) {
Jason Sams60709252010-11-17 15:29:32 -0800196 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
197 rsc->setProgramVertex(rsc->getDefaultProgramVertex());
Jason Samsaeb094b2010-05-18 13:35:45 -0700198 //rsc->setupCheck();
199
200 //GLint crop[4] = {0, h, w, -h};
201
202 float sh = rsc->getHeight();
203
Jason Sams87fe59a2011-04-20 15:09:01 -0700204 rsrDrawQuad(rsc, sc,
205 x, sh - y, z,
Jason Samsaeb094b2010-05-18 13:35:45 -0700206 x+w, sh - y, z,
207 x+w, sh - (y+h), z,
208 x, sh - (y+h), z);
Jason Sams60709252010-11-17 15:29:32 -0800209 rsc->setProgramVertex((ProgramVertex *)tmp.get());
Jason Samsaeb094b2010-05-18 13:35:45 -0700210}
Jason Samsaeb094b2010-05-18 13:35:45 -0700211
Jason Sams87fe59a2011-04-20 15:09:01 -0700212void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
Steve Blockaf12ac62012-01-06 19:20:56 +0000213 //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
Jason Sams87fe59a2011-04-20 15:09:01 -0700214 rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
Jason Samsaeb094b2010-05-18 13:35:45 -0700215}
216
Jason Sams9e0afb52011-10-31 13:23:43 -0700217void rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
218 CHECK_OBJ(sm);
219 if (!rsc->setupCheck()) {
220 return;
221 }
222 sm->render(rsc);
223}
224
Jason Sams87fe59a2011-04-20 15:09:01 -0700225void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
226 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700227 if (!rsc->setupCheck()) {
228 return;
229 }
230 sm->render(rsc);
231}
232
Jason Sams87fe59a2011-04-20 15:09:01 -0700233void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
234 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700235 if (!rsc->setupCheck()) {
236 return;
237 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700238 sm->renderPrimitive(rsc, primIndex);
239}
240
Jason Sams87fe59a2011-04-20 15:09:01 -0700241void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
242 uint32_t start, uint32_t len) {
243 CHECK_OBJ(sm);
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700244 if (!rsc->setupCheck()) {
245 return;
246 }
247 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700248}
249
Jason Sams87fe59a2011-04-20 15:09:01 -0700250void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
251 float *minX, float *minY, float *minZ,
252 float *maxX, float *maxY, float *maxZ) {
253 CHECK_OBJ(sm);
Jason Samse3150cf2012-07-24 18:10:20 -0700254 sm->computeBBox(rsc);
Alex Sakhartchoukba4aa5c2010-08-13 14:32:23 -0700255 *minX = sm->mBBoxMin[0];
256 *minY = sm->mBBoxMin[1];
257 *minZ = sm->mBBoxMin[2];
258 *maxX = sm->mBBoxMax[0];
259 *maxY = sm->mBBoxMax[1];
260 *maxZ = sm->mBBoxMax[2];
261}
262
Jason Samsaeb094b2010-05-18 13:35:45 -0700263
264//////////////////////////////////////////////////////////////////////////////
265//
266//////////////////////////////////////////////////////////////////////////////
267
268
Jason Sams87fe59a2011-04-20 15:09:01 -0700269void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
270 ProgramFragment *pf = rsc->getProgramFragment();
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700271 pf->setConstantColor(rsc, r, g, b, a);
Jason Samsaeb094b2010-05-18 13:35:45 -0700272}
273
Alex Sakhartchouk653b53e2012-02-24 14:22:34 -0800274void rsrPrepareClear(Context *rsc, Script *sc) {
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700275 rsc->mFBOCache.setup(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700276 rsc->setupProgramStore();
Jason Samsaeb094b2010-05-18 13:35:45 -0700277}
278
Jason Sams87fe59a2011-04-20 15:09:01 -0700279uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700280 return rsc->getWidth();
281}
282
Jason Sams87fe59a2011-04-20 15:09:01 -0700283uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700284 return rsc->getHeight();
285}
286
Jason Sams87fe59a2011-04-20 15:09:01 -0700287void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
288 const char *text = (const char *)a->getPtr();
289 size_t allocSize = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700290 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700291}
292
Jason Sams87fe59a2011-04-20 15:09:01 -0700293void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700294 size_t textLen = strlen(text);
295 rsc->mStateFont.renderText(text, textLen, x, y);
296}
297
Jason Sams87fe59a2011-04-20 15:09:01 -0700298static void SetMetrics(Font::Rect *metrics,
299 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800300 if (left) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700301 *left = metrics->left;
302 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800303 if (right) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700304 *right = metrics->right;
305 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800306 if (top) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700307 *top = metrics->top;
308 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800309 if (bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700310 *bottom = metrics->bottom;
311 }
312}
313
Jason Sams87fe59a2011-04-20 15:09:01 -0700314void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
315 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
316 CHECK_OBJ(a);
317 const char *text = (const char *)a->getPtr();
318 size_t textLen = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700319 Font::Rect metrics;
320 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700321 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700322}
323
Jason Sams87fe59a2011-04-20 15:09:01 -0700324void rsrMeasureText(Context *rsc, Script *sc, const char *text,
325 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700326 size_t textLen = strlen(text);
327 Font::Rect metrics;
328 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700329 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700330}
331
Jason Sams87fe59a2011-04-20 15:09:01 -0700332void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Sams605048a2010-09-30 18:15:52 -0700333 CHECK_OBJ(font);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700334 rsi_ContextBindFont(rsc, font);
335}
Jason Samsaeb094b2010-05-18 13:35:45 -0700336
Jason Sams87fe59a2011-04-20 15:09:01 -0700337void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk9fc9f032010-08-04 14:45:48 -0700338 rsc->mStateFont.setFontColor(r, g, b, a);
339}
340
Jason Samsaeb094b2010-05-18 13:35:45 -0700341}
Jason Sams87fe59a2011-04-20 15:09:01 -0700342}