JRepin

joined 2 years ago
MODERATOR OF
 

Welcome to the "Building a Simple Engine" tutorial series! This series marks a transition from the foundational Vulkan concepts covered in the previous chapters to a more structured approach focused on building a reusable rendering engine.

A New Learning Approach

While the previous tutorial series focused on introducing individual Vulkan concepts step by step, this series takes a different approach:

This series targets readers who have completed the Vulkan Tutorial and feel comfortable with the fundamentals. We’ll emphasize architectural concepts and design patterns over exhaustive API permutations, so you develop an engine mindset rather than a collection of snippets. Expect to do more independent work: fill in smaller gaps, experiment, and lean on the Vulkan Guide, Samples, and Specification as primary references. If a topic feels too advanced, revisit the original tutorial and return when ready.

What to Expect

The "Building a Simple Engine" series is designed as a starting point for your journey into engine development, not a finishing point. We’ll cover:

  1. Engine Architecture - How to structure your code for flexibility, maintainability, and extensibility.

  2. Resource Management - More sophisticated approaches to handling models, textures, and other assets.

  3. Rendering Techniques - Implementation of modern rendering approaches within an engine framework.

  4. Performance Considerations - How to design your engine with performance in mind.

  5. Publication Considerations - How to prepare your application for distribution in a professional environment, including packaging, deployment, and platform-specific considerations.

Throughout this series, we encourage you to experiment, extend the provided examples, and even challenge some of our design decisions. The best way to learn engine development is by doing, and sometimes by making (and learning from) mistakes.

Throughout our engine implementation, we’re using vk::raii dynamic rendering and C20 modules. The vk::raii namespace provides Resource Acquisition Is Initialization (RAII) wrappers for Vulkan objects, which helps with resource management and makes the code cleaner. Dynamic rendering simplifies the rendering process by eliminating the need for explicit render passes and framebuffers. C20 modules improve code organization, compilation times, and encapsulation compared to traditional header files.

 

This is the 1.6 release that is API and ABI compatible with previous 1.4.x releases. This release contains some of the bigger changes that happened since the 1.4 release last year, including:

  • An LDAC decoder was added for bluetooth.
  • SpanDSP for bluetooth packet loss concealment.
  • Safe parsing and building of PODs in shared memory.
  • Added support for metadata features. This is used to signal that the sync_timeline metadata supports the RELEASE operation.
  • Node commands and events can contain extra user data.
  • Support for more compressed format helper functions to create and parse formats.
  • Support for compile time max channels. The max channels was increased to 128.
  • Support for audio channel layouts was added. This makes it possible to set "audio.layout" = "5.1" instead of the more verbose audio.position = [ FL, FR, FC, LFE, SL, SR ]
  • Support for Capability Params was added. This can be used to negotiate capabilities on a link before format and buffer negotiation takes place.
  • More HDR colortypes are added.
  • Loops now have locking with priority inversion. Most code was adapted to use the faster locks instead of epoll/eventfd to update shared state.
  • Channel position are parsed from EDID data.
  • Channel maps are now set on ALSA.
  • The resampler now supports configurable window functions such as blackman and kaiser windows. The phases are now also calculated with fixed point math, which makes it more accurate.
  • Many bluetooth updates and improvements.
  • The filter-graph has an ffmpeg and ONNX plugin. The ffmpeg plugin can run an audio AVFilterGraph. The ONNX plugin can run some models such as the silero VAD.
  • Many AVB updates. Work is ongoing to merge the Milan protocol.
  • Support for v0 clients was removed.
  • The jack-tunnel module can now autoconnect ports.
  • ROC support multitrack layouts now.
  • Many RTP updates.
  • rlimits can now be set in the config file.
  • Thread reset on fork can now be configured. JACK clients expect this to be disabled.
  • node.exclusive is now enforced.
  • node.reliable enables reliable transport.
  • pw-cat supports sysex and midiclip as well as some more uncompressed formats. Options were added to set the container and codec formats as well as list the supported containers, codecs, layouts and channel names.
  • Documentation updates.
32
submitted 1 week ago* (last edited 1 week ago) by JRepin@lemmy.ml to c/technology@lemmy.ml
 

cross-posted from: https://lemmy.ml/post/43288310

In KDE Plasma 6.6 Spectacle can read texts from screenshots, a new on-screen keybord is available for testing, a first-time wizard was added, current theme can be saved as a new global theme, emoji selector got a new easier skin tone selection, you can now connect to a Wi-Fi network via a QR code, application sound volume can be changed by scrolling over a taskbar button via mouse, and there is much more.

