rsMesh.cpp revision 807fdc4b6f3fb893015ee136565d6151bb2332d3
1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 3a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 4a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * you may not use this file except in compliance with the License. 6a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * You may obtain a copy of the License at 7a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 8a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * 10a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Unless required by applicable law or agreed to in writing, software 11a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * See the License for the specific language governing permissions and 14a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * limitations under the License. 15a89371c6f144b9049efe7689105feee2c4a38384Jason Sams */ 16a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 17a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "rsContext.h" 184edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsMesh.h" 19e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rs.h" 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 23a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 24afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitives = NULL; 27a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = 0; 28064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = NULL; 29064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = 0; 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffers = NULL; 31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = 0; 32a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mInitialized = false; 33064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 34064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = NULL; 35064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = NULL; 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 3754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukMesh::Mesh(Context *rsc, 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount, 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount) : ObjectBase(rsc) { 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 42a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = primitivesCount; 43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = primitivesCount; 44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount]; 45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount]; 46a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) { 47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives[i] = RS_PRIMITIVE_POINT; 48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) { 50064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers[i] = NULL; 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 52a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = vertexBuffersCount; 53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount]; 54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) { 55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers[i] = NULL; 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 57064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 58064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount]; 59064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount]; 60a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 61a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 62afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::~Mesh() { 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.destroy(mRSC, this); 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 66a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.vertexBuffers; 68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.primitives; 69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.indexBuffers; 704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mVertexBuffers; 72064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mIndexBuffers; 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid Mesh::init() { 7677d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 77a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.init(mRSC, this); 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 81e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Mesh::serialize(Context *rsc, OStream *stream) const { 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Need to identify ourselves 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 84099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name(getName()); 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addString(&name); 87099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 88099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store number of vertex streams 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.vertexBuffersCount); 90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) { 91e3150cfb3edb028407669e4a65e087eae77e718cJason Sams mHal.state.vertexBuffers[vCount]->serialize(rsc, stream); 92099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.primitivesCount); 95099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store the primitives 96a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) { 97064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk stream->addU8((uint8_t)mHal.state.primitives[pCount]); 98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 99064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[pCount]) { 100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(1); 101e3150cfb3edb028407669e4a65e087eae77e718cJason Sams mHal.state.indexBuffers[pCount]->serialize(rsc, stream); 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(0); 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // First make sure we are reading the correct object 110099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 112af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("mesh loading skipped due to invalid class id"); 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return NULL; 114099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 116099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name; 117099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->loadString(&name); 118099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount = stream->loadU32(); 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *vertexBuffers = NULL; 121a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 122a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount]; 123099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 124a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 126a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers[vCount].set(vertexAlloc); 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 128099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 129099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 130a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount = stream->loadU32(); 131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *indexBuffers = NULL; 132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsPrimitive *primitives = NULL; 133a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 134a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount]; 135a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives = new RsPrimitive[primitivesCount]; 136099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 137099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // load all primitives 138a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 139a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives[pCount] = (RsPrimitive)stream->loadU8(); 140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Check to see if the index buffer was stored 142099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 143099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (isIndexPresent) { 144099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 145a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers[pCount].set(indexAlloc); 146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 147099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 148099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 149099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount); 151a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 152a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 153a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount); 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 155a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 156a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount); 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk // Cleanup 160a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 161a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] vertexBuffers; 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 164a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] indexBuffers; 165a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] primitives; 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 168a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 169a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->init(); 170a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->uploadAll(rsc); 171a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 172a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return mesh; 173a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 174a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 175afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 176a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 1784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 182a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primIndex >= mHal.state.primitivesCount) { 183af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid primitive index"); 1844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 187064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[primIndex]) { 188064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX()); 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 191fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 192a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX()); 1934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 195afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 196a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (len < 1 || primIndex >= mHal.state.primitivesCount) { 197af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid mesh or parameters"); 1984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 201a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len); 2024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 204afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 205a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) { 206064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.vertexBuffers[ct]) { 207064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]); 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 211a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 212064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[ct]) { 213064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]); 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 218e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Mesh::computeBBox(Context *rsc) { 219ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 220ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 221ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 222ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 223807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams Allocation *posAlloc = NULL; 224ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 225a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) { 226a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const Type *bufferType = mHal.state.vertexBuffers[ct]->getType(); 227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 230afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 234807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams posAlloc = mHal.state.vertexBuffers[ct]; 235807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const uint8_t *bp = (const uint8_t *)rsc->mHal.funcs.allocation.lock1D( 236807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsc, posAlloc); 237807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams posPtr = (float*)(bp + offset); 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 242afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 244ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 245ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 246ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 247ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 248ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 249afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 250af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Unable to compute bounding box"); 251ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 252ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 253ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 256afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 257afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 260ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 261ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 262ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 263807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 264807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams if (posAlloc) { 265807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, posAlloc); 266807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams } 267ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 268ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2729003e5674fb3b2a1442cd0cca899fdc3246debf8Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, 273b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * vtx, size_t vtxCount, 274b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * idx, size_t idxCount, 275b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t * primType, size_t primTypeCount) { 2769003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk rsAssert(idxCount == primTypeCount); 277a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *sm = new Mesh(rsc, vtxCount, idxCount); 2784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2809003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < vtxCount; i ++) { 2819003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setVertexBuffer((Allocation*)vtx[i], i); 2829003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2849003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < idxCount; i ++) { 2859003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i); 2869003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 288a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->init(); 2899003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk 2909003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk return sm; 29154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 29254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 293dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 294dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 296d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 297a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numVtx = sm->mHal.state.vertexBuffersCount; 298d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 299d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 301d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 302a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numIdx = sm->mHal.state.primitivesCount; 303d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 304d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 305afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 306d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 307a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount); 308d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 309afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 310064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk vtxData[ct] = sm->mHal.state.vertexBuffers[ct]; 311a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->mHal.state.vertexBuffers[ct]->incUserRef(); 312d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 313d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 314d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 315afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 316d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 317a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(idxDataCount == sm->mHal.state.primitivesCount); 318d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 319afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 320064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk va[ct] = sm->mHal.state.indexBuffers[ct]; 321064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk primType[ct] = sm->mHal.state.primitives[ct]; 322064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (sm->mHal.state.indexBuffers[ct]) { 323064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk sm->mHal.state.indexBuffers[ct]->incUserRef(); 324d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 325d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 326d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 327