Fix GPU buffer leak in geometry cache / overlays

This commit is contained in:
Brad Davis 2016-10-17 12:22:20 -07:00
parent aec76cd542
commit dde79ef3c5
6 changed files with 59 additions and 1 deletions

View file

@ -19,6 +19,7 @@ QString const Circle3DOverlay::TYPE = "circle3d";
Circle3DOverlay::Circle3DOverlay() {
memset(&_minorTickMarksColor, 0, sizeof(_minorTickMarksColor));
memset(&_majorTickMarksColor, 0, sizeof(_majorTickMarksColor));
qDebug() << "Building circle3d overlay";
}
Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) :
@ -39,8 +40,25 @@ Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) :
_majorTicksVerticesID(GeometryCache::UNKNOWN_ID),
_minorTicksVerticesID(GeometryCache::UNKNOWN_ID)
{
qDebug() << "Building circle3d overlay";
}
Circle3DOverlay::~Circle3DOverlay() {
auto geometryCache = DependencyManager::get<GeometryCache>();
if (_quadVerticesID) {
geometryCache->releaseID(_quadVerticesID);
}
if (_lineVerticesID) {
geometryCache->releaseID(_lineVerticesID);
}
if (_majorTicksVerticesID) {
geometryCache->releaseID(_majorTicksVerticesID);
}
if (_minorTicksVerticesID) {
geometryCache->releaseID(_minorTicksVerticesID);
}
qDebug() << "Destroying circle3d overlay";
}
void Circle3DOverlay::render(RenderArgs* args) {
if (!_visible) {
return; // do nothing if we're not visible

View file

@ -23,6 +23,7 @@ public:
Circle3DOverlay();
Circle3DOverlay(const Circle3DOverlay* circle3DOverlay);
~Circle3DOverlay();
virtual void render(RenderArgs* args) override;
virtual const render::ShapeKey getShapeKey() override;

View file

@ -19,6 +19,7 @@ QString const Line3DOverlay::TYPE = "line3d";
Line3DOverlay::Line3DOverlay() :
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
{
qDebug() << "Building line3D overlay";
}
Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
@ -27,9 +28,15 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
_end(line3DOverlay->_end),
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
{
qDebug() << "Building line3D overlay";
}
Line3DOverlay::~Line3DOverlay() {
qDebug() << "Destryoing line3D overlay";
auto geometryCache = DependencyManager::get<GeometryCache>();
if (_geometryCacheID) {
geometryCache->releaseID(_geometryCacheID);
}
}
glm::vec3 Line3DOverlay::getStart() const {
@ -84,7 +91,6 @@ void Line3DOverlay::render(RenderArgs* args) {
xColor color = getColor();
const float MAX_COLOR = 255.0f;
glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
auto batch = args->_batch;
if (batch) {
batch->setModelTransform(getTransform());

View file

@ -28,6 +28,10 @@ Rectangle3DOverlay::Rectangle3DOverlay(const Rectangle3DOverlay* rectangle3DOver
}
Rectangle3DOverlay::~Rectangle3DOverlay() {
auto geometryCache = DependencyManager::get<GeometryCache>();
if (_geometryCacheID) {
geometryCache->releaseID(_geometryCacheID);
}
}
void Rectangle3DOverlay::render(RenderArgs* args) {

View file

@ -441,6 +441,34 @@ GeometryCache::~GeometryCache() {
#endif //def WANT_DEBUG
}
void GeometryCache::releaseID(int id) {
_registeredQuad3DTextures.remove(id);
_lastRegisteredQuad2DTexture.remove(id);
_registeredQuad2DTextures.remove(id);
_lastRegisteredQuad3D.remove(id);
_registeredQuad3D.remove(id);
_lastRegisteredQuad2D.remove(id);
_registeredQuad2D.remove(id);
_lastRegisteredBevelRects.remove(id);
_registeredBevelRects.remove(id);
_lastRegisteredLine3D.remove(id);
_registeredLine3DVBOs.remove(id);
_lastRegisteredLine2D.remove(id);
_registeredLine2DVBOs.remove(id);
_registeredVertices.remove(id);
_lastRegisteredDashedLines.remove(id);
_registeredDashedLines.remove(id);
_lastRegisteredGridBuffer.remove(id);
_registeredGridBuffers.remove(id);
}
void setupBatchInstance(gpu::Batch& batch, gpu::BufferPointer colorBuffer) {
gpu::BufferView colorView(colorBuffer, COLOR_ELEMENT);
batch.setInputBuffer(gpu::Stream::COLOR, colorView);

View file

@ -148,6 +148,7 @@ public:
};
int allocateID() { return _nextID++; }
void releaseID(int id);
static const int UNKNOWN_ID;
// Bind the pipeline and get the state to render static geometry