[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