Cache the icon texture/picture in EffectFrame and use texture from pixmap to load the data in OpenGL mode. Yeah for less pixmap to image to gltexture conversations.

Some effects (boxswitch and flipswitch) still need to be changed to not set the icon in each frame.

svn path=/trunk/KDE/kdebase/workspace/; revision=1152367
This commit is contained in:
Martin Gräßlin 2010-07-20 21:11:03 +00:00
parent 73d8041d5a
commit fa832b7aa7
6 changed files with 39 additions and 8 deletions

View file

@ -1745,6 +1745,7 @@ void EffectFrameImpl::setIcon( const QPixmap& icon )
{
setIconSize( m_icon.size() );
}
m_sceneFrame->freeIconFrame();
}
const QSize& EffectFrameImpl::iconSize() const
@ -1760,6 +1761,7 @@ void EffectFrameImpl::setIconSize( const QSize& size )
}
m_iconSize = size;
autoResize();
m_sceneFrame->freeIconFrame();
}
void EffectFrameImpl::plasmaThemeChanged()

View file

@ -221,6 +221,7 @@ class Scene::EffectFrame
virtual ~EffectFrame();
virtual void render( QRegion region, double opacity, double frameOpacity ) = 0;
virtual void free() = 0;
virtual void freeIconFrame() = 0;
virtual void freeTextFrame() = 0;
protected:

View file

@ -1920,6 +1920,7 @@ SceneOpenGL::EffectFrame::EffectFrame( EffectFrameImpl* frame )
: Scene::EffectFrame( frame )
, m_texture( NULL )
, m_textTexture( NULL )
, m_iconTexture( NULL )
{
if( m_effectFrame->style() == Unstyled && !m_unstyledTexture )
{
@ -1931,6 +1932,7 @@ SceneOpenGL::EffectFrame::~EffectFrame()
{
delete m_texture;
delete m_textTexture;
delete m_iconTexture;
}
void SceneOpenGL::EffectFrame::free()
@ -1939,6 +1941,14 @@ void SceneOpenGL::EffectFrame::free()
m_texture = NULL;
delete m_textTexture;
m_textTexture = NULL;
delete m_iconTexture;
m_iconTexture = NULL;
}
void SceneOpenGL::EffectFrame::freeIconFrame()
{
delete m_iconTexture;
m_iconTexture = NULL;
}
void SceneOpenGL::EffectFrame::freeTextFrame()
@ -2039,11 +2049,15 @@ void SceneOpenGL::EffectFrame::render( QRegion region, double opacity, double fr
QPoint topLeft( m_effectFrame->geometry().x(),
m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2 );
GLTexture* icon = new GLTexture( m_effectFrame->icon() ); // TODO: Cache
icon->bind();
icon->render( region, QRect( topLeft, m_effectFrame->iconSize() ));
icon->unbind();
delete icon;
if( !m_iconTexture ) // lazy creation
{
m_iconTexture = new Texture( m_effectFrame->icon().handle(),
m_effectFrame->icon().size(),
m_effectFrame->icon().depth() );
}
m_iconTexture->bind();
m_iconTexture->render( region, QRect( topLeft, m_effectFrame->iconSize() ));
m_iconTexture->unbind();
}
// Render text

View file

@ -174,6 +174,7 @@ class SceneOpenGL::EffectFrame
virtual ~EffectFrame();
virtual void free();
virtual void freeIconFrame();
virtual void freeTextFrame();
virtual void render(QRegion region, double opacity, double frameOpacity);
@ -186,6 +187,7 @@ class SceneOpenGL::EffectFrame
GLTexture* m_texture;
GLTexture* m_textTexture;
GLTexture* m_iconTexture;
static GLTexture* m_unstyledTexture;
static void updateUnstyledTexture(); // Update OpenGL unstyled frame texture

View file

@ -854,12 +854,14 @@ SceneXrender::EffectFrame::EffectFrame( EffectFrameImpl* frame )
{
m_picture = NULL;
m_textPicture = NULL;
m_iconPicture = NULL;
}
SceneXrender::EffectFrame::~EffectFrame()
{
delete m_picture;
delete m_textPicture;
delete m_iconPicture;
}
void SceneXrender::EffectFrame::free()
@ -868,6 +870,14 @@ void SceneXrender::EffectFrame::free()
m_picture = NULL;
delete m_textPicture;
m_textPicture = NULL;
delete m_iconPicture;
m_iconPicture = NULL;
}
void SceneXrender::EffectFrame::freeIconFrame()
{
delete m_iconPicture;
m_iconPicture = NULL;
}
void SceneXrender::EffectFrame::freeTextFrame()
@ -907,11 +917,11 @@ void SceneXrender::EffectFrame::render( QRegion region, double opacity, double f
{
QPoint topLeft( m_effectFrame->geometry().x(), m_effectFrame->geometry().center().y() - m_effectFrame->iconSize().height() / 2 );
XRenderPicture* icon = new XRenderPicture( m_effectFrame->icon() ); // TODO: Cache
if( !m_iconPicture ) // lazy creation
m_iconPicture = new XRenderPicture( m_effectFrame->icon() );
QRect geom = QRect( topLeft, m_effectFrame->iconSize() );
XRenderComposite( display(), PictOpOver, *icon, fill, effects->xrenderBufferPicture(),
XRenderComposite( display(), PictOpOver, *m_iconPicture, fill, effects->xrenderBufferPicture(),
0, 0, 0, 0, geom.x(), geom.y(), geom.width(), geom.height() );
delete icon;
}
// Render text

View file

@ -101,6 +101,7 @@ class SceneXrender::EffectFrame
virtual ~EffectFrame();
virtual void free();
virtual void freeIconFrame();
virtual void freeTextFrame();
virtual void render( QRegion region, double opacity, double frameOpacity );
@ -110,6 +111,7 @@ class SceneXrender::EffectFrame
XRenderPicture* m_picture;
XRenderPicture* m_textPicture;
XRenderPicture* m_iconPicture;
};
inline