Verify Sanctuary shaders on Vulkan with explicit backend tests
Build Sanctuary / build (push) Canceled after 0s
Build Sanctuary / build (push) Canceled after 0s
This commit is contained in:
@@ -24,6 +24,8 @@ La version **beta.138** adapte l’épaisseur des **rayons solaires à la mété
|
|||||||
plus denses et diffus dans le brouillard, renforcés sous les précipitations,
|
plus denses et diffus dans le brouillard, renforcés sous les précipitations,
|
||||||
avec moins de lumière pendant l’orage. Le curseur reste inchangé.
|
avec moins de lumière pendant l’orage. Le curseur reste inchangé.
|
||||||
Le [ticket](docs/shader-beta138.md) détaille le rendu et ses vérifications.
|
Le [ticket](docs/shader-beta138.md) détaille le rendu et ses vérifications.
|
||||||
|
La [vérification Vulkan](docs/shader-vulkan-beta138.md) précise les backends testés
|
||||||
|
et les limites de la validation par pilote.
|
||||||
Release publiée et même instance Prism synchronisée ; sauvegardes et réglages conservés.
|
Release publiée et même instance Prism synchronisée ; sauvegardes et réglages conservés.
|
||||||
La [livraison précédente](docs/clay-workshop-integration-beta110.md) réunit déjà
|
La [livraison précédente](docs/clay-workshop-integration-beta110.md) réunit déjà
|
||||||
l’atelier, les œufs et la neige saisonnière dans l’instance **Sanctuary Beta**.
|
l’atelier, les œufs et la neige saisonnière dans l’instance **Sanctuary Beta**.
|
||||||
|
|||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# SHADER-139 — Compatibilité Vulkan du shader beta.138
|
||||||
|
|
||||||
|
Socle **beta.138**, Minecraft **26.3**, Java **25**, branche
|
||||||
|
`codex/vulkan-shaders-beta139`.
|
||||||
|
|
||||||
|
Le signalement initial concernait un bloom invisible même à 100 %. Le joueur
|
||||||
|
indique ensuite que le rendu fonctionne de nouveau sur Windows et demande
|
||||||
|
la compatibilité Vulkan. Les changements expérimentaux d'intensité ont été
|
||||||
|
retirés : les shaders et les valeurs par défaut restent ceux de beta.138.
|
||||||
|
|
||||||
|
## Contrat
|
||||||
|
|
||||||
|
Utiliser les mêmes pipelines RenderPearl sur OpenGL et Vulkan. Vérifier le
|
||||||
|
backend réellement utilisé, car Minecraft peut retomber sur OpenGL lorsque
|
||||||
|
Vulkan ne démarre pas. Tester les effets dans de nouveaux mondes ignorés,
|
||||||
|
sans ouvrir de sauvegarde personnelle ni modifier le backend de l'instance Prism.
|
||||||
|
|
||||||
|
Le lancement des tests accepte désormais `-PsanctuaryClientGraphicsBackend=vulkan`
|
||||||
|
ou `opengl`. Les tests de shaders refusent tout repli silencieux et consignent
|
||||||
|
le nom du backend, du GPU et du pilote. Cette option concerne uniquement
|
||||||
|
le client de développement.
|
||||||
|
|
||||||
|
## Reproduction
|
||||||
|
|
||||||
|
```sh
|
||||||
|
JAVA_HOME=/chemin/vers/jdk-25 ./gradlew :sanctuary:runClientGameTest \
|
||||||
|
-PsanctuaryClientTests=true -PsanctuaryPixelShadows122ClientTests=true \
|
||||||
|
-PsanctuaryClientGraphicsBackend=vulkan \
|
||||||
|
-PsanctuaryClientNoVsync=true -PsanctuaryQuickTests=true
|
||||||
|
```
|
||||||
|
|
||||||
|
Sur Windows, utiliser `gradlew.bat` avec les mêmes propriétés et Java 25.
|
||||||
|
Ajouter `-PsanctuaryClientImprovedTransparency=true` pour tester la transparence
|
||||||
|
améliorée ; le choix initial est restauré après le test.
|
||||||
|
Pour les rayons et la météo, remplacer `sanctuaryPixelShadows122ClientTests`
|
||||||
|
par `sanctuarySunshaft137ClientTests`. Pour isoler le bloom et le lens flare,
|
||||||
|
utiliser `sanctuaryBloom130ClientTests`.
|
||||||
|
|
||||||
|
## Diagnostic initial
|
||||||
|
|
||||||
|
Le client Vulkan démarre ici sur **Apple M1 / MoltenVK 1.4.2**, API 1.2.350.
|
||||||
|
Le test du bloom réussit en **2 min 19 s** : les masques des vingt minerais,
|
||||||
|
les contrôles OFF/zéro, intensité/diffusion, l'occlusion, le rechargement,
|
||||||
|
les torches, glowstone, lampes, lave, soleil et le lens flare sont vérifiés.
|
||||||
|
Les mesures de référence du bloom sont identiques à celles d'OpenGL :
|
||||||
|
14649 pixels de minerai, gain du halo faible 218131, fort 1970502,
|
||||||
|
gain solaire 7708. Log : `build/shader139-vulkan-first.log`.
|
||||||
|
|
||||||
|
Cela confirme cette combinaison précise ; ce n'est pas une validation des
|
||||||
|
pilotes NVIDIA/AMD/Intel sous Windows. En cas de retour du problème, le
|
||||||
|
`logs/latest.log` de la session Windows concernée est nécessaire pour relever
|
||||||
|
le backend effectif, le GPU, le pilote et les éventuelles erreurs de pipeline.
|
||||||
|
|
||||||
|
## Suite Vulkan
|
||||||
|
|
||||||
|
`sanctuaryPixelShadows122ClientTests` réussit en **8 min 50 s**. Les contrôles
|
||||||
|
couvrent ombres diurnes/nocturnes, feuillage, stabilité en temps réel,
|
||||||
|
highlights CTM, bloom et lens flare, SSGI en déplacement et près des surfaces,
|
||||||
|
PBR directionnel, rechargement, redimensionnement et interfaces FR/EN.
|
||||||
|
Log : `build/shader139-vulkan-suite2.log`.
|
||||||
|
|
||||||
|
Le bloom et le lens flare réussissent aussi avec
|
||||||
|
`sanctuaryClientImprovedTransparency=true`, en **1 min 45 s**. Le backend
|
||||||
|
est bien Vulkan, sa profondeur est en `[0, 1]` et l'option de transparence
|
||||||
|
est active. Les mesures du bloom restent identiques.
|
||||||
|
Log : `build/shader139-vulkan-transparency.log`.
|
||||||
|
|
||||||
|
La suite météo/rayons beta.138 n'a pas été rejouée sous Vulkan dans ce ticket ;
|
||||||
|
les résultats ci-dessus portent sur les effets explicitement listés.
|
||||||
|
Le joueur confirme que le retour à OpenGL rétablit l'effet sur Windows.
|
||||||
|
Ce défaut particulier reste à reproduire à partir d'un journal récent.
|
||||||
|
|
||||||
|
Un premier lancement utilisait un nom de propriété incomplet et a exécuté
|
||||||
|
la suite générale, échouant dans Blocodex avant les tests de shaders.
|
||||||
|
Ce lancement n'est pas compté comme une validation Vulkan des shaders.
|
||||||
|
La commande corrigée utilise `sanctuaryPixelShadows122ClientTests`.
|
||||||
|
|
||||||
|
## Construction
|
||||||
|
|
||||||
|
`./gradlew check build -x :sanctuary:runGameTest` réussit ; le serveur
|
||||||
|
GameTest dédié reste exclu conformément au refus EULA antérieur.
|
||||||
|
Log : `build/shader139-check-build.log`. Le JAR reconstruit est **strictement
|
||||||
|
identique, octet pour octet**, au JAR Sanctuary de la release beta.138.
|
||||||
|
La distribution ne change pas et ne nécessite donc pas de nouvel assemblage.
|
||||||
|
|
||||||
|
## Distribution
|
||||||
|
|
||||||
|
Ce ticket ajoute des options de lancement de tests et leur documentation.
|
||||||
|
Les shaders de production et les réglages de beta.138 ne sont pas changés.
|
||||||
|
Aucune nouvelle livraison binaire, aucun tag beta.139 ni mise à jour de
|
||||||
|
l'instance personnelle n'est effectué pour une vérification seule.
|
||||||
|
|
||||||
|
## Référence du moteur
|
||||||
|
|
||||||
|
Minecraft 26.3 compile les shaders OpenGL et Vulkan via ShaderC et expose
|
||||||
|
`RENDERPEARL_DEPTH_IS_ZERO_TO_ONE` pour la convention de profondeur.
|
||||||
|
[Notes officielles Minecraft 26.3](https://feedback.minecraft.net/hc/en-us/articles/48913133328013-Minecraft-Java-Edition-26-3).
|
||||||
|
Les effets Sanctuary transmettent déjà la convention du périphérique aux
|
||||||
|
reconstructions de position ; aucun remplacement spéculatif n'est appliqué.
|
||||||
@@ -25,6 +25,15 @@ if (clientRenderTests) {
|
|||||||
java.srcDir('src/clientGametest/java')
|
java.srcDir('src/clientGametest/java')
|
||||||
}
|
}
|
||||||
tasks.named('runClientGameTest') {
|
tasks.named('runClientGameTest') {
|
||||||
|
def graphicsBackend = providers.gradleProperty('sanctuaryClientGraphicsBackend')
|
||||||
|
if (graphicsBackend.isPresent()) {
|
||||||
|
args('--graphicsBackend', graphicsBackend.get())
|
||||||
|
systemProperty('sanctuary.test.graphicsBackend', graphicsBackend.get())
|
||||||
|
}
|
||||||
|
def improvedTransparency = providers.gradleProperty('sanctuaryClientImprovedTransparency')
|
||||||
|
if (improvedTransparency.isPresent()) {
|
||||||
|
systemProperty('sanctuary.test.improvedTransparency', improvedTransparency.get())
|
||||||
|
}
|
||||||
systemProperty('sanctuary.test.noVsync', providers.gradleProperty('sanctuaryClientNoVsync').getOrElse('false'))
|
systemProperty('sanctuary.test.noVsync', providers.gradleProperty('sanctuaryClientNoVsync').getOrElse('false'))
|
||||||
systemProperty('sanctuary.test.quick', providers.gradleProperty('sanctuaryQuickTests').getOrElse('false'))
|
systemProperty('sanctuary.test.quick', providers.gradleProperty('sanctuaryQuickTests').getOrElse('false'))
|
||||||
systemProperty('sanctuary.test.introVisualOnly', providers.gradleProperty('sanctuaryIntroVisualOnly').getOrElse('false'))
|
systemProperty('sanctuary.test.introVisualOnly', providers.gradleProperty('sanctuaryIntroVisualOnly').getOrElse('false'))
|
||||||
|
|||||||
+14
-2
@@ -51,6 +51,14 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void runTest(ClientGameTestContext c) {
|
public void runTest(ClientGameTestContext c) {
|
||||||
|
c.runOnClient(m -> {
|
||||||
|
var info = com.mojang.blaze3d.systems.RenderSystem.getDevice().getDeviceInfo();
|
||||||
|
String expected = System.getProperty("sanctuary.test.graphicsBackend", "");
|
||||||
|
check(expected.isEmpty() || info.backendName().equalsIgnoreCase(expected),
|
||||||
|
"Requested graphics backend must not silently fall back: " + expected + " / " + info.backendName());
|
||||||
|
System.out.println("SHADER139_BACKEND " + info.backendName() + " / " + info.name()
|
||||||
|
+ " / " + info.driverInfo() + " / zeroToOne=" + info.isZZeroToOne());
|
||||||
|
});
|
||||||
var path = FabricLoader.getInstance().getConfigDir().resolve("sanctuary-shaders.json");
|
var path = FabricLoader.getInstance().getConfigDir().resolve("sanctuary-shaders.json");
|
||||||
final byte[] originalPreferences;
|
final byte[] originalPreferences;
|
||||||
try {
|
try {
|
||||||
@@ -82,6 +90,9 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest {
|
|||||||
m.options.bobView().set(false);
|
m.options.bobView().set(false);
|
||||||
m.options.pauseOnLostFocus = false;
|
m.options.pauseOnLostFocus = false;
|
||||||
m.options.setCameraType(CameraType.FIRST_PERSON);
|
m.options.setCameraType(CameraType.FIRST_PERSON);
|
||||||
|
String transparency = System.getProperty("sanctuary.test.improvedTransparency");
|
||||||
|
if (transparency != null) m.options.improvedTransparency().set(Boolean.parseBoolean(transparency));
|
||||||
|
System.out.println("SHADER139_TRANSPARENCY " + m.options.improvedTransparency().get());
|
||||||
checkPreferences();
|
checkPreferences();
|
||||||
});
|
});
|
||||||
try (var world = c.worldBuilder().adjustSettings(s -> {
|
try (var world = c.worldBuilder().adjustSettings(s -> {
|
||||||
@@ -653,11 +664,11 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private record Options(int distance, int simulationDistance, int fov, boolean bob,
|
private record Options(int distance, int simulationDistance, int fov, boolean bob,
|
||||||
boolean pause, CameraType camera, String language) {
|
boolean pause, CameraType camera, String language, boolean improvedTransparency) {
|
||||||
static Options capture(Minecraft m) {
|
static Options capture(Minecraft m) {
|
||||||
return new Options(m.options.renderDistance().get(), m.options.simulationDistance().get(), m.options.fov().get(),
|
return new Options(m.options.renderDistance().get(), m.options.simulationDistance().get(), m.options.fov().get(),
|
||||||
m.options.bobView().get(), m.options.pauseOnLostFocus,
|
m.options.bobView().get(), m.options.pauseOnLostFocus,
|
||||||
m.options.getCameraType(), m.getLanguageManager().getSelected());
|
m.options.getCameraType(), m.getLanguageManager().getSelected(), m.options.improvedTransparency().get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void restore(Minecraft m) {
|
void restore(Minecraft m) {
|
||||||
@@ -667,6 +678,7 @@ public final class PixelShadows122ClientChecks implements FabricClientGameTest {
|
|||||||
m.options.bobView().set(bob);
|
m.options.bobView().set(bob);
|
||||||
m.options.pauseOnLostFocus = pause;
|
m.options.pauseOnLostFocus = pause;
|
||||||
m.options.setCameraType(camera);
|
m.options.setCameraType(camera);
|
||||||
|
m.options.improvedTransparency().set(improvedTransparency);
|
||||||
m.getLanguageManager().setSelected(language);
|
m.getLanguageManager().setSelected(language);
|
||||||
m.getLanguageManager().onResourceManagerReload(m.getResourceManager());
|
m.getLanguageManager().onResourceManagerReload(m.getResourceManager());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user