Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scrolling waveform using SceneGraph in QML #13470

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

acolombier
Copy link
Member

@acolombier acolombier commented Jul 14, 2024

This PR is a rebase of @m0dB's qml_scrolling_waveform on the latest main

The waveform rendering approach should provided better result in the long run and should integrate with the new allshader approach.

Currently, the waveform rendering logic which happen in QmlWaveformDisplay::updatePaintNode is duplicated (or rather strongly inspired) from the RGB allshader rendering. A "definition of ready" for this PR would be to have some kind of compatibility layer/integration to reuse the rendering logic define in allshader and should support at least one waveform type logic (e.g RGB)

Depends on:

TODO:

  • Crash on shutdown
  • Waveform zoom init

@acolombier acolombier changed the title scrolling qml waveformdisplay working Scrolling waveform using SceneGraph in QML Jul 14, 2024
Copy link

This PR is marked as stale because it has been open 90 days with no activity.

@github-actions github-actions bot added stale Stale issues that haven't been updated for a long time. and removed stale Stale issues that haven't been updated for a long time. labels Oct 13, 2024
@acolombier
Copy link
Member Author

Note that this is still being actively worked on with @m0dB and myself!

@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch 3 times, most recently from d16b1dc to 23f331f Compare October 22, 2024 22:49
@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch 2 times, most recently from fe570b1 to 3d9deed Compare November 9, 2024 20:50
@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch 4 times, most recently from 317256a to 8c71da3 Compare November 23, 2024 01:14
@Holzhaus
Copy link
Member

I see this when trying to build it:

CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


endoftrack.frag -> endoftrack.frag.qsb exposed as :/shaders/rendergraph/endoftrack.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


endoftrack.vert -> endoftrack.vert.qsb exposed as :/shaders/rendergraph/endoftrack.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


pattern.frag -> pattern.frag.qsb exposed as :/shaders/rendergraph/pattern.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


pattern.vert -> pattern.vert.qsb exposed as :/shaders/rendergraph/pattern.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgb.frag -> rgb.frag.qsb exposed as :/shaders/rendergraph/rgb.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgb.vert -> rgb.vert.qsb exposed as :/shaders/rendergraph/rgb.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgba.frag -> rgba.frag.qsb exposed as :/shaders/rendergraph/rgba.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgba.vert -> rgba.vert.qsb exposed as :/shaders/rendergraph/rgba.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


texture.frag -> texture.frag.qsb exposed as :/shaders/rendergraph/texture.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


texture.vert -> texture.vert.qsb exposed as :/shaders/rendergraph/texture.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


unicolor.frag -> unicolor.frag.qsb exposed as :/shaders/rendergraph/unicolor.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2138 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


unicolor.vert -> unicolor.vert.qsb exposed as :/shaders/rendergraph/unicolor.vert.qsb
endoftrack.frag -> endoftrack.frag.qsb exposed as :/shaders/rendergraph/endoftrack.frag.qsb
endoftrack.vert -> endoftrack.vert.qsb exposed as :/shaders/rendergraph/endoftrack.vert.qsb
pattern.frag -> pattern.frag.qsb exposed as :/shaders/rendergraph/pattern.frag.qsb
pattern.vert -> pattern.vert.qsb exposed as :/shaders/rendergraph/pattern.vert.qsb
rgb.frag -> rgb.frag.qsb exposed as :/shaders/rendergraph/rgb.frag.qsb
rgb.vert -> rgb.vert.qsb exposed as :/shaders/rendergraph/rgb.vert.qsb
rgba.frag -> rgba.frag.qsb exposed as :/shaders/rendergraph/rgba.frag.qsb
rgba.vert -> rgba.vert.qsb exposed as :/shaders/rendergraph/rgba.vert.qsb
texture.frag -> texture.frag.qsb exposed as :/shaders/rendergraph/texture.frag.qsb
texture.vert -> texture.vert.qsb exposed as :/shaders/rendergraph/texture.vert.qsb
unicolor.frag -> unicolor.frag.qsb exposed as :/shaders/rendergraph/unicolor.frag.qsb
unicolor.vert -> unicolor.vert.qsb exposed as :/shaders/rendergraph/unicolor.vert.qsb
-- Adding gl shaders to rendergraph_gl
-- Configuring incomplete, errors occurred!
make: *** [Makefile:25705: cmake_check_build_system] Error 1

