rsMesh.cpp revision 54929cce0bf44090424b1f91b676529a2422378f
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 Sakhartchouk 31fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android; 32fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchoukusing namespace android::renderscript; 33a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 34e514b45de8561fbc6ef6770845102ca10b0a69d7Jason SamsMesh::Mesh(Context *rsc) : ObjectBase(rsc) 35a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 36a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 37a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 4054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 4154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 4254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 4354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 44a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 45a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 46a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMesh::~Mesh() 47a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mVertexBuffers) { 494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mPrimitives) { 534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 5854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 5954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(mAttribs) { 6054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribs; 6154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete[] mAttribAllocationIndex; 6254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 6354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 6454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 6554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukbool Mesh::isValidGLComponent(const Element *elem, uint32_t fieldIdx) { 6654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Do not create attribs for padding 6754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(elem->getFieldName(fieldIdx)[0] == '#') { 6854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 6954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 7054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 7154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Only GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FIXED, GL_FLOAT are accepted. 7254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Filter rs types accordingly 7354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk RsDataType dt = elem->getField(fieldIdx)->getComponent().getType(); 7454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(dt != RS_TYPE_FLOAT_32 && dt != RS_TYPE_UNSIGNED_8 && 7554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_UNSIGNED_16 && dt != RS_TYPE_SIGNED_8 && 7654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk dt != RS_TYPE_SIGNED_16) { 7754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 7854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 7954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 8054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Now make sure they are not arrays 8154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t arraySize = elem->getFieldArraySize(fieldIdx); 8254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(arraySize != 1) { 8354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return false; 8454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 8554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 8654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return true; 8754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 8854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 8954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid Mesh::initVertexAttribs() { 9054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Count the number of gl attrs to initialize 9154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount = 0; 9254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 9354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 9454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < elem->getFieldCount(); ct++) { 9554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(isValidGLComponent(elem, ct)) { 9654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribCount ++; 9754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 9954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 10054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 10154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(mAttribs) { 10254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribs; 10354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk delete [] mAttribAllocationIndex; 10454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = NULL; 10554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = NULL; 10654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 10754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(!mAttribCount) { 10854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk return; 10954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 11054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 11154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs = new VertexArray::Attrib[mAttribCount]; 11254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex = new uint32_t[mAttribCount]; 11354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 11454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t userNum = 0; 11554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 11654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Element *elem = mVertexBuffers[ct]->getType()->getElement(); 11754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t stride = elem->getSizeBytes(); 11854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t fieldI=0; fieldI < elem->getFieldCount(); fieldI++) { 11954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk const Component &c = elem->getField(fieldI)->getComponent(); 12054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 12154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if(!isValidGLComponent(elem, fieldI)) { 12254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk continue; 12354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 12454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 12554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].size = c.getVectorSize(); 12654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].offset = elem->getFieldOffsetBytes(fieldI); 12754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].type = c.getGLType(); 12854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].normalized = c.getType() != RS_TYPE_FLOAT_32;//c.getIsNormalized(); 12954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].stride = stride; 13054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk String8 tmp(RS_SHADER_ATTR); 13154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk tmp.append(elem->getFieldName(fieldI)); 13254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[userNum].name.setTo(tmp.string()); 13354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 13454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // Remember which allocation this attribute came from 13554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribAllocationIndex[userNum] = ct; 13654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk userNum ++; 13754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 13854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 139a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 140a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 1414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::render(Context *rsc) const 142fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 1434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 1444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 1454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 147fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 1494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 1504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 1514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 1584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 1624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 163fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const 1654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 16654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount || mAttribCount == 0) { 16754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk LOGE("Invalid mesh or parameters"); 1684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 1694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 1724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 1734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 17454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk } 17554929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk // update attributes with either buffer information or data ptr based on their current state 17654929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk for (uint32_t ct=0; ct < mAttribCount; ct++) { 17754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk uint32_t allocIndex = mAttribAllocationIndex[ct]; 17854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Allocation *alloc = mVertexBuffers[allocIndex].get(); 17954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk if (alloc->getIsBufferObject()) { 18054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = alloc->getBufferObjectID(); 18154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = NULL; 1824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 18354929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].buffer = 0; 18454929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mAttribs[ct].ptr = (const uint8_t*)alloc->getPtr(); 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 18754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 18854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk VertexArray va(mAttribs, mAttribCount); 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 1904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 1934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 1954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 1964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 1974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 1994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 2024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) 2064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 2084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 2094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 2104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 2154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::updateGLPrimitives() 2214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 2234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk switch(mPrimitives[i]->mPrimitive) { 2244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 2254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 2304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const 2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Need to identify ourselves 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 2384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk String8 name(getName()); 2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addString(&name); 2414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Store number of vertex streams 2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(mVertexBufferCount); 2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 2454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 247fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 249fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 250fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 251fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 252fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 254fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(prim->mIndexBuffer.get()) { 2564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 2574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 258fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 2594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk else { 2604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 261fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 262fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 263fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 264fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 265fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) 266fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 267fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 268b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 269b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_MESH) { 270fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 271fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 272fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 273fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 274fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 275fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 276fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 277fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 278fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 279fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 2814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mesh->mVertexBufferCount) { 2824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 283fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 287fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 288fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 289fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 290fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mPrimitivesCount) { 292fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 293fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // load all primitives 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 2964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 2974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 298fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 300fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 3014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the index buffer was stored 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(isIndexPresent) { 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 306fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 308fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 309fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 3104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->updateGLPrimitives(); 31154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk mesh->initVertexAttribs(); 3124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->uploadAll(rsc); 3134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 314fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 316a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 317ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchoukvoid Mesh::computeBBox() { 318ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk float *posPtr = NULL; 319ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t vectorSize = 0; 320ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t stride = 0; 321ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t numVerts = 0; 322ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk // First we need to find the position ptr and stride 323ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 324ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Type *bufferType = mVertexBuffers[ct]->getType(); 325ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk const Element *bufferElem = bufferType->getElement(); 326ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 327ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for (uint32_t ct=0; ct < bufferElem->getFieldCount(); ct++) { 328ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(strcmp(bufferElem->getFieldName(ct), "position") == 0) { 329ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk vectorSize = bufferElem->getField(ct)->getComponent().getVectorSize(); 330ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk stride = bufferElem->getSizeBytes() / sizeof(float); 331ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk uint32_t offset = bufferElem->getFieldOffsetBytes(ct); 332ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr = (float*)((uint8_t*)mVertexBuffers[ct]->getPtr() + offset); 333ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk numVerts = bufferType->getDimX(); 334ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 335ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 336ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 337ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(posPtr) { 338ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk break; 339ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 340ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 341ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 342ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 1e6; 343ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = -1e6; 344ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk if(!posPtr) { 345ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk LOGE("Unable to compute bounding box"); 346ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[0] = mBBoxMin[1] = mBBoxMin[2] = 0.0f; 347ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[0] = mBBoxMax[1] = mBBoxMax[2] = 0.0f; 348ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk return; 349ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 350ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 351ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t i = 0; i < numVerts; i ++) { 352ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk for(uint32_t v = 0; v < vectorSize; v ++) { 353ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMin[v] = rsMin(mBBoxMin[v], posPtr[v]); 354ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk mBBoxMax[v] = rsMax(mBBoxMax[v], posPtr[v]); 355ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 356ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk posPtr += stride; 357ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk } 358ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk} 359ba4aa5c768a498bc3fbb8cb5547b7a9ad6f4b771Alex Sakhartchouk 360a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 361a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::MeshContext() 362a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 363a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 364a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 365a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::~MeshContext() 366a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 367a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 368a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 3694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 3704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 3714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3724e9a7a8ded109e16b163789274899447cef02642Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) 3734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 3754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 3764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 3784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 3794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < idxCount; ct ++) { 3804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 3814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 3844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 3854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 3874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) 3904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) 3984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 4004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 4014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 4024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 4034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 4044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 4054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 4064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 40754929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchoukvoid rsi_MeshInitVertexAttribs(Context *rsc, RsMesh mv) 40854929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk{ 40954929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 41054929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk sm->initVertexAttribs(); 41154929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk} 41254929cce0bf44090424b1f91b676529a2422378fAlex Sakhartchouk 413dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}} 414dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 415dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetVertexBufferCount(RsContext con, RsMesh mv, int32_t *numVtx) 416d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 417d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 418d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numVtx = sm->mVertexBufferCount; 419d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 420d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 421dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetIndexCount(RsContext con, RsMesh mv, int32_t *numIdx) 422d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 423d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 424d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk *numIdx = sm->mPrimitivesCount; 425d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 426d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 427dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetVertices(RsContext con, RsMesh mv, RsAllocation *vtxData, uint32_t vtxDataCount) 428d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 429d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 430d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(vtxDataCount == sm->mVertexBufferCount); 431d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 432d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < vtxDataCount; ct ++) { 433d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk vtxData[ct] = sm->mVertexBuffers[ct].get(); 434d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mVertexBuffers[ct]->incUserRef(); 435d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 436d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 437d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 438dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchoukvoid rsaMeshGetIndices(RsContext con, RsMesh mv, RsAllocation *va, uint32_t *primType, uint32_t idxDataCount) 439d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk{ 440d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 441d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk rsAssert(idxDataCount == sm->mPrimitivesCount); 442d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 443d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk for(uint32_t ct = 0; ct < idxDataCount; ct ++) { 444d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk va[ct] = sm->mPrimitives[ct]->mIndexBuffer.get(); 445d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk primType[ct] = sm->mPrimitives[ct]->mPrimitive; 446d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk if(sm->mPrimitives[ct]->mIndexBuffer.get()) { 447d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk sm->mPrimitives[ct]->mIndexBuffer->incUserRef(); 448d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 449d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk } 450d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 451d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 452