blob: 5c55c6b3e4d1ca0131872fc6e6f8d3f04b20102f [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"
Alex Sakhartchouk4edf0302012-03-09 10:47:27 -080022#include "rsMesh.h"
23#include "rsgApiStructs.h"
Jason Samsaeb094b2010-05-18 13:35:45 -070024
Jason Samsaeb094b2010-05-18 13:35:45 -070025#include "utils/Timers.h"
Alex Sakhartchouka04e30d2011-04-29 16:49:08 -070026#include "driver/rsdVertexArray.h"
27#include "driver/rsdShaderCache.h"
28#include "driver/rsdCore.h"
Jason Samsaeb094b2010-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 Sams87fe59a2011-04-20 15:09:01 -070042namespace android {
43namespace renderscript {
Jason Samsaeb094b2010-05-18 13:35:45 -070044
45//////////////////////////////////////////////////////////////////////////////
Jason Samsaeb094b2010-05-18 13:35:45 -070046// Context
47//////////////////////////////////////////////////////////////////////////////
48
Jason Sams709a0972012-11-15 18:18:04 -080049void rsrBindTexture(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
Jason Sams87fe59a2011-04-20 15:09:01 -070050 CHECK_OBJ_OR_NULL(a);
51 CHECK_OBJ(pf);
52 pf->bindTexture(rsc, slot, a);
Jason Samsaeb094b2010-05-18 13:35:45 -070053}
54
Jason Sams709a0972012-11-15 18:18:04 -080055void rsrBindConstant(Context *rsc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
Alex Sakhartchouka720a142012-01-10 10:16:52 -080056 CHECK_OBJ_OR_NULL(a);
57 CHECK_OBJ(pf);
58 pf->bindAllocation(rsc, a, slot);
59}
60
Jason Sams709a0972012-11-15 18:18:04 -080061void rsrBindConstant(Context *rsc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
Alex Sakhartchouka720a142012-01-10 10:16:52 -080062 CHECK_OBJ_OR_NULL(a);
Alex Sakhartchouk8e6bde72012-01-10 14:30:34 -080063 CHECK_OBJ(pv);
64 pv->bindAllocation(rsc, a, slot);
Alex Sakhartchouka720a142012-01-10 10:16:52 -080065}
66
Jason Sams709a0972012-11-15 18:18:04 -080067void rsrBindSampler(Context *rsc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
Jason Sams605048a2010-09-30 18:15:52 -070068 CHECK_OBJ_OR_NULL(vs);
69 CHECK_OBJ(vpf);
Jason Sams87fe59a2011-04-20 15:09:01 -070070 pf->bindSampler(rsc, slot, s);
Jason Samsaeb094b2010-05-18 13:35:45 -070071}
72
Jason Sams709a0972012-11-15 18:18:04 -080073void rsrBindProgramStore(Context *rsc, ProgramStore *ps) {
Jason Sams87fe59a2011-04-20 15:09:01 -070074 CHECK_OBJ_OR_NULL(ps);
75 rsc->setProgramStore(ps);
Jason Samsaeb094b2010-05-18 13:35:45 -070076}
77
Jason Sams709a0972012-11-15 18:18:04 -080078void rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) {
Jason Sams605048a2010-09-30 18:15:52 -070079 CHECK_OBJ_OR_NULL(pf);
Jason Sams87fe59a2011-04-20 15:09:01 -070080 rsc->setProgramFragment(pf);
Jason Samsaeb094b2010-05-18 13:35:45 -070081}
82
Jason Sams709a0972012-11-15 18:18:04 -080083void rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) {
Jason Sams605048a2010-09-30 18:15:52 -070084 CHECK_OBJ_OR_NULL(pv);
Jason Sams87fe59a2011-04-20 15:09:01 -070085 rsc->setProgramVertex(pv);
Jason Samsaeb094b2010-05-18 13:35:45 -070086}
87
Jason Sams709a0972012-11-15 18:18:04 -080088void rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) {
Jason Sams87fe59a2011-04-20 15:09:01 -070089 CHECK_OBJ_OR_NULL(pr);
90 rsc->setProgramRaster(pr);
Jason Samsaeb094b2010-05-18 13:35:45 -070091}
92
Jason Sams709a0972012-11-15 18:18:04 -080093void rsrBindFrameBufferObjectColorTarget(Context *rsc, Allocation *a, uint32_t slot) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070094 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -070095 rsc->mFBOCache.bindColorTarget(rsc, a, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -080096 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -070097}
98
Jason Sams709a0972012-11-15 18:18:04 -080099void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700100 CHECK_OBJ(va);
Jason Sams87fe59a2011-04-20 15:09:01 -0700101 rsc->mFBOCache.bindDepthTarget(rsc, a);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800102 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700103}
104
Jason Sams709a0972012-11-15 18:18:04 -0800105void rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) {
Chris Wailes44bef6f2014-08-12 13:51:10 -0700106 rsc->mFBOCache.bindColorTarget(rsc, nullptr, slot);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800107 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700108}
109
Jason Sams709a0972012-11-15 18:18:04 -0800110void rsrClearFrameBufferObjectDepthTarget(Context *rsc) {
Chris Wailes44bef6f2014-08-12 13:51:10 -0700111 rsc->mFBOCache.bindDepthTarget(rsc, nullptr);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800112 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700113}
114
Jason Sams709a0972012-11-15 18:18:04 -0800115void rsrClearFrameBufferObjectTargets(Context *rsc) {
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700116 rsc->mFBOCache.resetAll(rsc);
Alex Sakhartchouka74a8f62011-11-16 12:22:10 -0800117 rsc->mStateVertex.updateSize(rsc);
Alex Sakhartchouk7d9c5ff2011-04-01 14:19:01 -0700118}
119
Jason Samsaeb094b2010-05-18 13:35:45 -0700120//////////////////////////////////////////////////////////////////////////////
121// VP
122//////////////////////////////////////////////////////////////////////////////
123
Jason Sams709a0972012-11-15 18:18:04 -0800124void rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800125 rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
Jim Millera490f102010-07-28 14:46:22 -0700126}
127
Jason Sams709a0972012-11-15 18:18:04 -0800128void rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800129 rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700130}
131
Jason Sams709a0972012-11-15 18:18:04 -0800132void rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800133 rsc->getProgramVertex()->setTextureMatrix(rsc, m);
Jason Samsaeb094b2010-05-18 13:35:45 -0700134}
135
Jason Sams709a0972012-11-15 18:18:04 -0800136void rsrPfConstantColor(Context *rsc, ProgramFragment *pf,
Jason Sams87fe59a2011-04-20 15:09:01 -0700137 float r, float g, float b, float a) {
138 CHECK_OBJ(pf);
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700139 pf->setConstantColor(rsc, r, g, b, a);
Jason Sams6445e522010-08-04 17:50:20 -0700140}
141
Jason Sams709a0972012-11-15 18:18:04 -0800142void rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) {
Jason Sams60709252010-11-17 15:29:32 -0800143 rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
Alex Sakhartchouk95333f92010-08-16 17:40:10 -0700144}
145
Jason Samsaeb094b2010-05-18 13:35:45 -0700146//////////////////////////////////////////////////////////////////////////////
147// Drawing
148//////////////////////////////////////////////////////////////////////////////
149
Jason Samsaeb094b2010-05-18 13:35:45 -0700150
Jason Sams709a0972012-11-15 18:18:04 -0800151void rsrDrawPath(Context *rsc, Path *sm) {
Jason Sams9e0afb52011-10-31 13:23:43 -0700152 CHECK_OBJ(sm);
153 if (!rsc->setupCheck()) {
154 return;
155 }
156 sm->render(rsc);
157}
158
Jason Sams709a0972012-11-15 18:18:04 -0800159void rsrDrawMesh(Context *rsc, Mesh *sm) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700160 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700161 if (!rsc->setupCheck()) {
162 return;
163 }
164 sm->render(rsc);
165}
166
Jason Sams709a0972012-11-15 18:18:04 -0800167void rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700168 CHECK_OBJ(sm);
Jason Samsaeb094b2010-05-18 13:35:45 -0700169 if (!rsc->setupCheck()) {
170 return;
171 }
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700172 sm->renderPrimitive(rsc, primIndex);
173}
174
Jason Sams709a0972012-11-15 18:18:04 -0800175void rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex,
Jason Sams87fe59a2011-04-20 15:09:01 -0700176 uint32_t start, uint32_t len) {
177 CHECK_OBJ(sm);
Alex Sakhartchouk4e9a7a82010-07-01 16:14:06 -0700178 if (!rsc->setupCheck()) {
179 return;
180 }
181 sm->renderPrimitiveRange(rsc, primIndex, start, len);
Jason Samsaeb094b2010-05-18 13:35:45 -0700182}
183
Jason Sams709a0972012-11-15 18:18:04 -0800184void rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm,
Jason Sams87fe59a2011-04-20 15:09:01 -0700185 float *minX, float *minY, float *minZ,
186 float *maxX, float *maxY, float *maxZ) {
187 CHECK_OBJ(sm);
Jason Samse3150cf2012-07-24 18:10:20 -0700188 sm->computeBBox(rsc);
Alex Sakhartchoukba4aa5c2010-08-13 14:32:23 -0700189 *minX = sm->mBBoxMin[0];
190 *minY = sm->mBBoxMin[1];
191 *minZ = sm->mBBoxMin[2];
192 *maxX = sm->mBBoxMax[0];
193 *maxY = sm->mBBoxMax[1];
194 *maxZ = sm->mBBoxMax[2];
195}
196
Jason Samsaeb094b2010-05-18 13:35:45 -0700197
198//////////////////////////////////////////////////////////////////////////////
199//
200//////////////////////////////////////////////////////////////////////////////
201
202
Jason Sams709a0972012-11-15 18:18:04 -0800203void rsrColor(Context *rsc, float r, float g, float b, float a) {
Jason Sams87fe59a2011-04-20 15:09:01 -0700204 ProgramFragment *pf = rsc->getProgramFragment();
Alex Sakhartchouk383e5b12010-09-23 16:16:33 -0700205 pf->setConstantColor(rsc, r, g, b, a);
Jason Samsaeb094b2010-05-18 13:35:45 -0700206}
207
Jason Sams709a0972012-11-15 18:18:04 -0800208void rsrPrepareClear(Context *rsc) {
Alex Sakhartchoukc19ff012011-05-06 14:59:45 -0700209 rsc->mFBOCache.setup(rsc);
Alex Sakhartchouk889fe502010-10-01 10:54:06 -0700210 rsc->setupProgramStore();
Jason Samsaeb094b2010-05-18 13:35:45 -0700211}
212
Jason Sams709a0972012-11-15 18:18:04 -0800213uint32_t rsrGetWidth(Context *rsc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700214 return rsc->getWidth();
215}
216
Jason Sams709a0972012-11-15 18:18:04 -0800217uint32_t rsrGetHeight(Context *rsc) {
Jason Samsaeb094b2010-05-18 13:35:45 -0700218 return rsc->getHeight();
219}
220
Jason Sams709a0972012-11-15 18:18:04 -0800221void rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) {
Jason Sams61a4bb72012-07-25 19:33:43 -0700222 const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
Jason Sams61656a72013-09-03 16:21:18 -0700223 size_t allocSize = a->getType()->getPackedSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700224 rsc->mStateFont.renderText(text, allocSize, x, y);
Jason Sams61a4bb72012-07-25 19:33:43 -0700225 rsc->mHal.funcs.allocation.unlock1D(rsc, a);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700226}
227
Jason Sams709a0972012-11-15 18:18:04 -0800228void rsrDrawText(Context *rsc, const char *text, int x, int y) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700229 size_t textLen = strlen(text);
230 rsc->mStateFont.renderText(text, textLen, x, y);
231}
232
Jason Sams87fe59a2011-04-20 15:09:01 -0700233static void SetMetrics(Font::Rect *metrics,
234 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800235 if (left) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700236 *left = metrics->left;
237 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800238 if (right) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700239 *right = metrics->right;
240 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800241 if (top) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700242 *top = metrics->top;
243 }
Alex Sakhartchoukafb743a2010-11-09 17:00:54 -0800244 if (bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700245 *bottom = metrics->bottom;
246 }
247}
248
Jason Sams709a0972012-11-15 18:18:04 -0800249void rsrMeasureTextAlloc(Context *rsc, Allocation *a,
Jason Sams87fe59a2011-04-20 15:09:01 -0700250 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
251 CHECK_OBJ(a);
Jason Sams61a4bb72012-07-25 19:33:43 -0700252 const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
Jason Sams61656a72013-09-03 16:21:18 -0700253 size_t textLen = a->getType()->getPackedSizeBytes();
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700254 Font::Rect metrics;
255 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700256 SetMetrics(&metrics, left, right, top, bottom);
Jason Sams61a4bb72012-07-25 19:33:43 -0700257 rsc->mHal.funcs.allocation.unlock1D(rsc, a);
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700258}
259
Jason Sams709a0972012-11-15 18:18:04 -0800260void rsrMeasureText(Context *rsc, const char *text,
Jason Sams87fe59a2011-04-20 15:09:01 -0700261 int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
Alex Sakhartchouk09c67352010-10-05 11:33:27 -0700262 size_t textLen = strlen(text);
263 Font::Rect metrics;
264 rsc->mStateFont.measureText(text, textLen, &metrics);
Jason Sams87fe59a2011-04-20 15:09:01 -0700265 SetMetrics(&metrics, left, right, top, bottom);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700266}
267
Jason Sams709a0972012-11-15 18:18:04 -0800268void rsrBindFont(Context *rsc, Font *font) {
Jason Sams605048a2010-09-30 18:15:52 -0700269 CHECK_OBJ(font);
Alex Sakhartchoukd3e0ad42010-06-24 17:15:34 -0700270 rsi_ContextBindFont(rsc, font);
271}
Jason Samsaeb094b2010-05-18 13:35:45 -0700272
Jason Sams709a0972012-11-15 18:18:04 -0800273void rsrFontColor(Context *rsc, float r, float g, float b, float a) {
Alex Sakhartchouk9fc9f032010-08-04 14:45:48 -0700274 rsc->mStateFont.setFontColor(r, g, b, a);
275}
276
Jason Samsaeb094b2010-05-18 13:35:45 -0700277}
Jason Sams87fe59a2011-04-20 15:09:01 -0700278}