Opened 42 hours ago

Closed 32 hours ago

#19523 closed defect (wontfix)

Looking Glass support

Reported by: colin.gauvin@… 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)

image.png (3.5 MB ) - added by colin.gauvin@… 32 hours ago.
Added by email2trac

Change History (5)

comment:1 by Eric Pettersen, 40 hours ago

Component: UnassignedGraphics
Owner: set to Tom Goddard
Platform: all
Project: ChimeraX
Status: newassigned
Summary: ChimeraX bug report submissionLooking Glass support

comment:2 by Tom Goddard, 38 hours ago

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

def start_rendering_outline(self):

Must call set_outline_depth() before invoking this routine.
r = self._render
fb = r.current_framebuffer()
mfb = self._mask_framebuffer()
r.push_framebuffer(mfb)
...

to

def start_rendering_outline(self):

Must call set_outline_depth() before invoking this routine.
r = self._render
fb = r.current_framebuffer()
mfb = self._mask_framebuffer()
mfb.viewport = fb.viewport
r.push_framebuffer(mfb)
...

where the line

mfb.viewport = fb.viewport

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.

comment:3 by colin.gauvin@…, 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:

>
>
>
>
>
>
>
>
>
>

Added by email2trac

by colin.gauvin@…, 32 hours ago

Attachment: image.png added

Added by email2trac

comment:4 by Tom Goddard, 32 hours ago

Resolution: wontfix
Status: assignedclosed

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.

Note: See TracTickets for help on using tickets.