rsMesh.cpp revision 77d9f4bd05b2d2a161f30c12a2248f9c97eaac42
1a89371c6f144b9049efe7689105feee2c4a38384Jason Sams/* 2a89371c6f144b9049efe7689105feee2c4a38384Jason Sams * Copyright (C) 2009 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" 1877d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 19a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/gl.h> 20fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <GLES2/gl2.h> 21a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/glext.h> 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 26a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 27afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 28a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 29a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 32099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 3377d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 3454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 3554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 3654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 3754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 38099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 39a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 40a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 41afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::~Mesh() { 42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mVertexBuffers) { 434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 46afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPrimitives) { 47afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < mPrimitivesCount; i ++) { 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 5254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 5377d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 5554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribs; 5654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribAllocationIndex; 5754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 58099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 59099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 60099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 61099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const { 62099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Need to identify ourselves 63099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 64099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 65099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name(getName()); 66099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addString(&name); 67099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 68099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store number of vertex streams 69099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(mVertexBufferCount); 70099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 71099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 72099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 73099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 74099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(mPrimitivesCount); 75099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store the primitives 76099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 77099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 81099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(1); 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 84099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(0); 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 87099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 88099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 89099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // First make sure we are reading the correct object 92099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 94099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 95099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return NULL; 96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 97099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Mesh * mesh = new Mesh(rsc); 99099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name; 101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->loadString(&name); 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->setName(name.string(), name.size()); 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (mesh->mVertexBufferCount) { 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 110099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 114099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (mesh->mPrimitivesCount) { 116099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 117099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 118099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // load all primitives 119099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 120099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 121099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 122099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 123099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 124099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Check to see if the index buffer was stored 126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (isIndexPresent) { 128099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 129099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 130099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 131099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 132099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 133099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 13477d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 135099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->updateGLPrimitives(); 136099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->initVertexAttribs(); 137099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->uploadAll(rsc); 138099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return mesh; 14054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 14154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 14277d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE 143099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 14454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukbool Mesh::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { 14554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Do not create attribs for padding 146afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (elem->getFieldName(fieldIdx)[0] == '#') { 14754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 14954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. 15154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Filter rs types accordingly 15254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); 153afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_SIGNED_16) { 15654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Now make sure they are not arrays 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize = elem->getFieldArraySize(fieldIdx); 161afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (arraySize != 1) { 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 16354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Mesh::initVertexAttribs() { 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Count the number of gl attrs to initialize 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < elem->getFieldCount(); ct++) { 174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isValidGLComponent(elem, ct)) { 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount ++; 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 180afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribs; 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribAllocationIndex; 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 186afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mAttribCount) { 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = new VertexArray::Attrib[mAttribCount]; 19154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = new uint32_t[mAttribCount]; 19254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t userNum = 0; 19454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 19554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t stride = elem->getSizeBytes(); 19754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { 19854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Component &c = elem->getField(fieldI)->getComponent(); 19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 200afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isValidGLComponent(elem, fieldI)) { 20154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk continue; 20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 20354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 20454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].size = c.getVectorSize(); 20554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); 20654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].type = c.getGLType(); 20754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 20854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].stride = stride; 20954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk String8 tmp(RS_SHADER_ATTR); 21054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk tmp.append(elem->getFieldName(fieldI)); 21154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].name.setTo(tmp.string()); 21254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 21354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Remember which allocation this attribute came from 21454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex[userNum] = ct; 21554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk userNum ++; 21654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 21754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 218a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 219a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 221afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 2364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 242afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 24354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount || mAttribCount == 0) { 24454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGE("Invalid mesh or parameters"); 2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 25154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 25254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // update attributes with either buffer information or data ptr based on their current state 25354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mAttribCount; ct++) { 25454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t allocIndex = mAttribAllocationIndex[ct]; 25554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Allocation *alloc = mVertexBuffers[allocIndex].get(); 25654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (alloc->getIsBufferObject()) { 25754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = alloc->getBufferObjectID(); 25854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = NULL; 2594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 26054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = 0; 26154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = (const uint8_t*)alloc->getPtr(); 262fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 2634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 26454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 26554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk VertexArray va(mAttribs, mAttribCount); 2664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 2674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 2714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 2724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 2734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 2744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 2764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 280fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 281fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 282afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 2834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::updateGLPrimitives() { 297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < mPrimitivesCount; i ++) { 298afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (mPrimitives[i]->mPrimitive) { 2994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 3004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 3014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 309ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 310ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 311ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 312ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 313ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 314ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 315ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 316ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 317ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 318ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 319ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 320afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 321ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 322ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 323ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 324ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 325ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 326ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 327ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 328ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 329afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 330ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 331ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 332ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 333ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 334ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 335ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 336afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 337ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 338ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 339ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 340ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 341ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 342ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 343afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 344afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 345ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 346ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 347ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 348ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 349ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 350ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 351ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 3524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 3534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 3544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 355afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) { 3564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 3574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 3584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 3604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 361afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxCount; ct ++) { 3624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 3634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 3664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 3674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 3694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 371afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) { 3724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 378afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) { 3794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 3834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 387afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshInitVertexAttribs(Context *rsc, RsMesh mv) { 38854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 38954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk sm->initVertexAttribs(); 39054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 39154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 392dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 393dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 394afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 395d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 396d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 397d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 398d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 399afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 400d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 401d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 402d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 403d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 404afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 405d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 406d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 407d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 408afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 409d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 410d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 411d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 412d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 413d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 414afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 415d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 416d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 417d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 418afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 419d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 420d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 421afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (sm->mPrimitives[ct]->mIndexBuffer.get()) { 422d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 423d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 424d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 425d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 426099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 427099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 428