[Migrated] Move Output vars to return position (was: Storage class inference interface)
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Rust
- Sterne
- 3.4k
- Forks
- 126
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
Issue automatically imported from old repo: https://github.com/EmbarkStudios/rust-gpu/issues/416
Old labels: mcp: accepted
Originally creatd by khyperia on 2021-02-11T13:41:36Z
Storage class inference is now a thing as of #300/#414. This details the design for the interface system taking advantage of inference, pointing out all the rules of how storage classes are specified in entry points.
There are a handful of ways of specifying a storage class:
- direct attribute:
fn main(#[spirv(input)] x: &f32). This uses the current list of storage classes. - via builtin:
fn main(#[spirv(position)] x: &Vector3)(inferred as input). This uses the current list of builtins (a table is needed to map builtin to storage class, I think some are input, some are output, and there may be others) - via image:
fn main(x: &Image2d)(inferred as uniform_constant). I thiiink images are always uniform_constant and not uniform, but I'm not sure. - unspecified future inference rules that we haven't discovered yet (the spec is light on what goes in what storage class), suggestions are welcome
If exactly one of these rules matches, then use the storage class it specifies.
If more than one of these rules matches, and they all compute the same storage class, emit a warning (e.g. #[spirv(position, input)], warn on input and say it's redundant). If more than one of these rules matches, and they compute different storage classes, emit an error.
If none of these rules matches, then we have an open design question. The options here are a trade-off between catching user errors that may be difficult to diagnose/guiding users with explicit syntax suggestions, and not annoying people with overly explicit syntax that takes a while to type out and read.
fn main(x: &f32)-> is this an error, or does it default toinput? (or something else)fn main(x: &Struct)-> is this an error, does it default toinput, or does it default touniform? (or something else)fn main(x: &mut f32)-> is this an error, or does it default tooutput? (or something else)
For 2, I don't know if it's valid to have a struct (or any other non-scalar) be an input/output variable, more research is needed.
An alternative is to keep the current system of Input<T> and friends. We would remove the .load() and .store() methods entirely, and implement Deref/DerefMut (when applicable) for them. I much prefer the readability, recognizability, and usability of using plain references, but I understand others don't feel the same way~
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginnen Sie mit der Durchsicht der in #300 und #414 referenzierten Arbeiten zur Speicherklassen-Inferenz sowie der aktuellen Input- und der zugehörigen Schnittstelle, die im Issue beschrieben werden. Klären Sie die offenen Regeln für Inferenz und Standardwerte und definieren Sie anschließend die Schnittstellenänderung sowie die Validierung für widersprüchliche oder redundante Speicherklassenannotationen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- rust
- Bereich
- compilers
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Veraltet
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 25/100