~zsombi/ubuntu-ui-toolkit/pleaseBottomEdgePreloadUrl

« back to all changes in this revision

Viewing changes to src/Ubuntu/Components/plugin/ucubuntushapetextures.cpp

[UbuntuShape] Use reference counting to handle shape textures.

The current shape textures handling system requires to search for the textures associated to the current graphics context by doing a search in an array for each item at each updatePaintNode() call. It also deletes the textures on OpenGLContext::aboutToBeDestroyed() signal emission, which appears in some cases to not have any OpenGL context bound.

We propose an alternative to create and destroy shape textures per material creation and destruction with a reference counting mechanism to minimise costly calls. We search for the shape textures (hash lookup with an OpenGL context pointer as the key) only when a texture material is created or deleted, which is much more occasional compared to updatePaintNode() calls. That also ensures textures are deleted with the proper OpenGL context bound.

The only drawback is that shape textures are deleted when there is no shape items anymore in a scene and recreated when there is a new one appearing. These operations being quite uncommon and relatively fast, the advantages seem to be higher than the drawbacks.

Approved by ubuntu-sdk-build-bot, Tim Peeters.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
// Copyright 2015 Canonical Ltd.
2
2
// Automatically generated by the createshapetextures tool.
3
3
 
4
 
const int shapeTextureCount = 2;
5
 
const int shapeTextureWidth = 32;
6
 
const int shapeTextureHeight = 32;
7
 
const float shapeTextureOffset = 0.0625;
8
 
const int shapeTextureDistanceAA = 4;
9
 
static const unsigned char shapeTextureData[2][4097] = {
 
4
#include "ucubuntushapetextures.h"
 
5
 
 
6
const unsigned char shapeTextureData[2][4097] = {
10
7
    "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00"
11
8
    "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00"
12
9
    "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x06\x00"
522
519
    "\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00\xff\xff\xcc\x00"
523
520
};
524
521
 
525
 
const int shapeTextureMipmapWidth = 256;
526
 
const int shapeTextureMipmapHeight = 256;
527
 
const int shapeTextureMipmapCount = 9;
528
 
static const int shapeTextureMipmapOffset[9] = {
 
522
const int shapeTextureMipmapOffset[9] = {
529
523
    0, 262144, 327680, 344064, 348160, 349184, 349440, 349504, 349520
530
524
};
531
 
static const unsigned char shapeTextureMipmapData[2][349525] = {
 
525
const unsigned char shapeTextureMipmapData[2][349525] = {
532
526
    // Mipmap level 0.
533
527
    "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00"
534
528
    "\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00\x5e\x5e\x00\x00"