rsMesh.cpp revision af12ac6a08651464f8d823add667c706f993b587
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" 18fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 21a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 22afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 23a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitives = NULL; 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = 0; 26064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = NULL; 27064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = 0; 28a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffers = NULL; 29a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = 0; 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mInitialized = false; 31064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 32064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = NULL; 33064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = NULL; 34a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 3554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 36a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukMesh::Mesh(Context *rsc, 37a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount, 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount) : ObjectBase(rsc) { 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = primitivesCount; 41064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = primitivesCount; 42064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount]; 43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount]; 44a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) { 45064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives[i] = RS_PRIMITIVE_POINT; 46064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) { 48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers[i] = NULL; 49a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = vertexBuffersCount; 51064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount]; 52064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) { 53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers[i] = NULL; 54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount]; 57064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount]; 58a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 59a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 60afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::~Mesh() { 61a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.destroy(mRSC, this); 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 65064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.vertexBuffers; 66064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.primitives; 67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.indexBuffers; 684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 69064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mVertexBuffers; 70064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mIndexBuffers; 71a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 73a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid Mesh::init() { 7477d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 75a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.init(mRSC, this); 76099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 77099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const { 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Need to identify ourselves 81099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name(getName()); 84099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addString(&name); 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store number of vertex streams 87a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.vertexBuffersCount); 88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) { 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffers[vCount]->serialize(stream); 90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 92a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.primitivesCount); 93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store the primitives 94a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) { 95064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk stream->addU8((uint8_t)mHal.state.primitives[pCount]); 96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 97064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[pCount]) { 98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(1); 99064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers[pCount]->serialize(stream); 100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(0); 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // First make sure we are reading the correct object 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 110af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("mesh loading skipped due to invalid class id"); 111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return NULL; 112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 114099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name; 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->loadString(&name); 116099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 117a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount = stream->loadU32(); 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *vertexBuffers = NULL; 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount]; 121099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 122a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 123099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 124a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers[vCount].set(vertexAlloc); 125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 128a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount = stream->loadU32(); 129a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *indexBuffers = NULL; 130a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsPrimitive *primitives = NULL; 131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount]; 133a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives = new RsPrimitive[primitivesCount]; 134099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 135099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // load all primitives 136a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 137a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives[pCount] = (RsPrimitive)stream->loadU8(); 138099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Check to see if the index buffer was stored 140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (isIndexPresent) { 142099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 143a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers[pCount].set(indexAlloc); 144099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 145099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 147099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 148a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount); 149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 151a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount); 15254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 153a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount); 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 157a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk // Cleanup 158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] vertexBuffers; 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 161a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 162a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] indexBuffers; 163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] primitives; 16454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 166a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 167a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->init(); 168a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->uploadAll(rsc); 169a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 170a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return mesh; 171a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 172a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 173afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 174a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 1754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 1764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 180a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primIndex >= mHal.state.primitivesCount) { 181af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid primitive index"); 1824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 184fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 185064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[primIndex]) { 186064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX()); 1874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 189fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 190a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX()); 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 192fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 193afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 194a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (len < 1 || primIndex >= mHal.state.primitivesCount) { 195af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid mesh or parameters"); 1964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 199a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len); 2004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 202afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 203a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) { 204064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.vertexBuffers[ct]) { 205064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]); 2064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 209a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 210064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[ct]) { 211064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]); 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 216ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 217ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 218ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 219ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 220ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 221ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 222a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) { 223a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const Type *bufferType = mHal.state.vertexBuffers[ct]->getType(); 224ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 225ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 226ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 228ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 231a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk posPtr = (float*)((uint8_t*)mHal.state.vertexBuffers[ct]->getPtr() + offset); 232ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 236afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 237ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 243afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 244af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Unable to compute bounding box"); 245ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 246ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 247ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 248ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 249ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 250afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 251afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 252ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 253ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 2594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2629003e5674fb3b2a1442cd0cca899fdc3246debf8Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, 263b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * vtx, size_t vtxCount, 264b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * idx, size_t idxCount, 265b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t * primType, size_t primTypeCount) { 2669003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk rsAssert(idxCount == primTypeCount); 267a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *sm = new Mesh(rsc, vtxCount, idxCount); 2684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2709003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < vtxCount; i ++) { 2719003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setVertexBuffer((Allocation*)vtx[i], i); 2729003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2749003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < idxCount; i ++) { 2759003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i); 2769003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 278a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->init(); 2799003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk 2809003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk return sm; 28154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 28254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 283dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 284dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 285afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 286d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 287a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numVtx = sm->mHal.state.vertexBuffersCount; 288d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 289d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 290afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 291d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 292a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numIdx = sm->mHal.state.primitivesCount; 293d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 294d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 295afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 296d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 297a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount); 298d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 300064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk vtxData[ct] = sm->mHal.state.vertexBuffers[ct]; 301a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->mHal.state.vertexBuffers[ct]->incUserRef(); 302d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 303d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 304d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 305afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 306d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 307a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(idxDataCount == sm->mHal.state.primitivesCount); 308d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 309afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 310064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk va[ct] = sm->mHal.state.indexBuffers[ct]; 311064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk primType[ct] = sm->mHal.state.primitives[ct]; 312064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (sm->mHal.state.indexBuffers[ct]) { 313064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk sm->mHal.state.indexBuffers[ct]->incUserRef(); 314d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 315d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 316d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 317