+ struct vtn_value *val = vtn_value(b, value_id, vtn_value_type_constant);
+
+ vtn_fail_if(val->type->base_type != vtn_base_type_scalar ||
+ !glsl_type_is_integer(val->type->type),
+ "Expected id %u to be an integer constant", value_id);
+
+ switch (glsl_get_bit_size(val->type->type)) {
+ case 8: return val->constant->values[0].u8;
+ case 16: return val->constant->values[0].u16;
+ case 32: return val->constant->values[0].u32;
+ case 64: return val->constant->values[0].u64;
+ default: unreachable("Invalid bit size");
+ }
+}
+
+static inline int64_t
+vtn_constant_int(struct vtn_builder *b, uint32_t value_id)
+{
+ struct vtn_value *val = vtn_value(b, value_id, vtn_value_type_constant);
+
+ vtn_fail_if(val->type->base_type != vtn_base_type_scalar ||
+ !glsl_type_is_integer(val->type->type),
+ "Expected id %u to be an integer constant", value_id);
+
+ switch (glsl_get_bit_size(val->type->type)) {
+ case 8: return val->constant->values[0].i8;
+ case 16: return val->constant->values[0].i16;
+ case 32: return val->constant->values[0].i32;
+ case 64: return val->constant->values[0].i64;
+ default: unreachable("Invalid bit size");
+ }
+}
+
+static inline enum gl_access_qualifier vtn_value_access(struct vtn_value *value)
+{
+ switch (value->value_type) {
+ case vtn_value_type_invalid:
+ case vtn_value_type_undef:
+ case vtn_value_type_string:
+ case vtn_value_type_decoration_group:
+ case vtn_value_type_constant:
+ case vtn_value_type_function:
+ case vtn_value_type_block:
+ case vtn_value_type_extension:
+ return 0;
+ case vtn_value_type_type:
+ return value->type->access;
+ case vtn_value_type_pointer:
+ return value->pointer->access;
+ case vtn_value_type_ssa:
+ return value->ssa->access;
+ case vtn_value_type_image_pointer:
+ return value->image->image->access;
+ case vtn_value_type_sampled_image:
+ return value->sampled_image->image->access |
+ value->sampled_image->sampler->access;
+ }
+
+ unreachable("invalid type");