blob: a79c3cbb1dcf0e716c0decddcbb58274c30f1e8d [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 Sams9e0afb52011-10-31 13:23:43 -0700203void rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
204 CHECK_OBJ(sm);
205 if (!rsc->setupCheck()) {
206 return;
207 }
208 sm->render(rsc);
209}
210
Jason Sams87fe59a2011-04-20 15:09:01 -0700211void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
212 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700213 if (!rsc->setupCheck()) {
214 return;
215 }
216 sm->render(rsc);
217}
218
Jason Sams87fe59a2011-04-20 15:09:01 -0700219void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
220 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700221 if (!rsc->setupCheck()) {
222 return;
223 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700224 sm->renderPrimitive(rsc, primIndex);
225}
226
Jason Sams87fe59a2011-04-20 15:09:01 -0700227void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
228 uint32_t start, uint32_t len) {
229 CHECK_OBJ(sm);
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700230 if (!rsc->setupCheck()) {
231 return;
232 }
233 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700234}
235
Jason Sams87fe59a2011-04-20 15:09:01 -0700236void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
237 float *minX, float *minY, float *minZ,
238 float *maxX, float *maxY, float *maxZ) {
239 CHECK_OBJ(sm);
Alex Sakhartchoukba4aa5c2010-08-13 14:32:23 -0700240 sm->computeBBox();
241 *minX = sm->mBBoxMin[0];
242 *minY = sm->mBBoxMin[1];
243 *minZ = sm->mBBoxMin[2];
244 *maxX = sm->mBBoxMax[0];
245 *maxY = sm->mBBoxMax[1];
246 *maxZ = sm->mBBoxMax[2];
247}
248
Jason Samsaeb094b2010-05-18 13:35:45 -0700249
250//////////////////////////////////////////////////////////////////////////////
251//
252//////////////////////////////////////////////////////////////////////////////
253
254
Jason Sams87fe59a2011-04-20 15:09:01 -0700255void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
256 ProgramFragment *pf = rsc->getProgramFragment();
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700257 pf->setConstantColor(rsc, r, g, b, a);
Jason Samsaeb094b2010-05-18 13:35:45 -0700258}
259
Jason Sams87fe59a2011-04-20 15:09:01 -0700260void rsrFinish(Context *rsc, Script *sc) {
Jason Sams2382aba2011-09-13 15:41:01 -0700261 RSD_CALL_GL(glFinish);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700262}
263
Jason Samsb7e83bd2010-12-15 01:41:00 -0800264
Jason Sams87fe59a2011-04-20 15:09:01 -0700265void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
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(glClearColor, r, g, b, a);
270 RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
Jason Sams22fa3712010-05-19 17:22:57 -0700271}
272
Jason Sams87fe59a2011-04-20 15:09:01 -0700273void rsrClearDepth(Context *rsc, Script *sc, float v) {
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700274 rsc->mFBOCache.setup(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700275 rsc->setupProgramStore();
Jason Sams22fa3712010-05-19 17:22:57 -0700276
Jason Sams2382aba2011-09-13 15:41:01 -0700277 RSD_CALL_GL(glClearDepthf, v);
278 RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
Jason Samsaeb094b2010-05-18 13:35:45 -0700279}
280
Jason Sams87fe59a2011-04-20 15:09:01 -0700281uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700282 return rsc->getWidth();
283}
284
Jason Sams87fe59a2011-04-20 15:09:01 -0700285uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700286 return rsc->getHeight();
287}
288
Jason Sams87fe59a2011-04-20 15:09:01 -0700289void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
290 const char *text = (const char *)a->getPtr();
291 size_t allocSize = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700292 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700293}
294
Jason Sams87fe59a2011-04-20 15:09:01 -0700295void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700296 size_t textLen = strlen(text);
297 rsc->mStateFont.renderText(text, textLen, x, y);
298}
299
Jason Sams87fe59a2011-04-20 15:09:01 -0700300static void SetMetrics(Font::Rect *metrics,
301 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800302 if (left) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700303 *left = metrics->left;
304 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800305 if (right) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700306 *right = metrics->right;
307 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800308 if (top) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700309 *top = metrics->top;
310 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800311 if (bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700312 *bottom = metrics->bottom;
313 }
314}
315
Jason Sams87fe59a2011-04-20 15:09:01 -0700316void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
317 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
318 CHECK_OBJ(a);
319 const char *text = (const char *)a->getPtr();
320 size_t textLen = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700321 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 Sakhartchouk09c67352010-10-05 11:33:27 -0700324}
325
Jason Sams87fe59a2011-04-20 15:09:01 -0700326void rsrMeasureText(Context *rsc, Script *sc, const char *text,
327 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700328 size_t textLen = strlen(text);
329 Font::Rect metrics;
330 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700331 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700332}
333
Jason Sams87fe59a2011-04-20 15:09:01 -0700334void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Sams605048a2010-09-30 18:15:52 -0700335 CHECK_OBJ(font);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700336 rsi_ContextBindFont(rsc, font);
337}
Jason Samsaeb094b2010-05-18 13:35:45 -0700338
Jason Sams87fe59a2011-04-20 15:09:01 -0700339void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk9fc9f032010-08-04 14:45:48 -0700340 rsc->mStateFont.setFontColor(r, g, b, a);
341}
342
Jason Samsaeb094b2010-05-18 13:35:45 -0700343}
Jason Sams87fe59a2011-04-20 15:09:01 -0700344}