glsl: buffer variables can be readonly and writeonly

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).

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
This commit is contained in:
Juan A. Suarez Romero
2017-09-14 16:21:24 +00:00
parent 1746671a76
commit c408c92d28

View File

@@ -7254,11 +7254,6 @@ ast_process_struct_or_iface_block_members(exec_list *instructions,
validate_matrix_layout_for_type(state, &loc, decl_type, NULL); 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, foreach_list_typed (ast_declaration, decl, link,
&decl_list->declarations) { &decl_list->declarations) {
YYLTYPE loc = decl->get_location(); 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, /* For readonly and writeonly qualifiers the field definition,
* if set, overwrites the layout qualifier. * if set, overwrites the layout qualifier.
*/ */
if (qual->flags.q.read_only) { if (qual->flags.q.read_only || qual->flags.q.write_only) {
fields[i].memory_read_only = true; fields[i].memory_read_only = qual->flags.q.read_only;
fields[i].memory_write_only = false; fields[i].memory_write_only = qual->flags.q.write_only;
} else if (qual->flags.q.write_only) {
fields[i].memory_read_only = false;
fields[i].memory_write_only = true;
} else { } else {
fields[i].memory_read_only = fields[i].memory_read_only =
layout ? layout->flags.q.read_only : 0; layout ? layout->flags.q.read_only : 0;