Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 8772fe0

Browse files
bottlerfacebook-github-bot
authored andcommittedFeb 13, 2024
Make OpenGL optional in tests
Summary: Add an option to run tests without the OpenGL Renderer. Reviewed By: patricklabatut Differential Revision: D53573400 fbshipit-source-id: 54a14e7b2f156d24e0c561fdb279f4a9af01b793
1 parent c292c71 commit 8772fe0

File tree

6 files changed

+67
-23
lines changed

6 files changed

+67
-23
lines changed
 

‎tests/common_testing.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ def interactive_testing_requested() -> bool:
2424
return os.environ.get("PYTORCH3D_INTERACTIVE_TESTING", "") == "1"
2525

2626

27+
def skip_opengl_requested() -> bool:
28+
return os.environ.get("PYTORCH3D_NO_TEST_OPENGL", "") == "1"
29+
30+
31+
usesOpengl = unittest.skipIf(skip_opengl_requested(), "uses opengl")
32+
33+
2734
def get_tests_dir() -> Path:
2835
"""
2936
Returns Path for the directory containing this file.

‎tests/test_opengl_utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
global_device_context_store,
2727
)
2828

29-
from .common_testing import TestCaseMixin # noqa
29+
from .common_testing import TestCaseMixin, usesOpengl # noqa
3030

3131
MAX_EGL_HEIGHT = global_device_context_store.max_egl_height
3232
MAX_EGL_WIDTH = global_device_context_store.max_egl_width
@@ -82,6 +82,7 @@ def _draw_squares_with_context_store(
8282
result[thread_id] = data
8383

8484

85+
@usesOpengl
8586
class TestDeviceContextStore(TestCaseMixin, unittest.TestCase):
8687
def test_cuda_context(self):
8788
cuda_context_1 = global_device_context_store.get_cuda_context(
@@ -118,6 +119,7 @@ def test_egl_context(self):
118119
self.assertIsNot(egl_context_1, egl_context_3)
119120

120121

122+
@usesOpengl
121123
class TestUtils(TestCaseMixin, unittest.TestCase):
122124
def test_load_extensions(self):
123125
# This should work
@@ -145,6 +147,7 @@ def test_egl_convert_to_int_array(self):
145147
self.assertEqual(attribute_array[2], egl.EGL_NONE)
146148

147149

150+
@usesOpengl
148151
class TestOpenGLSingleThreaded(TestCaseMixin, unittest.TestCase):
149152
def test_draw_square(self):
150153
context = EGLContext(width=MAX_EGL_WIDTH, height=MAX_EGL_HEIGHT)
@@ -184,6 +187,7 @@ def test_render_two_squares(self):
184187
)
185188

186189

190+
@usesOpengl
187191
class TestOpenGLMultiThreaded(TestCaseMixin, unittest.TestCase):
188192
def test_multiple_renders_single_gpu_single_context(self):
189193
_draw_squares_with_context()
@@ -321,6 +325,7 @@ def test_render_multi_thread_multi_gpu(self):
321325
thread.join()
322326

323327

328+
@usesOpengl
324329
class TestOpenGLUtils(TestCaseMixin, unittest.TestCase):
325330
@classmethod
326331
def tearDownClass(cls):

‎tests/test_rasterize_rectangle_images.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
get_tests_dir,
5252
load_rgb_image,
5353
TestCaseMixin,
54+
usesOpengl,
5455
)
5556

5657

@@ -454,6 +455,7 @@ def test_cpu(self):
454455
def test_render_cow(self):
455456
self._render_cow(MeshRasterizer)
456457

458+
@usesOpengl
457459
def test_render_cow_opengl(self):
458460
self._render_cow(MeshRasterizerOpenGL)
459461

‎tests/test_rasterizer.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@
3333
from pytorch3d.structures.meshes import Meshes
3434
from pytorch3d.utils.ico_sphere import ico_sphere
3535

36-
from .common_testing import get_tests_dir, TestCaseMixin
36+
from .common_testing import (
37+
get_tests_dir,
38+
skip_opengl_requested,
39+
TestCaseMixin,
40+
usesOpengl,
41+
)
3742

3843

3944
DATA_DIR = get_tests_dir() / "data"
@@ -55,6 +60,7 @@ def test_simple_sphere(self):
5560
def test_simple_sphere_fisheye(self):
5661
self._simple_sphere_fisheye_against_perspective(MeshRasterizer)
5762

63+
@usesOpengl
5864
def test_simple_sphere_opengl(self):
5965
self._simple_sphere(MeshRasterizerOpenGL)
6066

@@ -250,9 +256,11 @@ def test_simple_to(self):
250256
rasterizer = MeshRasterizer()
251257
rasterizer.to(device)
252258

253-
rasterizer = MeshRasterizerOpenGL()
254-
rasterizer.to(device)
259+
if not skip_opengl_requested():
260+
rasterizer = MeshRasterizerOpenGL()
261+
rasterizer.to(device)
255262

263+
@usesOpengl
256264
def test_compare_rasterizers(self):
257265
device = torch.device("cuda:0")
258266

@@ -321,6 +329,7 @@ def test_compare_rasterizers(self):
321329
)
322330

323331

332+
@usesOpengl
324333
class TestMeshRasterizerOpenGLUtils(TestCaseMixin, unittest.TestCase):
325334
def setUp(self):
326335
verts = torch.tensor(

‎tests/test_render_meshes.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@
5959
get_pytorch3d_dir,
6060
get_tests_dir,
6161
load_rgb_image,
62+
skip_opengl_requested,
6263
TestCaseMixin,
64+
usesOpengl,
6365
)
6466

6567
# If DEBUG=True, save out images generated in the tests for debugging.
@@ -159,13 +161,16 @@ def test_simple_sphere(self, elevated_camera=False, check_depth=False):
159161
MeshRasterizer, HardGouraudShader, "gouraud", "hard_gouraud"
160162
),
161163
RasterizerTest(MeshRasterizer, HardFlatShader, "flat", "hard_flat"),
162-
RasterizerTest(
163-
MeshRasterizerOpenGL,
164-
SplatterPhongShader,
165-
"splatter",
166-
"splatter_phong",
167-
),
168164
]
165+
if not skip_opengl_requested():
166+
rasterizer_tests.append(
167+
RasterizerTest(
168+
MeshRasterizerOpenGL,
169+
SplatterPhongShader,
170+
"splatter",
171+
"splatter_phong",
172+
)
173+
)
169174
for test in rasterizer_tests:
170175
shader = test.shader(
171176
lights=lights,
@@ -400,13 +405,16 @@ def test_simple_sphere_batched(self):
400405
MeshRasterizer, HardGouraudShader, "gouraud", "hard_gouraud"
401406
),
402407
RasterizerTest(MeshRasterizer, HardFlatShader, "flat", "hard_flat"),
403-
RasterizerTest(
404-
MeshRasterizerOpenGL,
405-
SplatterPhongShader,
406-
"splatter",
407-
"splatter_phong",
408-
),
409408
]
409+
if not skip_opengl_requested():
410+
rasterizer_tests.append(
411+
RasterizerTest(
412+
MeshRasterizerOpenGL,
413+
SplatterPhongShader,
414+
"splatter",
415+
"splatter_phong",
416+
)
417+
)
410418
for test in rasterizer_tests:
411419
reference_name = test.reference_name
412420
debug_name = test.debug_name
@@ -518,6 +526,7 @@ def test_texture_map(self):
518526
"""
519527
self._texture_map_per_rasterizer(MeshRasterizer)
520528

