glsl/ast: Keep track of type qualifiers defined by ARB_shader_image_load_store.

v2: Add comment next to the read_only and write_only qualifier flags.
    Change temporary copies of the type qualifier mask to use uint64_t
    too.

Reviewed-by: Paul Berry <stereotype441@gmail.com>
This commit is contained in:
Francisco Jerez
2014-02-12 16:56:01 +01:00
parent c116541b2c
commit 299e869d25
3 changed files with 38 additions and 3 deletions

View File

@@ -466,12 +466,23 @@ struct ast_type_qualifier {
* local_size_x, and so on.
*/
unsigned local_size:3;
/** \name Layout and memory qualifiers for ARB_shader_image_load_store. */
/** \{ */
unsigned early_fragment_tests:1;
unsigned explicit_image_format:1;
unsigned coherent:1;
unsigned _volatile:1;
unsigned _restrict:1;
unsigned read_only:1; /**< "readonly" qualifier. */
unsigned write_only:1; /**< "writeonly" qualifier. */
/** \} */
}
/** \brief Set of flags, accessed by name. */
q;
/** \brief Set of flags, accessed as a bitmask. */
unsigned i;
uint64_t i;
} flags;
/** Precision of the type (highp/medium/lowp). */
@@ -522,6 +533,25 @@ struct ast_type_qualifier {
*/
int local_size[3];
/**
* Image format specified with an ARB_shader_image_load_store
* layout qualifier.
*
* \note
* This field is only valid if \c explicit_image_format is set.
*/
GLenum image_format;
/**
* Base type of the data read from or written to this image. Only
* the following enumerants are allowed: GLSL_TYPE_UINT,
* GLSL_TYPE_INT, GLSL_TYPE_FLOAT.
*
* \note
* This field is only valid if \c explicit_image_format is set.
*/
glsl_base_type image_base_type;
/**
* Return true if and only if an interpolation qualifier is present.
*/

View File

@@ -190,6 +190,11 @@ ast_type_qualifier::merge_qualifier(YYLTYPE *loc,
if (q.precision != ast_precision_none)
this->precision = q.precision;
if (q.flags.q.explicit_image_format) {
this->image_format = q.image_format;
this->image_base_type = q.image_base_type;
}
return true;
}

View File

@@ -2228,7 +2228,7 @@ basic_interface_block:
"an instance name are not allowed");
}
unsigned interface_type_mask;
uint64_t interface_type_mask;
struct ast_type_qualifier temp_type_qualifier;
/* Get a bitmask containing only the in/out/uniform flags, allowing us
@@ -2244,7 +2244,7 @@ basic_interface_block:
* production rule guarantees that only one bit will be set (and
* it will be in/out/uniform).
*/
unsigned block_interface_qualifier = $1.flags.i;
uint64_t block_interface_qualifier = $1.flags.i;
block->layout.flags.i |= block_interface_qualifier;