blob: 26e2374719ced90e701969047cb7aa797381d4e8 [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"
Jason Samsaeb094b2010-05-18 13:35:45 -070022
Jason Samsaeb094b2010-05-18 13:35:45 -070023#include "utils/Timers.h"
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -070024#include "driver/rsdVertexArray.h"
25#include "driver/rsdShaderCache.h"
26#include "driver/rsdCore.h"
Jason Samsaeb094b2010-05-18 13:35:45 -070027
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
37using namespace android;
38using namespace android::renderscript;
39
Jason Sams87fe59a2011-04-20 15:09:01 -070040namespace android {
41namespace renderscript {
Jason Samsaeb094b2010-05-18 13:35:45 -070042
43//////////////////////////////////////////////////////////////////////////////
Jason Samsaeb094b2010-05-18 13:35:45 -070044// Context
45//////////////////////////////////////////////////////////////////////////////
46
Jason Sams87fe59a2011-04-20 15:09:01 -070047void 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);
Jason Samsaeb094b2010-05-18 13:35:45 -070051}
52
Jason Sams87fe59a2011-04-20 15:09:01 -070053void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Sams605048a2010-09-30 18:15:52 -070054 CHECK_OBJ_OR_NULL(vs);
55 CHECK_OBJ(vpf);
Jason Sams87fe59a2011-04-20 15:09:01 -070056 pf->bindSampler(rsc, slot, s);
Jason Samsaeb094b2010-05-18 13:35:45 -070057}
58
Jason Sams87fe59a2011-04-20 15:09:01 -070059void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
60 CHECK_OBJ_OR_NULL(ps);
61 rsc->setProgramStore(ps);
Jason Samsaeb094b2010-05-18 13:35:45 -070062}
63
Jason Sams87fe59a2011-04-20 15:09:01 -070064void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
Jason Sams605048a2010-09-30 18:15:52 -070065 CHECK_OBJ_OR_NULL(pf);
Jason Sams87fe59a2011-04-20 15:09:01 -070066 rsc->setProgramFragment(pf);
Jason Samsaeb094b2010-05-18 13:35:45 -070067}
68
Jason Sams87fe59a2011-04-20 15:09:01 -070069void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
Jason Sams605048a2010-09-30 18:15:52 -070070 CHECK_OBJ_OR_NULL(pv);
Jason Sams87fe59a2011-04-20 15:09:01 -070071 rsc->setProgramVertex(pv);
Jason Samsaeb094b2010-05-18 13:35:45 -070072}
73
Jason Sams87fe59a2011-04-20 15:09:01 -070074void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
75 CHECK_OBJ_OR_NULL(pr);
76 rsc->setProgramRaster(pr);
Jason Samsaeb094b2010-05-18 13:35:45 -070077}
78
Jason Sams87fe59a2011-04-20 15:09:01 -070079void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070080 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070081 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080082 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070083}
84
Jason Sams87fe59a2011-04-20 15:09:01 -070085void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070086 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070087 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080088 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070089}
90
Jason Sams87fe59a2011-04-20 15:09:01 -070091void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070092 rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080093 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070094}
95
Jason Sams87fe59a2011-04-20 15:09:01 -070096void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070097 rsc->mFBOCache.bindDepthTarget(rsc, NULL);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080098 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070099}
100
Jason Sams87fe59a2011-04-20 15:09:01 -0700101void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700102 rsc->mFBOCache.resetAll(rsc);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800103 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700104}
105
Jason Samsaeb094b2010-05-18 13:35:45 -0700106//////////////////////////////////////////////////////////////////////////////
107// VP
108//////////////////////////////////////////////////////////////////////////////
109
Jason Sams87fe59a2011-04-20 15:09:01 -0700110void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800111 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millera490f102010-07-28 14:46:22 -0700112}
113
Jason Sams87fe59a2011-04-20 15:09:01 -0700114void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800115 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700116}
117
Jason Sams87fe59a2011-04-20 15:09:01 -0700118void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800119 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700120}
121
Jason Sams87fe59a2011-04-20 15:09:01 -0700122void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
123 float r, float g, float b, float a) {
124 CHECK_OBJ(pf);
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700125 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams6445e522010-08-04 17:50:20 -0700126}
127
Jason Sams87fe59a2011-04-20 15:09:01 -0700128void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800129 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchouk95333f92010-08-16 17:40:10 -0700130}
131
Jason Samsaeb094b2010-05-18 13:35:45 -0700132//////////////////////////////////////////////////////////////////////////////
133// Drawing
134//////////////////////////////////////////////////////////////////////////////
135
Jason Sams87fe59a2011-04-20 15:09:01 -0700136void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
137 float x1, float y1, float z1, float u1, float v1,
138 float x2, float y2, float z2, float u2, float v2,
139 float x3, float y3, float z3, float u3, float v3,
140 float x4, float y4, float z4, float u4, float v4) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700141 if (!rsc->setupCheck()) {
142 return;
143 }
144
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700145 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
146 if (!dc->gl.shaderCache->setup(rsc)) {
147 return;
148 }
149
Jason Samsaeb094b2010-05-18 13:35:45 -0700150 //LOGE("Quad");
151 //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
152 //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
153 //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
154 //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
155
156 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
157 const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
158
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700159 RsdVertexArray::Attrib attribs[2];
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800160 attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
161 attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
162
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -0700163 RsdVertexArray va(attribs, 2);
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700164 va.setup(rsc);
Jason Samsaeb094b2010-05-18 13:35:45 -0700165
Jason Sams2382aba2011-09-13 15:41:01 -0700166 RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
Jason Samsaeb094b2010-05-18 13:35:45 -0700167}
168
Jason Sams87fe59a2011-04-20 15:09:01 -0700169void rsrDrawQuad(Context *rsc, Script *sc,
170 float x1, float y1, float z1,
171 float x2, float y2, float z2,
172 float x3, float y3, float z3,
173 float x4, float y4, float z4) {
174 rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
175 x2, y2, z2, 1, 1,
176 x3, y3, z3, 1, 0,
177 x4, y4, z4, 0, 0);
Jason Samsaeb094b2010-05-18 13:35:45 -0700178}
179
Jason Sams87fe59a2011-04-20 15:09:01 -0700180void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
181 float x, float y, float z, float w, float h) {
Jason Sams60709252010-11-17 15:29:32 -0800182 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
183 rsc->setProgramVertex(rsc->getDefaultProgramVertex());
Jason Samsaeb094b2010-05-18 13:35:45 -0700184 //rsc->setupCheck();
185
186 //GLint crop[4] = {0, h, w, -h};
187
188 float sh = rsc->getHeight();
189
Jason Sams87fe59a2011-04-20 15:09:01 -0700190 rsrDrawQuad(rsc, sc,
191 x, sh - y, z,
Jason Samsaeb094b2010-05-18 13:35:45 -0700192 x+w, sh - y, z,
193 x+w, sh - (y+h), z,
194 x, sh - (y+h), z);
Jason Sams60709252010-11-17 15:29:32 -0800195 rsc->setProgramVertex((ProgramVertex *)tmp.get());
Jason Samsaeb094b2010-05-18 13:35:45 -0700196}
Jason Samsaeb094b2010-05-18 13:35:45 -0700197
Jason Sams87fe59a2011-04-20 15:09:01 -0700198void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700199 //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
Jason Sams87fe59a2011-04-20 15:09:01 -0700200 rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
Jason Samsaeb094b2010-05-18 13:35:45 -0700201}
202
Jason Sams87fe59a2011-04-20 15:09:01 -0700203void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
204 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700205 if (!rsc->setupCheck()) {
206 return;
207 }
208 sm->render(rsc);
209}
210
Jason Sams87fe59a2011-04-20 15:09:01 -0700211void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
212 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700213 if (!rsc->setupCheck()) {
214 return;
215 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700216 sm->renderPrimitive(rsc, primIndex);
217}
218
Jason Sams87fe59a2011-04-20 15:09:01 -0700219void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
220 uint32_t start, uint32_t len) {
221 CHECK_OBJ(sm);
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700222 if (!rsc->setupCheck()) {
223 return;
224 }
225 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700226}
227
Jason Sams87fe59a2011-04-20 15:09:01 -0700228void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
229 float *minX, float *minY, float *minZ,
230 float *maxX, float *maxY, float *maxZ) {
231 CHECK_OBJ(sm);
Alex Sakhartchoukba4aa5c2010-08-13 14:32:23 -0700232 sm->computeBBox();
233 *minX = sm->mBBoxMin[0];
234 *minY = sm->mBBoxMin[1];
235 *minZ = sm->mBBoxMin[2];
236 *maxX = sm->mBBoxMax[0];
237 *maxY = sm->mBBoxMax[1];
238 *maxZ = sm->mBBoxMax[2];
239}
240
Jason Samsaeb094b2010-05-18 13:35:45 -0700241
242//////////////////////////////////////////////////////////////////////////////
243//
244//////////////////////////////////////////////////////////////////////////////
245
246
Jason Sams87fe59a2011-04-20 15:09:01 -0700247void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
248 ProgramFragment *pf = rsc->getProgramFragment();
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700249 pf->setConstantColor(rsc, r, g, b, a);
Jason Samsaeb094b2010-05-18 13:35:45 -0700250}
251
Jason Sams87fe59a2011-04-20 15:09:01 -0700252void rsrFinish(Context *rsc, Script *sc) {
Jason Sams2382aba2011-09-13 15:41:01 -0700253 RSD_CALL_GL(glFinish);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700254}
255
Jason Samsb7e83bd2010-12-15 01:41:00 -0800256
Jason Sams87fe59a2011-04-20 15:09:01 -0700257void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700258 rsc->mFBOCache.setup(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700259 rsc->setupProgramStore();
Jason Sams22fa3712010-05-19 17:22:57 -0700260
Jason Sams2382aba2011-09-13 15:41:01 -0700261 RSD_CALL_GL(glClearColor, r, g, b, a);
262 RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
Jason Sams22fa3712010-05-19 17:22:57 -0700263}
264
Jason Sams87fe59a2011-04-20 15:09:01 -0700265void rsrClearDepth(Context *rsc, Script *sc, float v) {
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700266 rsc->mFBOCache.setup(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700267 rsc->setupProgramStore();
Jason Sams22fa3712010-05-19 17:22:57 -0700268
Jason Sams2382aba2011-09-13 15:41:01 -0700269 RSD_CALL_GL(glClearDepthf, v);
270 RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
Jason Samsaeb094b2010-05-18 13:35:45 -0700271}
272
Jason Sams87fe59a2011-04-20 15:09:01 -0700273uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700274 return rsc->getWidth();
275}
276
Jason Sams87fe59a2011-04-20 15:09:01 -0700277uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700278 return rsc->getHeight();
279}
280
Jason Sams87fe59a2011-04-20 15:09:01 -0700281void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
282 const char *text = (const char *)a->getPtr();
283 size_t allocSize = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700284 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700285}
286
Jason Sams87fe59a2011-04-20 15:09:01 -0700287void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700288 size_t textLen = strlen(text);
289 rsc->mStateFont.renderText(text, textLen, x, y);
290}
291
Jason Sams87fe59a2011-04-20 15:09:01 -0700292static void SetMetrics(Font::Rect *metrics,
293 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800294 if (left) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700295 *left = metrics->left;
296 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800297 if (right) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700298 *right = metrics->right;
299 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800300 if (top) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700301 *top = metrics->top;
302 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800303 if (bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700304 *bottom = metrics->bottom;
305 }
306}
307
Jason Sams87fe59a2011-04-20 15:09:01 -0700308void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
309 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
310 CHECK_OBJ(a);
311 const char *text = (const char *)a->getPtr();
312 size_t textLen = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700313 Font::Rect metrics;
314 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700315 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700316}
317
Jason Sams87fe59a2011-04-20 15:09:01 -0700318void rsrMeasureText(Context *rsc, Script *sc, const char *text,
319 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700320 size_t textLen = strlen(text);
321 Font::Rect metrics;
322 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700323 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700324}
325
Jason Sams87fe59a2011-04-20 15:09:01 -0700326void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Sams605048a2010-09-30 18:15:52 -0700327 CHECK_OBJ(font);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700328 rsi_ContextBindFont(rsc, font);
329}
Jason Samsaeb094b2010-05-18 13:35:45 -0700330
Jason Sams87fe59a2011-04-20 15:09:01 -0700331void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk9fc9f032010-08-04 14:45:48 -0700332 rsc->mStateFont.setFontColor(r, g, b, a);
333}
334
Jason Samsaeb094b2010-05-18 13:35:45 -0700335}
Jason Sams87fe59a2011-04-20 15:09:01 -0700336}