125
submitted 1 week ago* (last edited 1 week ago) by JRepin@lemmy.ml to c/opensource@lemmy.ml
 

cross-posted from: https://lemmy.ml/post/43288310

In KDE Plasma 6.6 Spectacle can read texts from screenshots, a new on-screen keybord is available for testing, a first-time wizard was added, current theme can be saved as a new global theme, emoji selector got a new easier skin tone selection, you can now connect to a Wi-Fi network via a QR code, application sound volume can be changed by scrolling over a taskbar button via mouse, and there is much more.

 

cross-posted from: https://lemmy.ml/post/43288310

In KDE Plasma 6.6 Spectacle can read texts from screenshots, a new on-screen keybord is available for testing, a first-time wizzard was added, current theme can be saved as a new global theme, emoji selector got a new easier skin tone selection, you can now connect to a Wi-Fi network via a QR code, application sound volume can be changed by scrolling over a task bur button via mouse, and there is much more.

48
submitted 1 week ago* (last edited 1 week ago) by JRepin@lemmy.ml to c/kde@lemmy.ml
 

In KDE Plasma 6.6 Spectacle can read texts from screenshots, a new on-screen keybord is available for testing, a first-time wizard was added, current theme can be saved as a new global theme, emoji selector got a new easier skin tone selection, you can now connect to a Wi-Fi network via a QR code, application sound volume can be changed by scrolling over a taskbar button via mouse, and there is much more.

 

SpacemiT Key Stone K3 series chips adopt RISC-V isomorphic fusion computing technology, integrating SpacemiT's self-developed 8 high-performance computing cores X100 and 8 ultra-wide parallel computing AI cores A100, providing 130 KDMIPS general computing power and 60TOPS general AI computing power, and can run 30 billion parameter large models smoothly.

K3 series chips are mainly used in AI computers, intelligent robots, personal intelligent computing servers, edge intelligent computing servers, large model inference machines and other fields.

 

cross-posted from: https://lemmy.ml/post/42248941

With the stability gained over the past five releases, the engine has matured enough to enter a new development phase. Godot 4.6 kicks off a period of polish, quality-of-life improvements, tighter integration of industry-standards, and doubled-down effort on performance optimization.

The result: a release that puts you and your workflow first. The new editor theme lets your projects take center stage, while dozens of improvements across the board reduce friction and speed up everyday development. Every aspect, from loading assets to editing, debugging, exporting, and testing, has received some love to keep you focused on creating and minimize the time you spend wrestling with UI, or fiddling with external tools and plugins.

 

With the stability gained over the past five releases, the engine has matured enough to enter a new development phase. Godot 4.6 kicks off a period of polish, quality-of-life improvements, tighter integration of industry-standards, and doubled-down effort on performance optimization.

The result: a release that puts you and your workflow first. The new editor theme lets your projects take center stage, while dozens of improvements across the board reduce friction and speed up everyday development. Every aspect, from loading assets to editing, debugging, exporting, and testing, has received some love to keep you focused on creating and minimize the time you spend wrestling with UI, or fiddling with external tools and plugins.

 

cross-posted from: https://lemmy.ml/post/42242801

