Skip to content

Commit 5386d38

Browse files
authored
[naga spv-in] OpImageWrite allows input other than Vector4. (#6630)
* fix(naga-spv-in): Image write value type is invalid. * fix(naga-spv-in): input vector 4 may case error * fix(naga-spv-in): Incorrect swizzle pattern for vector size 3.
1 parent 0fc0b35 commit 5386d38

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

naga/src/front/spv/image.rs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,51 @@ impl<I: Iterator<Item = u32>> super::Frontend<I> {
311311

312312
let value_lexp = self.lookup_expression.lookup(value_id)?;
313313
let value = self.get_expr_handle(value_id, value_lexp, ctx, emitter, block, body_idx);
314+
let value_type = self.lookup_type.lookup(value_lexp.type_id)?.handle;
315+
316+
// In hlsl etc, the write value may not be the vector 4.
317+
let expanded_value = match ctx.module.types[value_type].inner {
318+
crate::TypeInner::Scalar(_) => Some(crate::Expression::Splat {
319+
value,
320+
size: crate::VectorSize::Quad,
321+
}),
322+
crate::TypeInner::Vector { size, .. } => match size {
323+
crate::VectorSize::Bi => Some(crate::Expression::Swizzle {
324+
size: crate::VectorSize::Quad,
325+
vector: value,
326+
pattern: [
327+
crate::SwizzleComponent::X,
328+
crate::SwizzleComponent::Y,
329+
crate::SwizzleComponent::Y,
330+
crate::SwizzleComponent::Y,
331+
],
332+
}),
333+
crate::VectorSize::Tri => Some(crate::Expression::Swizzle {
334+
size: crate::VectorSize::Quad,
335+
vector: value,
336+
pattern: [
337+
crate::SwizzleComponent::X,
338+
crate::SwizzleComponent::Y,
339+
crate::SwizzleComponent::Z,
340+
crate::SwizzleComponent::Z,
341+
],
342+
}),
343+
crate::VectorSize::Quad => None,
344+
},
345+
_ => return Err(Error::InvalidVectorType(value_type)),
346+
};
347+
348+
let value_patched = if let Some(s) = expanded_value {
349+
ctx.expressions.append(s, crate::Span::default())
350+
} else {
351+
value
352+
};
314353

315354
Ok(crate::Statement::ImageStore {
316355
image: image_lexp.handle,
317356
coordinate,
318357
array_index,
319-
value,
358+
value: value_patched,
320359
})
321360
}
322361

0 commit comments

Comments
 (0)