529+
@usesOpengl
521530
def test_texture_map_opengl(self):
522531
"""
523532
Test a mesh with a texture map is loaded and rendered correctly.
@@ -694,6 +703,7 @@ def _texture_map_per_rasterizer(self, rasterizer_type):
694703
def test_batch_uvs(self):
695704
self._batch_uvs(MeshRasterizer)
696705

706+
@usesOpengl
697707
def test_batch_uvs_opengl(self):
698708
self._batch_uvs(MeshRasterizer)
699709

@@ -786,6 +796,7 @@ def _batch_uvs(self, rasterizer_type):
786796
def test_join_uvs(self):
787797
self._join_uvs(MeshRasterizer)
788798

799+
@usesOpengl
789800
def test_join_uvs_opengl(self):
790801
self._join_uvs(MeshRasterizerOpenGL)
791802

@@ -975,6 +986,7 @@ def test_join_uvs_simple(self):
975986
def test_join_verts(self):
976987
self._join_verts(MeshRasterizer)
977988

989+
@usesOpengl
978990
def test_join_verts_opengl(self):
979991
self._join_verts(MeshRasterizerOpenGL)
980992

@@ -1051,6 +1063,7 @@ def _join_verts(self, rasterizer_type):
10511063
def test_join_atlas(self):
10521064
self._join_atlas(MeshRasterizer)
10531065

1066+
@usesOpengl
10541067
def test_join_atlas_opengl(self):
10551068
self._join_atlas(MeshRasterizerOpenGL)
10561069

@@ -1151,6 +1164,7 @@ def _join_atlas(self, rasterizer_type):
11511164
def test_joined_spheres(self):
11521165
self._joined_spheres(MeshRasterizer)
11531166

1167+
@usesOpengl
11541168
def test_joined_spheres_opengl(self):
11551169
self._joined_spheres(MeshRasterizerOpenGL)
11561170

@@ -1233,6 +1247,7 @@ def _joined_spheres(self, rasterizer_type):
12331247
def test_texture_map_atlas(self):
12341248
self._texture_map_atlas(MeshRasterizer)
12351249

1250+
@usesOpengl
12361251
def test_texture_map_atlas_opengl(self):
12371252
self._texture_map_atlas(MeshRasterizerOpenGL)
12381253

@@ -1351,6 +1366,7 @@ def _texture_map_atlas(self, rasterizer_type):
13511366
def test_simple_sphere_outside_zfar(self):
13521367
self._simple_sphere_outside_zfar(MeshRasterizer)
13531368

1369+
@usesOpengl
13541370
def test_simple_sphere_outside_zfar_opengl(self):
13551371
self._simple_sphere_outside_zfar(MeshRasterizerOpenGL)
13561372

@@ -1445,13 +1461,16 @@ def test_cameras_kwarg(self):
14451461
# No elevation or azimuth rotation
14461462
rasterizer_tests = [
14471463
RasterizerTest(MeshRasterizer, HardPhongShader, "phong", "hard_phong"),
1448-
RasterizerTest(
1449-
MeshRasterizerOpenGL,
1450-
SplatterPhongShader,
1451-
"splatter",
1452-
"splatter_phong",
1453-
),
14541464
]
1465+
if not skip_opengl_requested():
1466+
rasterizer_tests.append(
1467+
RasterizerTest(
1468+
MeshRasterizerOpenGL,
1469+
SplatterPhongShader,
1470+
"splatter",
1471+
"splatter_phong",
1472+
)
1473+
)
14551474
R, T = look_at_view_transform(2.7, 0.0, 0.0)
14561475
for cam_type in (
14571476
FoVPerspectiveCameras,

‎tests/test_render_multigpu.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from pytorch3d.structures import Meshes, Pointclouds
3030
from pytorch3d.utils.ico_sphere import ico_sphere
3131

32-
from .common_testing import TestCaseMixin
32+
from .common_testing import TestCaseMixin, usesOpengl
3333

3434

3535
# Set the number of GPUS you want to test with
@@ -119,6 +119,7 @@ def _mesh_renderer_to(self, rasterizer_class, shader_class):
119119
def test_mesh_renderer_to(self):
120120
self._mesh_renderer_to(MeshRasterizer, SoftPhongShader)
121121

122+
@usesOpengl
122123
def test_mesh_renderer_opengl_to(self):
123124
self._mesh_renderer_to(MeshRasterizerOpenGL, SplatterPhongShader)
124125

@@ -177,6 +178,7 @@ def test_render_meshes(self):
177178
self._render_meshes(MeshRasterizer, HardGouraudShader)
178179

179180
# @unittest.skip("Multi-GPU OpenGL training is currently not supported.")
181+
@usesOpengl
180182
def test_render_meshes_opengl(self):
181183
self._render_meshes(MeshRasterizerOpenGL, SplatterPhongShader)
182184

0 commit comments

Comments
 (0)
Please sign in to comment.