blob: a79c3cbb1dcf0e716c0decddcbb58274c30f1e8d [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 Samsf15ed012011-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 Samsfcf72312011-04-20 15:09:01 -0700211void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
212 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700213 if (!rsc->setupCheck()) {
214 return;
215 }
216 sm->render(rsc);
217}
218
Jason Samsfcf72312011-04-20 15:09:01 -0700219void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
220 CHECK_OBJ(sm);
Jason Sams536923d2010-05-18 13:35:45 -0700221 if (!rsc->setupCheck()) {
222 return;
223 }
Alex Sakhartchouk164aaed2010-07-01 16:14:06 -0700224 sm->renderPrimitive(rsc, primIndex);
225}
226
Jason Samsfcf72312011-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 Sakhartchouk164aaed2010-07-01 16:14:06 -0700230 if (!rsc->setupCheck()) {
231 return;
232 }
233 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Sams536923d2010-05-18 13:35:45 -0700234}
235
Jason Samsfcf72312011-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 Sakhartchouka80145d2010-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 Sams536923d2010-05-18 13:35:45 -0700249
250//////////////////////////////////////////////////////////////////////////////
251//
252//////////////////////////////////////////////////////////////////////////////
253
254
Jason Samsfcf72312011-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 Sakhartchoukb89aaac2010-09-23 16:16:33 -0700257 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams536923d2010-05-18 13:35:45 -0700258}
259
Jason Samsfcf72312011-04-20 15:09:01 -0700260void rsrFinish(Context *rsc, Script *sc) {
Jason Sams5316b9e2011-09-13 15:41:01 -0700261 RSD_CALL_GL(glFinish);
Alex Sakhartchouk8e90f2b2011-04-01 14:19:01 -0700262}
263
Jason Sams6d8eb262010-12-15 01:41:00 -0800264
Jason Samsfcf72312011-04-20 15:09:01 -0700265void rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
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(glClearColor, r, g, b, a);
270 RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
Jason Samsd79b2e92010-05-19 17:22:57 -0700271}
272
Jason Samsfcf72312011-04-20 15:09:01 -0700273void rsrClearDepth(Context *rsc, Script *sc, float v) {
Alex Sakhartchouk407cae92011-05-06 14:59:45 -0700274 rsc->mFBOCache.setup(rsc);
Alex Sakhartchoukfeede2a2010-10-01 10:54:06 -0700275 rsc->setupProgramStore();
Jason Samsd79b2e92010-05-19 17:22:57 -0700276
Jason Sams5316b9e2011-09-13 15:41:01 -0700277 RSD_CALL_GL(glClearDepthf, v);
278 RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
Jason Sams536923d2010-05-18 13:35:45 -0700279}
280
Jason Samsfcf72312011-04-20 15:09:01 -0700281uint32_t rsrGetWidth(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700282 return rsc->getWidth();
283}
284
Jason Samsfcf72312011-04-20 15:09:01 -0700285uint32_t rsrGetHeight(Context *rsc, Script *sc) {
Jason Sams536923d2010-05-18 13:35:45 -0700286 return rsc->getHeight();
287}
288
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700292 rsc->mStateFont.renderText(text, allocSize, x, y);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700293}
294
Jason Samsfcf72312011-04-20 15:09:01 -0700295void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700296 size_t textLen = strlen(text);
297 rsc->mStateFont.renderText(text, textLen, x, y);
298}
299
Jason Samsfcf72312011-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 Sakhartchouked9f2102010-11-09 17:00:54 -0800302 if (left) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700303 *left = metrics->left;
304 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800305 if (right) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700306 *right = metrics->right;
307 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800308 if (top) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700309 *top = metrics->top;
310 }
Alex Sakhartchouked9f2102010-11-09 17:00:54 -0800311 if (bottom) {
Alex Sakhartchouk10825a02010-10-05 11:33:27 -0700312 *bottom = metrics->bottom;
313 }
314}
315
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700321 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 Sakhartchouk10825a02010-10-05 11:33:27 -0700324}
325
Jason Samsfcf72312011-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 Sakhartchouk10825a02010-10-05 11:33:27 -0700328 size_t textLen = strlen(text);
329 Font::Rect metrics;
330 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Samsfcf72312011-04-20 15:09:01 -0700331 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700332}
333
Jason Samsfcf72312011-04-20 15:09:01 -0700334void rsrBindFont(Context *rsc, Script *sc, Font *font) {
Jason Samsf166d9b2010-09-30 18:15:52 -0700335 CHECK_OBJ(font);
Alex Sakhartchouk9b949fc2010-06-24 17:15:34 -0700336 rsi_ContextBindFont(rsc, font);
337}
Jason Sams536923d2010-05-18 13:35:45 -0700338
Jason Samsfcf72312011-04-20 15:09:01 -0700339void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
Alex Sakhartchoukfb10c162010-08-04 14:45:48 -0700340 rsc->mStateFont.setFontColor(r, g, b, a);
341}
342
Jason Sams536923d2010-05-18 13:35:45 -0700343}
Jason Samsfcf72312011-04-20 15:09:01 -0700344}