From 9f62feee8733a2a12ba3133cabe7ab13e7d1ccf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Capucho?= Date: Sat, 19 Feb 2022 10:03:11 +0000 Subject: [PATCH] glsl-in: inject sampler2DMSArray builtins on use --- src/front/glsl/ast.rs | 2 ++ src/front/glsl/builtins.rs | 20 +++++++++++++++++++- src/front/glsl/functions.rs | 10 +++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/front/glsl/ast.rs b/src/front/glsl/ast.rs index 39264eeec8..9f28b2bdd7 100644 --- a/src/front/glsl/ast.rs +++ b/src/front/glsl/ast.rs @@ -74,6 +74,8 @@ bitflags::bitflags! { const DOUBLE = 1 << 1; /// Request overloads that use samplerCubeArray(Shadow) const CUBE_TEXTURES_ARRAY = 1 << 2; + /// Request overloads that use sampler2DMSArray + const D2_MULTI_TEXTURES_ARRAY = 1 << 3; } } diff --git a/src/front/glsl/builtins.rs b/src/front/glsl/builtins.rs index fa99d6d54a..ea56c54f7a 100644 --- a/src/front/glsl/builtins.rs +++ b/src/front/glsl/builtins.rs @@ -80,6 +80,12 @@ pub fn inject_builtin( name: &str, mut variations: BuiltinVariations, ) { + log::trace!( + "{} variations: {:?} {:?}", + name, + variations, + declaration.variations + ); // Don't regeneate variations variations.remove(declaration.variations); declaration.variations |= variations; @@ -2202,6 +2208,8 @@ bitflags::bitflags! { const STANDARD = 1 << 2; /// Generates cube arrayed images const CUBE_ARRAY = 1 << 3; + /// Generates cube arrayed images + const D2_MULTI_ARRAY = 1 << 4; } } @@ -2214,6 +2222,9 @@ impl From for TextureArgsOptions { if variations.contains(BuiltinVariations::CUBE_TEXTURES_ARRAY) { options |= TextureArgsOptions::CUBE_ARRAY } + if variations.contains(BuiltinVariations::D2_MULTI_TEXTURES_ARRAY) { + options |= TextureArgsOptions::D2_MULTI_ARRAY + } options } } @@ -2238,6 +2249,13 @@ fn texture_args_generator( if !options.contains(TextureArgsOptions::CUBE_ARRAY) { continue; } + } else if Dim::D2 == dim + && options.contains(TextureArgsOptions::MULTI) + && arrayed + && options.contains(TextureArgsOptions::D2_MULTI_ARRAY) + { + // multisampling for sampler2DMSArray + f(kind, dim, arrayed, true, false); } else if !options.contains(TextureArgsOptions::STANDARD) { continue; } @@ -2251,7 +2269,7 @@ fn texture_args_generator( break; } - if Dim::D2 == dim && options.contains(TextureArgsOptions::MULTI) { + if Dim::D2 == dim && options.contains(TextureArgsOptions::MULTI) && !arrayed { // multisampling f(kind, dim, arrayed, true, false); } diff --git a/src/front/glsl/functions.rs b/src/front/glsl/functions.rs index db58aa9b76..9a53e50028 100644 --- a/src/front/glsl/functions.rs +++ b/src/front/glsl/functions.rs @@ -1498,10 +1498,18 @@ fn builtin_required_variations<'a>(args: impl Iterator) -> variations |= BuiltinVariations::DOUBLE } } - TypeInner::Image { dim, arrayed, .. } => { + TypeInner::Image { + dim, + arrayed, + class, + } => { if dim == crate::ImageDimension::Cube && arrayed { variations |= BuiltinVariations::CUBE_TEXTURES_ARRAY } + + if dim == crate::ImageDimension::D2 && arrayed && class.is_multisampled() { + variations |= BuiltinVariations::D2_MULTI_TEXTURES_ARRAY + } } _ => {} }