rsMesh.cpp revision afb743aca56c18beb7ab924e75cb6e070ef3e55a
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 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h> 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGl/glext.h> 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 30fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 32a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 33afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh::Mesh(Context *rsc) : ObjectBase(rsc) { 34a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 35a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 3854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 3954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 4054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 4154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 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 56afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 5754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribs; 5854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribAllocationIndex; 5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 6154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukbool Mesh::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { 6354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Do not create attribs for padding 64afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (elem->getFieldName(fieldIdx)[0] == '#') { 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 6654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 6854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. 6954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Filter rs types accordingly 7054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); 71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && 7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && 7354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_SIGNED_16) { 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Now make sure they are not arrays 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize = elem->getFieldArraySize(fieldIdx); 79afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (arraySize != 1) { 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 8454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 8554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 8654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Mesh::initVertexAttribs() { 8754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Count the number of gl attrs to initialize 8854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 8954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 9054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 9154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < elem->getFieldCount(); ct++) { 92afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isValidGLComponent(elem, ct)) { 9354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount ++; 9454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAttribs) { 9954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribs; 10054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribAllocationIndex; 10154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 10254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 10354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 104afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mAttribCount) { 10554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 10654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 10754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 10854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = new VertexArray::Attrib[mAttribCount]; 10954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = new uint32_t[mAttribCount]; 11054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 11154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t userNum = 0; 11254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 11354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 11454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t stride = elem->getSizeBytes(); 11554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Component &c = elem->getField(fieldI)->getComponent(); 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 118afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!isValidGLComponent(elem, fieldI)) { 11954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk continue; 12054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 12154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 12254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].size = c.getVectorSize(); 12354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); 12454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].type = c.getGLType(); 12554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 12654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].stride = stride; 12754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk String8 tmp(RS_SHADER_ATTR); 12854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk tmp.append(elem->getFieldName(fieldI)); 12954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].name.setTo(tmp.string()); 13054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 13154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Remember which allocation this attribute came from 13254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex[userNum] = ct; 13354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk userNum ++; 13454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 13554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 136a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 137a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 138afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::render(Context *rsc) const { 139afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 1404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 1414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 143fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 1454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 1464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 1474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 149fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 151fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 1544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 1584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 159fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 160afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const { 16154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount || mAttribCount == 0) { 16254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGE("Invalid mesh or parameters"); 1634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 1674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 1684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 16954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // update attributes with either buffer information or data ptr based on their current state 17154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mAttribCount; ct++) { 17254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t allocIndex = mAttribAllocationIndex[ct]; 17354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Allocation *alloc = mVertexBuffers[allocIndex].get(); 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (alloc->getIsBufferObject()) { 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = alloc->getBufferObjectID(); 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = NULL; 1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = 0; 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = (const uint8_t*)alloc->getPtr(); 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 18254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk VertexArray va(mAttribs, mAttribCount); 1844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 1854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 1874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 1884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 1904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 1944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 1974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 200afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) { 2014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 2024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 2034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 2044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 2094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 2104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 214afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::updateGLPrimitives() { 215afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < mPrimitivesCount; i ++) { 216afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (mPrimitives[i]->mPrimitive) { 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 2214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Mesh::serialize(OStream *stream) const { 2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Need to identify ourselves 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk String8 name(getName()); 2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addString(&name); 2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Store number of vertex streams 2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(mVertexBufferCount); 236afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 239fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 240fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 242fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 243fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 244fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 247afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (prim->mIndexBuffer.get()) { 2484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 250afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 252fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 253fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 254fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 255fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 256afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) { 257fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 259afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_MESH) { 260fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 261fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 262fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 263fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 264fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 265fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 266fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 267fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 268fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 269fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 271afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mesh->mVertexBufferCount) { 2724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 273fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 274afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 2764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 277fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 278fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 279fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 280fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 281afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mesh->mPrimitivesCount) { 282fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 283fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // load all primitives 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 288fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 290fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the index buffer was stored 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 293afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isIndexPresent) { 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 296fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 297fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 298fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 299fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 3004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->updateGLPrimitives(); 30154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mesh->initVertexAttribs(); 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->uploadAll(rsc); 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 305fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 306a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 307ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 308ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 309ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 310ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 311ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 312ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 313ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 314ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 315ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 316ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 317ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 318afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (strcmp(bufferElem->getFieldName(ct), "position") == 0) { 319ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 320ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 321ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 322ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 323ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 324ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 325ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 326ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 327afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (posPtr) { 328ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 329ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 330ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 331ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 332ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 333ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 334afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!posPtr) { 335ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 336ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 337ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 338ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 339ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 340ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 341afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numVerts; i ++) { 342afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t v = 0; v < vectorSize; v ++) { 343ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 344ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 345ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 346ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 347ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 348ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 349ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 350a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 351afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMeshContext::MeshContext() { 352a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 353a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 354afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukMeshContext::~MeshContext() { 355a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 356a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 3574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 3584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 3594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 360afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) { 3614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 3624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 3634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 3654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 366afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxCount; ct ++) { 3674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 3684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 3714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 3724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 3744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 376afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) { 3774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 383afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) { 3844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 3884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 392afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_MeshInitVertexAttribs(Context *rsc, RsMesh mv) { 39354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 39454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk sm->initVertexAttribs(); 39554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 39654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 397dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 398dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 399afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) { 400d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 401d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 402d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 403d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 404afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) { 405d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 406d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 407d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 408d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 409afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) { 410d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 411d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 412d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 413afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < vtxDataCount; ct ++) { 414d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 415d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 416d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 417d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 418d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 419afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) { 420d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 421d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 422d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 423afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t ct = 0; ct < idxDataCount; ct ++) { 424d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 425d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 426afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (sm->mPrimitives[ct]->mIndexBuffer.get()) { 427d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 428d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 429d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 430d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 431