@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch from 8c71da3 to a59fe88 Compare December 1, 2024 22:19
@Holzhaus
Copy link
Member

Unfortunately, there are merge conflicts now.

@Holzhaus
Copy link
Member

FYI, the PR is still broken :(

CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


endoftrack.frag -> endoftrack.frag.qsb exposed as :/shaders/rendergraph/endoftrack.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


endoftrack.vert -> endoftrack.vert.qsb exposed as :/shaders/rendergraph/endoftrack.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


pattern.frag -> pattern.frag.qsb exposed as :/shaders/rendergraph/pattern.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


pattern.vert -> pattern.vert.qsb exposed as :/shaders/rendergraph/pattern.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgb.frag -> rgb.frag.qsb exposed as :/shaders/rendergraph/rgb.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgb.vert -> rgb.vert.qsb exposed as :/shaders/rendergraph/rgb.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgba.frag -> rgba.frag.qsb exposed as :/shaders/rendergraph/rgba.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


rgba.vert -> rgba.vert.qsb exposed as :/shaders/rendergraph/rgba.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


texture.frag -> texture.frag.qsb exposed as :/shaders/rendergraph/texture.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


texture.vert -> texture.vert.qsb exposed as :/shaders/rendergraph/texture.vert.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)


unicolor.frag -> unicolor.frag.qsb exposed as :/shaders/rendergraph/unicolor.frag.qsb
CMake Error at /usr/lib/cmake/Qt6Core/Qt6CoreMacros.cmake:2127 (get_target_property):
  get_target_property() called with non-existent target "rendergraph_sg".
Call Stack (most recent call first):
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:103 (_qt_internal_expose_source_file_to_ide)
  /usr/lib/cmake/Qt6ShaderToolsTools/Qt6ShaderToolsMacros.cmake:354 (_qt_internal_add_shaders_impl)
  res/shaders/rendergraph/CMakeLists.txt:16 (qt6_add_shaders)

@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch from d424088 to 141a5e2 Compare January 19, 2025 02:30
@acolombier
Copy link
Member Author

@Holzhaus this should now be ready for some very early testing!

@acolombier acolombier mentioned this pull request Jan 19, 2025
3 tasks
@JoergAtGithub
Copy link
Member

@m0dB @acolombier I wonder if a clearer seperation between QML and QtQuick would be of benefit here, as we could use a QQuickWindow instead of the QOpenGLWindow in the existing QWidget GUI: https://doc.qt.io/qt-6/qtquick-embeddedinwidgets-example.html
Wouldn't this provide us the use of native graphic APIs, instead of OpenGL - for all builds with recent Qt? And we are just in the process to update the VCPKG buildenv for macOS and Windows builds to Qt6.8.1.

@Holzhaus
Copy link
Member

Holzhaus commented Jan 20, 2025

Hi, configuring works now. I'm getting the following build error though:

[ 25%] Building CXX object CMakeFiles/mixxx-qml-lib.dir/src/qml/qmlstemsmodel.cpp.o
In file included from src/rendergraph/scenegraph/../common/rendergraph/assert.h:4,
                 from src/rendergraph/scenegraph/../common/rendergraph/material.h:6,
                 from src/rendergraph/scenegraph/../common/rendergraph/geometrynode.h:5,
                 from src/waveform/renderers/allshader/waveformrendermark.h:5,
                 from src/waveform/renderers/allshader/waveformrendermark.cpp:1:
src/waveform/renderers/allshader/waveformrendermark.cpp: In member function ‘void {anonymous}::WaveformMarkNode::update(float, float, float)’:
src/waveform/renderers/allshader/waveformrendermark.cpp:50:35: error: ‘RoundToPixel’ was not declared in this scope
   50 |         DEBUG_ASSERT(std::abs(x - RoundToPixel(devicePixelRatio)(x)) < epsilon);
      |                                   ^~~~~~~~~~~~
