rsScriptC_LibGL.cpp revision 61a4bb734b91ced09fbfee4214c6f253cb66e5f0
1aeb094b520d8ea49b74129927578f18f758c873eJason Sams/*
2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3aeb094b520d8ea49b74129927578f18f758c873eJason Sams *
4aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5aeb094b520d8ea49b74129927578f18f758c873eJason Sams * you may not use this file except in compliance with the License.
6aeb094b520d8ea49b74129927578f18f758c873eJason Sams * You may obtain a copy of the License at
7aeb094b520d8ea49b74129927578f18f758c873eJason Sams *
8aeb094b520d8ea49b74129927578f18f758c873eJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9aeb094b520d8ea49b74129927578f18f758c873eJason Sams *
10aeb094b520d8ea49b74129927578f18f758c873eJason Sams * Unless required by applicable law or agreed to in writing, software
11aeb094b520d8ea49b74129927578f18f758c873eJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12aeb094b520d8ea49b74129927578f18f758c873eJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aeb094b520d8ea49b74129927578f18f758c873eJason Sams * See the License for the specific language governing permissions and
14aeb094b520d8ea49b74129927578f18f758c873eJason Sams * limitations under the License.
15aeb094b520d8ea49b74129927578f18f758c873eJason Sams */
16aeb094b520d8ea49b74129927578f18f758c873eJason Sams
17aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsContext.h"
18aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "rsScriptC.h"
1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h"
2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h"
2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h"
224edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsMesh.h"
234edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsgApiStructs.h"
24aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h"
26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h"
27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h"
28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h"
29aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES
31aeb094b520d8ea49b74129927578f18f758c873eJason Sams
32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h>
33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h>
34aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h>
35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h>
36aeb094b520d8ea49b74129927578f18f758c873eJason Sams
37aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h>
38aeb094b520d8ea49b74129927578f18f758c873eJason Sams
39aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android;
40aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript;
41aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android {
4387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript {
44aeb094b520d8ea49b74129927578f18f758c873eJason Sams
45aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
46aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context
47aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
48aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(a);
5187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(pf);
5287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    pf->bindTexture(rsc, slot, a);
53aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
54aeb094b520d8ea49b74129927578f18f758c873eJason Sams
55a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchoukvoid rsrBindConstant(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
56a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk    CHECK_OBJ_OR_NULL(a);
57a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk    CHECK_OBJ(pf);
58a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk    pf->bindAllocation(rsc, a, slot);
59a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk}
60a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
618e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchoukvoid rsrBindConstant(Context *rsc, Script *sc, ProgramVertex *pv, uint32_t slot, Allocation *a) {
62a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk    CHECK_OBJ_OR_NULL(a);
638e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk    CHECK_OBJ(pv);
648e6bde735d3c0024c36beff668e1588803657357Alex Sakhartchouk    pv->bindAllocation(rsc, a, slot);
65a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk}
66a720a144508edd91e4790b23eadd6cd270368df9Alex Sakhartchouk
6787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
68605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(vs);
69605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    pf->bindSampler(rsc, slot, s);
71aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
72aeb094b520d8ea49b74129927578f18f758c873eJason Sams
7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(ps);
7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramStore(ps);
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
77aeb094b520d8ea49b74129927578f18f758c873eJason Sams
7887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
79605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pf);
8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramFragment(pf);
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams
8387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
84605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pv);
8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramVertex(pv);
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams
8887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(pr);
9087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramRaster(pr);
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams
9387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
9587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindColorTarget(rsc, a, slot);
96a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
9987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindDepthTarget(rsc, a);
102a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1037d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
10587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
1067d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
107a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
11087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
1117d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
112a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
11587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
1167d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.resetAll(rsc);
117a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1187d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1197d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
120aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
121aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
122aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
123aeb094b520d8ea49b74129927578f18f758c873eJason Sams
12487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
12560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
126a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
127a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams
13287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
13360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams
13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                        float r, float g, float b, float a) {
13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(pf);
139383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1406445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1416445e5210c6d7f8689e94be9026153d017c9545bJason Sams
14287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
14360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
14495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
14595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams
15087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc,
15187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x1, float y1, float z1, float u1, float v1,
15287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x2, float y2, float z2, float u2, float v2,
15387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x3, float y3, float z3, float u3, float v3,
15487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x4, float y4, float z4, float u4, float v4) {
155aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
156aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams
159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
160a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if (!dc->gl.shaderCache->setup(rsc)) {
161a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        return;
162a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
164af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("Quad");
165af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
166af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
167af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
168af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
169aeb094b520d8ea49b74129927578f18f758c873eJason Sams
170aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
171aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
172aeb094b520d8ea49b74129927578f18f758c873eJason Sams
173a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray::Attrib attribs[2];
17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
177a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray va(attribs, 2);
178c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    va.setup(rsc);
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams
1802382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams
18387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc,
18487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x1, float y1, float z1,
18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x2, float y2, float z2,
18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x3, float y3, float z3,
18787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x4, float y4, float z4) {
18887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
18987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x2, y2, z2, 1, 1,
19087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x3, y3, z3, 1, 0,
19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x4, y4, z4, 0, 0);
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams
19487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
19587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                              float x, float y, float z, float w, float h) {
19660709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
19760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
199aeb094b520d8ea49b74129927578f18f758c873eJason Sams
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams
20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc,
20587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                x,   sh - y,     z,
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
20960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex((ProgramVertex *)tmp.get());
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams
21287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
213af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2179e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
2189e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    CHECK_OBJ(sm);
2199e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    if (!rsc->setupCheck()) {
2209e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        return;
2219e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    }
2229e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    sm->render(rsc);
2239e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}
2249e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams
22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
228aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
230aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
231aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
232aeb094b520d8ea49b74129927578f18f758c873eJason Sams
23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
235aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
237aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
24187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               uint32_t start, uint32_t len) {
24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
248aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
249aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *minX, float *minY, float *minZ,
25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *maxX, float *maxY, float *maxZ) {
25387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
254e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    sm->computeBBox(rsc);
255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
263aeb094b520d8ea49b74129927578f18f758c873eJason Sams
264aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
265aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
266aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
267aeb094b520d8ea49b74129927578f18f758c873eJason Sams
268aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
27087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    ProgramFragment *pf = rsc->getProgramFragment();
271383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
272aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
273aeb094b520d8ea49b74129927578f18f758c873eJason Sams
274653b53ebcd2bedc94ac486080d2e82e1920232e3Alex Sakhartchoukvoid rsrPrepareClear(Context *rsc, Script *sc) {
275c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
276889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) {
280aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
282aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) {
284aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
285aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
286aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
28861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
28987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t allocSize = a->getType()->getSizeBytes();
29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
29161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
292d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
293d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
29487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
29509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
29709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
29987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics,
30087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
301afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
30309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
304afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
30609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
307afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
310afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
31109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
31209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
31309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
31409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
31687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
31787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(a);
31861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
31987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t textLen = a->getType()->getSizeBytes();
32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
32109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
32287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
32361a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
32409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
32509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text,
32787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
32809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
32909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
33009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
333d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
33487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) {
335605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
336d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
337d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
338aeb094b520d8ea49b74129927578f18f758c873eJason Sams
33987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
3409fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3419fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3429fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
343aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
34487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
345