Skip to content
This repository has been archived by the owner on Jan 29, 2025. It is now read-only.

Commit

Permalink
Minor cleanups.
Browse files Browse the repository at this point in the history
- Add comment explaining why it's okay to use
  `back::spv::GlobalVariable::var_id` instead of `access_id`.

- Rename `const_id` to `zero_id`.

- Return early to reduce indentation.
  • Loading branch information
jimblandy committed Jan 25, 2023
1 parent 623988c commit 0458e45
Showing 1 changed file with 67 additions and 64 deletions.
131 changes: 67 additions & 64 deletions src/back/spv/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1240,92 +1240,95 @@ impl Writer {
!info[handle].is_empty() && var.space == crate::AddressSpace::WorkGroup
})
.map(|(handle, var)| {
// It's safe to use `var_id` here, not `access_id`, because only
// variables in the `Uniform` and `StorageBuffer` address spaces
// get wrapped, and we're initializing `WorkGroup` variables.
let var_id = self.global_variables[handle.index()].var_id;
let var_type_id = self.get_type_id(LookupType::Handle(var.ty));
let init_word = self.write_constant_null(var_type_id);
Instruction::store(var_id, init_word, None)
})
.collect::<Vec<_>>();

if !body.is_empty() {
let uint3_type_id = self.get_uint3_type_id();
if body.is_empty() {
return None;
}

let mut pre_if_block = Block::new(entry_id);
let uint3_type_id = self.get_uint3_type_id();

let global_invocation_id = if let Some(global_invocation_id) = global_invocation_id {
global_invocation_id
} else {
let varying_id = self.id_gen.next();
let class = spirv::StorageClass::Input;
let pointer_type_id = self.get_uint3_pointer_type_id(class);
let mut pre_if_block = Block::new(entry_id);

Instruction::variable(pointer_type_id, varying_id, class, None)
.to_words(&mut self.logical_layout.declarations);
let global_invocation_id = if let Some(global_invocation_id) = global_invocation_id {
global_invocation_id
} else {
let varying_id = self.id_gen.next();
let class = spirv::StorageClass::Input;
let pointer_type_id = self.get_uint3_pointer_type_id(class);

self.decorate(
varying_id,
spirv::Decoration::BuiltIn,
&[spirv::BuiltIn::GlobalInvocationId as u32],
);
Instruction::variable(pointer_type_id, varying_id, class, None)
.to_words(&mut self.logical_layout.declarations);

interface.varying_ids.push(varying_id);
let id = self.id_gen.next();
pre_if_block
.body
.push(Instruction::load(uint3_type_id, id, varying_id, None));
self.decorate(
varying_id,
spirv::Decoration::BuiltIn,
&[spirv::BuiltIn::GlobalInvocationId as u32],
);

id
};
interface.varying_ids.push(varying_id);
let id = self.id_gen.next();
pre_if_block
.body
.push(Instruction::load(uint3_type_id, id, varying_id, None));

let const_id = self.write_constant_null(uint3_type_id);
let bool3_type_id = self.get_bool3_type_id();
id
};

let eq_id = self.id_gen.next();
pre_if_block.body.push(Instruction::binary(
spirv::Op::IEqual,
bool3_type_id,
eq_id,
global_invocation_id,
const_id,
));
let zero_id = self.write_constant_null(uint3_type_id);
let bool3_type_id = self.get_bool3_type_id();

let condition_id = self.id_gen.next();
let bool_type_id = self.get_bool_type_id();
pre_if_block.body.push(Instruction::relational(
spirv::Op::All,
bool_type_id,
condition_id,
eq_id,
));
let eq_id = self.id_gen.next();
pre_if_block.body.push(Instruction::binary(
spirv::Op::IEqual,
bool3_type_id,
eq_id,
global_invocation_id,
zero_id,
));

let merge_id = self.id_gen.next();
pre_if_block.body.push(Instruction::selection_merge(
merge_id,
spirv::SelectionControl::NONE,
));
let condition_id = self.id_gen.next();
let bool_type_id = self.get_bool_type_id();
pre_if_block.body.push(Instruction::relational(
spirv::Op::All,
bool_type_id,
condition_id,
eq_id,
));

let accept_id = self.id_gen.next();
function.consume(
pre_if_block,
Instruction::branch_conditional(condition_id, accept_id, merge_id),
);
let merge_id = self.id_gen.next();
pre_if_block.body.push(Instruction::selection_merge(
merge_id,
spirv::SelectionControl::NONE,
));

let accept_block = Block {
label_id: accept_id,
body,
};
function.consume(accept_block, Instruction::branch(merge_id));
let accept_id = self.id_gen.next();
function.consume(
pre_if_block,
Instruction::branch_conditional(condition_id, accept_id, merge_id),
);

let accept_block = Block {
label_id: accept_id,
body,
};
function.consume(accept_block, Instruction::branch(merge_id));

let mut post_if_block = Block::new(merge_id);
let mut post_if_block = Block::new(merge_id);

self.write_barrier(crate::Barrier::WORK_GROUP, &mut post_if_block);
self.write_barrier(crate::Barrier::WORK_GROUP, &mut post_if_block);

let next_id = self.id_gen.next();
function.consume(post_if_block, Instruction::branch(next_id));
Some(next_id)
} else {
None
}
let next_id = self.id_gen.next();
function.consume(post_if_block, Instruction::branch(next_id));
Some(next_id)
}

/// Generate an `OpVariable` for one value in an [`EntryPoint`]'s IO interface.
Expand Down

0 comments on commit 0458e45

Please sign in to comment.