mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
[glsl-in] Fix storage access
This commit is contained in:
committed by
Dzmitry Malyshau
parent
28a1ee4354
commit
9868441ebc
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user