blob: 26e2374719ced90e701969047cb7aa797381d4e8 [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"
Jason Sams536923d2010-05-18 13:35:45 -070022
Jason Sams536923d2010-05-18 13:35:45 -070023#include "utils/Timers.h"
Alex Sakhartchouk4a36b452011-04-29 16:49:08 -070024#include "driver/rsdVertexArray.h"
25#include "driver/rsdShaderCache.h"
26#include "driver/rsdCore.h"
Jason Sams536923d2010-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 Samsfcf72312011-04-20 15:09:01 -070040namespace android {
41namespace renderscript {
Jason Sams536923d2010-05-18 13:35:45 -070042
43//////////////////////////////////////////////////////////////////////////////
Jason Sams536923d2010-05-18 13:35:45 -070044// Context
45//////////////////////////////////////////////////////////////////////////////
46
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -070051}
52
Jason Samsfcf72312011-04-20 15:09:01 -070053void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Samsf166d9b2010-09-30 18:15:52 -070054 CHECK_OBJ_OR_NULL(vs);
55 CHECK_OBJ(vpf);
Jason Samsfcf72312011-04-20 15:09:01 -070056 pf->bindSampler(rsc, slot, s);
Jason Sams536923d2010-05-18 13:35:45 -070057}
58
Jason Samsfcf72312011-04-20 15:09:01 -070059void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
60 CHECK_OBJ_OR_NULL(ps);
61 rsc->setProgramStore(ps);
Jason Sams536923d2010-05-18 13:35:45 -070062}
63
Jason Samsfcf72312011-04-20 15:09:01 -070064void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
Jason Samsf166d9b2010-09-30 18:15:52 -070065 CHECK_OBJ_OR_NULL(pf);
Jason Samsfcf72312011-04-20 15:09:01 -070066 rsc->setProgramFragment(pf);
Jason Sams536923d2010-05-18 13:35:45 -070067}
68
Jason Samsfcf72312011-04-20 15:09:01 -070069void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
Jason Samsf166d9b2010-09-30 18:15:52 -070070 CHECK_OBJ_OR_NULL(pv);
Jason Samsfcf72312011-04-20 15:09:01 -070071 rsc->setProgramVertex(pv);
Jason Sams536923d2010-05-18 13:35:45 -070072}
73
Jason Samsfcf72312011-04-20 15:09:01 -070074void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
75 CHECK_OBJ_OR_NULL(pr);
76 rsc->setProgramRaster(pr);
Jason Sams536923d2010-05-18 13:35:45 -070077}
78
Jason Samsfcf72312011-04-20 15:09:01 -070079void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070080 CHECK_OBJ(va);
Jason Samsfcf72312011-04-20 15:09:01 -070081 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -080082 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070083}
84
Jason Samsfcf72312011-04-20 15:09:01 -070085void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070086 CHECK_OBJ(va);
Jason Samsfcf72312011-04-20 15:09:01 -070087 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -080088 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070089}
90
Jason Samsfcf72312011-04-20 15:09:01 -070091void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070092 rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -080093 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070094}
95
Jason Samsfcf72312011-04-20 15:09:01 -070096void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070097 rsc->mFBOCache.bindDepthTarget(rsc, NULL);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -080098 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -070099}
100
Jason Samsfcf72312011-04-20 15:09:01 -0700101void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700102 rsc->mFBOCache.resetAll(rsc);
Alex Sakhartchouk2d8ef492011-11-16 12:22:10 -0800103 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700104}
105
Jason Sams536923d2010-05-18 13:35:45 -0700106//////////////////////////////////////////////////////////////////////////////
107// VP
108//////////////////////////////////////////////////////////////////////////////
109
Jason Samsfcf72312011-04-20 15:09:01 -0700110void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800111 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millerd8e76202010-07-28 14:46:22 -0700112}
113
Jason Samsfcf72312011-04-20 15:09:01 -0700114void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800115 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Sams536923d2010-05-18 13:35:45 -0700116}
117
Jason Samsfcf72312011-04-20 15:09:01 -0700118void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800119 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Sams536923d2010-05-18 13:35:45 -0700120}
121
Jason Samsfcf72312011-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 Sakhartchoukb89aaac2010-09-23 16:16:33 -0700125 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams442a6472010-08-04 17:50:20 -0700126}
127
Jason Samsfcf72312011-04-20 15:09:01 -0700128void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
Jason Samsa17af042010-11-17 15:29:32 -0800129 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchoukcbed7522010-08-16 17:40:10 -0700130}
131
Jason Sams536923d2010-05-18 13:35:45 -0700132//////////////////////////////////////////////////////////////////////////////
133// Drawing
134//////////////////////////////////////////////////////////////////////////////
135
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -0700141 if (!rsc->setupCheck()) {
142 return;
143 }
144
Alex Sakhartchouk4a36b452011-04-29 16:49:08 -0700145 RsdHal *dc = (RsdHal *)rsc->mHal.drv;
146 if (!dc->gl.shaderCache->setup(rsc)) {
147 return;
148 }
149
Jason Sams536923d2010-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 Sakhartchouk4a36b452011-04-29 16:49:08 -0700159 RsdVertexArray::Attrib attribs[2];
Alex Sakhartchouk9d71e212010-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 Sakhartchouk4a36b452011-04-29 16:49:08 -0700163 RsdVertexArray va(attribs, 2);
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700164 va.setup(rsc);
Jason Sams536923d2010-05-18 13:35:45 -0700165
Jason Sams5316b9e2011-09-13 15:41:01 -0700166 RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
Jason Sams536923d2010-05-18 13:35:45 -0700167}
168
Jason Samsfcf72312011-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 Sams536923d2010-05-18 13:35:45 -0700178}
179
Jason Samsfcf72312011-04-20 15:09:01 -0700180void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
181 float x, float y, float z, float w, float h) {
Jason Samsa17af042010-11-17 15:29:32 -0800182 ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
183 rsc->setProgramVertex(rsc->getDefaultProgramVertex());
Jason Sams536923d2010-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 Samsfcf72312011-04-20 15:09:01 -0700190 rsrDrawQuad(rsc, sc,
191 x, sh - y, z,
Jason Sams536923d2010-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 Samsa17af042010-11-17 15:29:32 -0800195 rsc->setProgramVertex((ProgramVertex *)tmp.get());
Jason Sams536923d2010-05-18 13:35:45 -0700196}
Jason Sams536923d2010-05-18 13:35:45 -0700197
Jason Samsfcf72312011-04-20 15:09:01 -0700198void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
Jason Sams536923d2010-05-18 13:35:45 -0700199 //LOGE("SC_drawRect %f,%f %f,%f %f", x1, y1, x2, y2, z);
Jason Samsfcf72312011-04-20 15:09:01 -0700200 rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
Jason Sams536923d2010-05-18 13:35:45 -0700201}
202
Jason Samsfcf72312011-04-20 15:09:01 -0700203void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
204 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700205 if (!rsc->setupCheck()) {
206 return;
207 }
208 sm->render(rsc);
209}
210
Jason Samsfcf72312011-04-20 15:09:01 -0700211void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
212 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700213 if (!rsc->setupCheck()) {
214 return;
215 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700216 sm->renderPrimitive(rsc, primIndex);
217}
218
Jason Samsfcf72312011-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 Sakhartchouk164aaed2010-07-01 16:14:06 -0700222 if (!rsc->setupCheck()) {
223 return;
224 }
225 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Sams536923d2010-05-18 13:35:45 -0700226}
227
Jason Samsfcf72312011-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 Sakhartchouka80145d2010-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 Sams536923d2010-05-18 13:35:45 -0700241
242//////////////////////////////////////////////////////////////////////////////
243//
244//////////////////////////////////////////////////////////////////////////////
245
246
Jason Samsfcf72312011-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 Sakhartchoukb89aaac2010-09-23 16:16:33 -0700249 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams536923d2010-05-18 13:35:45 -0700250}
251
Jason Samsfcf72312011-04-20 15:09:01 -0700252void rsrFinish(Context *rsc, Script *sc) {
Jason Sams5316b9e2011-09-13 15:41:01 -0700253 RSD_CALL_GL(glFinish);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700254}
255
Jason Sams6d8eb262010-12-15 01:41:00 -0800256
Jason Samsfcf72312011-04-20 15:09:01 -0700257void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700258 rsc->mFBOCache.setup(rsc);
Alex Sakhartchoukfeede2a2010-10-01 10:54:06 -0700259 rsc->setupProgramStore();
Jason Samsd79b2e92010-05-19 17:22:57 -0700260
Jason Sams5316b9e2011-09-13 15:41:01 -0700261 RSD_CALL_GL(glClearColor, r, g, b, a);
262 RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
Jason Samsd79b2e92010-05-19 17:22:57 -0700263}
264
Jason Samsfcf72312011-04-20 15:09:01 -0700265void rsrClearDepth(Context *rsc, Script *sc, float v) {
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700266 rsc->mFBOCache.setup(rsc);
Alex Sakhartchoukfeede2a2010-10-01 10:54:06 -0700267 rsc->setupProgramStore();
Jason Samsd79b2e92010-05-19 17:22:57 -0700268
Jason Sams5316b9e2011-09-13 15:41:01 -0700269 RSD_CALL_GL(glClearDepthf, v);
270 RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
Jason Sams536923d2010-05-18 13:35:45 -0700271}
272
Jason Samsfcf72312011-04-20 15:09:01 -0700273uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700274 return rsc->getWidth();
275}
276
Jason Samsfcf72312011-04-20 15:09:01 -0700277uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700278 return rsc->getHeight();
279}
280
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700284 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700285}
286
Jason Samsfcf72312011-04-20 15:09:01 -0700287void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700288 size_t textLen = strlen(text);
289 rsc->mStateFont.renderText(text, textLen, x, y);
290}
291
Jason Samsfcf72312011-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 Sakhartchouked9f2102010-11-09 17:00:54 -0800294 if (left) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700295 *left = metrics->left;
296 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800297 if (right) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700298 *right = metrics->right;
299 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800300 if (top) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700301 *top = metrics->top;
302 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800303 if (bottom) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700304 *bottom = metrics->bottom;
305 }
306}
307
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700313 Font::Rect metrics;
314 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Samsfcf72312011-04-20 15:09:01 -0700315 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700316}
317
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700320 size_t textLen = strlen(text);
321 Font::Rect metrics;
322 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Samsfcf72312011-04-20 15:09:01 -0700323 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700324}
325
Jason Samsfcf72312011-04-20 15:09:01 -0700326void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700327 CHECK_OBJ(font);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700328 rsi_ContextBindFont(rsc, font);
329}
Jason Sams536923d2010-05-18 13:35:45 -0700330
Jason Samsfcf72312011-04-20 15:09:01 -0700331void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700332 rsc->mStateFont.setFontColor(r, g, b, a);
333}
334
Jason Sams536923d2010-05-18 13:35:45 -0700335}
Jason Samsfcf72312011-04-20 15:09:01 -0700336}