rsMesh.cpp revision e23d239828a229eb7d4d33c9630070f0a87833e1
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" 18e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rs.h" 19fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 22a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 23afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 24a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 25a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitives = NULL; 26a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = 0; 27064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = NULL; 28064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = 0; 29a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffers = NULL; 30a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = 0; 31a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mInitialized = false; 32064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 33064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = NULL; 34064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = NULL; 35a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 3654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 37a04e30dbb5ab11592b03666bb3d102070759c58eAlex SakhartchoukMesh::Mesh(Context *rsc, 38a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount, 39a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount) : ObjectBase(rsc) { 40a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.drv = NULL; 41a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.primitivesCount = primitivesCount; 42064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffersCount = primitivesCount; 43064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives = new RsPrimitive[mHal.state.primitivesCount]; 44064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers = new Allocation *[mHal.state.indexBuffersCount]; 45a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.primitivesCount; i ++) { 46064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.primitives[i] = RS_PRIMITIVE_POINT; 47064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 48064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.indexBuffersCount; i ++) { 49064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers[i] = NULL; 50a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk } 51a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffersCount = vertexBuffersCount; 52064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers = new Allocation *[mHal.state.vertexBuffersCount]; 53064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk for (uint32_t i = 0; i < mHal.state.vertexBuffersCount; i ++) { 54064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.vertexBuffers[i] = NULL; 55064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk } 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk 57064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mVertexBuffers = new ObjectBaseRef<Allocation>[mHal.state.vertexBuffersCount]; 58064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mIndexBuffers = new ObjectBaseRef<Allocation>[mHal.state.primitivesCount]; 59a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 60a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 61afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::~Mesh() { 62a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 63a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.destroy(mRSC, this); 64a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 65a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk 66064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.vertexBuffers; 67064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.primitives; 68064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mHal.state.indexBuffers; 694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 70064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mVertexBuffers; 71064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk delete[] mIndexBuffers; 72a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk} 7354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 74a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchoukvoid Mesh::init() { 7577d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 76a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.init(mRSC, this); 77099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const { 81099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Need to identify ourselves 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 84099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name(getName()); 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addString(&name); 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 87099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store number of vertex streams 88a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.vertexBuffersCount); 89a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) { 90a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mHal.state.vertexBuffers[vCount]->serialize(stream); 91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 92099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 93a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk stream->addU32(mHal.state.primitivesCount); 94099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store the primitives 95a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mHal.state.primitivesCount; pCount ++) { 96064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk stream->addU8((uint8_t)mHal.state.primitives[pCount]); 97099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 98064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[pCount]) { 99099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(1); 100064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk mHal.state.indexBuffers[pCount]->serialize(stream); 101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(0); 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // First make sure we are reading the correct object 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 110099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 111af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("mesh loading skipped due to invalid class id"); 112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return NULL; 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 114099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name; 116099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->loadString(&name); 117099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 118a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t vertexBuffersCount = stream->loadU32(); 119a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *vertexBuffers = NULL; 120a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 121a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers = new ObjectBaseRef<Allocation>[vertexBuffersCount]; 122099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 123a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 124099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 125a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk vertexBuffers[vCount].set(vertexAlloc); 126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 128099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 129a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk uint32_t primitivesCount = stream->loadU32(); 130a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk ObjectBaseRef<Allocation> *indexBuffers = NULL; 131a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk RsPrimitive *primitives = NULL; 132a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 133a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers = new ObjectBaseRef<Allocation>[primitivesCount]; 134a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives = new RsPrimitive[primitivesCount]; 135099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 136099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // load all primitives 137a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 138a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk primitives[pCount] = (RsPrimitive)stream->loadU8(); 139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Check to see if the index buffer was stored 141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 142099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (isIndexPresent) { 143099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 144a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk indexBuffers[pCount].set(indexAlloc); 145099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 147099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 148099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 149a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *mesh = new Mesh(rsc, vertexBuffersCount, primitivesCount); 150a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 151a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t vCount = 0; vCount < vertexBuffersCount; vCount ++) { 152a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setVertexBuffer(vertexBuffers[vCount].get(), vCount); 15354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 154a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < primitivesCount; pCount ++) { 155a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->setPrimitive(indexBuffers[pCount].get(), primitives[pCount], pCount); 15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 158a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk // Cleanup 159a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (vertexBuffersCount) { 160a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] vertexBuffers; 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 162a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primitivesCount) { 163a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] indexBuffers; 164a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk delete[] primitives; 16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 167a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 168a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->init(); 169a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mesh->uploadAll(rsc); 170a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk#endif 171a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk return mesh; 172a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 173a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 175a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 1764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 181a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (primIndex >= mHal.state.primitivesCount) { 182af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid primitive index"); 1834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 186064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[primIndex]) { 187064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.indexBuffers[primIndex]->getType()->getDimX()); 1884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 190fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 191a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mHal.state.vertexBuffers[0]->getType()->getDimX()); 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 194afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 195a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk if (len < 1 || primIndex >= mHal.state.primitivesCount) { 196af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Invalid mesh or parameters"); 1974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 200a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk mRSC->mHal.funcs.mesh.draw(mRSC, this, primIndex, start, len); 2014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 203afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 204a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.vertexBuffersCount; ct ++) { 205064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.vertexBuffers[ct]) { 206064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.vertexBuffers[ct]); 2074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 210a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct = 0; ct < mHal.state.primitivesCount; ct ++) { 211064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.indexBuffers[ct]) { 212064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk rsc->mHal.funcs.allocation.markDirty(rsc, mHal.state.indexBuffers[ct]); 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 217ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 218ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 219ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 220ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 221ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 222ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 223a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk for (uint32_t ct=0; ct < mHal.state.vertexBuffersCount; ct++) { 224a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk const Type *bufferType = mHal.state.vertexBuffers[ct]->getType(); 225ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 226ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 227ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 228afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 229ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 230ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 231ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 232a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk posPtr = (float*)((uint8_t*)mHal.state.vertexBuffers[ct]->getPtr() + offset); 233ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 234ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 235ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 236ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 237afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 238ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 239ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 240ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 241ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 242ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 243ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 244afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 245af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Unable to compute bounding box"); 246ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 247ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 248ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 249ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 250ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 251afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 252afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 253ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 254ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 255ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 256ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 257ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 258ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 259ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 2604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2639003e5674fb3b2a1442cd0cca899fdc3246debf8Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, 264b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * vtx, size_t vtxCount, 265b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk RsAllocation * idx, size_t idxCount, 266b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t * primType, size_t primTypeCount) { 2679003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk rsAssert(idxCount == primTypeCount); 268a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk Mesh *sm = new Mesh(rsc, vtxCount, idxCount); 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2719003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < vtxCount; i ++) { 2729003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setVertexBuffer((Allocation*)vtx[i], i); 2739003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2759003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk for (uint32_t i = 0; i < idxCount; i ++) { 2769003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk sm->setPrimitive((Allocation*)idx[i], (RsPrimitive)primType[i], i); 2779003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk } 2784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 279a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->init(); 2809003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk 2819003e5674fb3b2a1442cd0cca899fdc3246debf8Alex Sakhartchouk return sm; 28254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 28354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 284dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 285dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 286afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 287d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 288a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numVtx = sm->mHal.state.vertexBuffersCount; 289d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 290d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 291afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 292d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 293a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk *numIdx = sm->mHal.state.primitivesCount; 294d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 295d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 297d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 298a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(vtxDataCount == sm->mHal.state.vertexBuffersCount); 299d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 301064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk vtxData[ct] = sm->mHal.state.vertexBuffers[ct]; 302a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk sm->mHal.state.vertexBuffers[ct]->incUserRef(); 303d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 304d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 305d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 306afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 307d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 308a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk rsAssert(idxDataCount == sm->mHal.state.primitivesCount); 309d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 310afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 311064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk va[ct] = sm->mHal.state.indexBuffers[ct]; 312064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk primType[ct] = sm->mHal.state.primitives[ct]; 313064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (sm->mHal.state.indexBuffers[ct]) { 314064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk sm->mHal.state.indexBuffers[ct]->incUserRef(); 315d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 316d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 317d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 318