blob: 21b1c42abe1e191393cfa197f17b8b98d074f722 [file] [log] [blame]
Jason Sams536923d2010-05-18 13:35:45 -07001/*
Alex Sakhartchouk4a36b452011-04-29 16:49:08 -07002 * Copyright (C) 2011 The Android Open Source Project
Jason Sams536923d2010-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 Samsfcf72312011-04-20 15:09:01 -070019#include "rsMatrix4x4.h"
20#include "rsMatrix3x3.h"
21#include "rsMatrix2x2.h"
Alex Sakhartchoukbedc0232012-03-09 10:47:27 -080022#include "rsMesh.h"
23#include "rsgApiStructs.h"
Jason Sams536923d2010-05-18 13:35:45 -070024
Jason Sams536923d2010-05-18 13:35:45 -070025#include "utils/Timers.h"
Alex Sakhartchouk4a36b452011-04-29 16:49:08 -070026#include "driver/rsdVertexArray.h"
27#include "driver/rsdShaderCache.h"
28#include "driver/rsdCore.h"
Jason Sams536923d2010-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 Samsfcf72312011-04-20 15:09:01 -070042namespace android {
43namespace renderscript {
Jason Sams536923d2010-05-18 13:35:45 -070044
45//////////////////////////////////////////////////////////////////////////////
Jason Sams536923d2010-05-18 13:35:45 -070046// Context
47//////////////////////////////////////////////////////////////////////////////
48
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -070053}
54
Alex Sakhartchouk33680ff2012-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 Sakhartchoukfdccec92012-01-10 14:30:34 -080061void rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
Alex Sakhartchouk33680ff2012-01-10 10:16:52 -080062 CHECK_OBJ_OR_NULL(a);
Alex Sakhartchoukfdccec92012-01-10 14:30:34 -080063 CHECK_OBJ(pv);
64 pv->bindAllocation(rsc, a, slot);
Alex Sakhartchouk33680ff2012-01-10 10:16:52 -080065}
66
Jason Samsfcf72312011-04-20 15:09:01 -070067void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Samsf166d9b2010-09-30 18:15:52 -070068 CHECK_OBJ_OR_NULL(vs);
69 CHECK_OBJ(vpf);
Jason Samsfcf72312011-04-20 15:09:01 -070070 pf->bindSampler(rsc, slot, s);
Jason Sams536923d2010-05-18 13:35:45 -070071}
72
Jason Samsfcf72312011-04-20 15:09:01 -070073void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
74 CHECK_OBJ_OR_NULL(ps);
75 rsc->setProgramStore(ps);
Jason Sams536923d2010-05-18 13:35:45 -070076}
77
Jason Samsfcf72312011-04-20 15:09:01 -070078void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
Jason Samsf166d9b2010-09-30 18:15:52 -070079 CHECK_OBJ_OR_NULL(pf);
Jason Samsfcf72312011-04-20 15:09:01 -070080 rsc->setProgramFragment(pf);
Jason Sams536923d2010-05-18 13:35:45 -070081}
82
Jason Samsfcf72312011-04-20 15:09:01 -070083void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
Jason Samsf166d9b2010-09-30 18:15:52 -070084 CHECK_OBJ_OR_NULL(pv);
Jason Samsfcf72312011-04-20 15:09:01 -070085 rsc->setProgramVertex(pv);
Jason Sams536923d2010-05-18 13:35:45 -070086}
87
Jason Samsfcf72312011-04-20 15:09:01 -070088void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
89 CHECK_OBJ_OR_NULL(pr);
90 rsc->setProgramRaster(pr);
Jason Sams536923d2010-05-18 13:35:45 -070091}
92
Jason Samsfcf72312011-04-20 15:09:01 -070093void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070094 CHECK_OBJ(va);
Jason Samsfcf72312011-04-20 15:09:01 -070095 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -080096 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070097}
98
Jason Samsfcf72312011-04-20 15:09:01 -070099void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700100 CHECK_OBJ(va);
Jason Samsfcf72312011-04-20 15:09:01 -0700101 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -0800102 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700103}
104
Jason Samsfcf72312011-04-20 15:09:01 -0700105void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700106 rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -0800107 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700108}
109
Jason Samsfcf72312011-04-20 15:09:01 -0700110void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700111 rsc->mFBOCache.bindDepthTarget(rsc, NULL);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -0800112 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700113}
114
Jason Samsfcf72312011-04-20 15:09:01 -0700115void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700116 rsc->mFBOCache.resetAll(rsc);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -0800117 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700118}
119
Jason Sams536923d2010-05-18 13:35:45 -0700120//////////////////////////////////////////////////////////////////////////////
121// VP
122//////////////////////////////////////////////////////////////////////////////
123
Jason Samsfcf72312011-04-20 15:09:01 -0700124void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800125 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millerd8e76202010-07-28 14:46:22 -0700126}
127
Jason Samsfcf72312011-04-20 15:09:01 -0700128void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800129 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Sams536923d2010-05-18 13:35:45 -0700130}
131
Jason Samsfcf72312011-04-20 15:09:01 -0700132void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800133 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Sams536923d2010-05-18 13:35:45 -0700134}
135
Jason Samsfcf72312011-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 Sakhartchoukb89aaac2010-09-23 16:16:33 -0700139 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams442a6472010-08-04 17:50:20 -0700140}
141
Jason Samsfcf72312011-04-20 15:09:01 -0700142void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800143 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchoukcbed7522010-08-16 17:40:10 -0700144}
145
Jason Sams536923d2010-05-18 13:35:45 -0700146//////////////////////////////////////////////////////////////////////////////
147// Drawing
148//////////////////////////////////////////////////////////////////////////////
149
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -0700155 if (!rsc->setupCheck()) {
156 return;
157 }
158
Alex Sakhartchouk4a36b452011-04-29 16:49:08 -0700159 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
160 if (!dc->gl.shaderCache->setup(rsc)) {
161 return;
162 }
163
Steve Block3762c312012-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 Sams536923d2010-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 Sakhartchouk4a36b452011-04-29 16:49:08 -0700173 RsdVertexArray::Attrib attribs[2];
Alex Sakhartchouk9d71e212010-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 Sakhartchouk4a36b452011-04-29 16:49:08 -0700177 RsdVertexArray va(attribs, 2);
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700178 va.setup(rsc);
Jason Sams536923d2010-05-18 13:35:45 -0700179
Jason Sams5316b9e2011-09-13 15:41:01 -0700180 RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
Jason Sams536923d2010-05-18 13:35:45 -0700181}
182
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -0700192}
193
Jason Samsfcf72312011-04-20 15:09:01 -0700194void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
195 float x, float y, float z, float w, float h) {
Jason Samsa17af042010-11-17 15:29:32 -0800196 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
197 rsc->setProgramVertex(rsc->getDefaultProgramVertex());
Jason Sams536923d2010-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 Samsfcf72312011-04-20 15:09:01 -0700204 rsrDrawQuad(rsc, sc,
205 x, sh - y, z,
Jason Sams536923d2010-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 Samsa17af042010-11-17 15:29:32 -0800209 rsc->setProgramVertex((ProgramVertex *)tmp.get());
Jason Sams536923d2010-05-18 13:35:45 -0700210}
Jason Sams536923d2010-05-18 13:35:45 -0700211
Jason Samsfcf72312011-04-20 15:09:01 -0700212void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
Steve Block3762c312012-01-06 19:20:56 +0000213 //ALOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
Jason Samsfcf72312011-04-20 15:09:01 -0700214 rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
Jason Sams536923d2010-05-18 13:35:45 -0700215}
216
Jason Samsf15ed012011-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 Samsfcf72312011-04-20 15:09:01 -0700225void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
226 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700227 if (!rsc->setupCheck()) {
228 return;
229 }
230 sm->render(rsc);
231}
232
Jason Samsfcf72312011-04-20 15:09:01 -0700233void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
234 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700235 if (!rsc->setupCheck()) {
236 return;
237 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700238 sm->renderPrimitive(rsc, primIndex);
239}
240
Jason Samsfcf72312011-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 Sakhartchouk164aaed2010-07-01 16:14:06 -0700244 if (!rsc->setupCheck()) {
245 return;
246 }
247 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Sams536923d2010-05-18 13:35:45 -0700248}
249
Jason Samsfcf72312011-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);
Alex Sakhartchouka80145d2010-08-13 14:32:23 -0700254 sm->computeBBox();
255 *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 Sams536923d2010-05-18 13:35:45 -0700263
264//////////////////////////////////////////////////////////////////////////////
265//
266//////////////////////////////////////////////////////////////////////////////
267
268
Jason Samsfcf72312011-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 Sakhartchoukb89aaac2010-09-23 16:16:33 -0700271 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams536923d2010-05-18 13:35:45 -0700272}
273
Alex Sakhartchouk20c9c922012-02-24 14:22:34 -0800274void rsrPrepareClear(Context *rsc, Script *sc) {
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700275 rsc->mFBOCache.setup(rsc);
Alex Sakhartchoukfeede2a2010-10-01 10:54:06 -0700276 rsc->setupProgramStore();
Jason Sams536923d2010-05-18 13:35:45 -0700277}
278
Jason Samsfcf72312011-04-20 15:09:01 -0700279uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700280 return rsc->getWidth();
281}
282
Jason Samsfcf72312011-04-20 15:09:01 -0700283uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700284 return rsc->getHeight();
285}
286
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700290 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700291}
292
Jason Samsfcf72312011-04-20 15:09:01 -0700293void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700294 size_t textLen = strlen(text);
295 rsc->mStateFont.renderText(text, textLen, x, y);
296}
297
Jason Samsfcf72312011-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 Sakhartchouked9f2102010-11-09 17:00:54 -0800300 if (left) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700301 *left = metrics->left;
302 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800303 if (right) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700304 *right = metrics->right;
305 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800306 if (top) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700307 *top = metrics->top;
308 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800309 if (bottom) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700310 *bottom = metrics->bottom;
311 }
312}
313
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700319 Font::Rect metrics;
320 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Samsfcf72312011-04-20 15:09:01 -0700321 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700322}
323
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700326 size_t textLen = strlen(text);
327 Font::Rect metrics;
328 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Samsfcf72312011-04-20 15:09:01 -0700329 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700330}
331
Jason Samsfcf72312011-04-20 15:09:01 -0700332void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700333 CHECK_OBJ(font);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700334 rsi_ContextBindFont(rsc, font);
335}
Jason Sams536923d2010-05-18 13:35:45 -0700336
Jason Samsfcf72312011-04-20 15:09:01 -0700337void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700338 rsc->mStateFont.setFontColor(r, g, b, a);
339}
340
Jason Sams536923d2010-05-18 13:35:45 -0700341}
Jason Samsfcf72312011-04-20 15:09:01 -0700342}