rsScriptC_LibGL.cpp revision 61a4bb734b91ced09fbfee4214c6f253cb66e5f0
1/*
2 * Copyright (C) 2011 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"
19#include "rsMatrix4x4.h"
20#include "rsMatrix3x3.h"
21#include "rsMatrix2x2.h"
22#include "rsMesh.h"
23#include "rsgApiStructs.h"
24
25#include "utils/Timers.h"
26#include "driver/rsdVertexArray.h"
27#include "driver/rsdShaderCache.h"
28#include "driver/rsdCore.h"
29
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
42namespace android {
43namespace renderscript {
44
45//////////////////////////////////////////////////////////////////////////////
46// Context
47//////////////////////////////////////////////////////////////////////////////
48
49void 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);
53}
54
55void 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
61void rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
62    CHECK_OBJ_OR_NULL(a);
63    CHECK_OBJ(pv);
64    pv->bindAllocation(rsc, a, slot);
65}
66
67void rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
68    CHECK_OBJ_OR_NULL(vs);
69    CHECK_OBJ(vpf);
70    pf->bindSampler(rsc, slot, s);
71}
72
73void rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
74    CHECK_OBJ_OR_NULL(ps);
75    rsc->setProgramStore(ps);
76}
77
78void rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
79    CHECK_OBJ_OR_NULL(pf);
80    rsc->setProgramFragment(pf);
81}
82
83void rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
84    CHECK_OBJ_OR_NULL(pv);
85    rsc->setProgramVertex(pv);
86}
87
88void rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
89    CHECK_OBJ_OR_NULL(pr);
90    rsc->setProgramRaster(pr);
91}
92
93void rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
94    CHECK_OBJ(va);
95    rsc->mFBOCache.bindColorTarget(rsc, a, slot);
96    rsc->mStateVertex.updateSize(rsc);
97}
98
99void rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
100    CHECK_OBJ(va);
101    rsc->mFBOCache.bindDepthTarget(rsc, a);
102    rsc->mStateVertex.updateSize(rsc);
103}
104
105void rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
106    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
107    rsc->mStateVertex.updateSize(rsc);
108}
109
110void rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
111    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
112    rsc->mStateVertex.updateSize(rsc);
113}
114
115void rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
116    rsc->mFBOCache.resetAll(rsc);
117    rsc->mStateVertex.updateSize(rsc);
118}
119
120//////////////////////////////////////////////////////////////////////////////
121// VP
122//////////////////////////////////////////////////////////////////////////////
123
124void rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
125    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
126}
127
128void rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
129    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
130}
131
132void rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
133    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
134}
135
136void rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
137                        float r, float g, float b, float a) {
138    CHECK_OBJ(pf);
139    pf->setConstantColor(rsc, r, g, b, a);
140}
141
142void rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
143    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
144}
145
146//////////////////////////////////////////////////////////////////////////////
147// Drawing
148//////////////////////////////////////////////////////////////////////////////
149
150void 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) {
155    if (!rsc->setupCheck()) {
156        return;
157    }
158
159    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
160    if (!dc->gl.shaderCache->setup(rsc)) {
161        return;
162    }
163
164    //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);
169
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
173    RsdVertexArray::Attrib attribs[2];
174    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
177    RsdVertexArray va(attribs, 2);
178    va.setup(rsc);
179
180    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
181}
182
183void 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);
192}
193
194void rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
195                              float x, float y, float z, float w, float h) {
196    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
197    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
198    //rsc->setupCheck();
199
200    //GLint crop[4] = {0, h, w, -h};
201
202    float sh = rsc->getHeight();
203
204    rsrDrawQuad(rsc, sc,
205                x,   sh - y,     z,
206                x+w, sh - y,     z,
207                x+w, sh - (y+h), z,
208                x,   sh - (y+h), z);
209    rsc->setProgramVertex((ProgramVertex *)tmp.get());
210}
211
212void rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
213    //ALOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
214    rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
215}
216
217void rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
218    CHECK_OBJ(sm);
219    if (!rsc->setupCheck()) {
220        return;
221    }
222    sm->render(rsc);
223}
224
225void rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
226    CHECK_OBJ(sm);
227    if (!rsc->setupCheck()) {
228        return;
229    }
230    sm->render(rsc);
231}
232
233void rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
234    CHECK_OBJ(sm);
235    if (!rsc->setupCheck()) {
236        return;
237    }
238    sm->renderPrimitive(rsc, primIndex);
239}
240
241void rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
242                               uint32_t start, uint32_t len) {
243    CHECK_OBJ(sm);
244    if (!rsc->setupCheck()) {
245        return;
246    }
247    sm->renderPrimitiveRange(rsc, primIndex, start, len);
248}
249
250void 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);
254    sm->computeBBox(rsc);
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
263
264//////////////////////////////////////////////////////////////////////////////
265//
266//////////////////////////////////////////////////////////////////////////////
267
268
269void rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
270    ProgramFragment *pf = rsc->getProgramFragment();
271    pf->setConstantColor(rsc, r, g, b, a);
272}
273
274void rsrPrepareClear(Context *rsc, Script *sc) {
275    rsc->mFBOCache.setup(rsc);
276    rsc->setupProgramStore();
277}
278
279uint32_t rsrGetWidth(Context *rsc, Script *sc) {
280    return rsc->getWidth();
281}
282
283uint32_t rsrGetHeight(Context *rsc, Script *sc) {
284    return rsc->getHeight();
285}
286
287void rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
288    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
289    size_t allocSize = a->getType()->getSizeBytes();
290    rsc->mStateFont.renderText(text, allocSize, x, y);
291    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
292}
293
294void rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
295    size_t textLen = strlen(text);
296    rsc->mStateFont.renderText(text, textLen, x, y);
297}
298
299static void SetMetrics(Font::Rect *metrics,
300                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
301    if (left) {
302        *left = metrics->left;
303    }
304    if (right) {
305        *right = metrics->right;
306    }
307    if (top) {
308        *top = metrics->top;
309    }
310    if (bottom) {
311        *bottom = metrics->bottom;
312    }
313}
314
315void rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
316                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
317    CHECK_OBJ(a);
318    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
319    size_t textLen = a->getType()->getSizeBytes();
320    Font::Rect metrics;
321    rsc->mStateFont.measureText(text, textLen, &metrics);
322    SetMetrics(&metrics, left, right, top, bottom);
323    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
324}
325
326void rsrMeasureText(Context *rsc, Script *sc, const char *text,
327                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
328    size_t textLen = strlen(text);
329    Font::Rect metrics;
330    rsc->mStateFont.measureText(text, textLen, &metrics);
331    SetMetrics(&metrics, left, right, top, bottom);
332}
333
334void rsrBindFont(Context *rsc, Script *sc, Font *font) {
335    CHECK_OBJ(font);
336    rsi_ContextBindFont(rsc, font);
337}
338
339void rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
340    rsc->mStateFont.setFontColor(r, g, b, a);
341}
342
343}
344}
345