mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 22:22:54 +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() {
|
Circle3DOverlay::Circle3DOverlay() {
|
||||||
memset(&_minorTickMarksColor, 0, sizeof(_minorTickMarksColor));
|
memset(&_minorTickMarksColor, 0, sizeof(_minorTickMarksColor));
|
||||||
memset(&_majorTickMarksColor, 0, sizeof(_majorTickMarksColor));
|
memset(&_majorTickMarksColor, 0, sizeof(_majorTickMarksColor));
|
||||||
|
qDebug() << "Building circle3d overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) :
|
Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) :
|
||||||
|
@ -39,8 +40,27 @@ Circle3DOverlay::Circle3DOverlay(const Circle3DOverlay* circle3DOverlay) :
|
||||||
_majorTicksVerticesID(GeometryCache::UNKNOWN_ID),
|
_majorTicksVerticesID(GeometryCache::UNKNOWN_ID),
|
||||||
_minorTicksVerticesID(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) {
|
void Circle3DOverlay::render(RenderArgs* args) {
|
||||||
if (!_visible) {
|
if (!_visible) {
|
||||||
return; // do nothing if we're not visible
|
return; // do nothing if we're not visible
|
||||||
|
|
|
@ -23,6 +23,7 @@ public:
|
||||||
|
|
||||||
Circle3DOverlay();
|
Circle3DOverlay();
|
||||||
Circle3DOverlay(const Circle3DOverlay* circle3DOverlay);
|
Circle3DOverlay(const Circle3DOverlay* circle3DOverlay);
|
||||||
|
~Circle3DOverlay();
|
||||||
|
|
||||||
virtual void render(RenderArgs* args) override;
|
virtual void render(RenderArgs* args) override;
|
||||||
virtual const render::ShapeKey getShapeKey() override;
|
virtual const render::ShapeKey getShapeKey() override;
|
||||||
|
|
|
@ -19,6 +19,7 @@ QString const Line3DOverlay::TYPE = "line3d";
|
||||||
Line3DOverlay::Line3DOverlay() :
|
Line3DOverlay::Line3DOverlay() :
|
||||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||||
{
|
{
|
||||||
|
qDebug() << "Building line3D overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
|
Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
|
||||||
|
@ -27,9 +28,15 @@ Line3DOverlay::Line3DOverlay(const Line3DOverlay* line3DOverlay) :
|
||||||
_end(line3DOverlay->_end),
|
_end(line3DOverlay->_end),
|
||||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||||
{
|
{
|
||||||
|
qDebug() << "Building line3D overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
Line3DOverlay::~Line3DOverlay() {
|
Line3DOverlay::~Line3DOverlay() {
|
||||||
|
qDebug() << "Destryoing line3D overlay";
|
||||||
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
|
if (_geometryCacheID && geometryCache) {
|
||||||
|
geometryCache->releaseID(_geometryCacheID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::vec3 Line3DOverlay::getStart() const {
|
glm::vec3 Line3DOverlay::getStart() const {
|
||||||
|
@ -84,7 +91,6 @@ void Line3DOverlay::render(RenderArgs* args) {
|
||||||
xColor color = getColor();
|
xColor color = getColor();
|
||||||
const float MAX_COLOR = 255.0f;
|
const float MAX_COLOR = 255.0f;
|
||||||
glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
|
||||||
|
|
||||||
auto batch = args->_batch;
|
auto batch = args->_batch;
|
||||||
if (batch) {
|
if (batch) {
|
||||||
batch->setModelTransform(getTransform());
|
batch->setModelTransform(getTransform());
|
||||||
|
|
|
@ -19,15 +19,22 @@ QString const Rectangle3DOverlay::TYPE = "rectangle3d";
|
||||||
Rectangle3DOverlay::Rectangle3DOverlay() :
|
Rectangle3DOverlay::Rectangle3DOverlay() :
|
||||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||||
{
|
{
|
||||||
|
qDebug() << "Building rect3d overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle3DOverlay::Rectangle3DOverlay(const Rectangle3DOverlay* rectangle3DOverlay) :
|
Rectangle3DOverlay::Rectangle3DOverlay(const Rectangle3DOverlay* rectangle3DOverlay) :
|
||||||
Planar3DOverlay(rectangle3DOverlay),
|
Planar3DOverlay(rectangle3DOverlay),
|
||||||
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
_geometryCacheID(DependencyManager::get<GeometryCache>()->allocateID())
|
||||||
{
|
{
|
||||||
|
qDebug() << "Building rect3d overlay";
|
||||||
}
|
}
|
||||||
|
|
||||||
Rectangle3DOverlay::~Rectangle3DOverlay() {
|
Rectangle3DOverlay::~Rectangle3DOverlay() {
|
||||||
|
qDebug() << "Destryoing rect3d overlay";
|
||||||
|
auto geometryCache = DependencyManager::get<GeometryCache>();
|
||||||
|
if (_geometryCacheID && geometryCache) {
|
||||||
|
geometryCache->releaseID(_geometryCacheID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Rectangle3DOverlay::render(RenderArgs* args) {
|
void Rectangle3DOverlay::render(RenderArgs* args) {
|
||||||
|
|
|
@ -441,6 +441,34 @@ GeometryCache::~GeometryCache() {
|
||||||
#endif //def WANT_DEBUG
|
#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) {
|
void setupBatchInstance(gpu::Batch& batch, gpu::BufferPointer colorBuffer) {
|
||||||
gpu::BufferView colorView(colorBuffer, COLOR_ELEMENT);
|
gpu::BufferView colorView(colorBuffer, COLOR_ELEMENT);
|
||||||
batch.setInputBuffer(gpu::Stream::COLOR, colorView);
|
batch.setInputBuffer(gpu::Stream::COLOR, colorView);
|
||||||
|
|
|
@ -148,6 +148,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
int allocateID() { return _nextID++; }
|
int allocateID() { return _nextID++; }
|
||||||
|
void releaseID(int id);
|
||||||
static const int UNKNOWN_ID;
|
static const int UNKNOWN_ID;
|
||||||
|
|
||||||
// Bind the pipeline and get the state to render static geometry
|
// Bind the pipeline and get the state to render static geometry
|
||||||
|
|
Loading…
Reference in a new issue