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:
@@ -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.
|
||||
*/
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
|
Reference in New Issue
Block a user