Skip to content

Nalgebra vector fails to be recongized #247

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
marstaik opened this issue May 4, 2025 · 1 comment
Open

Nalgebra vector fails to be recongized #247

marstaik opened this issue May 4, 2025 · 1 comment
Labels
bug Something isn't working

Comments

@marstaik
Copy link

marstaik commented May 4, 2025

I tried using nalgebra (no-std) for types in shaders, but the simplest shaders fails to compile.

use nalgebra::Vector4;
use spirv_std::spirv;

#[allow(dead_code)]
#[spirv(fragment)]
pub fn main_fs(output: &mut Vector4<f32>) {
	*output = Vector4::new(1.0, 0.0, 0.0, 1.0);
}

#[allow(dead_code)]
#[spirv(vertex)]
pub fn main_vs(
	#[spirv(vertex_index)] vert_id: i32,
	#[spirv(position, invariant)] out_pos: &mut Vector4<f32>,
) {
	*out_pos = Vector4::new(
		(vert_id - 1) as f32,
		((vert_id & 1) * 2 - 1) as f32,
		0.0,
		1.0,
	);
}

Is the module I am trying to compile, and the error received is:

  error: [VUID-Position-Position-04321] According to the Vulkan spec BuiltIn Position variable needs to be a 4-component 32-bit float vector. ID <3> (OpVariable) is not a float vector.
    |
    = note: module `/home/marios/proj/hestia_vk/target/spirv-builder/spirv-unknown-vulkan1.2/release/deps/shaders.spvs/mesh-main_vs.spv`

  warning: an unknown error occurred
    |
    = note: spirv-opt failed, leaving as unoptimized
    = note: module `/home/marios/proj/hestia_vk/target/spirv-builder/spirv-unknown-vulkan1.2/release/deps/shaders.spvs/mesh-main_vs.spv`

  error: error:0:0 - [VUID-Position-Position-04321] According to the Vulkan spec BuiltIn Position variable needs to be a 4-component 32-bit float vector. ID <3> (OpVariable) is not a float vector.
           %50 = OpInBoundsAccessChain %_ptr_Output__arr_float_uint_4 %out_pos %uint_0 %uint_0 %uint_0
    |
    = note: spirv-val failed

If I comment out the main_vs function all is well.

It seems like the Vector4 type isnt being interpreted as a [f32;4]

I am wondering if this is because of the underlying type: pub struct ArrayStorage<T, const R: usize, const C: usize>(pub [[T; R]; C]);

It evaluates with R=4, C=1, making the inner type [[f32; 4],1]

@marstaik marstaik added the bug Something isn't working label May 4, 2025
@Turtyo
Copy link

Turtyo commented May 6, 2025

Could it because it's a wrapper ? Have you tried defining a struct with just a [f32; 4] inside and see if that works ?
Might just also be that it's indeed a [[f32; 4], 1] and it doesn't cast to [f32; 4] directly

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants