blob: 71f1312d564a5743785241ee32c3399980197f96 [file] [log] [blame]
Jason Samsaeb094b2010-05-18 13:35:45 -07001/*
2 * Copyright (C) 2009 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"
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"
24
25#define GL_GLEXT_PROTOTYPES
26
27#include <GLES/gl.h>
28#include <GLES/glext.h>
29#include <GLES2/gl2.h>
30#include <GLES2/gl2ext.h>
31
32#include <time.h>
33
34using namespace android;
35using namespace android::renderscript;
36
Jason Sams87fe59a2011-04-20 15:09:01 -070037namespace android {
38namespace renderscript {
Jason Samsaeb094b2010-05-18 13:35:45 -070039
40//////////////////////////////////////////////////////////////////////////////
Jason Samsaeb094b2010-05-18 13:35:45 -070041// Context
42//////////////////////////////////////////////////////////////////////////////
43
Jason Sams87fe59a2011-04-20 15:09:01 -070044void rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
45 CHECK_OBJ_OR_NULL(a);
46 CHECK_OBJ(pf);
47 pf->bindTexture(rsc, slot, a);
Jason Samsaeb094b2010-05-18 13:35:45 -070048}
49
Jason Sams87fe59a2011-04-20 15:09:01 -070050void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Sams605048a2010-09-30 18:15:52 -070051 CHECK_OBJ_OR_NULL(vs);
52 CHECK_OBJ(vpf);
Jason Sams87fe59a2011-04-20 15:09:01 -070053 pf->bindSampler(rsc, slot, s);
Jason Samsaeb094b2010-05-18 13:35:45 -070054}
55
Jason Sams87fe59a2011-04-20 15:09:01 -070056void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
57 CHECK_OBJ_OR_NULL(ps);
58 rsc->setProgramStore(ps);
Jason Samsaeb094b2010-05-18 13:35:45 -070059}
60
Jason Sams87fe59a2011-04-20 15:09:01 -070061void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
Jason Sams605048a2010-09-30 18:15:52 -070062 CHECK_OBJ_OR_NULL(pf);
Jason Sams87fe59a2011-04-20 15:09:01 -070063 rsc->setProgramFragment(pf);
Jason Samsaeb094b2010-05-18 13:35:45 -070064}
65
Jason Sams87fe59a2011-04-20 15:09:01 -070066void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
Jason Sams605048a2010-09-30 18:15:52 -070067 CHECK_OBJ_OR_NULL(pv);
Jason Sams87fe59a2011-04-20 15:09:01 -070068 rsc->setProgramVertex(pv);
Jason Samsaeb094b2010-05-18 13:35:45 -070069}
70
Jason Sams87fe59a2011-04-20 15:09:01 -070071void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
72 CHECK_OBJ_OR_NULL(pr);
73 rsc->setProgramRaster(pr);
Jason Samsaeb094b2010-05-18 13:35:45 -070074}
75
Jason Sams87fe59a2011-04-20 15:09:01 -070076void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070077 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070078 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070079}
80
Jason Sams87fe59a2011-04-20 15:09:01 -070081void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070082 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070083 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070084}
85
Jason Sams87fe59a2011-04-20 15:09:01 -070086void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070087 rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
88}
89
Jason Sams87fe59a2011-04-20 15:09:01 -070090void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070091 rsc->mFBOCache.bindDepthTarget(rsc, NULL);
92}
93
Jason Sams87fe59a2011-04-20 15:09:01 -070094void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070095 rsc->mFBOCache.resetAll(rsc);
96}
97
Jason Samsaeb094b2010-05-18 13:35:45 -070098//////////////////////////////////////////////////////////////////////////////
99// VP
100//////////////////////////////////////////////////////////////////////////////
101
Jason Sams87fe59a2011-04-20 15:09:01 -0700102void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800103 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millera490f102010-07-28 14:46:22 -0700104}
105
Jason Sams87fe59a2011-04-20 15:09:01 -0700106void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800107 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700108}
109
Jason Sams87fe59a2011-04-20 15:09:01 -0700110void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800111 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700112}
113
Jason Sams87fe59a2011-04-20 15:09:01 -0700114void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
115 float r, float g, float b, float a) {
116 CHECK_OBJ(pf);
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700117 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams6445e522010-08-04 17:50:20 -0700118}
119
Jason Sams87fe59a2011-04-20 15:09:01 -0700120void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800121 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchouk95333f92010-08-16 17:40:10 -0700122}
123
Jason Samsaeb094b2010-05-18 13:35:45 -0700124//////////////////////////////////////////////////////////////////////////////
125// Drawing
126//////////////////////////////////////////////////////////////////////////////
127
Jason Sams87fe59a2011-04-20 15:09:01 -0700128void rsrDrawQuadTexCoords(Context *rsc, Script *sc,
129 float x1, float y1, float z1, float u1, float v1,
130 float x2, float y2, float z2, float u2, float v2,
131 float x3, float y3, float z3, float u3, float v3,
132 float x4, float y4, float z4, float u4, float v4) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700133 if (!rsc->setupCheck()) {
134 return;
135 }
136
137 //LOGE("Quad");
138 //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
139 //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
140 //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
141 //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
142
143 float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
144 const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
145
Alex Sakhartchouk54929cc2010-11-08 15:10:52 -0800146 VertexArray::Attrib attribs[2];
147 attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
148 attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
149
150 VertexArray va(attribs, 2);
Jason Sams79f52df2010-06-01 15:47:01 -0700151 va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache);
Jason Samsaeb094b2010-05-18 13:35:45 -0700152
153 glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
154}
155
Jason Sams87fe59a2011-04-20 15:09:01 -0700156void rsrDrawQuad(Context *rsc, Script *sc,
157 float x1, float y1, float z1,
158 float x2, float y2, float z2,
159 float x3, float y3, float z3,
160 float x4, float y4, float z4) {
161 rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
162 x2, y2, z2, 1, 1,
163 x3, y3, z3, 1, 0,
164 x4, y4, z4, 0, 0);
Jason Samsaeb094b2010-05-18 13:35:45 -0700165}
166
Jason Sams87fe59a2011-04-20 15:09:01 -0700167void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
168 float x, float y, float z, float w, float h) {
Jason Sams60709252010-11-17 15:29:32 -0800169 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
170 rsc->setProgramVertex(rsc->getDefaultProgramVertex());
Jason Samsaeb094b2010-05-18 13:35:45 -0700171 //rsc->setupCheck();
172
173 //GLint crop[4] = {0, h, w, -h};
174
175 float sh = rsc->getHeight();
176
Jason Sams87fe59a2011-04-20 15:09:01 -0700177 rsrDrawQuad(rsc, sc,
178 x, sh - y, z,
Jason Samsaeb094b2010-05-18 13:35:45 -0700179 x+w, sh - y, z,
180 x+w, sh - (y+h), z,
181 x, sh - (y+h), z);
Jason Sams60709252010-11-17 15:29:32 -0800182 rsc->setProgramVertex((ProgramVertex *)tmp.get());
Jason Samsaeb094b2010-05-18 13:35:45 -0700183}
Jason Samsaeb094b2010-05-18 13:35:45 -0700184
Jason Sams87fe59a2011-04-20 15:09:01 -0700185void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700186 //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
Jason Sams87fe59a2011-04-20 15:09:01 -0700187 rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
Jason Samsaeb094b2010-05-18 13:35:45 -0700188}
189
Jason Sams87fe59a2011-04-20 15:09:01 -0700190void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
191 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700192 if (!rsc->setupCheck()) {
193 return;
194 }
195 sm->render(rsc);
196}
197
Jason Sams87fe59a2011-04-20 15:09:01 -0700198void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
199 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700200 if (!rsc->setupCheck()) {
201 return;
202 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700203 sm->renderPrimitive(rsc, primIndex);
204}
205
Jason Sams87fe59a2011-04-20 15:09:01 -0700206void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
207 uint32_t start, uint32_t len) {
208 CHECK_OBJ(sm);
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700209 if (!rsc->setupCheck()) {
210 return;
211 }
212 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700213}
214
Jason Sams87fe59a2011-04-20 15:09:01 -0700215void rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
216 float *minX, float *minY, float *minZ,
217 float *maxX, float *maxY, float *maxZ) {
218 CHECK_OBJ(sm);
Alex Sakhartchoukba4aa5c2010-08-13 14:32:23 -0700219 sm->computeBBox();
220 *minX = sm->mBBoxMin[0];
221 *minY = sm->mBBoxMin[1];
222 *minZ = sm->mBBoxMin[2];
223 *maxX = sm->mBBoxMax[0];
224 *maxY = sm->mBBoxMax[1];
225 *maxZ = sm->mBBoxMax[2];
226}
227
Jason Samsaeb094b2010-05-18 13:35:45 -0700228
229//////////////////////////////////////////////////////////////////////////////
230//
231//////////////////////////////////////////////////////////////////////////////
232
233
Jason Sams87fe59a2011-04-20 15:09:01 -0700234void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
235 ProgramFragment *pf = rsc->getProgramFragment();
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700236 pf->setConstantColor(rsc, r, g, b, a);
Jason Samsaeb094b2010-05-18 13:35:45 -0700237}
238
Jason Sams87fe59a2011-04-20 15:09:01 -0700239void rsrFinish(Context *rsc, Script *sc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700240 glFinish();
241}
242
Jason Samsb7e83bd2010-12-15 01:41:00 -0800243
Jason Sams87fe59a2011-04-20 15:09:01 -0700244void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700245 rsc->mFBOCache.setupGL2(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700246 rsc->setupProgramStore();
Jason Sams22fa3712010-05-19 17:22:57 -0700247
248 glClearColor(r, g, b, a);
249 glClear(GL_COLOR_BUFFER_BIT);
250}
251
Jason Sams87fe59a2011-04-20 15:09:01 -0700252void rsrClearDepth(Context *rsc, Script *sc, float v) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700253 rsc->mFBOCache.setupGL2(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700254 rsc->setupProgramStore();
Jason Sams22fa3712010-05-19 17:22:57 -0700255
256 glClearDepthf(v);
257 glClear(GL_DEPTH_BUFFER_BIT);
Jason Samsaeb094b2010-05-18 13:35:45 -0700258}
259
Jason Sams87fe59a2011-04-20 15:09:01 -0700260uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700261 return rsc->getWidth();
262}
263
Jason Sams87fe59a2011-04-20 15:09:01 -0700264uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700265 return rsc->getHeight();
266}
267
Jason Sams87fe59a2011-04-20 15:09:01 -0700268void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
269 const char *text = (const char *)a->getPtr();
270 size_t allocSize = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700271 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700272}
273
Jason Sams87fe59a2011-04-20 15:09:01 -0700274void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700275 size_t textLen = strlen(text);
276 rsc->mStateFont.renderText(text, textLen, x, y);
277}
278
Jason Sams87fe59a2011-04-20 15:09:01 -0700279static void SetMetrics(Font::Rect *metrics,
280 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800281 if (left) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700282 *left = metrics->left;
283 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800284 if (right) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700285 *right = metrics->right;
286 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800287 if (top) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700288 *top = metrics->top;
289 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800290 if (bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700291 *bottom = metrics->bottom;
292 }
293}
294
Jason Sams87fe59a2011-04-20 15:09:01 -0700295void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
296 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
297 CHECK_OBJ(a);
298 const char *text = (const char *)a->getPtr();
299 size_t textLen = a->getType()->getSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700300 Font::Rect metrics;
301 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700302 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700303}
304
Jason Sams87fe59a2011-04-20 15:09:01 -0700305void rsrMeasureText(Context *rsc, Script *sc, const char *text,
306 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700307 size_t textLen = strlen(text);
308 Font::Rect metrics;
309 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700310 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700311}
312
Jason Sams87fe59a2011-04-20 15:09:01 -0700313void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Sams605048a2010-09-30 18:15:52 -0700314 CHECK_OBJ(font);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700315 rsi_ContextBindFont(rsc, font);
316}
Jason Samsaeb094b2010-05-18 13:35:45 -0700317
Jason Sams87fe59a2011-04-20 15:09:01 -0700318void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk9fc9f032010-08-04 14:45:48 -0700319 rsc->mStateFont.setFontColor(r, g, b, a);
320}
321
Jason Samsaeb094b2010-05-18 13:35:45 -0700322}
Jason Sams87fe59a2011-04-20 15:09:01 -0700323}