1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2011 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include "rsContext.h"
18*e1eccf28SAndroid Build Coastguard Worker #include "rsMesh.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rs.h"
20*e1eccf28SAndroid Build Coastguard Worker
21*e1eccf28SAndroid Build Coastguard Worker namespace android {
22*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
23*e1eccf28SAndroid Build Coastguard Worker
Mesh(Context * rsc)24*e1eccf28SAndroid Build Coastguard Worker Mesh::Mesh(Context *rsc) : ObjectBase(rsc) {
25*e1eccf28SAndroid Build Coastguard Worker mHal.drv = nullptr;
26*e1eccf28SAndroid Build Coastguard Worker mHal.state.primitives = nullptr;
27*e1eccf28SAndroid Build Coastguard Worker mHal.state.primitivesCount = 0;
28*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffers = nullptr;
29*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffersCount = 0;
30*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffers = nullptr;
31*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffersCount = 0;
32*e1eccf28SAndroid Build Coastguard Worker mInitialized = false;
33*e1eccf28SAndroid Build Coastguard Worker
34*e1eccf28SAndroid Build Coastguard Worker mVertexBuffers = nullptr;
35*e1eccf28SAndroid Build Coastguard Worker mIndexBuffers = nullptr;
36*e1eccf28SAndroid Build Coastguard Worker }
37*e1eccf28SAndroid Build Coastguard Worker
Mesh(Context * rsc,uint32_t vertexBuffersCount,uint32_t primitivesCount)38*e1eccf28SAndroid Build Coastguard Worker Mesh::Mesh(Context *rsc,
39*e1eccf28SAndroid Build Coastguard Worker uint32_t vertexBuffersCount,
40*e1eccf28SAndroid Build Coastguard Worker uint32_t primitivesCount) : ObjectBase(rsc) {
41*e1eccf28SAndroid Build Coastguard Worker mHal.drv = nullptr;
42*e1eccf28SAndroid Build Coastguard Worker mHal.state.primitivesCount = primitivesCount;
43*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffersCount = primitivesCount;
44*e1eccf28SAndroid Build Coastguard Worker mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount];
45*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount];
46*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) {
47*e1eccf28SAndroid Build Coastguard Worker mHal.state.primitives[i] = RS_PRIMITIVE_POINT;
48*e1eccf28SAndroid Build Coastguard Worker }
49*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) {
50*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffers[i] = nullptr;
51*e1eccf28SAndroid Build Coastguard Worker }
52*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffersCount = vertexBuffersCount;
53*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount];
54*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) {
55*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffers[i] = nullptr;
56*e1eccf28SAndroid Build Coastguard Worker }
57*e1eccf28SAndroid Build Coastguard Worker
58*e1eccf28SAndroid Build Coastguard Worker mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount];
59*e1eccf28SAndroid Build Coastguard Worker mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount];
60*e1eccf28SAndroid Build Coastguard Worker }
61*e1eccf28SAndroid Build Coastguard Worker
~Mesh()62*e1eccf28SAndroid Build Coastguard Worker Mesh::~Mesh() {
63*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_SERIALIZE
64*e1eccf28SAndroid Build Coastguard Worker mRSC->mHal.funcs.mesh.destroy(mRSC, this);
65*e1eccf28SAndroid Build Coastguard Worker #endif
66*e1eccf28SAndroid Build Coastguard Worker
67*e1eccf28SAndroid Build Coastguard Worker delete[] mHal.state.vertexBuffers;
68*e1eccf28SAndroid Build Coastguard Worker delete[] mHal.state.primitives;
69*e1eccf28SAndroid Build Coastguard Worker delete[] mHal.state.indexBuffers;
70*e1eccf28SAndroid Build Coastguard Worker
71*e1eccf28SAndroid Build Coastguard Worker delete[] mVertexBuffers;
72*e1eccf28SAndroid Build Coastguard Worker delete[] mIndexBuffers;
73*e1eccf28SAndroid Build Coastguard Worker }
74*e1eccf28SAndroid Build Coastguard Worker
init()75*e1eccf28SAndroid Build Coastguard Worker void Mesh::init() {
76*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_SERIALIZE
77*e1eccf28SAndroid Build Coastguard Worker mRSC->mHal.funcs.mesh.init(mRSC, this);
78*e1eccf28SAndroid Build Coastguard Worker #endif
79*e1eccf28SAndroid Build Coastguard Worker }
80*e1eccf28SAndroid Build Coastguard Worker
serialize(Context * rsc,OStream * stream) const81*e1eccf28SAndroid Build Coastguard Worker void Mesh::serialize(Context *rsc, OStream *stream) const {
82*e1eccf28SAndroid Build Coastguard Worker // Need to identify ourselves
83*e1eccf28SAndroid Build Coastguard Worker stream->addU32((uint32_t)getClassId());
84*e1eccf28SAndroid Build Coastguard Worker stream->addString(getName());
85*e1eccf28SAndroid Build Coastguard Worker
86*e1eccf28SAndroid Build Coastguard Worker // Store number of vertex streams
87*e1eccf28SAndroid Build Coastguard Worker stream->addU32(mHal.state.vertexBuffersCount);
88*e1eccf28SAndroid Build Coastguard Worker for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) {
89*e1eccf28SAndroid Build Coastguard Worker mHal.state.vertexBuffers[vCount]->serialize(rsc, stream);
90*e1eccf28SAndroid Build Coastguard Worker }
91*e1eccf28SAndroid Build Coastguard Worker
92*e1eccf28SAndroid Build Coastguard Worker stream->addU32(mHal.state.primitivesCount);
93*e1eccf28SAndroid Build Coastguard Worker // Store the primitives
94*e1eccf28SAndroid Build Coastguard Worker for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) {
95*e1eccf28SAndroid Build Coastguard Worker stream->addU8((uint8_t)mHal.state.primitives[pCount]);
96*e1eccf28SAndroid Build Coastguard Worker
97*e1eccf28SAndroid Build Coastguard Worker if (mHal.state.indexBuffers[pCount]) {
98*e1eccf28SAndroid Build Coastguard Worker stream->addU32(1);
99*e1eccf28SAndroid Build Coastguard Worker mHal.state.indexBuffers[pCount]->serialize(rsc, stream);
100*e1eccf28SAndroid Build Coastguard Worker } else {
101*e1eccf28SAndroid Build Coastguard Worker stream->addU32(0);
102*e1eccf28SAndroid Build Coastguard Worker }
103*e1eccf28SAndroid Build Coastguard Worker }
104*e1eccf28SAndroid Build Coastguard Worker }
105*e1eccf28SAndroid Build Coastguard Worker
createFromStream(Context * rsc,IStream * stream)106*e1eccf28SAndroid Build Coastguard Worker Mesh *Mesh::createFromStream(Context *rsc, IStream *stream) {
107*e1eccf28SAndroid Build Coastguard Worker // First make sure we are reading the correct object
108*e1eccf28SAndroid Build Coastguard Worker RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
109*e1eccf28SAndroid Build Coastguard Worker if (classID != RS_A3D_CLASS_ID_MESH) {
110*e1eccf28SAndroid Build Coastguard Worker ALOGE("mesh loading skipped due to invalid class id");
111*e1eccf28SAndroid Build Coastguard Worker return nullptr;
112*e1eccf28SAndroid Build Coastguard Worker }
113*e1eccf28SAndroid Build Coastguard Worker
114*e1eccf28SAndroid Build Coastguard Worker const char *name = stream->loadString();
115*e1eccf28SAndroid Build Coastguard Worker
116*e1eccf28SAndroid Build Coastguard Worker uint32_t vertexBuffersCount = stream->loadU32();
117*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<Allocation> *vertexBuffers = nullptr;
118*e1eccf28SAndroid Build Coastguard Worker if (vertexBuffersCount) {
119*e1eccf28SAndroid Build Coastguard Worker vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount];
120*e1eccf28SAndroid Build Coastguard Worker
121*e1eccf28SAndroid Build Coastguard Worker for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) {
122*e1eccf28SAndroid Build Coastguard Worker Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream);
123*e1eccf28SAndroid Build Coastguard Worker vertexBuffers[vCount].set(vertexAlloc);
124*e1eccf28SAndroid Build Coastguard Worker }
125*e1eccf28SAndroid Build Coastguard Worker }
126*e1eccf28SAndroid Build Coastguard Worker
127*e1eccf28SAndroid Build Coastguard Worker uint32_t primitivesCount = stream->loadU32();
128*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<Allocation> *indexBuffers = nullptr;
129*e1eccf28SAndroid Build Coastguard Worker RsPrimitive *primitives = nullptr;
130*e1eccf28SAndroid Build Coastguard Worker if (primitivesCount) {
131*e1eccf28SAndroid Build Coastguard Worker indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount];
132*e1eccf28SAndroid Build Coastguard Worker primitives = new RsPrimitive[primitivesCount];
133*e1eccf28SAndroid Build Coastguard Worker
134*e1eccf28SAndroid Build Coastguard Worker // load all primitives
135*e1eccf28SAndroid Build Coastguard Worker for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) {
136*e1eccf28SAndroid Build Coastguard Worker primitives[pCount] = (RsPrimitive)stream->loadU8();
137*e1eccf28SAndroid Build Coastguard Worker
138*e1eccf28SAndroid Build Coastguard Worker // Check to see if the index buffer was stored
139*e1eccf28SAndroid Build Coastguard Worker uint32_t isIndexPresent = stream->loadU32();
140*e1eccf28SAndroid Build Coastguard Worker if (isIndexPresent) {
141*e1eccf28SAndroid Build Coastguard Worker Allocation *indexAlloc = Allocation::createFromStream(rsc, stream);
142*e1eccf28SAndroid Build Coastguard Worker indexBuffers[pCount].set(indexAlloc);
143*e1eccf28SAndroid Build Coastguard Worker }
144*e1eccf28SAndroid Build Coastguard Worker }
145*e1eccf28SAndroid Build Coastguard Worker }
146*e1eccf28SAndroid Build Coastguard Worker
147*e1eccf28SAndroid Build Coastguard Worker Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount);
148*e1eccf28SAndroid Build Coastguard Worker mesh->assignName(name);
149*e1eccf28SAndroid Build Coastguard Worker for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) {
150*e1eccf28SAndroid Build Coastguard Worker mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount);
151*e1eccf28SAndroid Build Coastguard Worker }
152*e1eccf28SAndroid Build Coastguard Worker for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) {
153*e1eccf28SAndroid Build Coastguard Worker mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount);
154*e1eccf28SAndroid Build Coastguard Worker }
155*e1eccf28SAndroid Build Coastguard Worker
156*e1eccf28SAndroid Build Coastguard Worker // Cleanup
157*e1eccf28SAndroid Build Coastguard Worker if (vertexBuffersCount) {
158*e1eccf28SAndroid Build Coastguard Worker delete[] vertexBuffers;
159*e1eccf28SAndroid Build Coastguard Worker }
160*e1eccf28SAndroid Build Coastguard Worker if (primitivesCount) {
161*e1eccf28SAndroid Build Coastguard Worker delete[] indexBuffers;
162*e1eccf28SAndroid Build Coastguard Worker delete[] primitives;
163*e1eccf28SAndroid Build Coastguard Worker }
164*e1eccf28SAndroid Build Coastguard Worker
165*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_SERIALIZE
166*e1eccf28SAndroid Build Coastguard Worker mesh->init();
167*e1eccf28SAndroid Build Coastguard Worker mesh->uploadAll(rsc);
168*e1eccf28SAndroid Build Coastguard Worker #endif
169*e1eccf28SAndroid Build Coastguard Worker return mesh;
170*e1eccf28SAndroid Build Coastguard Worker }
171*e1eccf28SAndroid Build Coastguard Worker
render(Context * rsc) const172*e1eccf28SAndroid Build Coastguard Worker void Mesh::render(Context *rsc) const {
173*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) {
174*e1eccf28SAndroid Build Coastguard Worker renderPrimitive(rsc, ct);
175*e1eccf28SAndroid Build Coastguard Worker }
176*e1eccf28SAndroid Build Coastguard Worker }
177*e1eccf28SAndroid Build Coastguard Worker
renderPrimitive(Context * rsc,uint32_t primIndex) const178*e1eccf28SAndroid Build Coastguard Worker void Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const {
179*e1eccf28SAndroid Build Coastguard Worker if (primIndex >= mHal.state.primitivesCount) {
180*e1eccf28SAndroid Build Coastguard Worker ALOGE("Invalid primitive index");
181*e1eccf28SAndroid Build Coastguard Worker return;
182*e1eccf28SAndroid Build Coastguard Worker }
183*e1eccf28SAndroid Build Coastguard Worker
184*e1eccf28SAndroid Build Coastguard Worker if (mHal.state.indexBuffers[primIndex]) {
185*e1eccf28SAndroid Build Coastguard Worker renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX());
186*e1eccf28SAndroid Build Coastguard Worker return;
187*e1eccf28SAndroid Build Coastguard Worker }
188*e1eccf28SAndroid Build Coastguard Worker
189*e1eccf28SAndroid Build Coastguard Worker renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX());
190*e1eccf28SAndroid Build Coastguard Worker }
191*e1eccf28SAndroid Build Coastguard Worker
renderPrimitiveRange(Context * rsc,uint32_t primIndex,uint32_t start,uint32_t len) const192*e1eccf28SAndroid Build Coastguard Worker void Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const {
193*e1eccf28SAndroid Build Coastguard Worker if (len < 1 || primIndex >= mHal.state.primitivesCount) {
194*e1eccf28SAndroid Build Coastguard Worker ALOGE("Invalid mesh or parameters");
195*e1eccf28SAndroid Build Coastguard Worker return;
196*e1eccf28SAndroid Build Coastguard Worker }
197*e1eccf28SAndroid Build Coastguard Worker
198*e1eccf28SAndroid Build Coastguard Worker mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len);
199*e1eccf28SAndroid Build Coastguard Worker }
200*e1eccf28SAndroid Build Coastguard Worker
uploadAll(Context * rsc)201*e1eccf28SAndroid Build Coastguard Worker void Mesh::uploadAll(Context *rsc) {
202*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) {
203*e1eccf28SAndroid Build Coastguard Worker if (mHal.state.vertexBuffers[ct]) {
204*e1eccf28SAndroid Build Coastguard Worker rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]);
205*e1eccf28SAndroid Build Coastguard Worker }
206*e1eccf28SAndroid Build Coastguard Worker }
207*e1eccf28SAndroid Build Coastguard Worker
208*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) {
209*e1eccf28SAndroid Build Coastguard Worker if (mHal.state.indexBuffers[ct]) {
210*e1eccf28SAndroid Build Coastguard Worker rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]);
211*e1eccf28SAndroid Build Coastguard Worker }
212*e1eccf28SAndroid Build Coastguard Worker }
213*e1eccf28SAndroid Build Coastguard Worker }
214*e1eccf28SAndroid Build Coastguard Worker
computeBBox(Context * rsc)215*e1eccf28SAndroid Build Coastguard Worker void Mesh::computeBBox(Context *rsc) {
216*e1eccf28SAndroid Build Coastguard Worker float *posPtr = nullptr;
217*e1eccf28SAndroid Build Coastguard Worker uint32_t vectorSize = 0;
218*e1eccf28SAndroid Build Coastguard Worker uint32_t stride = 0;
219*e1eccf28SAndroid Build Coastguard Worker uint32_t numVerts = 0;
220*e1eccf28SAndroid Build Coastguard Worker Allocation *posAlloc = nullptr;
221*e1eccf28SAndroid Build Coastguard Worker // First we need to find the position ptr and stride
222*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) {
223*e1eccf28SAndroid Build Coastguard Worker const Type *bufferType = mHal.state.vertexBuffers[ct]->getType();
224*e1eccf28SAndroid Build Coastguard Worker const Element *bufferElem = bufferType->getElement();
225*e1eccf28SAndroid Build Coastguard Worker
226*e1eccf28SAndroid Build Coastguard Worker for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) {
227*e1eccf28SAndroid Build Coastguard Worker if (strcmp(bufferElem->getFieldName(ct), "position") == 0) {
228*e1eccf28SAndroid Build Coastguard Worker vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize();
229*e1eccf28SAndroid Build Coastguard Worker stride = bufferElem->getSizeBytes() / sizeof(float);
230*e1eccf28SAndroid Build Coastguard Worker uint32_t offset = bufferElem->getFieldOffsetBytes(ct);
231*e1eccf28SAndroid Build Coastguard Worker posAlloc = mHal.state.vertexBuffers[ct];
232*e1eccf28SAndroid Build Coastguard Worker const uint8_t *bp = (const uint8_t *)rsc->mHal.funcs.allocation.lock1D(
233*e1eccf28SAndroid Build Coastguard Worker rsc, posAlloc);
234*e1eccf28SAndroid Build Coastguard Worker posPtr = (float*)(bp + offset);
235*e1eccf28SAndroid Build Coastguard Worker numVerts = bufferType->getDimX();
236*e1eccf28SAndroid Build Coastguard Worker break;
237*e1eccf28SAndroid Build Coastguard Worker }
238*e1eccf28SAndroid Build Coastguard Worker }
239*e1eccf28SAndroid Build Coastguard Worker if (posPtr) {
240*e1eccf28SAndroid Build Coastguard Worker break;
241*e1eccf28SAndroid Build Coastguard Worker }
242*e1eccf28SAndroid Build Coastguard Worker }
243*e1eccf28SAndroid Build Coastguard Worker
244*e1eccf28SAndroid Build Coastguard Worker mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6;
245*e1eccf28SAndroid Build Coastguard Worker mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6;
246*e1eccf28SAndroid Build Coastguard Worker if (!posPtr) {
247*e1eccf28SAndroid Build Coastguard Worker ALOGE("Unable to compute bounding box");
248*e1eccf28SAndroid Build Coastguard Worker mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f;
249*e1eccf28SAndroid Build Coastguard Worker mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f;
250*e1eccf28SAndroid Build Coastguard Worker return;
251*e1eccf28SAndroid Build Coastguard Worker }
252*e1eccf28SAndroid Build Coastguard Worker
253*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < numVerts; i ++) {
254*e1eccf28SAndroid Build Coastguard Worker for (uint32_t v = 0; v < vectorSize; v ++) {
255*e1eccf28SAndroid Build Coastguard Worker mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]);
256*e1eccf28SAndroid Build Coastguard Worker mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]);
257*e1eccf28SAndroid Build Coastguard Worker }
258*e1eccf28SAndroid Build Coastguard Worker posPtr += stride;
259*e1eccf28SAndroid Build Coastguard Worker }
260*e1eccf28SAndroid Build Coastguard Worker
261*e1eccf28SAndroid Build Coastguard Worker if (posAlloc) {
262*e1eccf28SAndroid Build Coastguard Worker rsc->mHal.funcs.allocation.unlock1D(rsc, posAlloc);
263*e1eccf28SAndroid Build Coastguard Worker }
264*e1eccf28SAndroid Build Coastguard Worker }
265*e1eccf28SAndroid Build Coastguard Worker
rsi_MeshCreate(Context * rsc,RsAllocation * vtx,size_t vtxCount,RsAllocation * idx,size_t idxCount,uint32_t * primType,size_t primTypeCount)266*e1eccf28SAndroid Build Coastguard Worker RsMesh rsi_MeshCreate(Context *rsc,
267*e1eccf28SAndroid Build Coastguard Worker RsAllocation * vtx, size_t vtxCount,
268*e1eccf28SAndroid Build Coastguard Worker RsAllocation * idx, size_t idxCount,
269*e1eccf28SAndroid Build Coastguard Worker uint32_t * primType, size_t primTypeCount) {
270*e1eccf28SAndroid Build Coastguard Worker rsAssert(idxCount == primTypeCount);
271*e1eccf28SAndroid Build Coastguard Worker Mesh *sm = new Mesh(rsc, vtxCount, idxCount);
272*e1eccf28SAndroid Build Coastguard Worker sm->incUserRef();
273*e1eccf28SAndroid Build Coastguard Worker
274*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < vtxCount; i ++) {
275*e1eccf28SAndroid Build Coastguard Worker sm->setVertexBuffer((Allocation*)vtx[i], i);
276*e1eccf28SAndroid Build Coastguard Worker }
277*e1eccf28SAndroid Build Coastguard Worker
278*e1eccf28SAndroid Build Coastguard Worker for (uint32_t i = 0; i < idxCount; i ++) {
279*e1eccf28SAndroid Build Coastguard Worker sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i);
280*e1eccf28SAndroid Build Coastguard Worker }
281*e1eccf28SAndroid Build Coastguard Worker
282*e1eccf28SAndroid Build Coastguard Worker sm->init();
283*e1eccf28SAndroid Build Coastguard Worker
284*e1eccf28SAndroid Build Coastguard Worker return sm;
285*e1eccf28SAndroid Build Coastguard Worker }
286*e1eccf28SAndroid Build Coastguard Worker
287*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
288*e1eccf28SAndroid Build Coastguard Worker } // namespace android
289