Major new features:

  • The ISO C23 free_sized, free_aligned_sized, memset_explicit, and memalignment functions have been added.

  • As specified in ISO C23, the assert macro is defined to take variable arguments to support expressions with a comma inside a compound literal initializer not surrounded by parentheses.

  • For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr, strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers into their input arrays now have definitions as macros that return a pointer to a const-qualified type when the input argument is a pointer to a const-qualified type.

  • The ISO C23 typedef names long_double_t, _Float32_t, _Float64_t, and (on platforms supporting _Float128) _Float128_t, introduced in TS 18661-3:2015, have been added to <math.h>.

  • The ISO C23 optional time bases TIME_MONOTONIC, TIME_ACTIVE, and TIME_THREAD_ACTIVE have been added.

  • On Linux, the mseal function has been added. It allows for sealing memory mappings to prevent further changes during process execution, such as changes to protection permissions, unmapping, relocation to another location, or shrinking the size.

  • Additional optimized and correctly rounded mathematical functions have been imported from the CORE-MATH project, in particular acosh, asinh, atanh, erf, erfc, lgamma, and tgamma.

  • Optimized implementations for fma, fmaf, remainder, remaindef, frexpf, frexp, frexpl (binary128), and frexpl (intel96) have been added.

  • The SVID handling for acosf, acoshf, asinhf, atan2f, atanhf, coshf, fmodf, lgammaf/lgammaf_r, log10f, remainderf, sinhf, sqrtf, tgammaf, y0/j0, y1/j1, and yn/jn was moved to compat symbols, allowing improvements in performance.

  • Experimental support for building with clang has been added. It requires at least clang version 18, aarch64-linux-gnu or x86_64-linux-gnu targets, and a libgcc compatible runtime (including libgcc_s.so for pthread cancellation and backtrace runtime support).

  • On Linux, the openat2 function has been added. It is an extension of openat and provides a superset of its functionality. It is supported only in LFS mode and is a cancellable entrypoint.

  • On AArch64, support for 2MB transparent huge pages has been enabled by default in malloc (similar to setting glibc.malloc.hugetlb=1 tunable).

  • On AArch64 Linux targets supporting the Scalable Matrix Extension (SME), the clone() system call wrapper will disable the ZA state of the SME.

  • On AArch64 targets supporting the Branch Target Identification (BTI) extension, it is possible to enforce that all binaries in the process support BTI using the glibc.cpu.aarch64_bti tunable.

  • On AArch64 Linux targets supporting at least one of the branch protection extensions (e.g. Branch Target Identification or Guarded Control Stack), it is possible to use LD_DEBUG=security to make the dynamic linker show warning messages about loaded binaries that do not support the corresponding security feature.

  • On AArch64, vector variants of the new C23 exp2m1, exp10m1, log10p1, log2p1, and rsqrt routines have been added.

  • On RISC-V, an RVV-optimized implementation of memset has been added.

  • On x86, support for the Intel Nova Lake and Wildcat Lake processors has been added.

  • The test suite has seen significant improvements in particular around the scanf, strerror, strsignal functions and multithreaded testing.

  • Unicode support has been updated to Unicode 17.0.0.

  • The manual has been updated and modernized, in particular also regarding many of its code examples.

 

cross-posted from: https://lemmy.ml/post/42242801

Major new features:

  • The ISO C23 free_sized, free_aligned_sized, memset_explicit, and memalignment functions have been added.

  • As specified in ISO C23, the assert macro is defined to take variable arguments to support expressions with a comma inside a compound literal initializer not surrounded by parentheses.

  • For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr, strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers into their input arrays now have definitions as macros that return a pointer to a const-qualified type when the input argument is a pointer to a const-qualified type.

  • The ISO C23 typedef names long_double_t, _Float32_t, _Float64_t, and (on platforms supporting _Float128) _Float128_t, introduced in TS 18661-3:2015, have been added to <math.h>.

  • The ISO C23 optional time bases TIME_MONOTONIC, TIME_ACTIVE, and TIME_THREAD_ACTIVE have been added.

  • On Linux, the mseal function has been added. It allows for sealing memory mappings to prevent further changes during process execution, such as changes to protection permissions, unmapping, relocation to another location, or shrinking the size.

  • Additional optimized and correctly rounded mathematical functions have been imported from the CORE-MATH project, in particular acosh, asinh, atanh, erf, erfc, lgamma, and tgamma.

  • Optimized implementations for fma, fmaf, remainder, remaindef, frexpf, frexp, frexpl (binary128), and frexpl (intel96) have been added.

  • The SVID handling for acosf, acoshf, asinhf, atan2f, atanhf, coshf, fmodf, lgammaf/lgammaf_r, log10f, remainderf, sinhf, sqrtf, tgammaf, y0/j0, y1/j1, and yn/jn was moved to compat symbols, allowing improvements in performance.

  • Experimental support for building with clang has been added. It requires at least clang version 18, aarch64-linux-gnu or x86_64-linux-gnu targets, and a libgcc compatible runtime (including libgcc_s.so for pthread cancellation and backtrace runtime support).

  • On Linux, the openat2 function has been added. It is an extension of openat and provides a superset of its functionality. It is supported only in LFS mode and is a cancellable entrypoint.

  • On AArch64, support for 2MB transparent huge pages has been enabled by default in malloc (similar to setting glibc.malloc.hugetlb=1 tunable).

  • On AArch64 Linux targets supporting the Scalable Matrix Extension (SME), the clone() system call wrapper will disable the ZA state of the SME.

  • On AArch64 targets supporting the Branch Target Identification (BTI) extension, it is possible to enforce that all binaries in the process support BTI using the glibc.cpu.aarch64_bti tunable.

  • On AArch64 Linux targets supporting at least one of the branch protection extensions (e.g. Branch Target Identification or Guarded Control Stack), it is possible to use LD_DEBUG=security to make the dynamic linker show warning messages about loaded binaries that do not support the corresponding security feature.

  • On AArch64, vector variants of the new C23 exp2m1, exp10m1, log10p1, log2p1, and rsqrt routines have been added.

  • On RISC-V, an RVV-optimized implementation of memset has been added.

  • On x86, support for the Intel Nova Lake and Wildcat Lake processors has been added.

  • The test suite has seen significant improvements in particular around the scanf, strerror, strsignal functions and multithreaded testing.

  • Unicode support has been updated to Unicode 17.0.0.

  • The manual has been updated and modernized, in particular also regarding many of its code examples.

 