src/rendergraph/scenegraph/../common/rendergraph/../../../util/assert.h:59:32: note: in definition of macro ‘DEBUG_ASSERT’
   59 |         if (!static_cast<bool>(cond)) [[unlikely]] {                        \
      |                                ^~~~
src/waveform/renderers/allshader/waveformrendermark.cpp:51:35: error: ‘RoundToPixel’ was not declared in this scope
   51 |         DEBUG_ASSERT(std::abs(y - RoundToPixel(devicePixelRatio)(y)) < epsilon);
      |                                   ^~~~~~~~~~~~
src/rendergraph/scenegraph/../common/rendergraph/../../../util/assert.h:59:32: note: in definition of macro ‘DEBUG_ASSERT’
   59 |         if (!static_cast<bool>(cond)) [[unlikely]] {                        \
      |                                ^~~~
make[2]: *** [CMakeFiles/mixxx-qml-lib.dir/build.make:666: CMakeFiles/mixxx-qml-lib.dir/src/waveform/renderers/allshader/waveformrendermark.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [CMakeFiles/Makefile2:803: CMakeFiles/mixxx-qml-lib.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

@m0dB
Copy link
Contributor

m0dB commented Jan 21, 2025

I fixed this in the rg-wr-… PR, so if @acolombier merges the latest commits of my branches it will be fixed here too.

@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch from bb5c4f8 to 7e39d2f Compare February 2, 2025 23:13
@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch 5 times, most recently from 3af3679 to 4b99a8b Compare February 3, 2025 12:57
@acolombier
Copy link
Member Author

acolombier commented Feb 3, 2025

@Swiftb0y I assume you are currently looking into this - you reacted with the 👁️ on the PR - thank you!

There is still a lot to work on, but I'd been keen to hear your feedback on how to propagate properties for each renderers.

Currently, there is two clashing design, and I will need to unify it into one, but I'm having a hard time to take a decision.

  • Design 1: The renderer gets initialised (the setup method) and holds properties statically. This means that the LegacySkinParser will need to extract these property from the XMLs and inject it, in the same way that the QML proxy will do it with its property. Pro: contained, no lifecycle issue, easy to maintain. Con: No dynamic propagation - property update requires to rebuild the renderer stack (slow!)
  • Design 2: The renderer gets initialised with a reference to the a "provider", which holds properties. This means that the LegacySkinParser (or some object in between) will need to extract and hold these properties from the XMLs and will provide them ondemand over few getters, in the same way that the QML proxy will do it with its property. Pro: generic interface, dynamic update, quick feedback. Con: lifecycle (no parenting between QML object and renderer, possible hierarchy on Legacy)

It feels like there is no perfect answers. Also QML is still quite unstable (note the number of changes made in this PR to consolidate it - happy to move some in other PR btw) so I don't think we should overly concern on stability yet with QML, as long as we don't introduce risks on legacy.

Edit: keen to hear everyone feedback! I just meant to tag Niko to make sure you don't spend too much time writing a thorough review yet :D

@Swiftb0y
Copy link
Member

Swiftb0y commented Feb 3, 2025

I assume you are currently looking into this - you reacted with the 👁️ on the PR - thank you!

I'm actually not atm, I'm sorry my reaction gave that impression. I'll try to once the preliminary PRs have been merged.

I have not looked enough into this PR to even understand the problem you're describing, so I can't provide any opinion.

@Holzhaus
Copy link
Member

Holzhaus commented Feb 3, 2025

It gets much further in the build now, but now it fails with:

In file included from src/waveform/renderers/allshader/waveformrenderersignalbase.h:8,
                 from src/waveform/renderers/allshader/waveformrendererrgb.h:5,
                 from src/waveform/renderers/allshader/waveformrendererrgb.cpp:1:
src/waveform/renderers/waveformrenderersignalbase.h:21:16: error: ‘virtual void WaveformRendererSignalBase::setup(const QDomNode&, const SkinContext&)’ was hidden [-Werror=overloaded-virtual=]
   21 |   virtual void setup(const QDomNode& node, const SkinContext& context);
      |                ^~~~~
src/waveform/renderers/allshader/waveformrendererrgb.h:24:10: note:   by ‘void allshader_gl::WaveformRendererRGB::setup(const QColor&, const QColor&, const QColor&, const QColor&)’
   24 |     void setup(const QColor& axesColor,
      |          ^~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/mixxx-lib.dir/build.make:8731: CMakeFiles/mixxx-lib.dir/src/waveform/renderers/allshader/waveformrendererrgb.cpp.o] Error 1
make[2]: *** Waiting for unfinished jobs....
In file included from src/waveform/renderers/allshader/waveformrenderersignalbase.h:8,
                 from src/waveform/widgets/allshader/waveformwidget.h:5,
                 from src/waveform/widgets/allshader/waveformwidget.cpp:2:
src/waveform/renderers/waveformrenderersignalbase.h:21:16: error: ‘virtual void WaveformRendererSignalBase::setup(const QDomNode&, const SkinContext&)’ was hidden [-Werror=overloaded-virtual=]
   21 |   virtual void setup(const QDomNode& node, const SkinContext& context);
      |                ^~~~~
In file included from src/waveform/widgets/allshader/waveformwidget.cpp:13:
src/waveform/renderers/allshader/waveformrendererrgb.h:24:10: note:   by ‘void allshader_gl::WaveformRendererRGB::setup(const QColor&, const QColor&, const QColor&, const QColor&)’
   24 |     void setup(const QColor& axesColor,
      |          ^~~~~
cc1plus: all warnings being treated as errors
make[2]: *** [CMakeFiles/mixxx-lib.dir/build.make:8815: CMakeFiles/mixxx-lib.dir/src/waveform/widgets/allshader/waveformwidget.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:388: CMakeFiles/mixxx-lib.dir/all] Error 2
make: *** [Makefile:166: all] Error 2

@Holzhaus
Copy link
Member

Holzhaus commented Feb 3, 2025

Ok, I applied to following patch to work around the build error:

diff --git a/src/qml/qmlwaveformrenderer.cpp b/src/qml/qmlwaveformrenderer.cpp
index 3095243945..1d368ebfd4 100644
--- a/src/qml/qmlwaveformrenderer.cpp
+++ b/src/qml/qmlwaveformrenderer.cpp
@@ -89,7 +89,7 @@ QmlWaveformRendererFactory::Renderer QmlWaveformRendererPreroll::create(
 QmlWaveformRendererFactory::Renderer QmlWaveformRendererRGB::create(
         WaveformWidgetRenderer* waveformWidget) const {
     auto* renderer = new WaveformRendererRGB(waveformWidget, m_position, m_options, this);
-    renderer->setup(
+    renderer->setupColors(
             m_axesColor,
             m_lowColor,
             m_midColor,
diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.cpp b/src/waveform/renderers/allshader/waveformrendererrgb.cpp
index 40b92d28e5..409232a66a 100644
--- a/src/waveform/renderers/allshader/waveformrendererrgb.cpp
+++ b/src/waveform/renderers/allshader/waveformrendererrgb.cpp
@@ -29,7 +29,7 @@ WaveformRendererRGB::WaveformRendererRGB(WaveformWidgetRenderer* waveformWidget,
     setUsePreprocess(true);
 }

-void WaveformRendererRGB::setup(const QColor& axesColor,
+void WaveformRendererRGB::setupColors(const QColor& axesColor,
         const QColor& lowColor,
         const QColor& midColor,
         const QColor& highColor) {
diff --git a/src/waveform/renderers/allshader/waveformrendererrgb.h b/src/waveform/renderers/allshader/waveformrendererrgb.h
index acd06ec50f..47833edd0d 100644
--- a/src/waveform/renderers/allshader/waveformrendererrgb.h
+++ b/src/waveform/renderers/allshader/waveformrendererrgb.h
@@ -21,7 +21,7 @@ class allshader::WaveformRendererRGB final
     // Pure virtual from WaveformRendererSignalBase, not used
     void onSetup(const QDomNode& node) override;

-    void setup(const QColor& axesColor,
+    void setupColors(const QColor& axesColor,
             const QColor& lowColor,
             const QColor& midColor,
             const QColor& highColor);

Now it crashes with a segfault:

Core was generated by `./mixxx --qml'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  ControlDoublePrivate::getKey (this=<optimized out>) at /home/jan/Projects/mixxx/src/control/control.h:143
143	        return m_key;
[Current thread is 1 (Thread 0x7ed96b7fe6c0 (LWP 176578))]
>>> bt
#0  ControlDoublePrivate::getKey (this=<optimized out>) at /home/jan/Projects/mixxx/src/control/control.h:143
#1  ControlProxy::getKey (this=0x0) at /home/jan/Projects/mixxx/src/control/controlproxy.cpp:25
#2  0x000062b631380b8d in allshader_sg::WaveformRendererStem::init (this=0x7ed95c366280)
    at /home/jan/Projects/mixxx/src/waveform/renderers/allshader/waveformrendererstem.cpp:35
#3  0x000062b630e2ec04 in WaveformWidgetRenderer::init (this=this@entry=0x62b65a1149c8)
    at /usr/include/qt6/QtCore/qarraydatapointer.h:119
#4  0x000062b63135c21e in mixxx::qml::QmlWaveformDisplay::updatePaintNode
    (this=0x62b65a1149a0, node=<optimized out>) at /home/jan/Projects/mixxx/src/qml/qmlwaveformdisplay.cpp:132
#5  0x00007edac7a6e984 in QQuickWindowPrivate::updateDirtyNode (this=0x62b661806220, item=0x62b65a1149a0)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/items/qquickwindow.cpp:2271
#6  0x00007edac7a61e1d in QQuickWindowPrivate::updateDirtyNodes (this=this@entry=0x62b661806220)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/items/qquickwindow.cpp:2013
#7  0x00007edac7a629c6 in QQuickWindowPrivate::syncSceneGraph (this=<optimized out>)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/items/qquickwindow.cpp:566
#8  0x00007edac7c465db in QSGRenderThread::sync (this=<optimized out>, inExpose=true)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/scenegraph/qsgthreadedrenderloop.cpp:553
#9  QSGRenderThread::syncAndRender (this=<optimized out>)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/scenegraph/qsgthreadedrenderloop.cpp:716
#10 QSGRenderThread::run (this=0x62b664890830)
    at /usr/src/debug/qt6-declarative/qtdeclarative/src/quick/scenegraph/qsgthreadedrenderloop.cpp:975
#11 0x00007edac22d831b in operator() (__closure=<optimized out>)
    at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:375
#12 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=<optimized out>)
    at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:311
#13 QThreadPrivate::start (arg=0x62b664890830)
    at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:339
#14 0x00007edac1aa32ce in ??? () at /usr/lib/libc.so.6
#15 0x00007edac1b2829c in ??? () at /usr/lib/libc.so.6

@Holzhaus
Copy link
Member

Holzhaus commented Feb 3, 2025

This fixes the crash:

diff --git a/src/waveform/renderers/allshader/waveformrendererstem.cpp b/src/waveform/renderers/allshader/waveformrendererstem.cpp
index 2736d498b1..c39b8bb48b 100644
--- a/src/waveform/renderers/allshader/waveformrendererstem.cpp
+++ b/src/waveform/renderers/allshader/waveformrendererstem.cpp
@@ -32,6 +32,7 @@ void WaveformRendererStem::onSetup(const QDomNode&) {
 }

 bool WaveformRendererStem::init() {
+    WaveformRendererSignalBase::init();
     auto group = m_pEQEnabled->getKey().group;
     for (int stemIdx = 0; stemIdx < mixxx::kMaxSupportedStems; stemIdx++) {
         QString stemGroup = EngineDeck::getGroupForStem(group, stemIdx);

@Holzhaus
Copy link
Member

Holzhaus commented Feb 3, 2025

@acolombier Kudos, looks great! And the annoying flickering that we saw with the previous waveforms is also gone.

Some minor issues I found:

  1. Something is wrong with the clipping - if i turn up the Hi/Mids using the EQ, the waveforms overlap the rest of the UI.
  2. The waveform marks wiggle around a bit when scratching.
Screencast.From.2025-02-03.22-50-43.mp4

@acolombier acolombier force-pushed the feat/qml-scrolling-waveform-with-sg branch from ceaab87 to 02a2b3d Compare February 4, 2025 01:11
@acolombier
Copy link
Member Author

acolombier commented Feb 4, 2025

Thanks for you feedback @Holzhaus! Kudos to @m0dB to make that possible with the rendergraph!

It gets much further in the build now, but now it fails with:

Yes, this is due to some warning related to shadowing the base class method and your compiler seem to treat warning as error (cc1plus: all warnings being treated as errors)
This shadowing is part of the incomplete implementation of the design 1 (see comment), so I'll look at improving the code if we decide to keep this approach. Any thoughts on which designs sound best in your opinion?

Some minor issues I found:

1. Something is wrong with the clipping - if i turn up the Hi/Mids using the EQ, the waveforms overlap the rest of the UI.

I'm actually still not completely sure how to use the scene graph clipping - Any pointer or fix for this @m0dB ?

2. The waveform marks wiggle around a bit when scratching.

Indeed, I can also reproduce it locally - it feels like the renderer are not synched for some reason (beats are responding faster than signal, itself responding faster than marker). I must say here again, I have no idea where to start and could definitely use some help @m0dB 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants