Loading libs/rs/rsAllocation.cpp +57 −9 Original line number Diff line number Diff line Loading @@ -38,9 +38,9 @@ Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc) mIsTexture = false; mTextureID = 0; mIsVertexBuffer = false; mBufferID = 0; mUploadDefered = false; mType.set(type); rsAssert(type); Loading Loading @@ -88,10 +88,23 @@ bool Allocation::fixAllocation() return false; } void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) void Allocation::deferedUploadToTexture(const Context *rsc, uint32_t lodOffset) { //rsAssert(!mTextureId); rsAssert(lodOffset < mType->getLODCount()); mIsTexture = true; mTextureLOD = lodOffset; mUploadDefered = true; } void Allocation::uploadToTexture(const Context *rsc) { //rsAssert(!mTextureId); mIsTexture = true; if (!rsc->checkDriver()) { mUploadDefered = true; return; } GLenum type = mType->getElement()->getGLType(); GLenum format = mType->getElement()->getGLFormat(); Loading @@ -109,15 +122,16 @@ void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) // Force a crash to 1: restart the app, 2: make sure we get a bugreport. LOGE("Upload to texture failed to gen mTextureID"); rsc->dumpDebug(); ((char *)0)[0] = 0; mUploadDefered = true; return; } } glBindTexture(GL_TEXTURE_2D, mTextureID); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); Adapter2D adapt(getContext(), this); for(uint32_t lod = 0; (lod + lodOffset) < mType->getLODCount(); lod++) { adapt.setLOD(lod+lodOffset); for(uint32_t lod = 0; (lod + mTextureLOD) < mType->getLODCount(); lod++) { adapt.setLOD(lod+mTextureLOD); uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0)); glTexImage2D(GL_TEXTURE_2D, lod, format, Loading @@ -126,19 +140,50 @@ void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) } } void Allocation::uploadToBufferObject() void Allocation::deferedUploadToBufferObject(const Context *rsc) { mIsVertexBuffer = true; mUploadDefered = true; } void Allocation::uploadToBufferObject(const Context *rsc) { rsAssert(!mType->getDimY()); rsAssert(!mType->getDimZ()); mIsVertexBuffer = true; if (!rsc->checkDriver()) { mUploadDefered = true; return; } if (!mBufferID) { glGenBuffers(1, &mBufferID); } if (!mBufferID) { LOGE("Upload to buffer object failed"); mUploadDefered = true; return; } glBindBuffer(GL_ARRAY_BUFFER, mBufferID); glBufferData(GL_ARRAY_BUFFER, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); } void Allocation::uploadCheck(const Context *rsc) { if (mUploadDefered) { mUploadDefered = false; if (mIsVertexBuffer) { uploadToBufferObject(rsc); } if (mIsTexture) { uploadToTexture(rsc); } } } void Allocation::data(const void *data, uint32_t sizeBytes) { Loading @@ -149,6 +194,7 @@ void Allocation::data(const void *data, uint32_t sizeBytes) } memcpy(mPtr, data, size); sendDirty(); mUploadDefered = true; } void Allocation::read(void *data) Loading @@ -170,6 +216,7 @@ void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32 } memcpy(ptr, data, size); sendDirty(); mUploadDefered = true; } void Allocation::subData(uint32_t xoff, uint32_t yoff, Loading @@ -195,6 +242,7 @@ void Allocation::subData(uint32_t xoff, uint32_t yoff, dst += destW * eSize; } sendDirty(); mUploadDefered = true; } void Allocation::subData(uint32_t xoff, uint32_t yoff, uint32_t zoff, Loading Loading @@ -271,13 +319,13 @@ RsAllocation rsi_AllocationCreateSized(Context *rsc, RsElement e, size_t count) void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, uint32_t baseMipLevel) { Allocation *alloc = static_cast<Allocation *>(va); alloc->uploadToTexture(rsc, baseMipLevel); alloc->deferedUploadToTexture(rsc, baseMipLevel); } void rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) { Allocation *alloc = static_cast<Allocation *>(va); alloc->uploadToBufferObject(); alloc->deferedUploadToBufferObject(rsc); } static void mip565(const Adapter2D &out, const Adapter2D &in) Loading libs/rs/rsAllocation.h +9 −2 Original line number Diff line number Diff line Loading @@ -46,10 +46,12 @@ public: void * getPtr() const {return mPtr;} const Type * getType() const {return mType.get();} void uploadToTexture(Context *rsc, uint32_t lodOffset = 0); void deferedUploadToTexture(const Context *rsc, uint32_t lodOffset); void uploadToTexture(const Context *rsc); uint32_t getTextureID() const {return mTextureID;} void uploadToBufferObject(); void deferedUploadToBufferObject(const Context *rsc); void uploadToBufferObject(const Context *rsc); uint32_t getBufferObjectID() const {return mBufferID;} Loading @@ -70,6 +72,8 @@ public: virtual void dumpLOGV(const char *prefix) const; virtual void uploadCheck(const Context *rsc); protected: void sendDirty() const; Loading @@ -94,6 +98,7 @@ protected: // Is this a legal structure to be used as a texture source. // Initially this will require 1D or 2D and color data bool mIsTexture; uint32_t mTextureLOD; uint32_t mTextureID; // Is this a legal structure to be used as a vertex source. Loading @@ -101,6 +106,8 @@ protected: // is allowed. bool mIsVertexBuffer; uint32_t mBufferID; bool mUploadDefered; }; } Loading libs/rs/rsContext.h +1 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ public: const ProgramVertex * getVertex() {return mVertex.get();} void setupCheck(); bool checkDriver() const {return mEGL.mSurface != 0;} void pause(); void resume(); Loading libs/rs/rsProgramFragment.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) } glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); } mTextures[ct]->uploadCheck(rsc); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); switch(mEnvModes[ct]) { Loading Loading @@ -126,6 +127,7 @@ void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, continue; } mTextures[ct]->uploadCheck(rsc); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); if (mSamplers[ct].get()) { mSamplers[ct]->setupGL(); Loading libs/rs/rsSimpleMesh.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const VertexArray va; for (uint32_t ct=0; ct < mVertexTypeCount; ct++) { mVertexBuffers[ct]->uploadCheck(rsc); va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); mVertexTypes[ct]->enableGLVertexBuffer(&va); } Loading @@ -67,6 +68,7 @@ void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const } if (mIndexType.get()) { mIndexBuffer->uploadCheck(rsc); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID()); glDrawElements(mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); } else { Loading @@ -78,14 +80,14 @@ void SimpleMesh::uploadAll(Context *rsc) { for (uint32_t ct=0; ct < mVertexTypeCount; ct++) { if (mVertexBuffers[ct].get()) { mVertexBuffers[ct]->uploadToBufferObject(); mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); } } if (mIndexBuffer.get()) { mIndexBuffer->uploadToBufferObject(); mIndexBuffer->deferedUploadToBufferObject(rsc); } if (mPrimitiveBuffer.get()) { mPrimitiveBuffer->uploadToBufferObject(); mPrimitiveBuffer->deferedUploadToBufferObject(rsc); } } Loading Loading
libs/rs/rsAllocation.cpp +57 −9 Original line number Diff line number Diff line Loading @@ -38,9 +38,9 @@ Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc) mIsTexture = false; mTextureID = 0; mIsVertexBuffer = false; mBufferID = 0; mUploadDefered = false; mType.set(type); rsAssert(type); Loading Loading @@ -88,10 +88,23 @@ bool Allocation::fixAllocation() return false; } void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) void Allocation::deferedUploadToTexture(const Context *rsc, uint32_t lodOffset) { //rsAssert(!mTextureId); rsAssert(lodOffset < mType->getLODCount()); mIsTexture = true; mTextureLOD = lodOffset; mUploadDefered = true; } void Allocation::uploadToTexture(const Context *rsc) { //rsAssert(!mTextureId); mIsTexture = true; if (!rsc->checkDriver()) { mUploadDefered = true; return; } GLenum type = mType->getElement()->getGLType(); GLenum format = mType->getElement()->getGLFormat(); Loading @@ -109,15 +122,16 @@ void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) // Force a crash to 1: restart the app, 2: make sure we get a bugreport. LOGE("Upload to texture failed to gen mTextureID"); rsc->dumpDebug(); ((char *)0)[0] = 0; mUploadDefered = true; return; } } glBindTexture(GL_TEXTURE_2D, mTextureID); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); Adapter2D adapt(getContext(), this); for(uint32_t lod = 0; (lod + lodOffset) < mType->getLODCount(); lod++) { adapt.setLOD(lod+lodOffset); for(uint32_t lod = 0; (lod + mTextureLOD) < mType->getLODCount(); lod++) { adapt.setLOD(lod+mTextureLOD); uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0)); glTexImage2D(GL_TEXTURE_2D, lod, format, Loading @@ -126,19 +140,50 @@ void Allocation::uploadToTexture(Context *rsc, uint32_t lodOffset) } } void Allocation::uploadToBufferObject() void Allocation::deferedUploadToBufferObject(const Context *rsc) { mIsVertexBuffer = true; mUploadDefered = true; } void Allocation::uploadToBufferObject(const Context *rsc) { rsAssert(!mType->getDimY()); rsAssert(!mType->getDimZ()); mIsVertexBuffer = true; if (!rsc->checkDriver()) { mUploadDefered = true; return; } if (!mBufferID) { glGenBuffers(1, &mBufferID); } if (!mBufferID) { LOGE("Upload to buffer object failed"); mUploadDefered = true; return; } glBindBuffer(GL_ARRAY_BUFFER, mBufferID); glBufferData(GL_ARRAY_BUFFER, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); } void Allocation::uploadCheck(const Context *rsc) { if (mUploadDefered) { mUploadDefered = false; if (mIsVertexBuffer) { uploadToBufferObject(rsc); } if (mIsTexture) { uploadToTexture(rsc); } } } void Allocation::data(const void *data, uint32_t sizeBytes) { Loading @@ -149,6 +194,7 @@ void Allocation::data(const void *data, uint32_t sizeBytes) } memcpy(mPtr, data, size); sendDirty(); mUploadDefered = true; } void Allocation::read(void *data) Loading @@ -170,6 +216,7 @@ void Allocation::subData(uint32_t xoff, uint32_t count, const void *data, uint32 } memcpy(ptr, data, size); sendDirty(); mUploadDefered = true; } void Allocation::subData(uint32_t xoff, uint32_t yoff, Loading @@ -195,6 +242,7 @@ void Allocation::subData(uint32_t xoff, uint32_t yoff, dst += destW * eSize; } sendDirty(); mUploadDefered = true; } void Allocation::subData(uint32_t xoff, uint32_t yoff, uint32_t zoff, Loading Loading @@ -271,13 +319,13 @@ RsAllocation rsi_AllocationCreateSized(Context *rsc, RsElement e, size_t count) void rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, uint32_t baseMipLevel) { Allocation *alloc = static_cast<Allocation *>(va); alloc->uploadToTexture(rsc, baseMipLevel); alloc->deferedUploadToTexture(rsc, baseMipLevel); } void rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) { Allocation *alloc = static_cast<Allocation *>(va); alloc->uploadToBufferObject(); alloc->deferedUploadToBufferObject(rsc); } static void mip565(const Adapter2D &out, const Adapter2D &in) Loading
libs/rs/rsAllocation.h +9 −2 Original line number Diff line number Diff line Loading @@ -46,10 +46,12 @@ public: void * getPtr() const {return mPtr;} const Type * getType() const {return mType.get();} void uploadToTexture(Context *rsc, uint32_t lodOffset = 0); void deferedUploadToTexture(const Context *rsc, uint32_t lodOffset); void uploadToTexture(const Context *rsc); uint32_t getTextureID() const {return mTextureID;} void uploadToBufferObject(); void deferedUploadToBufferObject(const Context *rsc); void uploadToBufferObject(const Context *rsc); uint32_t getBufferObjectID() const {return mBufferID;} Loading @@ -70,6 +72,8 @@ public: virtual void dumpLOGV(const char *prefix) const; virtual void uploadCheck(const Context *rsc); protected: void sendDirty() const; Loading @@ -94,6 +98,7 @@ protected: // Is this a legal structure to be used as a texture source. // Initially this will require 1D or 2D and color data bool mIsTexture; uint32_t mTextureLOD; uint32_t mTextureID; // Is this a legal structure to be used as a vertex source. Loading @@ -101,6 +106,8 @@ protected: // is allowed. bool mIsVertexBuffer; uint32_t mBufferID; bool mUploadDefered; }; } Loading
libs/rs/rsContext.h +1 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ public: const ProgramVertex * getVertex() {return mVertex.get();} void setupCheck(); bool checkDriver() const {return mEGL.mSurface != 0;} void pause(); void resume(); Loading
libs/rs/rsProgramFragment.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ void ProgramFragment::setupGL(const Context *rsc, ProgramFragmentState *state) } glTexEnvi(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, mPointSpriteEnable); } mTextures[ct]->uploadCheck(rsc); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); switch(mEnvModes[ct]) { Loading Loading @@ -126,6 +127,7 @@ void ProgramFragment::setupGL2(const Context *rsc, ProgramFragmentState *state, continue; } mTextures[ct]->uploadCheck(rsc); glBindTexture(GL_TEXTURE_2D, mTextures[ct]->getTextureID()); if (mSamplers[ct].get()) { mSamplers[ct]->setupGL(); Loading
libs/rs/rsSimpleMesh.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -57,6 +57,7 @@ void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const VertexArray va; for (uint32_t ct=0; ct < mVertexTypeCount; ct++) { mVertexBuffers[ct]->uploadCheck(rsc); va.setActiveBuffer(mVertexBuffers[ct]->getBufferObjectID()); mVertexTypes[ct]->enableGLVertexBuffer(&va); } Loading @@ -67,6 +68,7 @@ void SimpleMesh::renderRange(Context *rsc, uint32_t start, uint32_t len) const } if (mIndexType.get()) { mIndexBuffer->uploadCheck(rsc); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBuffer->getBufferObjectID()); glDrawElements(mGLPrimitive, len, GL_UNSIGNED_SHORT, (uint16_t *)(start * 2)); } else { Loading @@ -78,14 +80,14 @@ void SimpleMesh::uploadAll(Context *rsc) { for (uint32_t ct=0; ct < mVertexTypeCount; ct++) { if (mVertexBuffers[ct].get()) { mVertexBuffers[ct]->uploadToBufferObject(); mVertexBuffers[ct]->deferedUploadToBufferObject(rsc); } } if (mIndexBuffer.get()) { mIndexBuffer->uploadToBufferObject(); mIndexBuffer->deferedUploadToBufferObject(rsc); } if (mPrimitiveBuffer.get()) { mPrimitiveBuffer->uploadToBufferObject(); mPrimitiveBuffer->deferedUploadToBufferObject(rsc); } } Loading