Skip to content

Commit fd89971

Browse files
committed
Fix OpenGL context deinitialization in tests
1 parent 7576f5b commit fd89971

File tree

6 files changed

+22
-43
lines changed

6 files changed

+22
-43
lines changed

src/skin.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ Skin::Skin()
1212
QOpenGLContext *context = QOpenGLContext::currentContext();
1313
Q_ASSERT(context);
1414

15-
if (!m_destroyConnected && context) {
15+
if (!m_connectedCtx || (context && context != m_connectedCtx)) {
1616
QObject::connect(context, &QOpenGLContext::aboutToBeDestroyed, []() {
1717
// Destroy textures
1818
m_textures.clear();
1919
});
2020

21-
m_destroyConnected = true;
21+
m_connectedCtx = context;
2222
}
2323
}
2424

src/skin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class Skin
2727

2828
private:
2929
static inline std::vector<std::shared_ptr<QOpenGLTexture>> m_textures;
30-
static inline bool m_destroyConnected = false;
30+
static inline QOpenGLContext *m_connectedCtx = nullptr;
3131
};
3232

3333
} // namespace scratchcpprender

test/penlayer/penlayer_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class PenLayerTest : public testing::Test
3535
void TearDown() override
3636
{
3737
ASSERT_EQ(m_context.surface(), &m_surface);
38+
emit m_context.aboutToBeDestroyed();
3839
m_context.doneCurrent();
3940
}
4041

test/renderedtarget/renderedtarget_test.cpp

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,18 @@ using ::testing::_;
2929
class RenderedTargetTest : public testing::Test
3030
{
3131
public:
32+
void SetUp() override
33+
{
34+
// Create OpenGL context
35+
createContextAndSurface(&m_context, &m_surface);
36+
}
37+
38+
void TearDown() override
39+
{
40+
emit m_context.aboutToBeDestroyed();
41+
m_context.doneCurrent();
42+
}
43+
3244
void createContextAndSurface(QOpenGLContext *context, QOffscreenSurface *surface)
3345
{
3446
QSurfaceFormat surfaceFormat;
@@ -46,6 +58,9 @@ class RenderedTargetTest : public testing::Test
4658
context->makeCurrent(surface);
4759
ASSERT_EQ(QOpenGLContext::currentContext(), context);
4860
}
61+
62+
QOpenGLContext m_context;
63+
QOffscreenSurface m_surface;
4964
};
5065

5166
TEST_F(RenderedTargetTest, Constructors)
@@ -58,9 +73,6 @@ TEST_F(RenderedTargetTest, Constructors)
5873

5974
TEST_F(RenderedTargetTest, UpdateMethods)
6075
{
61-
QOpenGLContext context;
62-
QOffscreenSurface surface;
63-
createContextAndSurface(&context, &surface);
6476
RenderedTarget parent; // a parent item is needed for setVisible() to work
6577
RenderedTarget target(&parent);
6678
EngineMock engine;
@@ -325,8 +337,6 @@ TEST_F(RenderedTargetTest, UpdateMethods)
325337
ASSERT_TRUE(texture.isValid());
326338
ASSERT_EQ(texture.width(), 13);
327339
ASSERT_EQ(texture.height(), 13);
328-
329-
context.doneCurrent();
330340
}
331341

332342
TEST_F(RenderedTargetTest, DeinitClone)
@@ -358,11 +368,6 @@ TEST_F(RenderedTargetTest, CpuRendering)
358368
target.setEngine(&engine);
359369
target.setSpriteModel(&model);
360370

361-
// Create OpenGL context
362-
QOpenGLContext context;
363-
QOffscreenSurface surface;
364-
createContextAndSurface(&context, &surface);
365-
366371
// Load costume
367372
EXPECT_CALL(engine, stageWidth()).WillRepeatedly(Return(480));
368373
EXPECT_CALL(engine, stageHeight()).WillRepeatedly(Return(360));
@@ -467,9 +472,6 @@ TEST_F(RenderedTargetTest, CpuRendering)
467472
target.setGraphicEffect(ShaderManager::Effect::Color, 0);
468473

469474
// TODO: Test point transform (graphic effects that change shape)
470-
471-
// Cleanup
472-
context.doneCurrent();
473475
}
474476

475477
TEST_F(RenderedTargetTest, SpriteDragging)
@@ -738,9 +740,6 @@ TEST_F(RenderedTargetTest, GraphicEffects)
738740

