HiDPI issues with Cubase 10.0.40 / Windows 10

Hi,

I’ve implemented the VST3 IPlugViewContentScaleSupport interface to support automatic HiDPI scaling in Windows compatible hosts.
It works fine in all hosts we found had support for this interface:

  • Presonus Studio One
  • Bitwig Studio
  • FL Studio
  • Tracktion Waveform
  • Steinberg Wavelab
  • editorhost from the VST3 sdk sources

However in Cubase 10 with HiDPI mode activated, the UI pixels look like they’re bieng upscaled by the OS / UI code used in Cubase.


The plug-in is built using our internal framework, which uses OpenGL to draw the UI.
I’ve dumped the contents of the GL framebuffer to try and understand what’s going on:

As you can see internally the pixels are drawn correctly (the black part corresponds to the part of the window that isn’t displayed / invalidated / redrawn).

What’s extremly strange if that if I run the debug version of the plug-in, clicking on the plug-in window bar to move it after a few seconds
triggers some change in Cubase and the UI is redrawn correctly :confused:

The VST2 versions gets garbled, although there is no internal DPI scaling involved:


This is what it’s supposed to look like:

Any help with this would be greatly appreciated !

Best,
Lorcan

NB: For reference here is the log of the UI creation:

EditorVST3::ctor() name: Superchord
IEditorVST3::get_size() null component, using default: 890x406
IEditorVST3::on_size(890x406 @ (0, 0)) null component
IEditorVST3::setFrame(present)
EditorVST3::attached() parent: 00000000000a0e80 - HWND, creating editor
IComponent::init(Superchord) size: 890.0x406.0
Window::create() registering class 'lmdsp.superchord.64.class'
Window::create() class: 'lmdsp.superchord.64.class' (sub) start
Window::create() creating sub window class: 'lmdsp.superchord.64.class', size: 890x406 -> client size: 890x406, parent: 'Plugin View'
IComponent::on_window_maximize(Superchord: no)
IComponent::on_window_resized() name: Superchord[1], root: 0x0 -> 890x406, backing: 1.00, os: 890x406
Window::create() dpi mode: monitor, ratio: 1.50, parent: 1.50, size: 890x406 -> client: 890x406
Window::create() class: 'lmdsp.superchord.64.class', HNWD: 0x0000000000020ff6, parent: 0x00000000000a0e80 ('Plugin View') complete
EditorVST3::attached() scale not dirty
IEditorVST3::on_size(890x406 @ (0, 0))
EditorVST3::attached() host resize to -> 890x406
IComponent::on_backing_scale() 1.00 -> 2.00
IComponent::on_window_maximize(Superchord: no)
IComponent::on_window_resized() name: Superchord[1], root: 890x406 -> 890x406, backing: 2.00, os: 1780x812
IEditorVST3::on_size(1780x812 @ (0, 0))
IEditorVST3::setContentScaleFactor() 1.00x -> 2.00x, target size: 1780x812 -> ok
IEditorVST3::on_size(1780x812 @ (0, 0))
IEditorVST3::on_size(1780x812 @ (0, 0))
EngineGL::initialize_gl() dsa: arb, ext, program uniform
IEngine::set_scale() 1.00x -> 2.00x
Canvas[1]::set_size() 0x0 -> 890x406, scale: 2.00x
EngineGL::start_draw() size: 0x0 -> 1780x812, scaling: 2.00x
FrameBuffer::set_size() 0x0 -> 1780x812
Bitmap::write() 'screenshot.orange.png' written to 'C:\Users\lorca\Desktop\screenshots\superchord\screenshot.orange.png'
IEditorVST3::setFrame(null)
EditorVST3::removed() about to close and delete editor
Window::on_destroy('lmdsp.superchord.64.class')
EditorVST3::~dtor() name: Superchord