From 9868441ebc04ed1366c7a2994d8ee41c90caffb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Fri, 21 May 2021 22:47:08 +0100 Subject: [PATCH] [glsl-in] Fix storage access --- src/front/glsl/ast.rs | 15 +++++++++++---- src/front/glsl/parser.rs | 3 +-- src/front/glsl/variables.rs | 33 ++++++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/front/glsl/ast.rs b/src/front/glsl/ast.rs index 1d02b504a4..f43f69cfe5 100644 --- a/src/front/glsl/ast.rs +++ b/src/front/glsl/ast.rs @@ -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, }; diff --git a/src/front/glsl/parser.rs b/src/front/glsl/parser.rs index 543708dc3f..a3552ea169 100644 --- a/src/front/glsl/parser.rs +++ b/src/front/glsl/parser.rs @@ -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 { diff --git a/src/front/glsl/variables.rs b/src/front/glsl/variables.rs index 22201b8d24..ad4677a8b0 100644 --- a/src/front/glsl/variables.rs +++ b/src/front/glsl/variables.rs @@ -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