rsMesh.cpp revision 4e9a7a8ded109e16b163789274899447cef02642
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{ 36f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocFile = __FILE__; 37f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams mAllocLine = __LINE__; 38a89371c6f144b9049efe7689105feee2c4a38384Jason Sams mPrimitives = NULL; 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mPrimitivesCount = 0; 404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers = NULL; 414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexTypes = NULL; 424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBufferCount = 0; 43a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 44a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 45a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMesh::~Mesh() 46a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mVertexTypes) { 484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexTypes; 494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mVertexBuffers) { 524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mVertexBuffers; 534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mPrimitives) { 564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete mPrimitives[i]; 584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk delete[] mPrimitives; 604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 61a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 62a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::render(Context *rsc) const 64fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitive(rsc, ct); 674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 69fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitive(Context *rsc, uint32_t primIndex) const { 714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (primIndex >= mPrimitivesCount) { 724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk LOGE("Invalid primitive index"); 734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 75fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 77fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mIndexBuffer->getType()->getDimX()); 804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 82fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mPrimitiveBuffer.get()) { 844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, prim->mPrimitiveBuffer->getType()->getDimX()); 854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk renderPrimitiveRange(rsc, primIndex, 0, mVertexBuffers[0]->getType()->getDimX()); 894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 90fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::renderPrimitiveRange(Context *rsc, uint32_t primIndex, uint32_t start, uint32_t len) const 924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (len < 1 || primIndex >= mPrimitivesCount) { 944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return; 954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 1"); 984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk VertexArray va; 994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < mVertexBufferCount; ct++) { 1004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->uploadCheck(rsc); 1014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct]->getIsBufferObject()) { 1024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); 1034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setActiveBuffer(mVertexBuffers[ct]->getPtr()); 105fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->getType()->enableGLVertexBuffer(&va); 1074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk va.setupGL2(rsc, &rsc->mStateVertexArray, &rsc->mShaderCache); 1094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange 2"); 1114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t *prim = mPrimitives[primIndex]; 1124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (prim->mIndexBuffer.get()) { 1134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->uploadCheck(rsc); 1144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, prim->mIndexBuffer->getBufferObjectID()); 1154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawElements(prim->mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); 1164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } else { 1174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk glDrawArrays(prim->mGLPrimitive, start, len); 1184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::renderPrimitiveRange"); 1214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 122fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 123fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::uploadAll(Context *rsc) 1254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mVertexBufferCount; ct ++) { 1274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mVertexBuffers[ct].get()) { 1284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); 1294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct = 0; ct < mPrimitivesCount; ct ++) { 1334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mIndexBuffer.get()) { 1344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mIndexBuffer->deferedUploadToBufferObject(rsc); 1354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if (mPrimitives[ct]->mPrimitiveBuffer.get()) { 1374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mPrimitives[ct]->mPrimitiveBuffer->deferedUploadToBufferObject(rsc); 1384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsc->checkError("Mesh::uploadAll"); 1424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::updateGLPrimitives() 1454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t i = 0; i < mPrimitivesCount; i ++) { 1474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk switch(mPrimitives[i]->mPrimitive) { 1484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_POINT: mPrimitives[i]->mGLPrimitive = GL_POINTS; break; 1494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE: mPrimitives[i]->mGLPrimitive = GL_LINES; break; 1504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_LINE_STRIP: mPrimitives[i]->mGLPrimitive = GL_LINE_STRIP; break; 1514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE: mPrimitives[i]->mGLPrimitive = GL_TRIANGLES; break; 1524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_STRIP: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_STRIP; break; 1534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk case RS_PRIMITIVE_TRIANGLE_FAN: mPrimitives[i]->mGLPrimitive = GL_TRIANGLE_FAN; break; 1544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 1574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid Mesh::serialize(OStream *stream) const 1594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 1604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Need to identify ourselves 1614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32((uint32_t)getClassId()); 1624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk String8 name(getName()); 1644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addString(&name); 1654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 1664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Store number of vertex streams 1674e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(mVertexBufferCount); 1684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mVertexBufferCount; vCount ++) { 1694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mVertexBuffers[vCount]->serialize(stream); 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(mPrimitivesCount); 173fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the primitives 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk for (uint32_t pCount = 0; pCount < mPrimitivesCount; pCount ++) { 175fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Primitive_t * prim = mPrimitives[pCount]; 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU8((uint8_t)prim->mPrimitive); 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(prim->mIndexBuffer.get()) { 1804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 1814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer->serialize(stream); 182fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 1834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk else { 1844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 185fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(prim->mPrimitiveBuffer.get()) { 1884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(1); 1894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitiveBuffer->serialize(stream); 1904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 1914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk else { 1924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk stream->addU32(0); 193fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 194fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 195fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex SakhartchoukMesh *Mesh::createFromStream(Context *rsc, IStream *stream) 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk{ 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 200b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 201b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if(classID != RS_A3D_CLASS_ID_MESH) { 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("mesh loading skipped due to invalid class id"); 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 206fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Mesh * mesh = new Mesh(rsc); 207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 208fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->setName(name.string(), name.size()); 211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBufferCount = stream->loadU32(); 2134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(mesh->mVertexBufferCount) { 2144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers = new ObjectBaseRef<Allocation>[mesh->mVertexBufferCount]; 215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2164e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t vCount = 0; vCount < mesh->mVertexBufferCount; vCount ++) { 2174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *vertexAlloc = Allocation::createFromStream(rsc, stream); 2184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mVertexBuffers[vCount].set(vertexAlloc); 219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitivesCount = stream->loadU32(); 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if(mesh->mPrimitivesCount) { 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mesh->mPrimitives = new Primitive_t *[mesh->mPrimitivesCount]; 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // load all primitives 2274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t pCount = 0; pCount < mesh->mPrimitivesCount; pCount ++) { 2284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Primitive_t * prim = new Primitive_t; 2294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->mPrimitives[pCount] = prim; 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitive = (RsPrimitive)stream->loadU8(); 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the index buffer was stored 2344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isIndexPresent = stream->loadU32(); 2354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(isIndexPresent) { 2364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *indexAlloc = Allocation::createFromStream(rsc, stream); 2374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mIndexBuffer.set(indexAlloc); 238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 239fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk // Check to see if the primitive buffer was stored 2414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk uint32_t isPrimitivePresent = stream->loadU32(); 2424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk if(isPrimitivePresent) { 2434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Allocation *primitiveAlloc = Allocation::createFromStream(rsc, stream); 2444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk prim->mPrimitiveBuffer.set(primitiveAlloc); 245fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 246fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 247fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->updateGLPrimitives(); 2504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk mesh->uploadAll(rsc); 2514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 252fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mesh; 253fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 254a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 255a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 256a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::MeshContext() 257a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 258a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 259a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 260a89371c6f144b9049efe7689105feee2c4a38384Jason SamsMeshContext::~MeshContext() 261a89371c6f144b9049efe7689105feee2c4a38384Jason Sams{ 262a89371c6f144b9049efe7689105feee2c4a38384Jason Sams} 263a89371c6f144b9049efe7689105feee2c4a38384Jason Sams 2644e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace android { 2654e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouknamespace renderscript { 2664e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2674e9a7a8ded109e16b163789274899447cef02642Alex SakhartchoukRsMesh rsi_MeshCreate(Context *rsc, uint32_t vtxCount, uint32_t idxCount) 2684e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2694e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 2704e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 2714e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2724e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = idxCount; 2734e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 2744e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for(uint32_t ct = 0; ct < idxCount; ct ++) { 2754e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[ct] = new Mesh::Primitive_t; 2764e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 2774e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2784e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 2794e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 2804e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexTypes = new ObjectBaseRef<const Type>[vtxCount]; 2814e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2824e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 2834e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2844e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2854e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) 2864e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2874e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 2884e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 2894e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2904e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 2914e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 2924e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2934e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) 2944e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 2954e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 2964e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 2974e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 2984e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mIndexBuffer.set((Allocation *)va); 2994e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3004e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3014e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3024e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3034e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_MeshBindPrimitive(Context *rsc, RsMesh mv, RsAllocation va, uint32_t primType, uint32_t slot) 3044e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3054e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3064e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mPrimitivesCount); 3074e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3084e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitiveBuffer.set((Allocation *)va); 3094e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[slot]->mPrimitive = (RsPrimitive)primType; 3104e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3114e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3124e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3134e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3144e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk// Route all the simple mesh through mesh 3154e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3164e9a7a8ded109e16b163789274899447cef02642Alex SakhartchoukRsMesh rsi_SimpleMeshCreate(Context *rsc, RsType prim, RsType idx, RsType *vtx, uint32_t vtxCount, uint32_t primType) 3174e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3184e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = new Mesh(rsc); 3194e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->incUserRef(); 3204e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3214e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitivesCount = 1; 3224e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives = new Mesh::Primitive_t *[sm->mPrimitivesCount]; 3234e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0] = new Mesh::Primitive_t; 3244e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3254e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0]->mIndexType.set((const Type *)idx); 3264e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0]->mPrimitiveType.set((const Type *)prim); 3274e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0]->mPrimitive = (RsPrimitive)primType; 3284e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->updateGLPrimitives(); 3294e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3304e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBufferCount = vtxCount; 3314e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexTypes = new ObjectBaseRef<const Type>[vtxCount]; 3324e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers = new ObjectBaseRef<Allocation>[vtxCount]; 3334e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk for (uint32_t ct=0; ct < vtxCount; ct++) { 3344e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexTypes[ct].set((const Type *)vtx[ct]); 3354e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk } 3364e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3374e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk return sm; 3384e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3394e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3404e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_SimpleMeshBindVertex(Context *rsc, RsMesh mv, RsAllocation va, uint32_t slot) 3414e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3424e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3434e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk rsAssert(slot < sm->mVertexBufferCount); 3444e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3454e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mVertexBuffers[slot].set((Allocation *)va); 3464e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3474e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3484e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_SimpleMeshBindIndex(Context *rsc, RsMesh mv, RsAllocation va) 3494e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3504e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3514e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0]->mIndexBuffer.set((Allocation *)va); 3524e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3534e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3544e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchoukvoid rsi_SimpleMeshBindPrimitive(Context *rsc, RsMesh mv, RsAllocation va) 3554e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk{ 3564e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk Mesh *sm = static_cast<Mesh *>(mv); 3574e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk sm->mPrimitives[0]->mPrimitiveBuffer.set((Allocation *)va); 3584e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk} 3594e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3604e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3614e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3624e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk 3634e9a7a8ded109e16b163789274899447cef02642Alex Sakhartchouk}} 364