OgreGLES2StateCacheManagerImp have memory problem?

Anything and everything that's related to OGRE or the wider graphics field that doesn't fit into the other forums.
longer
Kobold
Posts: 37
Joined: Tue Aug 19, 2014 10:46 am
x 5

OgreGLES2StateCacheManagerImp have memory problem?

Post by longer »

When i use Ogre::SimpleRenderable class such as

Code: Select all

		Ogre::SceneNode* d_node_planet = d_root_node->createChildSceneNode("d_node_planet");
		Ogre::WireBoundingBox* mWireBoundingBox1 = OGRE_NEW Ogre::WireBoundingBox();
		Ogre::WireBoundingBox* mWireBoundingBox2 = OGRE_NEW Ogre::WireBoundingBox();
		mWireBoundingBox1->setupBoundingBox(d_node_planet->_getWorldAABB());
		mWireBoundingBox2->setupBoundingBox(d_node_planet->_getWorldAABB());
		OGRE_DELETE mWireBoundingBox1;
		OGRE_DELETE mWireBoundingBox2;
at update callback.my memory come bigger and bigger.At last throw a exception "bad allocation".

My env is ogre.1.9,at windows ,use GLES2 RenderSystems.
When i use Direct3D9 RenderSystems anything is ok.

I do not understand something at this function:

Code: Select all

    void GLES2StateCacheManagerImp::bindGLBuffer(GLenum target, GLuint buffer, GLenum attach, bool force)
    {
		bool update = false;
        BindBufferMap::iterator i = mActiveBufferMap.find(target);
        if (i == mActiveBufferMap.end())
        {
            // Haven't cached this state yet.  Insert it into the map
            mActiveBufferMap.insert(BindBufferMap::value_type(target, buffer));
			update = true;
        }
        else if((*i).second != buffer || force) // Update the cached value if needed
        {
			(*i).second = buffer;
			update = true;
        }

		// Update GL
		if(update)
		{
            if(target == GL_FRAMEBUFFER)
            {
                OGRE_CHECK_GL_ERROR(glBindFramebuffer(target, buffer));
            }
            else if(target == GL_RENDERBUFFER)
            {
                OGRE_CHECK_GL_ERROR(glBindRenderbuffer(target, buffer));
            }
            else
            {
                OGRE_CHECK_GL_ERROR(glBindBuffer(target, buffer));
            }
		}
    }
    
    void GLES2StateCacheManagerImp::deleteGLBuffer(GLenum target, GLuint buffer, GLenum attach, bool force)
    {
        // Buffer name 0 is reserved and we should never try to delete it
        if(buffer == 0)
            return;
        
        BindBufferMap::iterator i = mActiveBufferMap.find(target);
        
        if (i != mActiveBufferMap.end() && ((*i).second == buffer || force))
        {
			if(target == GL_FRAMEBUFFER)
            {
				OGRE_CHECK_GL_ERROR(glDeleteFramebuffers(1, &buffer));
            }
            else if(target == GL_RENDERBUFFER)
            {
				OGRE_CHECK_GL_ERROR(glDeleteRenderbuffers(1, &buffer));
            }
            else
            {
				OGRE_CHECK_GL_ERROR(glDeleteBuffers(1, &buffer));
            }

            // Currently bound buffer is being deleted, update the cached value to 0,
            // which it likely the buffer that will be bound by the driver.
            // An update will be forced next time we try to bind on this target.
            (*i).second = 0;
        }
    }
why if (i != mActiveBufferMap.end() && ((*i).second == buffer || force)) must ((*i).second == buffer?
and the mActiveBufferMap first is GL_ARRAY_BUFFER enum second is buffer index.
So when bindGLBuffer different buffer at GL_ARRAY_BUFFER(Ogre::HardwareVertexBufferSharedPtr use this),and deleteGLBuffer after will case a problem.
like this
bindGLBuffer(GL_ARRAY_BUFFER,1) mActiveBufferMap[GL_ARRAY_BUFFER] = 1
bindGLBuffer(GL_ARRAY_BUFFER,2) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 the buffer name 1 is out of control
deleteGLBuffer(GL_ARRAY_BUFFER,1) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 so can not find it and can not glDeleteBuffers buffer 1
deleteGLBuffer(GL_ARRAY_BUFFER,2) mActiveBufferMap[GL_ARRAY_BUFFER] = 2 find it glDeleteBuffers buffer 2

It's any thing wrong for my usage?