Move Layouter into ModuleInfo

This commit is contained in:
Dzmitry Malyshau
2021-03-22 22:57:08 -04:00
committed by Dzmitry Malyshau
parent 15a1941d6a
commit 8712020115
13 changed files with 997 additions and 731 deletions

View File

@@ -260,7 +260,6 @@ pub struct Writer {
// so it may require us to duplicate the type!
struct_type_handles: crate::FastHashMap<Handle<crate::Type>, crate::StorageAccess>,
gl450_ext_inst_id: Word,
layouter: Layouter,
temp_chain: Vec<Word>,
}
@@ -291,7 +290,6 @@ impl Writer {
cached: CachedExpressions::default(),
struct_type_handles: crate::FastHashMap::default(),
gl450_ext_inst_id,
layouter: Layouter::default(),
temp_chain: Vec::new(),
})
}
@@ -322,12 +320,7 @@ impl Writer {
Ok(*e.get())
} else {
match lookup_ty {
LookupType::Handle(handle) => {
match self.physical_layout.make_local(&arena[handle].inner) {
Some(local) => self.get_type_id(arena, LookupType::Local(local)),
None => self.write_type_declaration_arena(arena, handle),
}
}
LookupType::Handle(_handle) => unreachable!("Handles are populated at start"),
LookupType::Local(local_ty) => self.write_type_declaration_local(arena, local_ty),
}
}
@@ -716,10 +709,28 @@ impl Writer {
fn write_type_declaration_arena(
&mut self,
arena: &Arena<crate::Type>,
layouter: &Layouter,
handle: Handle<crate::Type>,
) -> Result<Word, Error> {
let ty = &arena[handle];
if let Some(local) = self.physical_layout.make_local(&ty.inner) {
match self.lookup_type.entry(LookupType::Local(local)) {
// if it's already known as local, re-use it
Entry::Occupied(e) => {
let id = *e.into_mut();
self.lookup_type.insert(LookupType::Handle(handle), id);
return Ok(id);
}
// also register the type as "local", to avoid duplication
Entry::Vacant(e) => {
let id = self.id_count + 1; // has to match the next ID
e.insert(id);
}
}
}
let id = self.generate_id();
self.lookup_type.insert(LookupType::Handle(handle), id);
if self.flags.contains(WriterFlags::DEBUG) {
if let Some(ref name) = ty.name {
@@ -728,18 +739,7 @@ impl Writer {
}
let instruction = match ty.inner {
crate::TypeInner::Scalar { kind, width } => {
self.lookup_type.insert(
LookupType::Local(LocalType::Value {
vector_size: None,
kind,
width,
pointer_class: None,
}),
id,
);
self.write_scalar(id, kind, width)
}
crate::TypeInner::Scalar { kind, width } => self.write_scalar(id, kind, width),
crate::TypeInner::Vector { size, kind, width } => {
let scalar_id = self.get_type_id(
arena,
@@ -750,15 +750,6 @@ impl Writer {
pointer_class: None,
}),
)?;
self.lookup_type.insert(
LookupType::Local(LocalType::Value {
vector_size: Some(size),
kind,
width,
pointer_class: None,
}),
id,
);
Instruction::type_vector(id, scalar_id, size)
}
crate::TypeInner::Matrix {
@@ -769,20 +760,12 @@ impl Writer {
let vector_id = self.get_type_id(
arena,
LookupType::Local(LocalType::Value {
vector_size: Some(columns),
vector_size: Some(rows),
kind: crate::ScalarKind::Float,
width,
pointer_class: None,
}),
)?;
self.lookup_type.insert(
LookupType::Local(LocalType::Matrix {
columns,
rows,
width,
}),
id,
);
Instruction::type_matrix(id, vector_id, columns)
}
crate::TypeInner::Image {
@@ -842,7 +825,7 @@ impl Writer {
let mut current_offset = 0;
let mut member_ids = Vec::with_capacity(members.len());
for (index, member) in members.iter().enumerate() {
let (placement, _) = self.layouter.member_placement(current_offset, member);
let (placement, _) = layouter.member_placement(current_offset, member);
self.annotations.push(Instruction::member_decorate(
id,
index as u32,
@@ -901,13 +884,6 @@ impl Writer {
crate::TypeInner::Pointer { base, class } => {
let type_id = self.get_type_id(arena, LookupType::Handle(base))?;
let raw_class = self.physical_layout.map_storage_class(class);
self.lookup_type.insert(
LookupType::Local(LocalType::Pointer {
base,
class: raw_class,
}),
id,
);
Instruction::type_pointer(id, raw_class, type_id)
}
crate::TypeInner::ValuePointer {
@@ -926,106 +902,102 @@ impl Writer {
pointer_class: None,
}),
)?;
self.lookup_type.insert(
LookupType::Local(LocalType::Value {
vector_size: size,
kind,
width,
pointer_class: Some(raw_class),
}),
id,
);
Instruction::type_pointer(id, raw_class, type_id)
}
};
self.lookup_type.insert(LookupType::Handle(handle), id);
instruction.to_words(&mut self.logical_layout.declarations);
Ok(id)
}
fn write_constant_type(
fn write_constant_scalar(
&mut self,
id: Word,
inner: &crate::ConstantInner,
value: &crate::ScalarValue,
width: crate::Bytes,
types: &Arena<crate::Type>,
) -> Result<(), Error> {
let instruction = match *inner {
crate::ConstantInner::Scalar { width, ref value } => {
let type_id = self.get_type_id(
types,
LookupType::Local(LocalType::Value {
vector_size: None,
kind: value.scalar_kind(),
width,
pointer_class: None,
}),
)?;
let (solo, pair);
match *value {
crate::ScalarValue::Sint(val) => {
let words = match width {
4 => {
solo = [val as u32];
&solo[..]
}
8 => {
pair = [(val >> 32) as u32, val as u32];
&pair
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
let type_id = self.get_type_id(
types,
LookupType::Local(LocalType::Value {
vector_size: None,
kind: value.scalar_kind(),
width,
pointer_class: None,
}),
)?;
let (solo, pair);
let instruction = match *value {
crate::ScalarValue::Sint(val) => {
let words = match width {
4 => {
solo = [val as u32];
&solo[..]
}
crate::ScalarValue::Uint(val) => {
let words = match width {
4 => {
solo = [val as u32];
&solo[..]
}
8 => {
pair = [(val >> 32) as u32, val as u32];
&pair
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
8 => {
pair = [(val >> 32) as u32, val as u32];
&pair
}
crate::ScalarValue::Float(val) => {
let words = match width {
4 => {
solo = [(val as f32).to_bits()];
&solo[..]
}
8 => {
let bits = f64::to_bits(val);
pair = [(bits >> 32) as u32, bits as u32];
&pair
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
}
crate::ScalarValue::Bool(true) => Instruction::constant_true(type_id, id),
crate::ScalarValue::Bool(false) => Instruction::constant_false(type_id, id),
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
}
crate::ConstantInner::Composite { ty, ref components } => {
let mut constituent_ids = Vec::with_capacity(components.len());
for constituent in components.iter() {
let constituent_id = self.lookup_constant[constituent];
constituent_ids.push(constituent_id);
}
let type_id = self.get_type_id(types, LookupType::Handle(ty))?;
Instruction::constant_composite(type_id, id, constituent_ids.as_slice())
crate::ScalarValue::Uint(val) => {
let words = match width {
4 => {
solo = [val as u32];
&solo[..]
}
8 => {
pair = [(val >> 32) as u32, val as u32];
&pair
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
}
crate::ScalarValue::Float(val) => {
let words = match width {
4 => {
solo = [(val as f32).to_bits()];
&solo[..]
}
8 => {
let bits = f64::to_bits(val);
pair = [(bits >> 32) as u32, bits as u32];
&pair
}
_ => unreachable!(),
};
Instruction::constant(type_id, id, words)
}
crate::ScalarValue::Bool(true) => Instruction::constant_true(type_id, id),
crate::ScalarValue::Bool(false) => Instruction::constant_false(type_id, id),
};
instruction.to_words(&mut self.logical_layout.declarations);
Ok(())
}
fn write_constant_composite(
&mut self,
id: Word,
ty: Handle<crate::Type>,
components: &[Handle<crate::Constant>],
types: &Arena<crate::Type>,
) -> Result<(), Error> {
let mut constituent_ids = Vec::with_capacity(components.len());
for constituent in components.iter() {
let constituent_id = self.lookup_constant[constituent];
constituent_ids.push(constituent_id);
}
let type_id = self.get_type_id(types, LookupType::Handle(ty))?;
Instruction::constant_composite(type_id, id, constituent_ids.as_slice())
.to_words(&mut self.logical_layout.declarations);
Ok(())
}
fn write_varying(
&mut self,
ir_module: &crate::Module,
@@ -1108,9 +1080,8 @@ impl Writer {
fn write_global_variable(
&mut self,
ir_module: &crate::Module,
handle: Handle<crate::GlobalVariable>,
global_variable: &crate::GlobalVariable,
) -> Result<(Instruction, Word, spirv::StorageClass), Error> {
let global_variable = &ir_module.global_variables[handle];
let id = self.generate_id();
let class = self
@@ -1801,11 +1772,12 @@ impl Writer {
//TODO: cache this!
let zero_id = self.generate_id();
let zero_inner = crate::ConstantInner::Scalar {
width: 4,
value: crate::ScalarValue::Float(0.0),
};
self.write_constant_type(zero_id, &zero_inner, &ir_module.types)?;
self.write_constant_scalar(
zero_id,
&crate::ScalarValue::Float(0.0),
4,
&ir_module.types,
)?;
inst.add_operand(spirv::ImageOperands::LOD.bits());
inst.add_operand(zero_id);
@@ -2375,23 +2347,57 @@ impl Writer {
.push(Instruction::source(spirv::SourceLanguage::GLSL, 450));
}
// first, output all the scalar constants
for (handle, constant) in ir_module.constants.iter() {
let id = self.generate_id();
self.lookup_constant.insert(handle, id);
if self.flags.contains(WriterFlags::DEBUG) {
if let Some(ref name) = constant.name {
self.debugs.push(Instruction::name(id, name));
match constant.inner {
crate::ConstantInner::Composite { .. } => continue,
crate::ConstantInner::Scalar { width, ref value } => {
let id = self.generate_id();
self.lookup_constant.insert(handle, id);
if self.flags.contains(WriterFlags::DEBUG) {
if let Some(ref name) = constant.name {
self.debugs.push(Instruction::name(id, name));
}
}
self.write_constant_scalar(id, value, width, &ir_module.types)?;
}
}
self.write_constant_type(id, &constant.inner, &ir_module.types)?;
}
self.global_variables.clear();
for (handle, var) in ir_module.global_variables.iter() {
// then gather the struct type handles, then affect types
self.struct_type_handles.clear();
for (_, var) in ir_module.global_variables.iter() {
if let crate::TypeInner::Struct { .. } = ir_module.types[var.ty].inner {
self.struct_type_handles.insert(var.ty, var.storage_access);
}
let (instruction, id, class) = self.write_global_variable(ir_module, handle)?;
}
// then all types, some of them may rely on constants and struct type set
for (handle, _) in ir_module.types.iter() {
self.write_type_declaration_arena(&ir_module.types, &mod_info.layouter, handle)?;
}
// the all the composite constants, they rely on types
for (handle, constant) in ir_module.constants.iter() {
match constant.inner {
crate::ConstantInner::Scalar { .. } => continue,
crate::ConstantInner::Composite { ty, ref components } => {
let id = self.generate_id();
self.lookup_constant.insert(handle, id);
if self.flags.contains(WriterFlags::DEBUG) {
if let Some(ref name) = constant.name {
self.debugs.push(Instruction::name(id, name));
}
}
self.write_constant_composite(id, ty, components, &ir_module.types)?;
}
}
}
// now write all globals
self.global_variables.clear();
for (_, var) in ir_module.global_variables.iter() {
let (instruction, id, class) = self.write_global_variable(ir_module, var)?;
instruction.to_words(&mut self.logical_layout.declarations);
self.global_variables.push(GlobalVariable {
id,
@@ -2400,12 +2406,14 @@ impl Writer {
});
}
// all functions
for (handle, ir_function) in ir_module.functions.iter() {
let info = &mod_info[handle];
let id = self.write_function(ir_function, info, ir_module, None)?;
self.lookup_function.insert(handle, id);
}
// and entry points
for (ep_index, ir_ep) in ir_module.entry_points.iter().enumerate() {
let info = mod_info.get_entry_point(ep_index);
let ep_instruction = self.write_entry_point(ir_ep, info, ir_module)?;
@@ -2447,9 +2455,6 @@ impl Writer {
self.lookup_function_type.clear();
self.lookup_function_call.clear();
self.layouter
.initialize(&ir_module.types, &ir_module.constants);
self.write_logical_layout(ir_module, info)?;
self.write_physical_layout();

View File

@@ -5,6 +5,8 @@ pub type Alignment = NonZeroU32;
/// Alignment information for a type.
#[derive(Clone, Copy, Debug, Hash, PartialEq)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
pub struct TypeLayout {
pub size: u32,
pub alignment: Alignment,
@@ -14,6 +16,8 @@ pub struct TypeLayout {
/// It uses the default layout algorithm/table, described in
/// https://github.com/gpuweb/gpuweb/issues/1393
#[derive(Debug, Default)]
#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
pub struct Layouter {
layouts: Vec<TypeLayout>,
}

View File

@@ -5,7 +5,7 @@ mod namer;
mod terminator;
mod typifier;
pub use layouter::{Alignment, Layouter};
pub use layouter::{Alignment, Layouter, TypeLayout};
pub use namer::{EntryPointIndex, NameKey, Namer};
pub use terminator::ensure_block_returns;
pub use typifier::{ResolveContext, ResolveError, TypeResolution};

View File

@@ -715,13 +715,6 @@ impl ModuleInfo {
}
}
impl ops::Index<Handle<crate::Function>> for ModuleInfo {
type Output = FunctionInfo;
fn index(&self, handle: Handle<crate::Function>) -> &FunctionInfo {
&self.functions[handle.index()]
}
}
#[test]
fn uniform_control_flow() {
use crate::{Expression as E, Statement as S};

View File

@@ -10,9 +10,11 @@ use crate::{
FastHashSet,
};
use bit_set::BitSet;
use std::ops;
//TODO: analyze the model at the same time as we validate it,
// merge the corresponding matches over expressions and statements.
pub use analyzer::{ExpressionInfo, FunctionInfo, GlobalUse, Uniformity, UniformityRequirements};
pub use expression::ExpressionError;
pub use function::{CallError, FunctionError, LocalVariableError};
@@ -35,6 +37,14 @@ bitflags::bitflags! {
pub struct ModuleInfo {
functions: Vec<FunctionInfo>,
entry_points: Vec<FunctionInfo>,
pub layouter: Layouter,
}
impl ops::Index<Handle<crate::Function>> for ModuleInfo {
type Output = FunctionInfo;
fn index(&self, handle: Handle<crate::Function>) -> &Self::Output {
&self.functions[handle.index()]
}
}
#[derive(Debug)]
@@ -174,10 +184,6 @@ impl Validator {
pub fn validate(&mut self, module: &crate::Module) -> Result<ModuleInfo, ValidationError> {
self.reset_types(module.types.len());
let mut mod_info = ModuleInfo {
functions: Vec::with_capacity(module.functions.len()),
entry_points: Vec::with_capacity(module.entry_points.len()),
};
let layouter = Layouter::new(&module.types, &module.constants);
for (handle, constant) in module.constants.iter() {
@@ -210,6 +216,12 @@ impl Validator {
})?;
}
let mut mod_info = ModuleInfo {
functions: Vec::with_capacity(module.functions.len()),
entry_points: Vec::with_capacity(module.entry_points.len()),
layouter,
};
for (handle, fun) in module.functions.iter() {
match self.validate_function(fun, module, &mod_info) {
Ok(info) => mod_info.functions.push(info),

View File

@@ -13,55 +13,55 @@ OpEntryPoint GLCompute %43 "main" %40
OpExecutionMode %43 LocalSize 64 1 1
OpSource GLSL 450
OpName %3 "NUM_PARTICLES"
OpName %16 "SimParams"
OpMemberName %16 0 "deltaT"
OpMemberName %16 1 "rule1Distance"
OpMemberName %16 2 "rule2Distance"
OpMemberName %16 3 "rule3Distance"
OpMemberName %16 4 "rule1Scale"
OpMemberName %16 5 "rule2Scale"
OpMemberName %16 6 "rule3Scale"
OpName %15 "params"
OpName %16 "Particle"
OpMemberName %16 0 "pos"
OpMemberName %16 1 "vel"
OpName %17 "SimParams"
OpMemberName %17 0 "deltaT"
OpMemberName %17 1 "rule1Distance"
OpMemberName %17 2 "rule2Distance"
OpMemberName %17 3 "rule3Distance"
OpMemberName %17 4 "rule1Scale"
OpMemberName %17 5 "rule2Scale"
OpMemberName %17 6 "rule3Scale"
OpName %19 "Particles"
OpMemberName %19 0 "particles"
OpName %21 "Particle"
OpMemberName %21 0 "pos"
OpMemberName %21 1 "vel"
OpName %18 "particlesSrc"
OpName %24 "particlesDst"
OpName %25 "vPos"
OpName %27 "vVel"
OpName %28 "cMass"
OpName %29 "cVel"
OpName %30 "colVel"
OpName %31 "cMassCount"
OpName %33 "cVelCount"
OpName %34 "pos"
OpName %35 "vel"
OpName %36 "i"
OpName %21 "params"
OpName %23 "particlesSrc"
OpName %25 "particlesDst"
OpName %26 "vPos"
OpName %28 "vVel"
OpName %29 "cMass"
OpName %30 "cVel"
OpName %31 "colVel"
OpName %32 "cMassCount"
OpName %34 "cVelCount"
OpName %35 "pos"
OpName %36 "vel"
OpName %37 "i"
OpName %40 "global_invocation_id"
OpName %43 "main"
OpName %43 "main"
OpDecorate %16 Block
OpMemberDecorate %16 0 Offset 0
OpMemberDecorate %16 1 Offset 4
OpMemberDecorate %16 2 Offset 8
OpMemberDecorate %16 3 Offset 12
OpMemberDecorate %16 4 Offset 16
OpMemberDecorate %16 5 Offset 20
OpMemberDecorate %16 6 Offset 24
OpDecorate %15 DescriptorSet 0
OpDecorate %15 Binding 0
OpMemberDecorate %16 1 Offset 8
OpDecorate %17 Block
OpMemberDecorate %17 0 Offset 0
OpMemberDecorate %17 1 Offset 4
OpMemberDecorate %17 2 Offset 8
OpMemberDecorate %17 3 Offset 12
OpMemberDecorate %17 4 Offset 16
OpMemberDecorate %17 5 Offset 20
OpMemberDecorate %17 6 Offset 24
OpDecorate %18 ArrayStride 16
OpDecorate %19 BufferBlock
OpMemberDecorate %19 0 Offset 0
OpDecorate %20 ArrayStride 16
OpMemberDecorate %21 0 Offset 0
OpMemberDecorate %21 1 Offset 8
OpDecorate %18 NonWritable
OpDecorate %18 DescriptorSet 0
OpDecorate %18 Binding 1
OpDecorate %24 DescriptorSet 0
OpDecorate %24 Binding 2
OpDecorate %21 DescriptorSet 0
OpDecorate %21 Binding 0
OpDecorate %23 NonWritable
OpDecorate %23 DescriptorSet 0
OpDecorate %23 Binding 1
OpDecorate %25 DescriptorSet 0
OpDecorate %25 Binding 2
OpDecorate %40 BuiltIn GlobalInvocationId
%2 = OpTypeVoid
%4 = OpTypeInt 32 0
@@ -76,27 +76,27 @@ OpDecorate %40 BuiltIn GlobalInvocationId
%12 = OpConstant %6 1.0
%13 = OpConstant %6 0.1
%14 = OpConstant %6 -1.0
%16 = OpTypeStruct %6 %6 %6 %6 %6 %6 %6
%17 = OpTypePointer Uniform %16
%15 = OpVariable %17 Uniform
%22 = OpTypeVector %6 2
%21 = OpTypeStruct %22 %22
%20 = OpTypeRuntimeArray %21
%19 = OpTypeStruct %20
%23 = OpTypePointer Uniform %19
%18 = OpVariable %23 Uniform
%24 = OpVariable %23 Uniform
%26 = OpTypePointer Function %22
%32 = OpTypePointer Function %8
%37 = OpTypePointer Function %4
%39 = OpTypeVector %4 3
%41 = OpTypePointer Input %39
%15 = OpTypeVector %6 2
%16 = OpTypeStruct %15 %15
%17 = OpTypeStruct %6 %6 %6 %6 %6 %6 %6
%18 = OpTypeRuntimeArray %16
%19 = OpTypeStruct %18
%20 = OpTypeVector %4 3
%22 = OpTypePointer Uniform %17
%21 = OpVariable %22 Uniform
%24 = OpTypePointer Uniform %19
%23 = OpVariable %24 Uniform
%25 = OpVariable %24 Uniform
%27 = OpTypePointer Function %15
%33 = OpTypePointer Function %8
%38 = OpTypePointer Function %4
%41 = OpTypePointer Input %20
%40 = OpVariable %41 Input
%44 = OpTypeFunction %2
%47 = OpTypeBool
%51 = OpTypePointer Uniform %20
%52 = OpTypePointer Uniform %21
%53 = OpTypePointer Uniform %22
%51 = OpTypePointer Uniform %18
%52 = OpTypePointer Uniform %16
%53 = OpTypePointer Uniform %15
%54 = OpConstant %8 0
%55 = OpConstant %8 0
%58 = OpConstant %8 1
@@ -123,18 +123,18 @@ OpDecorate %40 BuiltIn GlobalInvocationId
%218 = OpConstant %8 1
%219 = OpConstant %8 0
%43 = OpFunction %2 None %44
%38 = OpLabel
%36 = OpVariable %37 Function %9
%33 = OpVariable %32 Function %7
%29 = OpVariable %26 Function
%25 = OpVariable %26 Function
%34 = OpVariable %26 Function
%30 = OpVariable %26 Function
%27 = OpVariable %26 Function
%35 = OpVariable %26 Function
%31 = OpVariable %32 Function %7
%28 = OpVariable %26 Function
%42 = OpLoad %39 %40
%39 = OpLabel
%37 = OpVariable %38 Function %9
%34 = OpVariable %33 Function %7
%30 = OpVariable %27 Function
%26 = OpVariable %27 Function
%35 = OpVariable %27 Function
%31 = OpVariable %27 Function
%28 = OpVariable %27 Function
%36 = OpVariable %27 Function
%32 = OpVariable %33 Function %7
%29 = OpVariable %27 Function
%42 = OpLoad %20 %40
OpBranch %45
%45 = OpLabel
%46 = OpCompositeExtract %4 %42 0
@@ -144,209 +144,209 @@ OpBranchConditional %48 %50 %49
%50 = OpLabel
OpReturn
%49 = OpLabel
%56 = OpAccessChain %53 %18 %55 %46 %54
%57 = OpLoad %22 %56
OpStore %25 %57
%60 = OpAccessChain %53 %18 %59 %46 %58
%61 = OpLoad %22 %60
OpStore %27 %61
%62 = OpCompositeConstruct %22 %5 %5
OpStore %28 %62
%63 = OpCompositeConstruct %22 %5 %5
OpStore %29 %63
%64 = OpCompositeConstruct %22 %5 %5
OpStore %30 %64
%56 = OpAccessChain %53 %23 %55 %46 %54
%57 = OpLoad %15 %56
OpStore %26 %57
%60 = OpAccessChain %53 %23 %59 %46 %58
%61 = OpLoad %15 %60
OpStore %28 %61
%62 = OpCompositeConstruct %15 %5 %5
OpStore %29 %62
%63 = OpCompositeConstruct %15 %5 %5
OpStore %30 %63
%64 = OpCompositeConstruct %15 %5 %5
OpStore %31 %64
OpBranch %65
%65 = OpLabel
OpLoopMerge %66 %68 None
OpBranch %67
%67 = OpLabel
%69 = OpLoad %4 %36
%69 = OpLoad %4 %37
%70 = OpUGreaterThanEqual %47 %69 %3
OpSelectionMerge %71 None
OpBranchConditional %70 %72 %71
%72 = OpLabel
OpBranch %66
%71 = OpLabel
%73 = OpLoad %4 %36
%73 = OpLoad %4 %37
%74 = OpIEqual %47 %73 %46
OpSelectionMerge %75 None
OpBranchConditional %74 %76 %75
%76 = OpLabel
OpBranch %68
%75 = OpLabel
%77 = OpLoad %4 %36
%80 = OpAccessChain %53 %18 %79 %77 %78
%81 = OpLoad %22 %80
OpStore %34 %81
%82 = OpLoad %4 %36
%85 = OpAccessChain %53 %18 %84 %82 %83
%86 = OpLoad %22 %85
OpStore %35 %86
%87 = OpLoad %22 %34
%88 = OpLoad %22 %25
%77 = OpLoad %4 %37
%80 = OpAccessChain %53 %23 %79 %77 %78
%81 = OpLoad %15 %80
OpStore %35 %81
%82 = OpLoad %4 %37
%85 = OpAccessChain %53 %23 %84 %82 %83
%86 = OpLoad %15 %85
OpStore %36 %86
%87 = OpLoad %15 %35
%88 = OpLoad %15 %26
%89 = OpExtInst %6 %1 Distance %87 %88
%92 = OpAccessChain %90 %15 %91
%92 = OpAccessChain %90 %21 %91
%93 = OpLoad %6 %92
%94 = OpFOrdLessThan %47 %89 %93
OpSelectionMerge %95 None
OpBranchConditional %94 %96 %95
%96 = OpLabel
%97 = OpLoad %22 %28
%98 = OpLoad %22 %34
%99 = OpFAdd %22 %97 %98
OpStore %28 %99
%100 = OpLoad %8 %31
%97 = OpLoad %15 %29
%98 = OpLoad %15 %35
%99 = OpFAdd %15 %97 %98
OpStore %29 %99
%100 = OpLoad %8 %32
%101 = OpIAdd %8 %100 %10
OpStore %31 %101
OpStore %32 %101
OpBranch %95
%95 = OpLabel
%102 = OpLoad %22 %34
%103 = OpLoad %22 %25
%102 = OpLoad %15 %35
%103 = OpLoad %15 %26
%104 = OpExtInst %6 %1 Distance %102 %103
%106 = OpAccessChain %90 %15 %105
%106 = OpAccessChain %90 %21 %105
%107 = OpLoad %6 %106
%108 = OpFOrdLessThan %47 %104 %107
OpSelectionMerge %109 None
OpBranchConditional %108 %110 %109
%110 = OpLabel
%111 = OpLoad %22 %30
%112 = OpLoad %22 %34
%113 = OpLoad %22 %25
%114 = OpFSub %22 %112 %113
%115 = OpFSub %22 %111 %114
OpStore %30 %115
%111 = OpLoad %15 %31
%112 = OpLoad %15 %35
%113 = OpLoad %15 %26
%114 = OpFSub %15 %112 %113
%115 = OpFSub %15 %111 %114
OpStore %31 %115
OpBranch %109
%109 = OpLabel
%116 = OpLoad %22 %34
%117 = OpLoad %22 %25
%116 = OpLoad %15 %35
%117 = OpLoad %15 %26
%118 = OpExtInst %6 %1 Distance %116 %117
%120 = OpAccessChain %90 %15 %119
%120 = OpAccessChain %90 %21 %119
%121 = OpLoad %6 %120
%122 = OpFOrdLessThan %47 %118 %121
OpSelectionMerge %123 None
OpBranchConditional %122 %124 %123
%124 = OpLabel
%125 = OpLoad %22 %29
%126 = OpLoad %22 %35
%127 = OpFAdd %22 %125 %126
OpStore %29 %127
%128 = OpLoad %8 %33
%125 = OpLoad %15 %30
%126 = OpLoad %15 %36
%127 = OpFAdd %15 %125 %126
OpStore %30 %127
%128 = OpLoad %8 %34
%129 = OpIAdd %8 %128 %10
OpStore %33 %129
OpStore %34 %129
OpBranch %123
%123 = OpLabel
OpBranch %68
%68 = OpLabel
%130 = OpLoad %4 %36
%130 = OpLoad %4 %37
%131 = OpIAdd %4 %130 %11
OpStore %36 %131
OpStore %37 %131
OpBranch %65
%66 = OpLabel
%132 = OpLoad %8 %31
%132 = OpLoad %8 %32
%133 = OpSGreaterThan %47 %132 %7
OpSelectionMerge %134 None
OpBranchConditional %133 %135 %134
%135 = OpLabel
%136 = OpLoad %22 %28
%137 = OpLoad %8 %31
%136 = OpLoad %15 %29
%137 = OpLoad %8 %32
%138 = OpConvertSToF %6 %137
%139 = OpFDiv %6 %12 %138
%140 = OpVectorTimesScalar %22 %136 %139
%141 = OpLoad %22 %25
%142 = OpFSub %22 %140 %141
OpStore %28 %142
%140 = OpVectorTimesScalar %15 %136 %139
%141 = OpLoad %15 %26
%142 = OpFSub %15 %140 %141
OpStore %29 %142
OpBranch %134
%134 = OpLabel
%143 = OpLoad %8 %33
%143 = OpLoad %8 %34
%144 = OpSGreaterThan %47 %143 %7
OpSelectionMerge %145 None
OpBranchConditional %144 %146 %145
%146 = OpLabel
%147 = OpLoad %22 %29
%148 = OpLoad %8 %33
%147 = OpLoad %15 %30
%148 = OpLoad %8 %34
%149 = OpConvertSToF %6 %148
%150 = OpFDiv %6 %12 %149
%151 = OpVectorTimesScalar %22 %147 %150
OpStore %29 %151
%151 = OpVectorTimesScalar %15 %147 %150
OpStore %30 %151
OpBranch %145
%145 = OpLabel
%152 = OpLoad %22 %27
%153 = OpLoad %22 %28
%155 = OpAccessChain %90 %15 %154
%152 = OpLoad %15 %28
%153 = OpLoad %15 %29
%155 = OpAccessChain %90 %21 %154
%156 = OpLoad %6 %155
%157 = OpVectorTimesScalar %22 %153 %156
%158 = OpFAdd %22 %152 %157
%159 = OpLoad %22 %30
%161 = OpAccessChain %90 %15 %160
%157 = OpVectorTimesScalar %15 %153 %156
%158 = OpFAdd %15 %152 %157
%159 = OpLoad %15 %31
%161 = OpAccessChain %90 %21 %160
%162 = OpLoad %6 %161
%163 = OpVectorTimesScalar %22 %159 %162
%164 = OpFAdd %22 %158 %163
%165 = OpLoad %22 %29
%167 = OpAccessChain %90 %15 %166
%163 = OpVectorTimesScalar %15 %159 %162
%164 = OpFAdd %15 %158 %163
%165 = OpLoad %15 %30
%167 = OpAccessChain %90 %21 %166
%168 = OpLoad %6 %167
%169 = OpVectorTimesScalar %22 %165 %168
%170 = OpFAdd %22 %164 %169
OpStore %27 %170
%171 = OpLoad %22 %27
%172 = OpExtInst %22 %1 Normalize %171
%173 = OpLoad %22 %27
%169 = OpVectorTimesScalar %15 %165 %168
%170 = OpFAdd %15 %164 %169
OpStore %28 %170
%171 = OpLoad %15 %28
%172 = OpExtInst %15 %1 Normalize %171
%173 = OpLoad %15 %28
%174 = OpExtInst %6 %1 Length %173
%175 = OpExtInst %6 %1 FClamp %174 %5 %13
%176 = OpVectorTimesScalar %22 %172 %175
OpStore %27 %176
%177 = OpLoad %22 %25
%178 = OpLoad %22 %27
%180 = OpAccessChain %90 %15 %179
%176 = OpVectorTimesScalar %15 %172 %175
OpStore %28 %176
%177 = OpLoad %15 %26
%178 = OpLoad %15 %28
%180 = OpAccessChain %90 %21 %179
%181 = OpLoad %6 %180
%182 = OpVectorTimesScalar %22 %178 %181
%183 = OpFAdd %22 %177 %182
OpStore %25 %183
%184 = OpLoad %22 %25
%182 = OpVectorTimesScalar %15 %178 %181
%183 = OpFAdd %15 %177 %182
OpStore %26 %183
%184 = OpLoad %15 %26
%185 = OpCompositeExtract %6 %184 0
%186 = OpFOrdLessThan %47 %185 %14
OpSelectionMerge %187 None
OpBranchConditional %186 %188 %187
%188 = OpLabel
%191 = OpAccessChain %189 %25 %190
%191 = OpAccessChain %189 %26 %190
OpStore %191 %12
OpBranch %187
%187 = OpLabel
%192 = OpLoad %22 %25
%192 = OpLoad %15 %26
%193 = OpCompositeExtract %6 %192 0
%194 = OpFOrdGreaterThan %47 %193 %12
OpSelectionMerge %195 None
OpBranchConditional %194 %196 %195
%196 = OpLabel
%198 = OpAccessChain %189 %25 %197
%198 = OpAccessChain %189 %26 %197
OpStore %198 %14
OpBranch %195
%195 = OpLabel
%199 = OpLoad %22 %25
%199 = OpLoad %15 %26
%200 = OpCompositeExtract %6 %199 1
%201 = OpFOrdLessThan %47 %200 %14
OpSelectionMerge %202 None
OpBranchConditional %201 %203 %202
%203 = OpLabel
%205 = OpAccessChain %189 %25 %204
%205 = OpAccessChain %189 %26 %204
OpStore %205 %12
OpBranch %202
%202 = OpLabel
%206 = OpLoad %22 %25
%206 = OpLoad %15 %26
%207 = OpCompositeExtract %6 %206 1
%208 = OpFOrdGreaterThan %47 %207 %12
OpSelectionMerge %209 None
OpBranchConditional %208 %210 %209
%210 = OpLabel
%212 = OpAccessChain %189 %25 %211
%212 = OpAccessChain %189 %26 %211
OpStore %212 %14
OpBranch %209
%209 = OpLabel
%213 = OpLoad %22 %25
%216 = OpAccessChain %53 %24 %215 %46 %214
%213 = OpLoad %15 %26
%216 = OpAccessChain %53 %25 %215 %46 %214
OpStore %216 %213
%217 = OpLoad %22 %27
%220 = OpAccessChain %53 %24 %219 %46 %218
%217 = OpLoad %15 %28
%220 = OpAccessChain %53 %25 %219 %46 %218
OpStore %220 %217
OpReturn
OpFunctionEnd

View File

@@ -498,4 +498,24 @@ expression: output
],
),
],
layouter: (
layouts: [
(
size: 4,
alignment: 4,
),
(
size: 4,
alignment: 4,
),
(
size: 4,
alignment: 4,
),
(
size: 12,
alignment: 16,
),
],
),
)

View File

@@ -14,18 +14,18 @@ OpExecutionMode %48 LocalSize 1 1 1
OpSource GLSL 450
OpName %9 "PrimeIndices"
OpMemberName %9 0 "data"
OpName %8 "v_indices"
OpName %12 "n"
OpName %14 "i"
OpName %17 "collatz_iterations"
OpName %11 "v_indices"
OpName %13 "n"
OpName %15 "i"
OpName %18 "collatz_iterations"
OpName %45 "global_id"
OpName %48 "main"
OpName %48 "main"
OpDecorate %8 ArrayStride 4
OpDecorate %9 BufferBlock
OpMemberDecorate %9 0 Offset 0
OpDecorate %10 ArrayStride 4
OpDecorate %8 DescriptorSet 0
OpDecorate %8 Binding 0
OpDecorate %11 DescriptorSet 0
OpDecorate %11 Binding 0
OpDecorate %45 BuiltIn GlobalInvocationId
%2 = OpTypeVoid
%4 = OpTypeInt 32 0
@@ -33,80 +33,80 @@ OpDecorate %45 BuiltIn GlobalInvocationId
%5 = OpConstant %4 1
%6 = OpConstant %4 2
%7 = OpConstant %4 3
%10 = OpTypeRuntimeArray %4
%9 = OpTypeStruct %10
%11 = OpTypePointer Uniform %9
%8 = OpVariable %11 Uniform
%13 = OpTypePointer Function %4
%18 = OpTypeFunction %4 %4
%25 = OpTypeBool
%44 = OpTypeVector %4 3
%46 = OpTypePointer Input %44
%8 = OpTypeRuntimeArray %4
%9 = OpTypeStruct %8
%10 = OpTypeVector %4 3
%12 = OpTypePointer Uniform %9
%11 = OpVariable %12 Uniform
%14 = OpTypePointer Function %4
%19 = OpTypeFunction %4 %4
%26 = OpTypeBool
%46 = OpTypePointer Input %10
%45 = OpVariable %46 Input
%49 = OpTypeFunction %2
%51 = OpTypePointer Uniform %10
%51 = OpTypePointer Uniform %8
%53 = OpTypePointer Uniform %4
%55 = OpTypeInt 32 1
%56 = OpConstant %55 0
%60 = OpConstant %55 0
%17 = OpFunction %4 None %18
%16 = OpFunctionParameter %4
%15 = OpLabel
%12 = OpVariable %13 Function
%14 = OpVariable %13 Function %3
OpBranch %19
%19 = OpLabel
OpStore %12 %16
%18 = OpFunction %4 None %19
%17 = OpFunctionParameter %4
%16 = OpLabel
%13 = OpVariable %14 Function
%15 = OpVariable %14 Function %3
OpBranch %20
%20 = OpLabel
OpLoopMerge %21 %23 None
OpBranch %22
%22 = OpLabel
%24 = OpLoad %4 %12
%26 = OpULessThanEqual %25 %24 %5
OpSelectionMerge %27 None
OpBranchConditional %26 %28 %27
%28 = OpLabel
OpStore %13 %17
OpBranch %21
%27 = OpLabel
%29 = OpLoad %4 %12
%30 = OpUMod %4 %29 %6
%31 = OpIEqual %25 %30 %3
OpSelectionMerge %32 None
OpBranchConditional %31 %33 %34
%33 = OpLabel
%35 = OpLoad %4 %12
%36 = OpUDiv %4 %35 %6
OpStore %12 %36
OpBranch %32
%34 = OpLabel
%37 = OpLoad %4 %12
%38 = OpIMul %4 %7 %37
%39 = OpIAdd %4 %38 %5
OpStore %12 %39
OpBranch %32
%32 = OpLabel
%40 = OpLoad %4 %14
%41 = OpIAdd %4 %40 %5
OpStore %14 %41
%21 = OpLabel
OpLoopMerge %22 %24 None
OpBranch %23
%23 = OpLabel
OpBranch %20
%21 = OpLabel
%42 = OpLoad %4 %14
OpReturnValue %42
%25 = OpLoad %4 %13
%27 = OpULessThanEqual %26 %25 %5
OpSelectionMerge %28 None
OpBranchConditional %27 %29 %28
%29 = OpLabel
OpBranch %22
%28 = OpLabel
%30 = OpLoad %4 %13
%31 = OpUMod %4 %30 %6
%32 = OpIEqual %26 %31 %3
OpSelectionMerge %33 None
OpBranchConditional %32 %34 %35
%34 = OpLabel
%36 = OpLoad %4 %13
%37 = OpUDiv %4 %36 %6
OpStore %13 %37
OpBranch %33
%35 = OpLabel
%38 = OpLoad %4 %13
%39 = OpIMul %4 %7 %38
%40 = OpIAdd %4 %39 %5
OpStore %13 %40
OpBranch %33
%33 = OpLabel
%41 = OpLoad %4 %15
%42 = OpIAdd %4 %41 %5
OpStore %15 %42
OpBranch %24
%24 = OpLabel
OpBranch %21
%22 = OpLabel
%43 = OpLoad %4 %15
OpReturnValue %43
OpFunctionEnd
%48 = OpFunction %2 None %49
%43 = OpLabel
%47 = OpLoad %44 %45
%44 = OpLabel
%47 = OpLoad %10 %45
OpBranch %50
%50 = OpLabel
%52 = OpCompositeExtract %4 %47 0
%54 = OpCompositeExtract %4 %47 0
%57 = OpAccessChain %53 %8 %56 %54
%57 = OpAccessChain %53 %11 %56 %54
%58 = OpLoad %4 %57
%59 = OpFunctionCall %4 %17 %58
%61 = OpAccessChain %53 %8 %60 %52
%59 = OpFunctionCall %4 %18 %58
%61 = OpAccessChain %53 %11 %60 %52
OpStore %61 %59
OpReturn
OpFunctionEnd

View File

@@ -14,10 +14,10 @@ OpEntryPoint Fragment %47 "main" %44 %46
OpExecutionMode %47 OriginUpperLeft
OpSource GLSL 450
OpName %3 "c_scale"
OpName %7 "u_texture"
OpName %10 "u_sampler"
OpName %13 "out"
OpName %14 "VertexOutput"
OpName %9 "VertexOutput"
OpName %12 "u_texture"
OpName %14 "u_sampler"
OpName %16 "out"
OpName %19 "pos"
OpName %22 "uv"
OpName %24 "uv"
@@ -27,10 +27,10 @@ OpName %28 "main"
OpName %44 "uv"
OpName %47 "main"
OpName %47 "main"
OpDecorate %7 DescriptorSet 0
OpDecorate %7 Binding 0
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 1
OpDecorate %12 DescriptorSet 0
OpDecorate %12 Binding 0
OpDecorate %14 DescriptorSet 0
OpDecorate %14 Binding 1
OpDecorate %19 Location 0
OpDecorate %22 Location 1
OpDecorate %24 Location 0
@@ -42,62 +42,62 @@ OpDecorate %46 Location 0
%3 = OpConstant %4 1.2
%5 = OpConstant %4 0.0
%6 = OpConstant %4 1.0
%8 = OpTypeImage %4 2D 0 0 0 1 Unknown
%9 = OpTypePointer UniformConstant %8
%7 = OpVariable %9 UniformConstant
%7 = OpTypeVector %4 2
%8 = OpTypeVector %4 4
%9 = OpTypeStruct %7 %8
%10 = OpTypeImage %4 2D 0 0 0 1 Unknown
%11 = OpTypeSampler
%12 = OpTypePointer UniformConstant %11
%10 = OpVariable %12 UniformConstant
%15 = OpTypeVector %4 2
%16 = OpTypeVector %4 4
%14 = OpTypeStruct %15 %16
%17 = OpTypePointer Function %14
%20 = OpTypePointer Input %15
%13 = OpTypePointer UniformConstant %10
%12 = OpVariable %13 UniformConstant
%15 = OpTypePointer UniformConstant %11
%14 = OpVariable %15 UniformConstant
%17 = OpTypePointer Function %9
%20 = OpTypePointer Input %7
%19 = OpVariable %20 Input
%22 = OpVariable %20 Input
%25 = OpTypePointer Output %15
%25 = OpTypePointer Output %7
%24 = OpVariable %25 Output
%27 = OpTypePointer Output %16
%27 = OpTypePointer Output %8
%26 = OpVariable %27 Output
%29 = OpTypeFunction %2
%31 = OpTypePointer Function %15
%31 = OpTypePointer Function %7
%32 = OpTypeInt 32 1
%33 = OpConstant %32 0
%35 = OpTypePointer Function %16
%35 = OpTypePointer Function %8
%38 = OpConstant %32 1
%44 = OpVariable %20 Input
%46 = OpVariable %27 Output
%51 = OpTypeSampledImage %8
%51 = OpTypeSampledImage %10
%55 = OpTypeBool
%28 = OpFunction %2 None %29
%18 = OpLabel
%13 = OpVariable %17 Function
%21 = OpLoad %15 %19
%23 = OpLoad %15 %22
%16 = OpVariable %17 Function
%21 = OpLoad %7 %19
%23 = OpLoad %7 %22
OpBranch %30
%30 = OpLabel
%34 = OpAccessChain %31 %13 %33
%34 = OpAccessChain %31 %16 %33
OpStore %34 %23
%36 = OpVectorTimesScalar %15 %21 %3
%37 = OpCompositeConstruct %16 %36 %5 %6
%39 = OpAccessChain %35 %13 %38
%36 = OpVectorTimesScalar %7 %21 %3
%37 = OpCompositeConstruct %8 %36 %5 %6
%39 = OpAccessChain %35 %16 %38
OpStore %39 %37
%40 = OpLoad %14 %13
%41 = OpCompositeExtract %15 %40 0
%40 = OpLoad %9 %16
%41 = OpCompositeExtract %7 %40 0
OpStore %24 %41
%42 = OpCompositeExtract %16 %40 1
%42 = OpCompositeExtract %8 %40 1
OpStore %26 %42
OpReturn
OpFunctionEnd
%47 = OpFunction %2 None %29
%43 = OpLabel
%45 = OpLoad %15 %44
%48 = OpLoad %8 %7
%49 = OpLoad %11 %10
%45 = OpLoad %7 %44
%48 = OpLoad %10 %12
%49 = OpLoad %11 %14
OpBranch %50
%50 = OpLabel
%52 = OpSampledImage %51 %48 %49
%53 = OpImageSampleImplicitLod %16 %52 %45
%53 = OpImageSampleImplicitLod %8 %52 %45
%54 = OpCompositeExtract %4 %53 3
%56 = OpFOrdEqual %55 %54 %5
OpSelectionMerge %57 None
@@ -106,7 +106,7 @@ OpBranchConditional %56 %58 %57
OpKill
%57 = OpLabel
%59 = OpCompositeExtract %4 %53 3
%60 = OpVectorTimesScalar %16 %53 %59
%60 = OpVectorTimesScalar %8 %53 %59
OpStore %46 %60
OpReturn
OpFunctionEnd

View File

@@ -2749,4 +2749,236 @@ expression: output
],
),
],
layouter: (
layouts: [
(
size: 4,
alignment: 4,
),
(
size: 12,
alignment: 16,
),
(
size: 4,
alignment: 4,
),
(
size: 16,
alignment: 16,
),
(
size: 1,
alignment: 1,
),
(
size: 8,
alignment: 8,
),
(
size: 0,
alignment: 1,
),
(
size: 0,
alignment: 1,
),
(
size: 8,
alignment: 8,
),
(
size: 4,
alignment: 4,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 16,
alignment: 16,
),
(
size: 16,
alignment: 16,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 64,
alignment: 16,
),
(
size: 96,
alignment: 16,
),
(
size: 96,
alignment: 96,
),
(
size: 96,
alignment: 96,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 4,
alignment: 1,
),
(
size: 0,
alignment: 1,
),
(
size: 0,
alignment: 1,
),
],
),
)

View File

@@ -12,46 +12,46 @@ OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %81 "fs_main" %73 %76 %79
OpExecutionMode %81 OriginUpperLeft
OpSource GLSL 450
OpName %9 "c_ambient"
OpName %11 "c_max_lights"
OpName %16 "Globals"
OpMemberName %16 0 "num_lights"
OpName %15 "u_globals"
OpName %20 "Lights"
OpMemberName %20 0 "data"
OpName %22 "Light"
OpMemberName %22 0 "proj"
OpMemberName %22 1 "pos"
OpMemberName %22 2 "color"
OpName %19 "s_lights"
OpName %26 "t_shadow"
OpName %29 "sampler_shadow"
OpName %35 "fetch_shadow"
OpName %9 "c_max_lights"
OpName %14 "Globals"
OpMemberName %14 0 "num_lights"
OpName %17 "Light"
OpMemberName %17 0 "proj"
OpMemberName %17 1 "pos"
OpMemberName %17 2 "color"
OpName %19 "Lights"
OpMemberName %19 0 "data"
OpName %24 "c_ambient"
OpName %25 "u_globals"
OpName %27 "s_lights"
OpName %29 "t_shadow"
OpName %31 "sampler_shadow"
OpName %36 "fetch_shadow"
OpName %68 "color"
OpName %70 "i"
OpName %73 "raw_normal"
OpName %76 "position"
OpName %81 "fs_main"
OpName %81 "fs_main"
OpDecorate %16 Block
OpMemberDecorate %16 0 Offset 0
OpDecorate %15 DescriptorSet 0
OpDecorate %15 Binding 0
OpDecorate %20 BufferBlock
OpMemberDecorate %20 0 Offset 0
OpDecorate %21 ArrayStride 96
OpMemberDecorate %22 0 Offset 0
OpMemberDecorate %22 0 ColMajor
OpMemberDecorate %22 0 MatrixStride 16
OpMemberDecorate %22 1 Offset 64
OpMemberDecorate %22 2 Offset 80
OpDecorate %19 NonWritable
OpDecorate %19 DescriptorSet 0
OpDecorate %19 Binding 1
OpDecorate %26 DescriptorSet 0
OpDecorate %26 Binding 2
OpDecorate %14 Block
OpMemberDecorate %14 0 Offset 0
OpMemberDecorate %17 0 Offset 0
OpMemberDecorate %17 0 ColMajor
OpMemberDecorate %17 0 MatrixStride 16
OpMemberDecorate %17 1 Offset 64
OpMemberDecorate %17 2 Offset 80
OpDecorate %18 ArrayStride 96
OpDecorate %19 BufferBlock
OpMemberDecorate %19 0 Offset 0
OpDecorate %25 DescriptorSet 0
OpDecorate %25 Binding 0
OpDecorate %27 NonWritable
OpDecorate %27 DescriptorSet 0
OpDecorate %27 Binding 1
OpDecorate %29 DescriptorSet 0
OpDecorate %29 Binding 3
OpDecorate %29 Binding 2
OpDecorate %31 DescriptorSet 0
OpDecorate %31 Binding 3
OpDecorate %73 Location 0
OpDecorate %76 Location 1
OpDecorate %79 Location 0
@@ -62,151 +62,151 @@ OpDecorate %79 Location 0
%6 = OpConstant %4 0.5
%7 = OpConstant %4 -0.5
%8 = OpConstant %4 0.05
%10 = OpTypeVector %4 3
%9 = OpConstantComposite %10 %8 %8 %8
%12 = OpTypeInt 32 0
%11 = OpConstant %12 10
%13 = OpConstant %12 0
%14 = OpConstant %12 1
%17 = OpTypeVector %12 4
%16 = OpTypeStruct %17
%18 = OpTypePointer Uniform %16
%15 = OpVariable %18 Uniform
%24 = OpTypeVector %4 4
%23 = OpTypeMatrix %24 4
%22 = OpTypeStruct %23 %24 %24
%21 = OpTypeRuntimeArray %22
%20 = OpTypeStruct %21
%25 = OpTypePointer Uniform %20
%19 = OpVariable %25 Uniform
%27 = OpTypeImage %4 2D 1 1 0 1 Unknown
%28 = OpTypePointer UniformConstant %27
%26 = OpVariable %28 UniformConstant
%30 = OpTypeSampler
%31 = OpTypePointer UniformConstant %30
%29 = OpVariable %31 UniformConstant
%36 = OpTypeFunction %4 %12 %24
%41 = OpTypeBool
%45 = OpTypeVector %4 2
%10 = OpTypeInt 32 0
%9 = OpConstant %10 10
%11 = OpConstant %10 0
%12 = OpConstant %10 1
%13 = OpTypeVector %10 4
%14 = OpTypeStruct %13
%16 = OpTypeVector %4 4
%15 = OpTypeMatrix %16 4
%17 = OpTypeStruct %15 %16 %16
%18 = OpTypeRuntimeArray %17
%19 = OpTypeStruct %18
%20 = OpTypeImage %4 2D 1 1 0 1 Unknown
%21 = OpTypeSampler
%22 = OpTypeVector %4 2
%23 = OpTypeVector %4 3
%24 = OpConstantComposite %23 %8 %8 %8
%26 = OpTypePointer Uniform %14
%25 = OpVariable %26 Uniform
%28 = OpTypePointer Uniform %19
%27 = OpVariable %28 Uniform
%30 = OpTypePointer UniformConstant %20
%29 = OpVariable %30 UniformConstant
%32 = OpTypePointer UniformConstant %21
%31 = OpVariable %32 UniformConstant
%37 = OpTypeFunction %4 %10 %16
%42 = OpTypeBool
%56 = OpTypeInt 32 1
%60 = OpTypeSampledImage %27
%60 = OpTypeSampledImage %20
%67 = OpConstant %4 0.0
%69 = OpTypePointer Function %10
%71 = OpTypePointer Function %12
%74 = OpTypePointer Input %10
%69 = OpTypePointer Function %23
%71 = OpTypePointer Function %10
%74 = OpTypePointer Input %23
%73 = OpVariable %74 Input
%77 = OpTypePointer Input %24
%77 = OpTypePointer Input %16
%76 = OpVariable %77 Input
%80 = OpTypePointer Output %24
%80 = OpTypePointer Output %16
%79 = OpVariable %80 Output
%82 = OpTypeFunction %2
%92 = OpTypePointer Uniform %17
%92 = OpTypePointer Uniform %13
%93 = OpConstant %56 0
%101 = OpTypePointer Uniform %21
%103 = OpTypePointer Uniform %22
%101 = OpTypePointer Uniform %18
%103 = OpTypePointer Uniform %17
%104 = OpConstant %56 0
%35 = OpFunction %4 None %36
%33 = OpFunctionParameter %12
%34 = OpFunctionParameter %24
%32 = OpLabel
%37 = OpLoad %27 %26
%38 = OpLoad %30 %29
OpBranch %39
%39 = OpLabel
%40 = OpCompositeExtract %4 %34 3
%42 = OpFOrdLessThanEqual %41 %40 %3
OpSelectionMerge %43 None
OpBranchConditional %42 %44 %43
%44 = OpLabel
%36 = OpFunction %4 None %37
%34 = OpFunctionParameter %10
%35 = OpFunctionParameter %16
%33 = OpLabel
%38 = OpLoad %20 %29
%39 = OpLoad %21 %31
OpBranch %40
%40 = OpLabel
%41 = OpCompositeExtract %4 %35 3
%43 = OpFOrdLessThanEqual %42 %41 %3
OpSelectionMerge %44 None
OpBranchConditional %43 %45 %44
%45 = OpLabel
OpReturnValue %5
%43 = OpLabel
%46 = OpCompositeConstruct %45 %6 %7
%47 = OpCompositeExtract %4 %34 3
%44 = OpLabel
%46 = OpCompositeConstruct %22 %6 %7
%47 = OpCompositeExtract %4 %35 3
%48 = OpFDiv %4 %5 %47
%49 = OpCompositeExtract %4 %34 0
%50 = OpCompositeExtract %4 %34 1
%51 = OpCompositeConstruct %45 %49 %50
%52 = OpFMul %45 %51 %46
%53 = OpVectorTimesScalar %45 %52 %48
%54 = OpCompositeConstruct %45 %6 %6
%55 = OpFAdd %45 %53 %54
%57 = OpBitcast %56 %33
%58 = OpCompositeExtract %4 %34 2
%49 = OpCompositeExtract %4 %35 0
%50 = OpCompositeExtract %4 %35 1
%51 = OpCompositeConstruct %22 %49 %50
%52 = OpFMul %22 %51 %46
%53 = OpVectorTimesScalar %22 %52 %48
%54 = OpCompositeConstruct %22 %6 %6
%55 = OpFAdd %22 %53 %54
%57 = OpBitcast %56 %34
%58 = OpCompositeExtract %4 %35 2
%59 = OpFMul %4 %58 %48
%61 = OpCompositeExtract %4 %55 0
%62 = OpCompositeExtract %4 %55 1
%63 = OpConvertUToF %4 %57
%64 = OpCompositeConstruct %10 %61 %62 %63
%65 = OpSampledImage %60 %37 %38
%64 = OpCompositeConstruct %23 %61 %62 %63
%65 = OpSampledImage %60 %38 %39
%66 = OpImageSampleDrefExplicitLod %4 %65 %64 %59 Lod %67
OpReturnValue %66
OpFunctionEnd
%81 = OpFunction %2 None %82
%72 = OpLabel
%68 = OpVariable %69 Function %9
%70 = OpVariable %71 Function %13
%75 = OpLoad %10 %73
%78 = OpLoad %24 %76
%83 = OpLoad %27 %26
%84 = OpLoad %30 %29
%68 = OpVariable %69 Function %24
%70 = OpVariable %71 Function %11
%75 = OpLoad %23 %73
%78 = OpLoad %16 %76
%83 = OpLoad %20 %29
%84 = OpLoad %21 %31
OpBranch %85
%85 = OpLabel
%86 = OpExtInst %10 %1 Normalize %75
%86 = OpExtInst %23 %1 Normalize %75
OpBranch %87
%87 = OpLabel
OpLoopMerge %88 %90 None
OpBranch %89
%89 = OpLabel
%91 = OpLoad %12 %70
%94 = OpAccessChain %92 %15 %93
%95 = OpLoad %17 %94
%96 = OpCompositeExtract %12 %95 0
%97 = OpExtInst %12 %1 UMin %96 %11
%98 = OpUGreaterThanEqual %41 %91 %97
%91 = OpLoad %10 %70
%94 = OpAccessChain %92 %25 %93
%95 = OpLoad %13 %94
%96 = OpCompositeExtract %10 %95 0
%97 = OpExtInst %10 %1 UMin %96 %9
%98 = OpUGreaterThanEqual %42 %91 %97
OpSelectionMerge %99 None
OpBranchConditional %98 %100 %99
%100 = OpLabel
OpBranch %88
%99 = OpLabel
%102 = OpLoad %12 %70
%105 = OpAccessChain %103 %19 %104 %102
%106 = OpLoad %22 %105
%107 = OpLoad %12 %70
%108 = OpCompositeExtract %23 %106 0
%109 = OpMatrixTimesVector %24 %108 %78
%110 = OpFunctionCall %4 %35 %107 %109
%111 = OpCompositeExtract %24 %106 1
%102 = OpLoad %10 %70
%105 = OpAccessChain %103 %27 %104 %102
%106 = OpLoad %17 %105
%107 = OpLoad %10 %70
%108 = OpCompositeExtract %15 %106 0
%109 = OpMatrixTimesVector %16 %108 %78
%110 = OpFunctionCall %4 %36 %107 %109
%111 = OpCompositeExtract %16 %106 1
%112 = OpCompositeExtract %4 %111 0
%113 = OpCompositeExtract %4 %111 1
%114 = OpCompositeExtract %4 %111 2
%115 = OpCompositeConstruct %10 %112 %113 %114
%115 = OpCompositeConstruct %23 %112 %113 %114
%116 = OpCompositeExtract %4 %78 0
%117 = OpCompositeExtract %4 %78 1
%118 = OpCompositeExtract %4 %78 2
%119 = OpCompositeConstruct %10 %116 %117 %118
%120 = OpFSub %10 %115 %119
%121 = OpExtInst %10 %1 Normalize %120
%119 = OpCompositeConstruct %23 %116 %117 %118
%120 = OpFSub %23 %115 %119
%121 = OpExtInst %23 %1 Normalize %120
%122 = OpDot %4 %86 %121
%123 = OpExtInst %4 %1 FMax %3 %122
%124 = OpLoad %10 %68
%124 = OpLoad %23 %68
%125 = OpFMul %4 %110 %123
%126 = OpCompositeExtract %24 %106 2
%126 = OpCompositeExtract %16 %106 2
%127 = OpCompositeExtract %4 %126 0
%128 = OpCompositeExtract %4 %126 1
%129 = OpCompositeExtract %4 %126 2
%130 = OpCompositeConstruct %10 %127 %128 %129
%131 = OpVectorTimesScalar %10 %130 %125
%132 = OpFAdd %10 %124 %131
%130 = OpCompositeConstruct %23 %127 %128 %129
%131 = OpVectorTimesScalar %23 %130 %125
%132 = OpFAdd %23 %124 %131
OpStore %68 %132
OpBranch %90
%90 = OpLabel
%133 = OpLoad %12 %70
%134 = OpIAdd %12 %133 %14
%133 = OpLoad %10 %70
%134 = OpIAdd %10 %133 %12
OpStore %70 %134
OpBranch %87
%88 = OpLabel
%135 = OpLoad %10 %68
%136 = OpCompositeConstruct %24 %135 %5
%135 = OpLoad %23 %68
%136 = OpCompositeConstruct %16 %135 %5
OpStore %79 %136
OpReturn
OpFunctionEnd

View File

@@ -9,45 +9,45 @@ expression: dis
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "vs_main" %30 %33 %35
OpEntryPoint Vertex %38 "vs_main" %31 %34 %36
OpEntryPoint Fragment %108 "fs_main" %101 %104 %107
OpExecutionMode %108 OriginUpperLeft
OpSource GLSL 450
OpName %11 "Data"
OpMemberName %11 0 "proj_inv"
OpMemberName %11 1 "view"
OpName %10 "r_data"
OpName %15 "r_texture"
OpName %18 "r_sampler"
OpName %21 "tmp1"
OpName %23 "tmp2"
OpName %24 "out"
OpName %25 "VertexOutput"
OpName %30 "vertex_index"
OpName %33 "position"
OpName %35 "uv"
OpName %37 "vs_main"
OpName %37 "vs_main"
OpName %12 "VertexOutput"
OpName %14 "Data"
OpMemberName %14 0 "proj_inv"
OpMemberName %14 1 "view"
OpName %19 "r_data"
OpName %21 "r_texture"
OpName %23 "r_sampler"
OpName %25 "tmp1"
OpName %27 "tmp2"
OpName %28 "out"
OpName %31 "vertex_index"
OpName %34 "position"
OpName %36 "uv"
OpName %38 "vs_main"
OpName %38 "vs_main"
OpName %101 "position"
OpName %104 "uv"
OpName %108 "fs_main"
OpName %108 "fs_main"
OpDecorate %11 Block
OpMemberDecorate %11 0 Offset 0
OpMemberDecorate %11 0 ColMajor
OpMemberDecorate %11 0 MatrixStride 16
OpMemberDecorate %11 1 Offset 64
OpMemberDecorate %11 1 ColMajor
OpMemberDecorate %11 1 MatrixStride 16
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 0
OpDecorate %15 DescriptorSet 0
OpDecorate %15 Binding 1
OpDecorate %18 DescriptorSet 0
OpDecorate %18 Binding 2
OpDecorate %30 BuiltIn VertexIndex
OpDecorate %33 BuiltIn Position
OpDecorate %35 Location 0
OpDecorate %14 Block
OpMemberDecorate %14 0 Offset 0
OpMemberDecorate %14 0 ColMajor
OpMemberDecorate %14 0 MatrixStride 16
OpMemberDecorate %14 1 Offset 64
OpMemberDecorate %14 1 ColMajor
OpMemberDecorate %14 1 MatrixStride 16
OpDecorate %19 DescriptorSet 0
OpDecorate %19 Binding 0
OpDecorate %21 DescriptorSet 0
OpDecorate %21 Binding 1
OpDecorate %23 DescriptorSet 0
OpDecorate %23 Binding 2
OpDecorate %31 BuiltIn VertexIndex
OpDecorate %34 BuiltIn Position
OpDecorate %36 Location 0
OpDecorate %101 BuiltIn FragCoord
OpDecorate %104 Location 0
OpDecorate %107 Location 0
@@ -59,122 +59,122 @@ OpDecorate %107 Location 0
%6 = OpConstant %7 4.0
%8 = OpConstant %7 1.0
%9 = OpConstant %7 0.0
%13 = OpTypeVector %7 4
%12 = OpTypeMatrix %13 4
%11 = OpTypeStruct %12 %12
%14 = OpTypePointer Uniform %11
%10 = OpVariable %14 Uniform
%16 = OpTypeImage %7 Cube 0 0 0 1 Unknown
%17 = OpTypePointer UniformConstant %16
%15 = OpVariable %17 UniformConstant
%19 = OpTypeSampler
%20 = OpTypePointer UniformConstant %19
%18 = OpVariable %20 UniformConstant
%22 = OpTypePointer Function %4
%26 = OpTypeVector %7 3
%25 = OpTypeStruct %13 %26
%27 = OpTypePointer Function %25
%29 = OpTypeInt 32 0
%31 = OpTypePointer Input %29
%30 = OpVariable %31 Input
%34 = OpTypePointer Output %13
%33 = OpVariable %34 Output
%36 = OpTypePointer Output %26
%35 = OpVariable %36 Output
%38 = OpTypeFunction %2
%53 = OpTypePointer Uniform %12
%54 = OpConstant %4 1
%62 = OpConstant %4 1
%70 = OpConstant %4 1
%78 = OpTypeMatrix %26 3
%10 = OpTypeVector %7 4
%11 = OpTypeVector %7 3
%12 = OpTypeStruct %10 %11
%13 = OpTypeMatrix %10 4
%14 = OpTypeStruct %13 %13
%15 = OpTypeInt 32 0
%16 = OpTypeMatrix %11 3
%17 = OpTypeImage %7 Cube 0 0 0 1 Unknown
%18 = OpTypeSampler
%20 = OpTypePointer Uniform %14
%19 = OpVariable %20 Uniform
%22 = OpTypePointer UniformConstant %17
%21 = OpVariable %22 UniformConstant
%24 = OpTypePointer UniformConstant %18
%23 = OpVariable %24 UniformConstant
%26 = OpTypePointer Function %4
%29 = OpTypePointer Function %12
%32 = OpTypePointer Input %15
%31 = OpVariable %32 Input
%35 = OpTypePointer Output %10
%34 = OpVariable %35 Output
%37 = OpTypePointer Output %11
%36 = OpVariable %37 Output
%39 = OpTypeFunction %2
%54 = OpTypePointer Uniform %13
%55 = OpConstant %4 1
%63 = OpConstant %4 1
%71 = OpConstant %4 1
%81 = OpConstant %4 0
%85 = OpTypePointer Function %26
%85 = OpTypePointer Function %11
%91 = OpConstant %4 1
%93 = OpTypePointer Function %13
%93 = OpTypePointer Function %10
%94 = OpConstant %4 0
%102 = OpTypePointer Input %13
%102 = OpTypePointer Input %10
%101 = OpVariable %102 Input
%105 = OpTypePointer Input %26
%105 = OpTypePointer Input %11
%104 = OpVariable %105 Input
%107 = OpVariable %34 Output
%113 = OpTypeSampledImage %16
%37 = OpFunction %2 None %38
%28 = OpLabel
%21 = OpVariable %22 Function
%23 = OpVariable %22 Function
%24 = OpVariable %27 Function
%32 = OpLoad %29 %30
OpBranch %39
%39 = OpLabel
%40 = OpBitcast %4 %32
%41 = OpSDiv %4 %40 %3
OpStore %21 %41
%42 = OpBitcast %4 %32
%43 = OpBitwiseAnd %4 %42 %5
OpStore %23 %43
%44 = OpLoad %4 %21
%45 = OpConvertSToF %7 %44
%46 = OpFMul %7 %45 %6
%47 = OpFSub %7 %46 %8
%48 = OpLoad %4 %23
%49 = OpConvertSToF %7 %48
%50 = OpFMul %7 %49 %6
%51 = OpFSub %7 %50 %8
%52 = OpCompositeConstruct %13 %47 %51 %9 %8
%55 = OpAccessChain %53 %10 %54
%56 = OpLoad %12 %55
%57 = OpCompositeExtract %13 %56 0
%58 = OpCompositeExtract %7 %57 0
%59 = OpCompositeExtract %7 %57 1
%60 = OpCompositeExtract %7 %57 2
%61 = OpCompositeConstruct %26 %58 %59 %60
%63 = OpAccessChain %53 %10 %62
%64 = OpLoad %12 %63
%65 = OpCompositeExtract %13 %64 1
%66 = OpCompositeExtract %7 %65 0
%67 = OpCompositeExtract %7 %65 1
%68 = OpCompositeExtract %7 %65 2
%69 = OpCompositeConstruct %26 %66 %67 %68
%71 = OpAccessChain %53 %10 %70
%72 = OpLoad %12 %71
%73 = OpCompositeExtract %13 %72 2
%74 = OpCompositeExtract %7 %73 0
%75 = OpCompositeExtract %7 %73 1
%76 = OpCompositeExtract %7 %73 2
%77 = OpCompositeConstruct %26 %74 %75 %76
%79 = OpCompositeConstruct %78 %61 %69 %77
%80 = OpTranspose %78 %79
%82 = OpAccessChain %53 %10 %81
%83 = OpLoad %12 %82
%84 = OpMatrixTimesVector %13 %83 %52
%107 = OpVariable %35 Output
%113 = OpTypeSampledImage %17
%38 = OpFunction %2 None %39
%30 = OpLabel
%25 = OpVariable %26 Function
%27 = OpVariable %26 Function
%28 = OpVariable %29 Function
%33 = OpLoad %15 %31
OpBranch %40
%40 = OpLabel
%41 = OpBitcast %4 %33
%42 = OpSDiv %4 %41 %3
OpStore %25 %42
%43 = OpBitcast %4 %33
%44 = OpBitwiseAnd %4 %43 %5
OpStore %27 %44
%45 = OpLoad %4 %25
%46 = OpConvertSToF %7 %45
%47 = OpFMul %7 %46 %6
%48 = OpFSub %7 %47 %8
%49 = OpLoad %4 %27
%50 = OpConvertSToF %7 %49
%51 = OpFMul %7 %50 %6
%52 = OpFSub %7 %51 %8
%53 = OpCompositeConstruct %10 %48 %52 %9 %8
%56 = OpAccessChain %54 %19 %55
%57 = OpLoad %13 %56
%58 = OpCompositeExtract %10 %57 0
%59 = OpCompositeExtract %7 %58 0
%60 = OpCompositeExtract %7 %58 1
%61 = OpCompositeExtract %7 %58 2
%62 = OpCompositeConstruct %11 %59 %60 %61
%64 = OpAccessChain %54 %19 %63
%65 = OpLoad %13 %64
%66 = OpCompositeExtract %10 %65 1
%67 = OpCompositeExtract %7 %66 0
%68 = OpCompositeExtract %7 %66 1
%69 = OpCompositeExtract %7 %66 2
%70 = OpCompositeConstruct %11 %67 %68 %69
%72 = OpAccessChain %54 %19 %71
%73 = OpLoad %13 %72
%74 = OpCompositeExtract %10 %73 2
%75 = OpCompositeExtract %7 %74 0
%76 = OpCompositeExtract %7 %74 1
%77 = OpCompositeExtract %7 %74 2
%78 = OpCompositeConstruct %11 %75 %76 %77
%79 = OpCompositeConstruct %16 %62 %70 %78
%80 = OpTranspose %16 %79
%82 = OpAccessChain %54 %19 %81
%83 = OpLoad %13 %82
%84 = OpMatrixTimesVector %10 %83 %53
%86 = OpCompositeExtract %7 %84 0
%87 = OpCompositeExtract %7 %84 1
%88 = OpCompositeExtract %7 %84 2
%89 = OpCompositeConstruct %26 %86 %87 %88
%90 = OpMatrixTimesVector %26 %80 %89
%92 = OpAccessChain %85 %24 %91
%89 = OpCompositeConstruct %11 %86 %87 %88
%90 = OpMatrixTimesVector %11 %80 %89
%92 = OpAccessChain %85 %28 %91
OpStore %92 %90
%95 = OpAccessChain %93 %24 %94
OpStore %95 %52
%96 = OpLoad %25 %24
%97 = OpCompositeExtract %13 %96 0
OpStore %33 %97
%98 = OpCompositeExtract %26 %96 1
OpStore %35 %98
%95 = OpAccessChain %93 %28 %94
OpStore %95 %53
%96 = OpLoad %12 %28
%97 = OpCompositeExtract %10 %96 0
OpStore %34 %97
%98 = OpCompositeExtract %11 %96 1
OpStore %36 %98
OpReturn
OpFunctionEnd
%108 = OpFunction %2 None %38
%108 = OpFunction %2 None %39
%99 = OpLabel
%103 = OpLoad %13 %101
%106 = OpLoad %26 %104
%100 = OpCompositeConstruct %25 %103 %106
%109 = OpLoad %16 %15
%110 = OpLoad %19 %18
%103 = OpLoad %10 %101
%106 = OpLoad %11 %104
%100 = OpCompositeConstruct %12 %103 %106
%109 = OpLoad %17 %21
%110 = OpLoad %18 %23
OpBranch %111
%111 = OpLabel
%112 = OpCompositeExtract %26 %100 1
%112 = OpCompositeExtract %11 %100 1
%114 = OpSampledImage %113 %109 %110
%115 = OpImageSampleImplicitLod %13 %114 %112
%115 = OpImageSampleImplicitLod %10 %114 %112
OpStore %107 %115
OpReturn
OpFunctionEnd

View File

@@ -9,75 +9,75 @@ expression: dis
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %24 "main" %18 %22
OpEntryPoint Fragment %24 "main" %19 %22
OpExecutionMode %24 OriginUpperLeft
OpSource GLSL 450
OpName %5 "texture0"
OpName %9 "texture1"
OpName %10 "sampler"
OpName %14 "PushConstants"
OpMemberName %14 0 "index"
OpName %13 "pc"
OpName %18 "tex_coord"
OpName %8 "PushConstants"
OpMemberName %8 0 "index"
OpName %11 "texture0"
OpName %13 "texture1"
OpName %14 "sampler"
OpName %16 "pc"
OpName %19 "tex_coord"
OpName %24 "main"
OpName %24 "main"
OpDecorate %5 DescriptorSet 0
OpDecorate %5 Binding 0
OpDecorate %9 DescriptorSet 0
OpDecorate %9 Binding 1
OpDecorate %10 DescriptorSet 0
OpDecorate %10 Binding 2
OpDecorate %14 Block
OpMemberDecorate %14 0 Offset 0
OpDecorate %18 Location 0
OpDecorate %8 Block
OpMemberDecorate %8 0 Offset 0
OpDecorate %11 DescriptorSet 0
OpDecorate %11 Binding 0
OpDecorate %13 DescriptorSet 0
OpDecorate %13 Binding 1
OpDecorate %14 DescriptorSet 0
OpDecorate %14 Binding 2
OpDecorate %19 Location 0
OpDecorate %22 Location 1
%2 = OpTypeVoid
%4 = OpTypeInt 32 0
%3 = OpConstant %4 0
%7 = OpTypeFloat 32
%6 = OpTypeImage %7 2D 0 0 0 1 Unknown
%8 = OpTypePointer UniformConstant %6
%5 = OpVariable %8 UniformConstant
%9 = OpVariable %8 UniformConstant
%11 = OpTypeSampler
%12 = OpTypePointer UniformConstant %11
%10 = OpVariable %12 UniformConstant
%14 = OpTypeStruct %4
%15 = OpTypePointer PushConstant %14
%13 = OpVariable %15 PushConstant
%17 = OpTypeVector %7 2
%19 = OpTypePointer Input %17
%18 = OpVariable %19 Input
%21 = OpTypeVector %7 4
%23 = OpTypePointer Output %21
%6 = OpTypeFloat 32
%5 = OpTypeImage %6 2D 0 0 0 1 Unknown
%7 = OpTypeSampler
%8 = OpTypeStruct %4
%9 = OpTypeVector %6 2
%10 = OpTypeVector %6 4
%12 = OpTypePointer UniformConstant %5
%11 = OpVariable %12 UniformConstant
%13 = OpVariable %12 UniformConstant
%15 = OpTypePointer UniformConstant %7
%14 = OpVariable %15 UniformConstant
%17 = OpTypePointer PushConstant %8
%16 = OpVariable %17 PushConstant
%20 = OpTypePointer Input %9
%19 = OpVariable %20 Input
%23 = OpTypePointer Output %10
%22 = OpVariable %23 Output
%25 = OpTypeFunction %2
%30 = OpTypePointer PushConstant %4
%31 = OpTypeInt 32 1
%32 = OpConstant %31 0
%35 = OpTypeBool
%40 = OpTypeSampledImage %6
%40 = OpTypeSampledImage %5
%24 = OpFunction %2 None %25
%16 = OpLabel
%20 = OpLoad %17 %18
%26 = OpLoad %6 %5
%27 = OpLoad %6 %9
%28 = OpLoad %11 %10
%18 = OpLabel
%21 = OpLoad %9 %19
%26 = OpLoad %5 %11
%27 = OpLoad %5 %13
%28 = OpLoad %7 %14
OpBranch %29
%29 = OpLabel
%33 = OpAccessChain %30 %13 %32
%33 = OpAccessChain %30 %16 %32
%34 = OpLoad %4 %33
%36 = OpIEqual %35 %34 %3
OpSelectionMerge %37 None
OpBranchConditional %36 %38 %39
%38 = OpLabel
%41 = OpSampledImage %40 %26 %28
%42 = OpImageSampleImplicitLod %21 %41 %20
%42 = OpImageSampleImplicitLod %10 %41 %21
OpStore %22 %42
OpReturn
%39 = OpLabel
%43 = OpSampledImage %40 %27 %28
%44 = OpImageSampleImplicitLod %21 %43 %20
%44 = OpImageSampleImplicitLod %10 %43 %21
OpStore %22 %44
OpReturn
%37 = OpLabel