Major new features:

  • The ISO C23 free_sized, free_aligned_sized, memset_explicit, and memalignment functions have been added.

  • As specified in ISO C23, the assert macro is defined to take variable arguments to support expressions with a comma inside a compound literal initializer not surrounded by parentheses.

  • For ISO C23, the functions bsearch, memchr, strchr, strpbrk, strrchr, strstr, wcschr, wcspbrk, wcsrchr, wcsstr and wmemchr that return pointers into their input arrays now have definitions as macros that return a pointer to a const-qualified type when the input argument is a pointer to a const-qualified type.

  • The ISO C23 typedef names long_double_t, _Float32_t, _Float64_t, and (on platforms supporting _Float128) _Float128_t, introduced in TS 18661-3:2015, have been added to <math.h>.

  • The ISO C23 optional time bases TIME_MONOTONIC, TIME_ACTIVE, and TIME_THREAD_ACTIVE have been added.

  • On Linux, the mseal function has been added. It allows for sealing memory mappings to prevent further changes during process execution, such as changes to protection permissions, unmapping, relocation to another location, or shrinking the size.

  • Additional optimized and correctly rounded mathematical functions have been imported from the CORE-MATH project, in particular acosh, asinh, atanh, erf, erfc, lgamma, and tgamma.

  • Optimized implementations for fma, fmaf, remainder, remaindef, frexpf, frexp, frexpl (binary128), and frexpl (intel96) have been added.

  • The SVID handling for acosf, acoshf, asinhf, atan2f, atanhf, coshf, fmodf, lgammaf/lgammaf_r, log10f, remainderf, sinhf, sqrtf, tgammaf, y0/j0, y1/j1, and yn/jn was moved to compat symbols, allowing improvements in performance.

  • Experimental support for building with clang has been added. It requires at least clang version 18, aarch64-linux-gnu or x86_64-linux-gnu targets, and a libgcc compatible runtime (including libgcc_s.so for pthread cancellation and backtrace runtime support).

  • On Linux, the openat2 function has been added. It is an extension of openat and provides a superset of its functionality. It is supported only in LFS mode and is a cancellable entrypoint.

  • On AArch64, support for 2MB transparent huge pages has been enabled by default in malloc (similar to setting glibc.malloc.hugetlb=1 tunable).

  • On AArch64 Linux targets supporting the Scalable Matrix Extension (SME), the clone() system call wrapper will disable the ZA state of the SME.

  • On AArch64 targets supporting the Branch Target Identification (BTI) extension, it is possible to enforce that all binaries in the process support BTI using the glibc.cpu.aarch64_bti tunable.

  • On AArch64 Linux targets supporting at least one of the branch protection extensions (e.g. Branch Target Identification or Guarded Control Stack), it is possible to use LD_DEBUG=security to make the dynamic linker show warning messages about loaded binaries that do not support the corresponding security feature.

  • On AArch64, vector variants of the new C23 exp2m1, exp10m1, log10p1, log2p1, and rsqrt routines have been added.

  • On RISC-V, an RVV-optimized implementation of memset has been added.

  • On x86, support for the Intel Nova Lake and Wildcat Lake processors has been added.

  • The test suite has seen significant improvements in particular around the scanf, strerror, strsignal functions and multithreaded testing.

  • Unicode support has been updated to Unicode 17.0.0.

  • The manual has been updated and modernized, in particular also regarding many of its code examples.

[–] JRepin@lemmy.ml 2 points 3 months ago* (last edited 3 months ago) (1 children)

