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