From ab54f683bee5d0480e6c7830cb0e3b683f6a2ff6 Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Thu, 1 Apr 2021 01:25:34 -0400 Subject: [PATCH] [spv-in] flip Y axis --- src/front/spv/function.rs | 37 ++++++++++++++++++++++++++++++++---- src/front/spv/mod.rs | 1 + tests/out/quad-vert.msl.snap | 1 + 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/front/spv/function.rs b/src/front/spv/function.rs index 082c9ff170..8a71b4037a 100644 --- a/src/front/spv/function.rs +++ b/src/front/spv/function.rs @@ -279,12 +279,41 @@ impl> super::Parser { } } - let old_len = function.expressions.len(); - for component in components.iter_mut() { - *component = function.expressions.append(crate::Expression::Load { - pointer: *component, + let position_index = members.iter().position(|member| match member.binding { + Some(crate::Binding::BuiltIn(crate::BuiltIn::Position)) => true, + _ => false, + }); + if let Some(component_index) = position_index { + let old_len = function.expressions.len(); + let global_expr = components[component_index]; + let access_expr = function.expressions.append(crate::Expression::AccessIndex { + base: global_expr, + index: 1, + }); + let load_expr = function.expressions.append(crate::Expression::Load { + pointer: access_expr, + }); + let neg_expr = function.expressions.append(crate::Expression::Unary { + op: crate::UnaryOperator::Negate, + expr: load_expr, + }); + function.body.push(crate::Statement::Emit( + function.expressions.range_from(old_len), + )); + function.body.push(crate::Statement::Store { + pointer: access_expr, + value: neg_expr, }); } + + let old_len = function.expressions.len(); + for component in components.iter_mut() { + let load_expr = crate::Expression::Load { + pointer: *component, + }; + *component = function.expressions.append(load_expr); + } + match members.len() { 0 => {} 1 => { diff --git a/src/front/spv/mod.rs b/src/front/spv/mod.rs index 651fc11a62..1fe4e51daa 100644 --- a/src/front/spv/mod.rs +++ b/src/front/spv/mod.rs @@ -1825,6 +1825,7 @@ impl> Parser { crate::Module::default() }; + // register indexing constants self.index_constants.clear(); for i in 0..4 { let handle = module.constants.append(crate::Constant { diff --git a/tests/out/quad-vert.msl.snap b/tests/out/quad-vert.msl.snap index 16b3529771..79d91a3cd4 100644 --- a/tests/out/quad-vert.msl.snap +++ b/tests/out/quad-vert.msl.snap @@ -69,6 +69,7 @@ vertex main2Output main2( a_uv = a_uv1; a_pos = a_pos1; main1(v_uv, a_uv, _, a_pos); + _.gl_Position.y = -_.gl_Position.y; const auto _tmp = type10 {v_uv, _.gl_Position, _.gl_PointSize, {_.gl_ClipDistance[0]}}; return main2Output { _tmp.member, _tmp.gl_Position1, _tmp.gl_PointSize1, {_tmp.gl_ClipDistance1[0]} }; }