rsScriptC_LibGL.cpp revision af12ac6a08651464f8d823add667c706f993b587
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);
82a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
837d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
847d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Script *sc, Allocation *a) {
867d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
8787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindDepthTarget(rsc, a);
88a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
897d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
907d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
9187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, Script *sc, uint32_t slot) {
927d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindColorTarget(rsc, NULL, slot);
93a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
947d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
957d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
9687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc, Script *sc) {
977d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.bindDepthTarget(rsc, NULL);
98a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
997d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc, Script *sc) {
1027d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    rsc->mFBOCache.resetAll(rsc);
103a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1057d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
106aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
107aeb094b520d8ea49b74129927578f18f758c873eJason Sams// VP
108aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
109aeb094b520d8ea49b74129927578f18f758c873eJason Sams
11087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
11160709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
112a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
113a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
11487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
11560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
116aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
117aeb094b520d8ea49b74129927578f18f758c873eJason Sams
11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, Script *sc, const rsc_Matrix *m) {
11960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
120aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
121aeb094b520d8ea49b74129927578f18f758c873eJason Sams
12287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrPfConstantColor(Context *rsc, Script *sc, ProgramFragment *pf,
12387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                        float r, float g, float b, float a) {
12487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(pf);
125383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
1266445e5210c6d7f8689e94be9026153d017c9545bJason Sams}
1276445e5210c6d7f8689e94be9026153d017c9545bJason Sams
12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, Script *sc, rsc_Matrix *m) {
12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
13095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
13195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
132aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
133aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams
13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuadTexCoords(Context *rsc, Script *sc,
13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x1, float y1, float z1, float u1, float v1,
13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x2, float y2, float z2, float u2, float v2,
13987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x3, float y3, float z3, float u3, float v3,
14087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                          float x4, float y4, float z4, float u4, float v4) {
141aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
142aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
143aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
144aeb094b520d8ea49b74129927578f18f758c873eJason Sams
145a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
146a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    if (!dc->gl.shaderCache->setup(rsc)) {
147a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk        return;
148a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    }
149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk
150af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("Quad");
151af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
152af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
153af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
154af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
155aeb094b520d8ea49b74129927578f18f758c873eJason Sams
156aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams
159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray::Attrib attribs[2];
16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk
163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk    RsdVertexArray va(attribs, 2);
164c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    va.setup(rsc);
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams
1662382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
168aeb094b520d8ea49b74129927578f18f758c873eJason Sams
16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawQuad(Context *rsc, Script *sc,
17087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x1, float y1, float z1,
17187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x2, float y2, float z2,
17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x3, float y3, float z3,
17387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                 float x4, float y4, float z4) {
17487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuadTexCoords(rsc, sc, x1, y1, z1, 0, 1,
17587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x2, y2, z2, 1, 1,
17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x3, y3, z3, 1, 0,
17787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                                  x4, y4, z4, 0, 0);
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams
18087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawSpriteScreenspace(Context *rsc, Script *sc,
18187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                              float x, float y, float z, float w, float h) {
18260709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
18360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
184aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //rsc->setupCheck();
185aeb094b520d8ea49b74129927578f18f758c873eJason Sams
186aeb094b520d8ea49b74129927578f18f758c873eJason Sams    //GLint crop[4] = {0, h, w, -h};
187aeb094b520d8ea49b74129927578f18f758c873eJason Sams
188aeb094b520d8ea49b74129927578f18f758c873eJason Sams    float sh = rsc->getHeight();
189aeb094b520d8ea49b74129927578f18f758c873eJason Sams
19087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc,
19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                x,   sh - y,     z,
192aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - y,     z,
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x+w, sh - (y+h), z,
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams                x,   sh - (y+h), z);
19560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->setProgramVertex((ProgramVertex *)tmp.get());
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams
19887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawRect(Context *rsc, Script *sc, float x1, float y1, float x2, float y2, float z) {
199af12ac6a08651464f8d823add667c706f993b587Steve Block    //ALOGE("SC_drawRect %f,%f  %f,%f  %f", x1, y1, x2, y2, z);
20087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsrDrawQuad(rsc, sc, x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
201aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams
20387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMesh(Context *rsc, Script *sc, Mesh *sm) {
20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
205aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
206aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
209aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams
21187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex) {
21287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
213aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
21987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Script *sc, Mesh *sm, uint32_t primIndex,
22087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               uint32_t start, uint32_t len) {
22187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
226aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
227aeb094b520d8ea49b74129927578f18f758c873eJason Sams
22887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Script *sc, Mesh *sm,
22987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *minX, float *minY, float *minZ,
23087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *maxX, float *maxY, float *maxZ) {
23187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    sm->computeBBox();
233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
241aeb094b520d8ea49b74129927578f18f758c873eJason Sams
242aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
243aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
244aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
245aeb094b520d8ea49b74129927578f18f758c873eJason Sams
246aeb094b520d8ea49b74129927578f18f758c873eJason Sams
24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
24887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    ProgramFragment *pf = rsc->getProgramFragment();
249383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
250aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
251aeb094b520d8ea49b74129927578f18f758c873eJason Sams
25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFinish(Context *rsc, Script *sc) {
2532382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glFinish);
2547d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
2557d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
256b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
25787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
258c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
259889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
260aeb094b520d8ea49b74129927578f18f758c873eJason Sams
2612382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClearColor, r, g, b, a);
2622382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClear, GL_COLOR_BUFFER_BIT);
263aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
264aeb094b520d8ea49b74129927578f18f758c873eJason Sams
26587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrClearDepth(Context *rsc, Script *sc, float v) {
266c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
267889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
26822fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
2692382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClearDepthf, v);
2702382aba4a55c6ae74789c478eead8fbd96593321Jason Sams    RSD_CALL_GL(glClear, GL_DEPTH_BUFFER_BIT);
271aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
272aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetWidth(Context *rsc, Script *sc) {
274aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
275aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
276aeb094b520d8ea49b74129927578f18f758c873eJason Sams
27787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsuint32_t rsrGetHeight(Context *rsc, Script *sc) {
278aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
279aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
280aeb094b520d8ea49b74129927578f18f758c873eJason Sams
28187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Script *sc, Allocation *a, int x, int y) {
28287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
28387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t allocSize = a->getType()->getSizeBytes();
28409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
285d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
286d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
28787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrDrawText(Context *rsc, Script *sc, const char *text, int x, int y) {
28809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
28909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
29009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
29109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
29287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics,
29387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
294afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
29509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
29609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
29809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
29909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
30109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
30209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
30409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
30509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
30609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
30709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
30887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Script *sc, Allocation *a,
30987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
31087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(a);
31187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    const char *text = (const char *)a->getPtr();
31287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    size_t textLen = a->getType()->getSizeBytes();
31309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
31409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
31587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
31609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
31709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
31887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrMeasureText(Context *rsc, Script *sc, const char *text,
31987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
32009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
32109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
32209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
32387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
324d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
325d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
32687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrBindFont(Context *rsc, Script *sc, Font *font) {
327605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
328d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
329d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
330aeb094b520d8ea49b74129927578f18f758c873eJason Sams
33187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsvoid rsrFontColor(Context *rsc, Script *sc, float r, float g, float b, float a) {
3329fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
3339fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
3349fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
335aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
33687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
337