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.
|
* local_size_x, and so on.
|
||||||
*/
|
*/
|
||||||
unsigned local_size:3;
|
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. */
|
/** \brief Set of flags, accessed by name. */
|
||||||
q;
|
q;
|
||||||
|
|
||||||
/** \brief Set of flags, accessed as a bitmask. */
|
/** \brief Set of flags, accessed as a bitmask. */
|
||||||
unsigned i;
|
uint64_t i;
|
||||||
} flags;
|
} flags;
|
||||||
|
|
||||||
/** Precision of the type (highp/medium/lowp). */
|
/** Precision of the type (highp/medium/lowp). */
|
||||||
@@ -522,6 +533,25 @@ struct ast_type_qualifier {
|
|||||||
*/
|
*/
|
||||||
int local_size[3];
|
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.
|
* 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)
|
if (q.precision != ast_precision_none)
|
||||||
this->precision = q.precision;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2228,7 +2228,7 @@ basic_interface_block:
|
|||||||
"an instance name are not allowed");
|
"an instance name are not allowed");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned interface_type_mask;
|
uint64_t interface_type_mask;
|
||||||
struct ast_type_qualifier temp_type_qualifier;
|
struct ast_type_qualifier temp_type_qualifier;
|
||||||
|
|
||||||
/* Get a bitmask containing only the in/out/uniform flags, allowing us
|
/* 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
|
* production rule guarantees that only one bit will be set (and
|
||||||
* it will be in/out/uniform).
|
* 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;
|
block->layout.flags.i |= block_interface_qualifier;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user