[Mesa-dev] [PATCH v2] glsl: buffer variables can be readonly and writeonly

Samuel Pitoiset samuel.pitoiset at gmail.com
Tue Sep 19 10:02:58 UTC 2017


Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>

On 09/18/2017 05:56 PM, Juan A. Suarez Romero wrote:
> In GLSL ES 3.10 session 4.9 [Memory Access Qualifiers], it has the following description:
> 
> "A variable could be qualified as both readonly and writeonly, disallowing both read and write, but still be passed to
> imageSize() to have the size queried.".
> 
> This is for image variable, but not for buffer variables.
> 
> According to https://github.com/KhronosGroup/OpenGL-API/issues/7 Khronos
> intent is to allow both readonly and writeonly in buffer variables, and
> as such it will update the GLSL specification.
> 
> This commit address this issue, and fixes:
> 
> KHR-GL{43,44,45}.shader_storage_buffer_object.basic-readonly-writeonly
> KHR-GLES31.core.shader_storage_buffer_object.basic-readonly-writeonly
> 
> v2: set correctly fields[i] memory flags (Samuel Pitoiset).
> ---
>   src/compiler/glsl/ast_to_hir.cpp | 14 +++-----------
>   1 file changed, 3 insertions(+), 11 deletions(-)
> 
> diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
> index 45c8ca2a5d..c46454956d 100644
> --- a/src/compiler/glsl/ast_to_hir.cpp
> +++ b/src/compiler/glsl/ast_to_hir.cpp
> @@ -7254,11 +7254,6 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>               validate_matrix_layout_for_type(state, &loc, decl_type, NULL);
>         }
>   
> -      if (qual->flags.q.read_only && qual->flags.q.write_only) {
> -         _mesa_glsl_error(&loc, state, "buffer variable can't be both "
> -                          "readonly and writeonly.");
> -      }
> -
>         foreach_list_typed (ast_declaration, decl, link,
>                             &decl_list->declarations) {
>            YYLTYPE loc = decl->get_location();
> @@ -7434,12 +7429,9 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
>               /* For readonly and writeonly qualifiers the field definition,
>                * if set, overwrites the layout qualifier.
>                */
> -            if (qual->flags.q.read_only) {
> -               fields[i].memory_read_only = true;
> -               fields[i].memory_write_only = false;
> -            } else if (qual->flags.q.write_only) {
> -               fields[i].memory_read_only = false;
> -               fields[i].memory_write_only = true;
> +            if (qual->flags.q.read_only || qual->flags.q.write_only) {
> +               fields[i].memory_read_only = qual->flags.q.read_only;
> +               fields[i].memory_write_only = qual->flags.q.write_only;
>               } else {
>                  fields[i].memory_read_only =
>                     layout ? layout->flags.q.read_only : 0;
> 


More information about the mesa-dev mailing list