rsScriptC_LibGL.cpp revision c19ff0177a7a0dadfc01b1990f822354fdc95991
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"
22aeb094b520d8ea49b74129927578f18f758c873eJason Sams
23aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include "utils/Timers.h"
24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdVertexArray.h"
25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdShaderCache.h"
26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#include "driver/rsdCore.h"
27aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28aeb094b520d8ea49b74129927578f18f758c873eJason Sams#define GL_GLEXT_PROTOTYPES
29aeb094b520d8ea49b74129927578f18f758c873eJason Sams
30aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/gl.h>
31aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES/glext.h>
32aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2.h>
33aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <GLES2/gl2ext.h>
34aeb094b520d8ea49b74129927578f18f758c873eJason Sams
35aeb094b520d8ea49b74129927578f18f758c873eJason Sams#include <time.h>
36aeb094b520d8ea49b74129927578f18f758c873eJason Sams
37aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android;
38aeb094b520d8ea49b74129927578f18f758c873eJason Samsusing namespace android::renderscript;
39aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace android {
4187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsnamespace renderscript {
42aeb094b520d8ea49b74129927578f18f758c873eJason Sams
43aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
44aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Context
45aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
46aeb094b520d8ea49b74129927578f18f758c873eJason Sams
4787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindTexture(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Allocation *a) {
4887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(a);
4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(pf);
5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    pf->bindTexture(rsc, slot, a);
51aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
52aeb094b520d8ea49b74129927578f18f758c873eJason Sams
5387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindSampler(Context *rsc, Script *sc, ProgramFragment *pf, uint32_t slot, Sampler *s) {
54605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(vs);
55605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(vpf);
5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    pf->bindSampler(rsc, slot, s);
57aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
58aeb094b520d8ea49b74129927578f18f758c873eJason Sams
5987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramStore(Context *rsc, Script *sc, ProgramStore *ps) {
6087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(ps);
6187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramStore(ps);
62aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
63aeb094b520d8ea49b74129927578f18f758c873eJason Sams
6487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramFragment(Context *rsc, Script *sc, ProgramFragment *pf) {
65605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pf);
6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramFragment(pf);
67aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
68aeb094b520d8ea49b74129927578f18f758c873eJason Sams
6987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramVertex(Context *rsc, Script *sc, ProgramVertex *pv) {
70605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pv);
7187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramVertex(pv);
72aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
73aeb094b520d8ea49b74129927578f18f758c873eJason Sams
7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindProgramRaster(Context *rsc, Script *sc, ProgramRaster *pr) {
7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(pr);
7687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramRaster(pr);
77aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
78aeb094b520d8ea49b74129927578f18f758c873eJason Sams
7987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, Script *sc, Allocation *a, uint32_t slot) {
807d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
8187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindColorTarget(rsc, a, slot);
827d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
8487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
857d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
8687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindDepthTarget(rsc, a);
877d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
887d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
917d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
927d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
9387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
967d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
9787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
987d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.resetAll(rsc);
997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
101aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
102aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
103aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
104aeb094b520d8ea49b74129927578f18f758c873eJason Sams
10587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
10660709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
107a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
108a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
10987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
11060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
111aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
112aeb094b520d8ea49b74129927578f18f758c873eJason Sams
11387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
11460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
115aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
116aeb094b520d8ea49b74129927578f18f758c873eJason Sams
11787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                        float r, float g, float b, float a) {
11987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(pf);
120383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1216445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1226445e5210c6d7f8689e94be9026153d017c9545bJason Sams
12387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
12460709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
12595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
12695333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
127aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
128aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
129aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams
13187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc,
13287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x1, float y1, float z1, float u1, float v1,
13387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x2, float y2, float z2, float u2, float v2,
13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x3, float y3, float z3, float u3, float v3,
13587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x4, float y4, float z4, float u4, float v4) {
136aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
137aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
138aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
139aeb094b520d8ea49b74129927578f18f758c873eJason Sams
140a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
141a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if (!dc->gl.shaderCache->setup(rsc)) {
142a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        return;
143a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
144a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
145aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("Quad");
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams
151aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
152aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
153aeb094b520d8ea49b74129927578f18f758c873eJason Sams
154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray::Attrib attribs[2];
15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray va(attribs, 2);
159c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    va.setup(rsc);
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
163aeb094b520d8ea49b74129927578f18f758c873eJason Sams
16487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc,
16587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x1, float y1, float z1,
16687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x2, float y2, float z2,
16787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x3, float y3, float z3,
16887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x4, float y4, float z4) {
16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
17087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x2, y2, z2, 1, 1,
17187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x3, y3, z3, 1, 0,
17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x4, y4, z4, 0, 0);
173aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
174aeb094b520d8ea49b74129927578f18f758c873eJason Sams
17587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                              float x, float y, float z, float w, float h) {
17760709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
17860709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
180aeb094b520d8ea49b74129927578f18f758c873eJason Sams
181aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
182aeb094b520d8ea49b74129927578f18f758c873eJason Sams
183aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams
18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc,
18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                x,   sh - y,     z,
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
19060709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex((ProgramVertex *)tmp.get());
191aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams
19387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //LOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
19587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams
19887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
19987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
200aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
204aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams
20687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               uint32_t start, uint32_t len) {
21687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
221aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
222aeb094b520d8ea49b74129927578f18f758c873eJason Sams
22387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
22487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *minX, float *minY, float *minZ,
22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *maxX, float *maxY, float *maxZ) {
22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
236aeb094b520d8ea49b74129927578f18f758c873eJason Sams
237aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
238aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
239aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
240aeb094b520d8ea49b74129927578f18f758c873eJason Sams
241aeb094b520d8ea49b74129927578f18f758c873eJason Sams
24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    ProgramFragment *pf = rsc->getProgramFragment();
244383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams
24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) {
2487d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    glFinish();
2497d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
2507d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
251b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
253c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
254889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
255aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearColor(r, g, b, a);
25722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_COLOR_BUFFER_BIT);
258aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
259aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) {
261c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
262889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
26322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
26422fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClearDepthf(v);
26522fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams    glClear(GL_DEPTH_BUFFER_BIT);
266aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
267aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) {
269aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
270aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
271aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) {
273aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
274aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
27787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
27887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t allocSize = a->getType()->getSizeBytes();
27909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
280d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
281d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
28287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
28309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
28409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
28509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
28609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics,
28887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
289afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
292afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
29309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
29409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
29709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
298afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
30009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
30387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
30487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
30587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(a);
30687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
30787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t textLen = a->getType()->getSizeBytes();
30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
31087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
31109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
31209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
31387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text,
31487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
31509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
319d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
320d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
32187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) {
322605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
323d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
325aeb094b520d8ea49b74129927578f18f758c873eJason Sams
32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
3279fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3289fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3299fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
332