xref: /aosp_15_r20/frameworks/rs/rsMesh.cpp (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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