rsMesh.cpp revision 099d7d33e55afeb3399f6e8cf8d665223ca94939
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 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 18a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include "rsContext.h" 19a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 20a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/gl.h> 21fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <GLES2/gl2.h> 22a89371c6f144b9049efe7689105feee2c4a38384Jason Sams#include <GLES/glext.h> 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h" 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 29a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 31a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 32a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 35099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 36099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 3754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 3854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 3954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 4054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 41099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 42a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 44afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::~Mesh() { 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mVertexBuffers) { 464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 49afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mPrimitives) { 50afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < mPrimitivesCount; i ++) { 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 5554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 56099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 57afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 5854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribs; 5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribAllocationIndex; 6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 61099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 62099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 63099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 64099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const { 65099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Need to identify ourselves 66099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 67099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 68099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name(getName()); 69099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addString(&name); 70099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 71099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store number of vertex streams 72099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(mVertexBufferCount); 73099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 74099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 75099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 76099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 77099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(mPrimitivesCount); 78099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Store the primitives 79099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 80099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 81099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 82099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 83099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 84099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 85099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(1); 86099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 87099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } else { 88099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->addU32(0); 89099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 90099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 91099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk} 92099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 93099d7d33e55afeb3399f6e8cf8d665223ca94939Alex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 94099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // First make sure we are reading the correct object 95099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 96099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 97099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 98099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return NULL; 99099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 100099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 101099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Mesh * mesh = new Mesh(rsc); 102099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 103099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk String8 name; 104099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk stream->loadString(&name); 105099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->setName(name.string(), name.size()); 106099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 107099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 108099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (mesh->mVertexBufferCount) { 109099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 110099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 111099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 112099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 113099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 114099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 115099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 116099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 117099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 118099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (mesh->mPrimitivesCount) { 119099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 120099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 121099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // load all primitives 122099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 123099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 124099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 125099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 126099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 128099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk // Check to see if the index buffer was stored 129099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 130099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk if (isIndexPresent) { 131099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 132099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 133099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 134099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 135099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk } 136099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 137099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 138099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->updateGLPrimitives(); 139099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->initVertexAttribs(); 140099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk mesh->uploadAll(rsc); 141099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 142099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk return mesh; 14354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 14454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 145099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 146099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 14754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukbool Mesh::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { 14854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Do not create attribs for padding 149afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (elem->getFieldName(fieldIdx)[0] == '#') { 15054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 15154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 15254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 15354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. 15454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Filter rs types accordingly 15554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); 156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && 15754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && 15854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_SIGNED_16) { 15954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 16054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Now make sure they are not arrays 16354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize = elem->getFieldArraySize(fieldIdx); 164afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (arraySize != 1) { 16554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 16854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Mesh::initVertexAttribs() { 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Count the number of gl attrs to initialize 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < elem->getFieldCount(); ct++) { 177afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isValidGLComponent(elem, ct)) { 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount ++; 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 183afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribs; 18554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribAllocationIndex; 18654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 189afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mAttribCount) { 19054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 19154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 19254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = new VertexArray::Attrib[mAttribCount]; 19454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = new uint32_t[mAttribCount]; 19554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 19654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t userNum = 0; 19754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 19854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 19954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t stride = elem->getSizeBytes(); 20054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { 20154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Component &c = elem->getField(fieldI)->getComponent(); 20254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 203afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isValidGLComponent(elem, fieldI)) { 20454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk continue; 20554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 20654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 20754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].size = c.getVectorSize(); 20854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); 20954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].type = c.getGLType(); 21054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 21154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].stride = stride; 21254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk String8 tmp(RS_SHADER_ATTR); 21354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk tmp.append(elem->getFieldName(fieldI)); 21454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].name.setTo(tmp.string()); 21554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 21654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Remember which allocation this attribute came from 21754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex[userNum] = ct; 21854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk userNum ++; 21954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 22054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 221a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 222a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 224afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 244fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 245afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 24654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount || mAttribCount == 0) { 24754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGE("Invalid mesh or parameters"); 2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 2524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 25454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 25554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // update attributes with either buffer information or data ptr based on their current state 25654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mAttribCount; ct++) { 25754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t allocIndex = mAttribAllocationIndex[ct]; 25854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Allocation *alloc = mVertexBuffers[allocIndex].get(); 25954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (alloc->getIsBufferObject()) { 26054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = alloc->getBufferObjectID(); 26154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = NULL; 2624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 26354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = 0; 26454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = (const uint8_t*)alloc->getPtr(); 265fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 2664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 26754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 26854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk VertexArray va(mAttribs, mAttribCount); 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 2724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 2734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 2744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 2764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 2774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 2784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 2824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 283fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 284fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 285afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 2884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::updateGLPrimitives() { 300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < mPrimitivesCount; i ++) { 301afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (mPrimitives[i]->mPrimitive) { 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 3064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 3074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 3084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 312ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 313ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 314ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 315ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 316ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 317ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 318ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 319ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 320ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 321ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 322ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 323afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 324ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 325ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 326ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 327ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 328ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 329ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 330ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 331ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 332afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 333ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 334ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 335ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 336ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 337ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 338ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 339afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 340ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 341ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 342ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 343ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 344ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 345ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 346afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 347afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 348ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 349ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 350ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 351ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 352ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 353ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 354ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 3554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 3564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 3574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 358afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) { 3594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 3604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 3614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 3634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 364afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxCount; ct ++) { 3654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 3664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 3694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 3704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 3724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 374afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) { 3754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 381afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) { 3824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 3864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 390afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshInitVertexAttribs(Context *rsc, RsMesh mv) { 39154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 39254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk sm->initVertexAttribs(); 39354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 39454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 395dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 396dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 397afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 398d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 399d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 400d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 401d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 402afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 403d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 404d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 405d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 406d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 407afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 408d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 409d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 410d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 411afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 412d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 413d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 414d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 415d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 416d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 417afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 418d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 419d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 420d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 421afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 422d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 423d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 424afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (sm->mPrimitives[ct]->mIndexBuffer.get()) { 425d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 426d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 427d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 428d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 429099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 430099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk#endif 431