Well for x86 software still needs to be testing if some instructions are supported dynamically if they want to take adventage of the latest ones. For example you still neeed to test for different versions of AVX or even older SSE versions, since not all the x86 CPUs support everything. In 2020 something similar to RISC-V profiles was also defined for x86: microarchitectural levels. And most software just is compiled for the lowest commonly supported set of x86 instructions, in essence x86-64-v1 or x86-64-v2, depends on the software or GNU/Linux distribution. Although recently some distributions started to provide additional higher levels of packages for programs that benefit most from the use of latest x86 instructions. And then glibc HWCAPS feature enables the system to load the most optimized binary of the appliation. For example see openSUSE Tumbleweed gains optional x86-64-v3 optimization.

[–] JRepin@lemmy.ml 6 points 3 months ago* (last edited 3 months ago) (3 children)

To make this easier RISC-V has profiles (the latest being RVA23), which specify a base extension set. So software can target a specific profile, and CPUs advertises which profile they support (+ possible additional extensions). Regarding naming schemes, AMD and Intel are not so clear here either, so it would not be so much different :)

[–] JRepin@lemmy.ml 9 points 9 months ago (2 children)

On openSUSE they have snapper snapshotting integrated into package management, so it automatically creates a snapshot before and after updates. And if something would go wrong you could easily select an old snappshot to boot from in the GRUB menu.

[–] JRepin@lemmy.ml 3 points 10 months ago (1 children)

I have the BPI-F3 and it comes with Bianbu distribution by default. It is based on old LTS versions of Ubuntu with some updated packages (like Mesa) and some packages optimized for the X60/K1 CPU. The problem with this CPU/SBC is that SpacemiT is bad at upstreaming the support, they do support only in their own forks of Linux kernel and other software. So upstreaming is done by volunteers and is progressing very slowly (example only for the Linux kernel), so usual distros like Debian do not have support out of the box. Also it is a problem that the K1/X60 has some Imagination PowerVR BXE-2-32 integrated graphics and this one is not supported by Mesa and only has closed binary drivers which Imagination provides to SpacemiT and they then add it into Bianbu. Also keep in mind that even this driver does not support OpenGL (the normal desktop one). Only OpenGL ES and Vulkan. So in essence this means that the compositor/windowmanager and the toolkits like Qt need to be compiled with this support which is generaly not the case in more normal distros. Sometimes they provide two sets of compiled packags, one with normal desktop OpenGL which you then have to replace with the openGL ES variants. And these are usually not so well tested in the normal daily desktop use case.

So for daily use you more or less have to stick with Bianbu Linux on it. If you do that, I would it is quite usable, if you do not find GNOME-based desktop it has limiting as I do, since I am used to the power and plethora of features in KDE Plasma :) It is a bit slow for some more demanding tasks like video, graphics, games and stuff like that, but yeah, for simple office usecases, it is fine. So depends on what you would use it to do.

[–] JRepin@lemmy.ml 3 points 10 months ago* (last edited 10 months ago)

Oh yeah. Can't wait for this. Bad session management/restore is basically the only major thing I still miss a lot on Wayland. Hopefully Firefox and other apps will gain support for this soon (I guess all Qt/KDE apps will get support at once when they also add support to Qt and KDE Frameworks). Anyways I just opened the enhancement request for Firefox for this just hoping they will add support soon.

[–] JRepin@lemmy.ml 9 points 10 months ago (1 children)
[–] JRepin@lemmy.ml 4 points 10 months ago

I would guess these are for device-tree specifications and run-time detection of what extensions some RISC-V CPU supports. Also might be some support for using these extensions in some common kernel code that is used by other parts of the kernel. But to be sure we would need to check the commits themselves.

[–] JRepin@lemmy.ml 1 points 10 months ago

Well as they mention it, they do know.

[–] JRepin@lemmy.ml 2 points 10 months ago (1 children)

It does not break anything. Just uses C++ and builds upon it and improves it. And MOC comes in when some niceties are required that are hard to do with plain C++ (and be backwards compatible) or when more flexibility is required. If you know how to do it better, well Qt is free (as in freedom) and opensource and you can join the project and replace MOC with a better implementation. Until then it is a not so important detail and foolish to throw away entire Qt and all the numerous goodies and nice things that it brings just for this small detail.

[–] JRepin@lemmy.ml 2 points 10 months ago (3 children)

What's wrong with it? It is basically invisible and all done automatically in the background by the build system.

[–] JRepin@lemmy.ml 1 points 10 months ago (5 children)

Why are you sad?

[–] JRepin@lemmy.ml 1 points 10 months ago (7 children)
view more: next ›