Skip to content

Tracking: Collection of issues found when porting HLSL to rust-gpu #744

@hrydgard

Description

@hrydgard

I and some others have been porting a body of HLSL code to rust-gpu. Here's some notes about unexpected differences, pitfalls, and hard-to-port things.

Fixable issues (doesn't mean they're easy!)

  • For loops compile to a mess that spirv-cross can't quite handle, so we're sticking to while loops
  • .abs() and .sign() don't work (cause 64-bit int code gen). See .abs() and .signum() cause 64-bit integer instruction generation #468
  • .saturate doesn't behave like HLSL's saturate with regards to NaNs. (glam issue?)
  • #derive(Debug) on a struct really weirds the compiler out, no way to see what you did wrong
  • Need to use #[rustfmt::skip] on shader entry points, since rustfmt eats long attributes!
    For example, this line gets mangled from:
    #[spirv(storage_buffer, descriptor_set = 0, binding = 1)] instance_constants_dyn: &[InstanceDynamicParameters],

into:

    instance_constants_dyn: &[InstanceDynamicParameters],

Unintuitive behavior mismatches

Inconveniences that may not be fixable

  • The mix of uint3 for global_invocation_id and int2/int3 for texture fetches is a lot more painful in rust than in HLSL.
    • This currently seems to just work? ~@oisyn
  • a.max(b) instead of max(a, b) is sometimes kinda laborious. though rust-style.
  • Sometimes need to do a lot more parameter passing since inputs are not global. Not necessarily a bad thing though.

Documentation issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    a: documentationImprovements or additions to documentationt: tracking issueAn issue tracking the progress of a specific feature or change.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions