X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fspirv%2Fvtn_private.h;h=436bac8a664b76f9119bc5f91fbc4166603cdeba;hb=1b808d208f7ae6b7934ada37378c654991a5ca5a;hp=defcbb8e69d310f2e79a960957f261c9ee4d5c56;hpb=639c236e74e99524245c22f1fa0758603f558cf2;p=mesa.git diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index defcbb8e69d..436bac8a664 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -88,6 +88,12 @@ _vtn_fail(struct vtn_builder *b, const char *file, unsigned line, vtn_fail(__VA_ARGS__); \ } while (0) +#define _vtn_fail_with(t, msg, v) \ + vtn_fail("%s: %s (%u)\n", msg, spirv_ ## t ## _to_string(v), v) + +#define vtn_fail_with_decoration(msg, v) _vtn_fail_with(decoration, msg, v) +#define vtn_fail_with_opcode(msg, v) _vtn_fail_with(op, msg, v) + /** Assert that a condition is true and, if it isn't, vtn_fail * * This macro is transitional only and should not be used in new code. Use @@ -263,6 +269,9 @@ struct vtn_ssa_value { struct vtn_ssa_value *transposed; const struct glsl_type *type; + + /* Access qualifiers */ + enum gl_access_qualifier access; }; enum vtn_base_type { @@ -335,6 +344,13 @@ struct vtn_type { * (i.e. a block that contains only builtins). */ bool builtin_block:1; + + /* for structs and unions it specifies the minimum alignment of the + * members. 0 means packed. + * + * Set by CPacked and Alignment Decorations in kernels. + */ + bool packed:1; }; /* Members for pointer types */ @@ -378,9 +394,13 @@ struct vtn_type { }; }; +bool vtn_type_contains_block(struct vtn_builder *b, struct vtn_type *type); + bool vtn_types_compatible(struct vtn_builder *b, struct vtn_type *t1, struct vtn_type *t2); +struct vtn_type *vtn_type_without_array(struct vtn_type *type); + struct vtn_variable; enum vtn_access_mode { @@ -390,7 +410,7 @@ enum vtn_access_mode { struct vtn_access_link { enum vtn_access_mode mode; - uint32_t id; + int64_t id; }; struct vtn_access_chain { @@ -401,6 +421,9 @@ struct vtn_access_chain { */ bool ptr_as_array; + /* Access qualifiers */ + enum gl_access_qualifier access; + /** Struct elements and array offsets. * * This is an array of 1 so that it can conveniently be created on the @@ -410,15 +433,18 @@ struct vtn_access_chain { }; enum vtn_variable_mode { - vtn_variable_mode_local, - vtn_variable_mode_global, + vtn_variable_mode_function, + vtn_variable_mode_private, vtn_variable_mode_uniform, vtn_variable_mode_ubo, vtn_variable_mode_ssbo, + vtn_variable_mode_phys_ssbo, vtn_variable_mode_push_constant, vtn_variable_mode_workgroup, + vtn_variable_mode_cross_workgroup, vtn_variable_mode_input, vtn_variable_mode_output, + vtn_variable_mode_image, }; struct vtn_pointer { @@ -454,6 +480,16 @@ struct vtn_pointer { enum gl_access_qualifier access; }; +bool vtn_mode_uses_ssa_offset(struct vtn_builder *b, + enum vtn_variable_mode mode); + +static inline bool vtn_pointer_uses_ssa_offset(struct vtn_builder *b, + struct vtn_pointer *ptr) +{ + return vtn_mode_uses_ssa_offset(b, ptr->mode); +} + + struct vtn_variable { enum vtn_variable_mode mode; @@ -468,6 +504,12 @@ struct vtn_variable { nir_variable *var; + /* If the variable is a struct with a location set on it then this will be + * stored here. This will be used to calculate locations for members that + * don’t have their own explicit location. + */ + int base_location; + int shared_location; /** @@ -492,10 +534,10 @@ struct vtn_image_pointer { struct vtn_pointer *image; nir_ssa_def *coord; nir_ssa_def *sample; + nir_ssa_def *lod; }; struct vtn_sampled_image { - struct vtn_type *type; struct vtn_pointer *image; /* Image or array of images */ struct vtn_pointer *sampler; /* Sampler */ }; @@ -532,7 +574,7 @@ struct vtn_decoration { */ int scope; - const uint32_t *literals; + const uint32_t *operands; struct vtn_value *group; union { @@ -551,7 +593,7 @@ struct vtn_builder { size_t spirv_word_count; nir_shader *shader; - const struct spirv_to_nir_options *options; + struct spirv_to_nir_options *options; struct vtn_block *block; /* Current offset, file, line, and column. Useful for debugging. Set @@ -581,11 +623,14 @@ struct vtn_builder { unsigned value_id_bound; struct vtn_value *values; + /* True if we should watch out for GLSLang issue #179 */ + bool wa_glslang_179; + gl_shader_stage entry_point_stage; const char *entry_point_name; struct vtn_value *entry_point; - bool origin_upper_left; - bool pixel_center_integer; + struct vtn_value *workgroup_size_builtin; + bool variable_pointers; struct vtn_function *func; struct exec_list functions; @@ -594,6 +639,12 @@ struct vtn_builder { unsigned func_param_idx; bool has_loop_continue; + + /* false by default, set to true by the ContractionOff execution mode */ + bool exact; + + /* when a physical memory model is choosen */ + bool physical_ptrs; }; nir_ssa_def * @@ -610,6 +661,10 @@ vtn_untyped_value(struct vtn_builder *b, uint32_t value_id) return &b->values[value_id]; } +/* Consider not using this function directly and instead use + * vtn_push_ssa/vtn_push_value_pointer so that appropriate applying of + * decorations is handled by common code. + */ static inline struct vtn_value * vtn_push_value(struct vtn_builder *b, uint32_t value_id, enum vtn_value_type value_type) @@ -621,22 +676,8 @@ vtn_push_value(struct vtn_builder *b, uint32_t value_id, value_id); val->value_type = value_type; - return &b->values[value_id]; -} -static inline struct vtn_value * -vtn_push_ssa(struct vtn_builder *b, uint32_t value_id, - struct vtn_type *type, struct vtn_ssa_value *ssa) -{ - struct vtn_value *val; - if (type->base_type == vtn_base_type_pointer) { - val = vtn_push_value(b, value_id, vtn_value_type_pointer); - val->pointer = vtn_pointer_from_ssa(b, ssa->def, type); - } else { - val = vtn_push_value(b, value_id, vtn_value_type_ssa); - val->ssa = ssa; - } - return val; + return &b->values[value_id]; } static inline struct vtn_value * @@ -653,14 +694,79 @@ bool vtn_set_instruction_result_type(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count); -static inline nir_constant * -vtn_constant_value(struct vtn_builder *b, uint32_t value_id) +static inline uint64_t +vtn_constant_uint(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].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) { - return vtn_value(b, value_id, vtn_value_type_constant)->constant; + 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"); } struct vtn_ssa_value *vtn_ssa_value(struct vtn_builder *b, uint32_t value_id); +struct vtn_value *vtn_push_value_pointer(struct vtn_builder *b, + uint32_t value_id, + struct vtn_pointer *ptr); + +struct vtn_value *vtn_push_ssa(struct vtn_builder *b, uint32_t value_id, + struct vtn_type *type, struct vtn_ssa_value *ssa); + struct vtn_ssa_value *vtn_create_ssa_value(struct vtn_builder *b, const struct glsl_type *type); @@ -689,10 +795,12 @@ vtn_pointer_to_offset(struct vtn_builder *b, struct vtn_pointer *ptr, nir_ssa_def **index_out); struct vtn_ssa_value * -vtn_local_load(struct vtn_builder *b, nir_deref_instr *src); +vtn_local_load(struct vtn_builder *b, nir_deref_instr *src, + enum gl_access_qualifier access); void vtn_local_store(struct vtn_builder *b, struct vtn_ssa_value *src, - nir_deref_instr *dest); + nir_deref_instr *dest, + enum gl_access_qualifier access); struct vtn_ssa_value * vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src); @@ -728,12 +836,18 @@ nir_op vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, void vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count); +void vtn_handle_bitcast(struct vtn_builder *b, const uint32_t *w, + unsigned count); + void vtn_handle_subgroup(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count); bool vtn_handle_glsl450_instruction(struct vtn_builder *b, SpvOp ext_opcode, const uint32_t *words, unsigned count); +bool vtn_handle_opencl_instruction(struct vtn_builder *b, SpvOp ext_opcode, + const uint32_t *words, unsigned count); + struct vtn_builder* vtn_create_builder(const uint32_t *words, size_t word_count, gl_shader_stage stage, const char *entry_point_name, const struct spirv_to_nir_options *options); @@ -744,6 +858,14 @@ void vtn_handle_entry_point(struct vtn_builder *b, const uint32_t *w, void vtn_handle_decoration(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count); +enum vtn_variable_mode vtn_storage_class_to_mode(struct vtn_builder *b, + SpvStorageClass class, + struct vtn_type *interface_type, + nir_variable_mode *nir_mode_out); + +nir_address_format vtn_mode_to_address_format(struct vtn_builder *b, + enum vtn_variable_mode); + static inline uint32_t vtn_align_u32(uint32_t v, uint32_t a) { @@ -760,6 +882,15 @@ vtn_u64_literal(const uint32_t *w) bool vtn_handle_amd_gcn_shader_instruction(struct vtn_builder *b, SpvOp ext_opcode, const uint32_t *words, unsigned count); +bool vtn_handle_amd_shader_ballot_instruction(struct vtn_builder *b, SpvOp ext_opcode, + const uint32_t *w, unsigned count); + bool vtn_handle_amd_shader_trinary_minmax_instruction(struct vtn_builder *b, SpvOp ext_opcode, const uint32_t *words, unsigned count); + +SpvMemorySemanticsMask vtn_storage_class_to_memory_semantics(SpvStorageClass sc); + +void vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope, + SpvMemorySemanticsMask semantics); + #endif /* _VTN_PRIVATE_H_ */