[glsl-in] Fix storage access

This commit is contained in:
João Capucho
2021-05-21 22:47:08 +01:00
committed by Dzmitry Malyshau
parent 28a1ee4354
commit 9868441ebc
3 changed files with 36 additions and 15 deletions

View File

@@ -203,12 +203,15 @@ impl<'function> Context<'function> {
for &(ref name, lookup) in program.global_variables.iter() {
this.emit_flush(body);
let expr = match lookup {
GlobalLookup::Variable(v) => Expression::GlobalVariable(v),
let (expr, load) = match lookup {
GlobalLookup::Variable(v) => (
Expression::GlobalVariable(v),
program.module.global_variables[v].class != StorageClass::Handle,
),
GlobalLookup::BlockSelect(handle, index) => {
let base = this.expressions.append(Expression::GlobalVariable(handle));
Expression::AccessIndex { base, index }
(Expression::AccessIndex { base, index }, true)
}
};
@@ -217,7 +220,11 @@ impl<'function> Context<'function> {
let var = VariableReference {
expr,
load: Some(this.add_expression(Expression::Load { pointer: expr }, body)),
load: if load {
Some(this.add_expression(Expression::Load { pointer: expr }, body))
} else {
None
},
// TODO: respect constant qualifier
mutable: true,
};

View File

@@ -785,8 +785,7 @@ impl<'source, 'program, 'options> Parser<'source, 'program, 'options> {
binding,
ty,
init: None,
// TODO
storage_access: StorageAccess::all(),
storage_access: StorageAccess::empty(),
});
if let Some(k) = name {

View File

@@ -1,6 +1,6 @@
use crate::{
Binding, Block, BuiltIn, Constant, Expression, GlobalVariable, Handle, LocalVariable,
ScalarKind, StorageAccess, StorageClass, Type, TypeInner, VectorSize,
Binding, Block, BuiltIn, Constant, Expression, GlobalVariable, Handle, ImageClass,
LocalVariable, ScalarKind, StorageAccess, StorageClass, Type, TypeInner, VectorSize,
};
use super::ast::*;
@@ -41,7 +41,7 @@ impl Program<'_> {
binding: None,
ty,
init: None,
storage_access: StorageAccess::all(),
storage_access: StorageAccess::empty(),
});
self.entry_args
@@ -304,7 +304,7 @@ impl Program<'_> {
binding: None,
ty,
init,
storage_access: StorageAccess::all(),
storage_access: StorageAccess::empty(),
});
self.entry_args.push((
@@ -331,9 +331,25 @@ impl Program<'_> {
return Ok(ctx.add_expression(Expression::Constant(handle), body));
}
let class = match storage {
StorageQualifier::StorageClass(class) => class,
_ => StorageClass::Private,
let (class, storage_access) = match self.module.types[ty].inner {
TypeInner::Image { class, .. } => (
StorageClass::Handle,
if let ImageClass::Storage(_) = class {
// TODO: Add support for qualifiers such as readonly,
// writeonly and readwrite
StorageAccess::all()
} else {
StorageAccess::empty()
},
),
TypeInner::Sampler { .. } => (StorageClass::Handle, StorageAccess::empty()),
_ => (
match storage {
StorageQualifier::StorageClass(class) => class,
_ => StorageClass::Private,
},
StorageAccess::empty(),
),
};
let handle = self.module.global_variables.append(GlobalVariable {
@@ -342,8 +358,7 @@ impl Program<'_> {
binding,
ty,
init,
// TODO
storage_access: StorageAccess::all(),
storage_access,
});
self.global_variables