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
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