Replies: 10 comments 13 replies
-
As usual with GitHub Discussions, please use thread replies via the GitHub interface rather than email based replies to keep discussion well structured. Please use replies to this comment to group and identify places where conversion needs to occur (e.g. build system components, API calls, etc) |
Beta Was this translation helpful? Give feedback.
-
Please use replies to this comment to discuss the smoke testing plan |
Beta Was this translation helpful? Give feedback.
-
Please use replies to this comment to discuss NVDA dependencies which do / do not have 64bit alternatives |
Beta Was this translation helpful? Give feedback.
-
Hi, I would assume that a 32-bit remote loader will be used to let the core code and add-ons talk to 32-bit processes? The remote loader is needed by soe add-ons to communicate with 32-bit processes using Windows API calls. Thanks. |
Beta Was this translation helpful? Give feedback.
-
Would it be possible to consider an arm 64 build as well? Currently NVDA runs on emulation on arm which may have a performance and battery life impact on arm devices. |
Beta Was this translation helpful? Give feedback.
-
Please don't forget corporate users on LTSB / LTSC versions of Windows 10 - these are supported until the beginning of 2029. While I don't thing they should hold us back, it would be nice to know how many windows 10 users on 32-bit are running these extended support editions. Sadly our statistics gathering does not cover OS information in that detail.
Is there anything other than Braille display driver you have in mint here?
To be clear I assume that there is no intention to remove 32-bit controller client for external applications?
I'd say this risk is quite small - most (probably all) displays are supported via BRLTTY, which means that users can use it indirectly, but more importantly that source code of the driver which does not rely on the manufacturer dll is available, so we can use it to create native Python driver.
Is this only about stuff relying on NVDA's API? This sentence may also mean that 32-bit programs will no longer be supported which, I hope, is not an intent here.
I'd say this is really a must for synthesizer drivers. For just one example of a user who disagreed with an idea of dropping support for, very popular, 32-bit synthesizers see #12064 (comment) |
Beta Was this translation helpful? Give feedback.
-
There are some things which IMO should be clarified in the initial comment, so that we all share the same expectations:
|
Beta Was this translation helpful? Give feedback.
-
Just to note a practical example, #3339. There is also a PR referenced. |
Beta Was this translation helpful? Give feedback.
-
This comment is for discussing handling the migration of NVDA's C++ code. Resources: |
Beta Was this translation helpful? Give feedback.
-
About 32-bit/64-bit interoperations
I wonder how this would be implemented. Usually add-ons are written in Python code that runs in the NVDA's process, so that they can use all the public APIs in NVDA (or even monkey-patch some internal functions, albeit not recommended), and use some external DLLs, which will also be loaded inside the NVDA process. If we want to split the NVDA main process and the add-on code into two processes, and want to require as less changes to the existing add-on code as possible, we could implement proxy objects to allow the add-on to transparently perform remote calls to the NVDA APIs. This way, the add-on doesn't need to be aware that it is doing remote calls, because the code to use the API is exactly the same, unless, for example, the add-on wants to monkey-patch some internal functions. The problem is, how many proxies would we need? NVDA has lots of modules/classes/functions that can be categorized as "public API". When an add-on runs in-process, it has access to all those APIs. But when an add-on runs out-of-process, it only has access to the APIs that can be proxied to the main process. Do we need to provide proxies for every single public API, in order not to break existing add-ons? Although we only need one proxy class for each class, and we can reuse the same implementation, there are still a lot of classes, and we will have to create the same module structure to make importing work. Another way is to provide (or recommend) a set of RPC/IPC facilities for add-ons to use, but all the NVDA APIs are still only in the main process. Then, it will be the add-on's job to split out the part that needs to run in a 32-bit environment, and run the part in a separate process using the facilities. About ARM64ARM64 is also considered 64-bit, unless you want to explicitly distinguish x64 and ARM64. However, x64 and ARM64 are different. x86 and x64 have different Program Files folder path and registry path, but x64 and ARM64 share the same location, including COM registry keys, which can make things difficult. Windows 11 ARM supports these architectures: x86, x64, ARM64 and ARM64EC. ARM64 programs contain "pure" ARM64 code and are the most efficient, however they are incompatible with existing x64 dependencies. ARM64EC, on the other hand, is designed to be somewhat compatible with x64, and also be efficient by running native ARM64 code when possible. In other words, ARM64EC is "ARM64 in x64's clothing". However, the "clothing" makes ARM64EC incompatible with "pure" ARM64, so ARM64EC becomes another "architecture". As a process can have any of those architectures, NVDA should be prepared for all of them. When you build a DLL, you can also make an ARM64X DLL, which contains both ARM64 code and ARM64EC code, and can be used as either an ARM64 DLL or an ARM64EC DLL. The compatibility among different architectures is as follows.
So on an ARM64 system, ARM64X DLLs have the best compatibility and can be loaded into any 64-bit process. If you want to hook/patch functions in an ARM64EC process, you can treat it as an x64 process, as ARM64EC code is specifically structured to look like x64 code. However, all the DLLs an ARM64X DLL links against should also be ARM64X DLLs. System DLLs are usually ARM64X, but third-party DLLs might not. If there's only an x64 version and an ARM64 version of a third-party DLL with no way to recompile it into ARM64X, you may have to split your ARM64X DLL into x64 and ARM64, then use an ARM64X DLL only as a forwarder. If you use x64 NVDA on an ARM64 system, it can mostly work, as x64 DLLs can be loaded in x64 and ARM64EC processes. But x64 DLLs cannot be loaded in ARM64 processes, although they both seem to be 64-bit. |
Beta Was this translation helpful? Give feedback.
-
Note: As usual with GitHub Discussions, please use thread replies via the GitHub interface rather than email based replies to keep discussion well structured.
Project Description
This project aims to migrate NVDA to becoming a 64 bit only application.
This means that NVDA would no longer run on 32 bit machines.
Once initial discussion has settled, we encourage the community to start and contribute to the conversion.
Reasoning
Less than 5% of NVDA users are on 32-bit machines, many of which are already left behind due to Win 7 deprecation.
Only 1.4% of Windows 8.1+ NVDA users are on 32-bit machines.
Many dependencies are dropping 32 bit support:
Windows 11 only offers a 64 bit version. This means once Windows 10 goes EOL (end of 2025), the entire software ecosystem (including python) will likely move to 64 bit only.
Migration is likely to be a slow process, and we are increasingly risking being left behind as the software ecosystem migrates.
NVDA runs into errors with some 64bit applications:
We cannot build a magnifier built in to NVDA as a 32bit (WOW64) application:
Project Goals
Objective
A stable final x64 build of NVDA
Backlog
Total
65-200d
Engineering risks
Risk Description
Dependencies that are incompatible with x64 software.
We may have legacy dependencies that are 32bit only.
Management strategy
We should check all our dependencies and see if this will be an issue before embarking on the conversion process.
If essential dependencies are identified we may need to find alternative solutions or deprecate support for certain things.
Resulting severity
Final severity: high
Risk Description
NVDA add-ons, synthesizers, and other external software may rely on NVDA's 32bit API.
Particular braille display drivers may rely on dlls from the manufacturer to communicate with the display. It may be possible that the company who made the braille display no longer exists (e.g. Baum) and therefore there is no chance that a 64 bit dll could be created without major reverse engineering. The vast majority of the braille display drivers in NVDA core do not rely on dlls, but there may be some add-ons. Generally we could say bad luck, times move on. However for a $10,000 investment on an older braille display, we would want to provide a solution if at all possible.
Management strategy
We should advertise these changes as early as possible, and provide testing builds once 64bit NVDA enters beta.
Some legacy software will unfortunately be left behind, and users relying on it may be stuck on older versions of NVDA.
A user story exists for creating a 32 bit legacy API for legacy drivers.
As we start to think about the secure add-on API, specifically for synth drivers and braille display drivers, these could run in their own isolated sub-processes, with our own custom IPC for communication with NVDA core. In this case, it would be possible to continue to provide 32-bit support by providing a 32-bit braille driver host process.
Resulting severity
Final severity: medium
Risk Description
Uncommon code paths.
Many functions relying on 32bit infrastructure may be uncommon code paths and hard to pick up from testing or as a developer.
Management strategy
Use AI to analyse NVDA codebase for remaining code that needs conversion. AI may get better at this once we have performed some conversion and have examples.
Thorough alpha testing and beta testing will help here.
Resulting severity
Final severity: low
Beta Was this translation helpful? Give feedback.
All reactions