mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 17:14:59 +02:00
Merge pull request #8829 from jherico/gpu_leak
Fix GPU buffer leak in geometry cache / overlays
This commit is contained in:
commit
13e5c31d0d
6 changed files with 64 additions and 1 deletions
|
@ -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,27 @@ 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 (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
|
||||
|
|
|
@ -23,6 +23,7 @@ public:
|
|||
|
||||
Circle3DOverlay();
|
||||
Circle3DOverlay(const Circle3DOverlay* circle3DOverlay);
|
||||
~Circle3DOverlay();
|
||||
|
||||
virtual void render(RenderArgs* args) override;
|
||||
virtual const render::ShapeKey getShapeKey() override;
|
||||
|
|
|
@ -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) {
|
||||
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());
|
||||
|
|
|
@ -19,15 +19,22 @@ QString const Rectangle3DOverlay::TYPE = "rectangle3d";
|
|||
Rectangle3DOverlay::Rectangle3DOverlay() :
|
||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||
{
|
||||
qDebug() << "Building rect3d overlay";
|
||||
}
|
||||
|
||||
Rectangle3DOverlay::Rectangle3DOverlay(const Rectangle3DOverlay* rectangle3DOverlay) :
|
||||
Planar3DOverlay(rectangle3DOverlay),
|
||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||
{
|
||||
qDebug() << "Building rect3d overlay";
|
||||
}
|
||||
|
||||
Rectangle3DOverlay::~Rectangle3DOverlay() {
|
||||
qDebug() << "Destryoing rect3d overlay";
|
||||
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||
if (_geometryCacheID && geometryCache) {
|
||||
geometryCache->releaseID(_geometryCacheID);
|
||||
}
|
||||
}
|
||||
|
||||
void Rectangle3DOverlay::render(RenderArgs* args) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue