rsScriptC_LibGL.cpp revision 9e0afb5a2b3e476c42a373e7cd89cef4a34f8195
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
1612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(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
1989e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Samsvoid rsrDrawPath(Context *rsc, Script *sc, Path *sm) {
1999e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    CHECK_OBJ(sm);
2009e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    if (!rsc->setupCheck()) {
2019e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams        return;
2029e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    }
2039e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams    sm->render(rsc);
2049e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}
2059e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams
20687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams
21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
217aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
218aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
22287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
22387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               uint32_t start, uint32_t len) {
22487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
229aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
230aeb094b520d8ea49b74129927578f18f758c873eJason Sams
23187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
23287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *minX, float *minY, float *minZ,
23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *maxX, float *maxY, float *maxZ) {
23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
244aeb094b520d8ea49b74129927578f18f758c873eJason Sams
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
247aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
248aeb094b520d8ea49b74129927578f18f758c873eJason Sams
249aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    ProgramFragment *pf = rsc->getProgramFragment();
252383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
253aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
254aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) {
2562382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glFinish);
2577d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
2587d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
259b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
26087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
261c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
262889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
263aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2642382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClearColor, r, g, b, a);
2652382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
266aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
267aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) {
269c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
270889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
27122fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
2722382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClearDepthf, v);
2732382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
274aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) {
277aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
279aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) {
281aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
282aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
283aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
28587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
28687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t allocSize = a->getType()->getSizeBytes();
28709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
288d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
289d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
29087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
29209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
29309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
29409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
29587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics,
29687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
30409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
306afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
30709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
30809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
30909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
31009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
31187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
31287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
31387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(a);
31487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t textLen = a->getType()->getSizeBytes();
31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
31909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
32187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text,
32287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
32309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
32409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
32509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
327d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
328d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
32987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) {
330605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
331d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
332d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
333aeb094b520d8ea49b74129927578f18f758c873eJason Sams
33487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
3359fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3369fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3379fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
338aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
33987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
340