Opened 42 hours ago
Closed 32 hours ago
#19523 closed defect (wontfix)
Looking Glass support
| Reported by: | Owned by: | Tom Goddard | |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | Graphics | Version: | |
| Keywords: | Cc: | ||
| Blocked By: | Blocking: | ||
| Notify when closed: | Platform: | all | |
| Project: | ChimeraX |
Description
The following bug report has been submitted:
Platform: macOS-26.0.1-arm64-arm-64bit
ChimeraX Version: 1.10.1 (2025-07-24 20:15:27 UTC)
Description
Hello,
I'm working on adding Looking Glass support for modern LG displays to ChimeraX. While I have everything working/displaying in 3D, the non-3D display flickers quite a bit as a result of what I believe is a potential bug.
Specifically, when rendering a quilted tile like is necessary with LG displays, and having some sort of outline (selection outline or silhouettes), the renderer only blits the scene to tile 0,0 while the silhouettes seem to go to 0-47 properly. This results in a very dim/imperceptible image. I think the reason it works without outlines is that we rendering directly to the quilt, but as soon as there is an outline, we must be rendering through the framebuffer, so I suspect that what is happening is that in copy_from_framebuffer, GL.glBlitFramebuffer has hard-coded (0,0) coordinates, which means only tile 0 ever gets the actual rendered scene.
I can work around this by disabling silhouettes/outlines before rendering to LG display, but this introduces a flicker on the main display as we are in a constant state of re-drawing with and without outlines/silhouettes, especially when using something like ISOLDE where selection is constantly updating and new selection outlines are being drawn.
Best,
Clin
OpenGL version: 4.1 Metal - 90.5
OpenGL renderer: Apple M4 Max
OpenGL vendor: Apple
Python: 3.11.4
Locale: en_US.UTF-8
Qt version: PyQt6 6.8.1, Qt 6.8.2
Qt runtime version: 6.8.2
Qt platform: cocoa
Hardware:
Hardware Overview:
Model Name: MacBook Pro
Model Identifier: Mac16,6
Model Number: Z1FG000AULL/A
Chip: Apple M4 Max
Total Number of Cores: 16 (12 performance and 4 efficiency)
Memory: 64 GB
System Firmware Version: 13822.1.2
OS Loader Version: 13822.1.2
Software:
System Software Overview:
System Version: macOS 26.0.1 (25A362)
Kernel Version: Darwin 25.0.0
Time since boot: 6 minutes, 35 seconds
Graphics/Displays:
Apple M4 Max:
Chipset Model: Apple M4 Max
Type: GPU
Bus: Built-In
Total Number of Cores: 40
Vendor: Apple (0x106b)
Metal Support: Metal 4
Displays:
MEG 342C OLED:
Resolution: 3440 x 1440 (UWQHD - Ultra-Wide Quad HD)
UI Looks like: 3440 x 1440 @ 175.00Hz
Main Display: Yes
Mirror: Off
Online: Yes
Rotation: Supported
LKG-J00339:
Resolution: 3840 x 2160 (2160p/4K UHD 1 - Ultra High Definition)
UI Looks like: 3840 x 2160 @ 30.00Hz
Mirror: Off
Online: Yes
Rotation: Supported
Installed Packages:
alabaster: 1.0.0
appdirs: 1.4.4
appnope: 0.1.4
asttokens: 3.0.0
babel: 2.17.0
beautifulsoup4: 4.13.3
biopython: 1.83
blockdiag: 3.0.0
blosc2: 3.6.1
build: 1.2.2.post1
certifi: 2023.11.17
cftime: 1.6.4.post1
charset-normalizer: 3.4.2
ChimeraX-AddCharge: 1.5.19
ChimeraX-AddH: 2.2.7
ChimeraX-AlignmentAlgorithms: 2.0.2
ChimeraX-AlignmentHdrs: 3.6.1
ChimeraX-AlignmentMatrices: 2.1
ChimeraX-Alignments: 2.20.2
ChimeraX-AlphaFold: 1.0.1
ChimeraX-AltlocExplorer: 1.1.2
ChimeraX-AmberInfo: 1.0
ChimeraX-Aniso: 1.1.4
ChimeraX-Arrays: 1.1
ChimeraX-Atomic: 1.60.7
ChimeraX-AtomicLibrary: 14.1.19
ChimeraX-AtomSearch: 2.0.1
ChimeraX-AxesPlanes: 2.4
ChimeraX-BasicActions: 1.1.3
ChimeraX-BILD: 1.0
ChimeraX-BlastProtein: 3.0.0
ChimeraX-Boltz: 1.0
ChimeraX-BondRot: 2.0.4
ChimeraX-BugReporter: 1.0.2
ChimeraX-BuildStructure: 2.13.1
ChimeraX-Bumps: 1.0
ChimeraX-BundleBuilder: 1.5.1
ChimeraX-ButtonPanel: 1.0.1
ChimeraX-CageBuilder: 1.0.1
ChimeraX-CellPack: 1.0
ChimeraX-Centroids: 1.4
ChimeraX-ChangeChains: 1.1
ChimeraX-CheckWaters: 1.5
ChimeraX-ChemGroup: 2.0.2
ChimeraX-Clashes: 2.3
ChimeraX-Clipper: 0.25.2
ChimeraX-clix: 0.2.4
ChimeraX-ColorActions: 1.0.5
ChimeraX-ColorGlobe: 1.0
ChimeraX-ColorKey: 1.5.8
ChimeraX-CommandLine: 1.3
ChimeraX-ConnectStructure: 2.0.1
ChimeraX-Contacts: 1.0.1
ChimeraX-Core: 1.10.1
ChimeraX-CoreFormats: 1.2
ChimeraX-coulombic: 1.4.5
ChimeraX-Crosslinks: 1.0
ChimeraX-Crystal: 1.0
ChimeraX-CrystalContacts: 1.0.1
ChimeraX-DataFormats: 1.2.4
ChimeraX-Dicom: 1.2.7
ChimeraX-DistMonitor: 1.4.2
ChimeraX-DockPrep: 1.1.4
ChimeraX-Dssp: 2.0
ChimeraX-EMDB-SFF: 1.0
ChimeraX-ESMFold: 1.0
ChimeraX-FileHistory: 1.0.1
ChimeraX-FunctionKey: 1.0.1
ChimeraX-Geometry: 1.3
ChimeraX-gltf: 1.0
ChimeraX-Graphics: 1.4.1
ChimeraX-Hbonds: 2.5.1
ChimeraX-Help: 1.3
ChimeraX-HKCage: 1.3
ChimeraX-IHM: 1.1
ChimeraX-ImageFormats: 1.2
ChimeraX-IMOD: 1.0
ChimeraX-IO: 1.0.3
ChimeraX-ISOLDE: 1.10.1
ChimeraX-ItemsInspection: 1.0.1
ChimeraX-IUPAC: 1.0
ChimeraX-KVFinder: 1.6.2
ChimeraX-Label: 1.1.14
ChimeraX-ListInfo: 1.2.2
ChimeraX-LocalResWeight: 0.1
ChimeraX-Log: 1.2
ChimeraX-LookingGlass: 1.1
ChimeraX-LookingGlassBridge: 1.0
ChimeraX-Maestro: 1.9.1
ChimeraX-Map: 1.3
ChimeraX-MapData: 2.0
ChimeraX-MapEraser: 1.0.1
ChimeraX-MapFilter: 2.0.1
ChimeraX-MapFit: 2.0
ChimeraX-MapSeries: 2.1.1
ChimeraX-Markers: 1.0.1
ChimeraX-Mask: 1.0.2
ChimeraX-MatchMaker: 2.2.2
ChimeraX-MCopy: 1.0
ChimeraX-MDcrds: 2.10.1
ChimeraX-MedicalToolbar: 1.1
ChimeraX-Meeting: 1.0.1
ChimeraX-MIC: 0.2
ChimeraX-MLP: 1.1.1
ChimeraX-mmCIF: 2.16
ChimeraX-MMTF: 2.2
ChimeraX-ModelArchive: 1.0
ChimeraX-Modeller: 1.5.19
ChimeraX-ModelPanel: 1.5.1
ChimeraX-ModelSeries: 1.0.1
ChimeraX-Mol2: 2.0.3
ChimeraX-Mole: 1.0
ChimeraX-Morph: 1.0.2
ChimeraX-MouseModes: 1.2
ChimeraX-Movie: 1.0
ChimeraX-MutationScores: 1.0
ChimeraX-Neuron: 1.0
ChimeraX-Nifti: 1.2
ChimeraX-NMRSTAR: 1.0.2
ChimeraX-NRRD: 1.2
ChimeraX-Nucleotides: 2.0.3
ChimeraX-OpenCommand: 1.14.1
ChimeraX-OrthoPick: 1.0.1
ChimeraX-PDB: 2.7.10
ChimeraX-PDBBio: 1.0.1
ChimeraX-PDBLibrary: 1.0.4
ChimeraX-PDBMatrices: 1.0
ChimeraX-PickBlobs: 1.0.1
ChimeraX-Positions: 1.0
ChimeraX-PresetMgr: 1.1.3
ChimeraX-ProfileGrids: 1.1.3
ChimeraX-PubChem: 2.2
ChimeraX-QScore: 1.2
ChimeraX-ReadPbonds: 1.0.1
ChimeraX-Registration: 1.1.2
ChimeraX-RemoteControl: 1.0
ChimeraX-RenderByAttr: 1.6.3
ChimeraX-RenumberResidues: 1.1
ChimeraX-ResidueFit: 1.0.1
ChimeraX-RestServer: 1.3.1
ChimeraX-RNALayout: 1.0
ChimeraX-RotamerLibMgr: 4.0
ChimeraX-RotamerLibsDunbrack: 2.0
ChimeraX-RotamerLibsDynameomics: 2.0
ChimeraX-RotamerLibsRichardson: 2.0
ChimeraX-SaveCommand: 1.5.1
ChimeraX-SchemeMgr: 1.0
ChimeraX-SDF: 2.0.3
ChimeraX-Segger: 1.0
ChimeraX-Segment: 1.0.1
ChimeraX-Segmentations: 3.5.7
ChimeraX-SelInspector: 1.0
ChimeraX-SeqView: 2.17.1
ChimeraX-Shape: 1.1
ChimeraX-Shell: 1.0.1
ChimeraX-Shortcuts: 1.2.1
ChimeraX-ShowSequences: 1.0.3
ChimeraX-SideView: 1.0.1
ChimeraX-SimilarStructures: 1.0.1
ChimeraX-Smiles: 2.1.2
ChimeraX-SmoothLines: 1.0
ChimeraX-SpaceNavigator: 1.0
ChimeraX-StarMap: 1.2.15
ChimeraX-StdCommands: 1.19.1
ChimeraX-STL: 1.0.1
ChimeraX-Storm: 1.0
ChimeraX-StructMeasure: 1.2.1
ChimeraX-Struts: 1.0.1
ChimeraX-Surface: 1.0.1
ChimeraX-SwapAA: 2.0.1
ChimeraX-SwapRes: 2.5.2
ChimeraX-TapeMeasure: 1.0
ChimeraX-TaskManager: 1.0
ChimeraX-Test: 1.0
ChimeraX-Toolbar: 1.2.3
ChimeraX-ToolshedUtils: 1.2.4
ChimeraX-Topography: 1.0
ChimeraX-ToQuest: 1.0
ChimeraX-Tug: 1.0.1
ChimeraX-UI: 1.45.2
ChimeraX-Umap: 1.0
ChimeraX-uniprot: 2.3.1
ChimeraX-UnitCell: 1.0.1
ChimeraX-ViewDockX: 1.4.4
ChimeraX-VIPERdb: 1.0
ChimeraX-Vive: 1.1
ChimeraX-VolumeMenu: 1.0.1
ChimeraX-vrml: 1.0
ChimeraX-VTK: 1.0
ChimeraX-WavefrontOBJ: 1.0
ChimeraX-WebCam: 1.0.2
ChimeraX-WebServices: 1.1.5
ChimeraX-Zone: 1.0.1
colorama: 0.4.6
comm: 0.2.2
contourpy: 1.3.2
coverage: 7.10.0
cxservices: 1.2.3
cycler: 0.12.1
Cython: 3.0.12
debugpy: 1.8.15
decorator: 5.2.1
DiffFit: 0.7.0
docutils: 0.21.2
executing: 2.2.0
filelock: 3.18.0
fonttools: 4.59.0
fsspec: 2025.12.0
funcparserlib: 2.0.0a0
glfw: 2.9.0
grako: 3.16.5
h5py: 3.14.0
html2text: 2024.2.26
idna: 3.10
ihm: 2.2
imagecodecs: 2024.6.1
imagesize: 1.4.1
iniconfig: 2.1.0
ipykernel: 6.29.5
ipython: 8.26.0
ipywidgets: 8.1.7
jedi: 0.19.1
Jinja2: 3.1.6
joblib: 1.5.3
jupyter_client: 8.6.3
jupyter_core: 5.8.1
jupyterlab_widgets: 3.0.15
kiwisolver: 1.4.8
line_profiler: 4.2.0
lxml: 5.3.1
lz4: 4.3.2
MarkupSafe: 3.0.2
matplotlib: 3.10.1
matplotlib-inline: 0.1.7
mmh3: 2.5.1
mpmath: 1.3.0
mrcfile: 1.5.0
msgpack: 1.1.0
ndindex: 1.10.0
nest-asyncio: 1.6.0
netCDF4: 1.6.5
networkx: 3.3
nibabel: 5.2.0
nptyping: 2.5.0
numexpr: 2.11.0
numpy: 1.26.4
OpenMM: 8.2.0
openvr: 1.26.701
packaging: 24.2
pandas: 2.3.3
ParmEd: 4.2.2
parso: 0.8.4
pep517: 0.13.1
pexpect: 4.9.0
pickleshare: 0.7.5
pillow: 10.4.0
pip: 25.0.1
pkginfo: 1.11.1
platformdirs: 4.3.8
pluggy: 1.6.0
prompt_toolkit: 3.0.51
psutil: 7.0.0
ptyprocess: 0.7.0
pure_eval: 0.2.3
py-cpuinfo: 9.0.0
pycollada: 0.8
pydicom: 2.4.4
Pygments: 2.18.0
pynmrstar: 3.3.5
pynrrd: 1.0.0
PyOpenGL: 3.1.9
PyOpenGL-accelerate: 3.1.9
pyopenxr: 1.1.4501
pyparsing: 3.2.3
pyproject_hooks: 1.2.0
PyQt6-commercial: 6.8.1
PyQt6-Qt6: 6.8.2
PyQt6-WebEngine-commercial: 6.8.0
PyQt6-WebEngine-Qt6: 6.8.2
PyQt6_sip: 13.10.0
pyqtgraph: 0.14.0
pytest: 8.4.1
pytest-cov: 6.2.1
python-dateutil: 2.9.0.post0
pytz: 2025.2
pyzmq: 27.0.0
qtconsole: 5.5.2
QtPy: 2.4.3
qtshim: 1.1
RandomWords: 0.4.0
requests: 2.32.3
roman-numerals-py: 3.1.0
scikit-learn: 1.8.0
scipy: 1.14.0
setuptools: 78.1.0
sfftk-rw: 0.8.1
simplejson: 3.20.2
six: 1.16.0
snowballstemmer: 3.0.1
sortedcontainers: 2.4.0
soupsieve: 2.7
Sphinx: 8.2.3
sphinx-autodoc-typehints: 3.1.0
sphinxcontrib-applehelp: 2.0.0
sphinxcontrib-blockdiag: 3.0.0
sphinxcontrib-devhelp: 2.0.0
sphinxcontrib-htmlhelp: 2.1.0
sphinxcontrib-jsmath: 1.0.1
sphinxcontrib-qthelp: 2.0.0
sphinxcontrib-serializinghtml: 2.0.0
stack-data: 0.6.3
superqt: 0.7.1
sympy: 1.14.0
tables: 3.10.2
tcia_utils: 1.5.1
threadpoolctl: 3.6.0
tifffile: 2025.3.13
tinyarray: 1.2.4
torch: 2.2.1
tornado: 6.5.1
tqdm: 4.67.1
traitlets: 5.14.3
typing_extensions: 4.14.1
tzdata: 2025.2
urllib3: 2.5.0
wcwidth: 0.2.13
webcolors: 24.11.1
wheel: 0.45.1
wheel-filename: 1.4.2
widgetsnbextension: 4.0.14
Attachments (1)
Change History (5)
comment:1 by , 40 hours ago
| Component: | Unassigned → Graphics |
|---|---|
| Owner: | set to |
| Platform: | → all |
| Project: | → ChimeraX |
| Status: | new → assigned |
| Summary: | ChimeraX bug report submission → Looking Glass support |
comment:2 by , 38 hours ago
comment:3 by , 32 hours ago
Hi Tom, Thanks for the reply. You are certainly correct in that it's not really worth your time to develop this - I'm for sure the only person using it. I do wonder if the newer ones are better - I do think it's pretty nice, but I don't have an old one to compare. I'll try attaching an image here. [image: image.png] Certainly depth is not great, but I think that's just a fact of lenticular displays. Unfortunately that line seems to have broken my rendering method entirely - not sure why. I'm wondering if it's because the temp framebuffers are a different size from the main one and result in mismatched coordinates. But I am at the (past the) limits of my understanding here. I did figure out in the meantime that if I just change copy_from_framebuffer and copy_to_framebuffer to query the current GL viewport and use the x/y offset, the rendering of silhouettes and outlines works. Might just be how I have the quilt rendering setup - essentially I am just making one large framebuffer that holds all 48 views and dividing that into unique quilt positions. Anyways, I can report it's working and quite nicely now. Should anyone else ever pop up with one of these, feel free to send them my way! Best, Colin On Wed, Dec 17, 2025 at 1:18 PM ChimeraX <ChimeraX-bugs-admin@cgl.ucsf.edu> wrote: > > > > > > > > > >
comment:4 by , 32 hours ago
| Resolution: | → wontfix |
|---|---|
| Status: | assigned → closed |
Great! Glad you got it work. It is hard for me to figure it out without testing on an LG display. But now that I look more closely at the code with your new info I see that the temporary framebuffers made for outlines actually are not the size of the full rendering framebuffer, they are just the size of the viewport. So my suggested solution was certainly wrong, and your fix of blitting the smaller outline buffer to the right place in the full render buffer makes sense.
The copy_from_framebuffer() and copy_to_framebuffer() routines were not intended to take viewports into account, they are intended to act on full framebuffers, and if the framebuffers have different sizes that should be an error. I'm not going to change them to use the viewport because that may break other code, although I think nothing other than LookingGlass is using the viewport rendering or we would have seen the same selection outline bug since that is not implemented correctly for handling viewports.

Looking at the code I believe the OpenGL blit is not the problem. The trouble I believe is that the Outline and Silhouette classes in chimerax/graphics/opengl.py create a new framebuffer that holds the outline info and that new framebuffer does not use the viewport of the previous framebuffer. It might be that adding one line of code where the Outline framebuffer viewport gets set to the rendering framebuffer viewport will fix the issue. Here is the line that I think needs to be added for the selection outlines, in site-packages/chimerax/graphics/opengl.py in your distribution in the start_rendering_outline() routine, at line 1981 in current code,
Change this code
to
where the line
was added. A similar change to the start_silhouette_drawing() routine would be needed for silhouette edges.
I'll let you try this. Although I have an old LookingGlass from about 5 years ago I have not used it in 5 years and this is such an obscure device you are probably the only user. Honestly the resolution was so poor on the device and the poor interaction of the mouse with the display makes this just a curiosity in my opinion. The newer Sony and Asus (and I think Samsung) eye-tracked glasses-free 3D displays I think have much better potential to be useful (I made the mouse work on those displays). But even those displays I think are a technology not ready for ChimeraX use.