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
49709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindTexture(Context *rsc, 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
55709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, 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
61709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindConstant(Context *rsc, 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
67709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindSampler(Context *rsc, 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
73709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramStore(Context *rsc, ProgramStore *ps) {
7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(ps);
7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramStore(ps);
76aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
77aeb094b520d8ea49b74129927578f18f758c873eJason Sams
78709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramFragment(Context *rsc, ProgramFragment *pf) {
79605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pf);
8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramFragment(pf);
81aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
82aeb094b520d8ea49b74129927578f18f758c873eJason Sams
83709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramVertex(Context *rsc, ProgramVertex *pv) {
84605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ_OR_NULL(pv);
8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramVertex(pv);
86aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
87aeb094b520d8ea49b74129927578f18f758c873eJason Sams
88709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindProgramRaster(Context *rsc, ProgramRaster *pr) {
8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ_OR_NULL(pr);
9087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->setProgramRaster(pr);
91aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
92aeb094b520d8ea49b74129927578f18f758c873eJason Sams
93709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectColorTarget(Context *rsc, 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
99709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFrameBufferObjectDepthTarget(Context *rsc, Allocation *a) {
1007d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk    CHECK_OBJ(va);
10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    rsc->mFBOCache.bindDepthTarget(rsc, a);
102a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1037d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1047d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
105709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectColorTarget(Context *rsc, uint32_t slot) {
10644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    rsc->mFBOCache.bindColorTarget(rsc, nullptr, slot);
107a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1087d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1097d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
110709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectDepthTarget(Context *rsc) {
11144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    rsc->mFBOCache.bindDepthTarget(rsc, nullptr);
112a74a8f635ce4fae0a9d4b9c79e9fa412787bf6a2Alex Sakhartchouk    rsc->mStateVertex.updateSize(rsc);
1137d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk}
1147d9c5ffccb7a5e682860f752403e5a03aed587beAlex Sakhartchouk
115709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrClearFrameBufferObjectTargets(Context *rsc) {
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
124709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadProjectionMatrix(Context *rsc, const rsc_Matrix *m) {
12560709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setProjectionMatrix(rsc, m);
126a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller}
127a490f1003a76286e0f00606adff4ef85fdd78b02Jim Miller
128709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadModelMatrix(Context *rsc, const rsc_Matrix *m) {
12960709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setModelviewMatrix(rsc, m);
130aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
131aeb094b520d8ea49b74129927578f18f758c873eJason Sams
132709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpLoadTextureMatrix(Context *rsc, const rsc_Matrix *m) {
13360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->setTextureMatrix(rsc, m);
134aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
135aeb094b520d8ea49b74129927578f18f758c873eJason Sams
136709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPfConstantColor(Context *rsc, 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
142709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrVpGetProjectionMatrix(Context *rsc, rsc_Matrix *m) {
14360709257bbdeb0c50f39b9c8969dc76264d6e142Jason Sams    rsc->getProgramVertex()->getProjectionMatrix(rsc, m);
14495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk}
14595333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk
146aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
147aeb094b520d8ea49b74129927578f18f758c873eJason Sams// Drawing
148aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
149aeb094b520d8ea49b74129927578f18f758c873eJason Sams
150aeb094b520d8ea49b74129927578f18f758c873eJason Sams
151709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawPath(Context *rsc, Path *sm) {
1520ca7cbaea8d5cf18f25d1148be75fbb6e2d86c62Jason Sams    // Never shipped in a working state
1539e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams}
1549e0afb5a2b3e476c42a373e7cd89cef4a34f8195Jason Sams
155709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMesh(Context *rsc, Mesh *sm) {
15687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
157aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
158aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
159aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
160aeb094b520d8ea49b74129927578f18f758c873eJason Sams    sm->render(rsc);
161aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
162aeb094b520d8ea49b74129927578f18f758c873eJason Sams
163709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitive(Context *rsc, Mesh *sm, uint32_t primIndex) {
16487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
165aeb094b520d8ea49b74129927578f18f758c873eJason Sams    if (!rsc->setupCheck()) {
166aeb094b520d8ea49b74129927578f18f758c873eJason Sams        return;
167aeb094b520d8ea49b74129927578f18f758c873eJason Sams    }
1684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitive(rsc, primIndex);
1694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}
1704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk
171709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawMeshPrimitiveRange(Context *rsc, Mesh *sm, uint32_t primIndex,
17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               uint32_t start, uint32_t len) {
17387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
1744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    if (!rsc->setupCheck()) {
1754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk        return;
1764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    }
1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk    sm->renderPrimitiveRange(rsc, primIndex, start, len);
178aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
179aeb094b520d8ea49b74129927578f18f758c873eJason Sams
180709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeshComputeBoundingBox(Context *rsc, Mesh *sm,
18187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *minX, float *minY, float *minZ,
18287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                               float *maxX, float *maxY, float *maxZ) {
18387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(sm);
184e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    sm->computeBBox(rsc);
185ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minX = sm->mBBoxMin[0];
186ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minY = sm->mBBoxMin[1];
187ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *minZ = sm->mBBoxMin[2];
188ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxX = sm->mBBoxMax[0];
189ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxY = sm->mBBoxMax[1];
190ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk    *maxZ = sm->mBBoxMax[2];
191ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk}
192ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk
193aeb094b520d8ea49b74129927578f18f758c873eJason Sams
194aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
195aeb094b520d8ea49b74129927578f18f758c873eJason Sams//
196aeb094b520d8ea49b74129927578f18f758c873eJason Sams//////////////////////////////////////////////////////////////////////////////
197aeb094b520d8ea49b74129927578f18f758c873eJason Sams
198aeb094b520d8ea49b74129927578f18f758c873eJason Sams
199709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrColor(Context *rsc, float r, float g, float b, float a) {
20087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    ProgramFragment *pf = rsc->getProgramFragment();
201383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk    pf->setConstantColor(rsc, r, g, b, a);
202aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
203aeb094b520d8ea49b74129927578f18f758c873eJason Sams
204709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrPrepareClear(Context *rsc) {
205c19ff0177a7a0dadfc01b1990f822354fdc95991Alex Sakhartchouk    rsc->mFBOCache.setup(rsc);
206889fe50e7aaebed8cb8284b16a0e51e64e8a3a9cAlex Sakhartchouk    rsc->setupProgramStore();
207aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
208aeb094b520d8ea49b74129927578f18f758c873eJason Sams
209709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetWidth(Context *rsc) {
210aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getWidth();
211aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
212aeb094b520d8ea49b74129927578f18f758c873eJason Sams
213709a0978ae141198018ca9769f8d96292a8928e6Jason Samsuint32_t rsrGetHeight(Context *rsc) {
214aeb094b520d8ea49b74129927578f18f758c873eJason Sams    return rsc->getHeight();
215aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
216aeb094b520d8ea49b74129927578f18f758c873eJason Sams
217709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawTextAlloc(Context *rsc, Allocation *a, int x, int y) {
21861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
21961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    size_t allocSize = a->getType()->getPackedSizeBytes();
22009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, allocSize, x, y);
22161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
222d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
223d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
224709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrDrawText(Context *rsc, const char *text, int x, int y) {
22509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
22609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.renderText(text, textLen, x, y);
22709c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
22809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
22987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SetMetrics(Font::Rect *metrics,
23087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                       int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
231afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (left) {
23209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *left = metrics->left;
23309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
234afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (right) {
23509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *right = metrics->right;
23609c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
237afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (top) {
23809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *top = metrics->top;
23909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
240afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (bottom) {
24109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk        *bottom = metrics->bottom;
24209c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    }
24309c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
24409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
245709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureTextAlloc(Context *rsc, Allocation *a,
24687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    CHECK_OBJ(a);
24861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    const char *text = (const char *)rsc->mHal.funcs.allocation.lock1D(rsc, a);
24961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    size_t textLen = a->getType()->getPackedSizeBytes();
25009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
25109c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
25361a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, a);
25409c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk}
25509c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk
256709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrMeasureText(Context *rsc, const char *text,
25787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
25809c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    size_t textLen = strlen(text);
25909c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    Font::Rect metrics;
26009c67356bbeee0a97a20a06c95b66756838cb541Alex Sakhartchouk    rsc->mStateFont.measureText(text, textLen, &metrics);
26187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams    SetMetrics(&metrics, left, right, top, bottom);
262d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
263d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk
264709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrBindFont(Context *rsc, Font *font) {
265605048a9f9af925782f6c90bc1cdc5af59e337d8Jason Sams    CHECK_OBJ(font);
266d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk    rsi_ContextBindFont(rsc, font);
267d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk}
268aeb094b520d8ea49b74129927578f18f758c873eJason Sams
269709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid rsrFontColor(Context *rsc, float r, float g, float b, float a) {
2709fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk    rsc->mStateFont.setFontColor(r, g, b, a);
2719fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk}
2729fc9f0375a92fe22fecb3782b18a5c6060a07290Alex Sakhartchouk
273aeb094b520d8ea49b74129927578f18f758c873eJason Sams}
27487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}
275