739741
TEST_F(RenderedTargetTest, GetBounds)
740742
{
741-
QOpenGLContext context;
742-
QOffscreenSurface surface;
743-
createContextAndSurface(&context, &surface);
744743
RenderedTarget target;
745744

746745
Sprite sprite;
@@ -826,16 +825,11 @@ TEST_F(RenderedTargetTest, GetBounds)
826825
ASSERT_EQ(std::round(bubbleBounds.top() * 100) / 100, 1294.13);
827826
ASSERT_EQ(std::round(bubbleBounds.right() * 100) / 100, -405.87);
828827
ASSERT_EQ(std::round(bubbleBounds.bottom() * 100) / 100, 1286.13);
829-
830-
context.doneCurrent();
831828
}
832829

833830
TEST_F(RenderedTargetTest, GetFastBounds)
834831
{
835-
QOpenGLContext context;
836-
QOffscreenSurface surface;
837-
createContextAndSurface(&context, &surface);
838-
QOpenGLExtraFunctions glF(&context);
832+
QOpenGLExtraFunctions glF(&m_context);
839833
glF.initializeOpenGLFunctions();
840834
RenderedTarget target;
841835

@@ -898,8 +892,6 @@ TEST_F(RenderedTargetTest, GetFastBounds)
898892
ASSERT_EQ(std::round(bounds.top() * 100) / 100, 1324.22);
899893
ASSERT_EQ(std::round(bounds.right() * 100) / 100, -375.77);
900894
ASSERT_EQ(std::round(bounds.bottom() * 100) / 100, 1143.65);
901-
902-
context.doneCurrent();
903895
}
904896

905897
TEST_F(RenderedTargetTest, TouchingClones)
@@ -923,11 +915,6 @@ TEST_F(RenderedTargetTest, TouchingClones)
923915
model1.setRenderedTarget(&target1);
924916
model2.setRenderedTarget(&target2);
925917

926-
// Create OpenGL context
927-
QOpenGLContext context;
928-
QOffscreenSurface surface;
929-
createContextAndSurface(&context, &surface);
930-
931918
// Load costume
932919
EXPECT_CALL(engine, stageWidth()).WillRepeatedly(Return(480));
933920
EXPECT_CALL(engine, stageHeight()).WillRepeatedly(Return(360));
@@ -1074,9 +1061,6 @@ TEST_F(RenderedTargetTest, TouchingClones)
10741061
EXPECT_CALL(target1, containsScratchPoint).Times(0);
10751062
EXPECT_CALL(target2, containsScratchPoint).Times(0);
10761063
ASSERT_FALSE(target.touchingClones({ &clone1, &clone2 }));
1077-
1078-
// Cleanup
1079-
context.doneCurrent();
10801064
}
10811065

10821066
TEST_F(RenderedTargetTest, TouchingColor)
@@ -1146,11 +1130,6 @@ TEST_F(RenderedTargetTest, TouchingColor)
11461130
model1.setRenderedTarget(&target1);
11471131
model2.setRenderedTarget(&target2);
11481132

1149-
// Create OpenGL context
1150-
QOpenGLContext context;
1151-
QOffscreenSurface surface;
1152-
createContextAndSurface(&context, &surface);
1153-
11541133
// Load costume
11551134
EXPECT_CALL(engine, stageWidth()).WillRepeatedly(Return(480));
11561135
EXPECT_CALL(engine, stageHeight()).WillRepeatedly(Return(360));
@@ -1330,7 +1309,4 @@ TEST_F(RenderedTargetTest, TouchingColor)
13301309
EXPECT_CALL(penLayer, colorAtScratchPoint).Times(0);
13311310
EXPECT_CALL(stageTarget, colorAtScratchPoint).Times(0);
13321311
ASSERT_FALSE(target.touchingColor(color1));
1333-
1334-
// Cleanup
1335-
context.doneCurrent();
13361312
}

test/skins/bitmapskin_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class BitmapSkinTest : public testing::Test
3333
void TearDown() override
3434
{
3535
ASSERT_EQ(m_context.surface(), &m_surface);
36+
emit m_context.aboutToBeDestroyed();
3637
m_jpegSkin.reset();
3738
m_pngSkin.reset();
3839
m_context.doneCurrent();

test/skins/svgskin_test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class SVGSkinTest : public testing::Test
2828
void TearDown() override
2929
{
3030
ASSERT_EQ(m_context.surface(), &m_surface);
31+
emit m_context.aboutToBeDestroyed();
3132
m_skin.reset();
3233
m_context.doneCurrent();
3334
}

0 commit comments

Comments
 (0)