X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fspirv%2Fvtn_private.h;h=300fb017257c4d203aff98b1eaffecf70706e2b0;hb=1bdf8506384fce4c9dc13504e1b3272d1ddc1097;hp=f4e6201febe2ae3adb2d01c87f9ca5a1054ccf87;hpb=f5deed138a0b4765438135367248f1d8f0649975;p=mesa.git diff --git a/src/compiler/spirv/vtn_private.h b/src/compiler/spirv/vtn_private.h index f4e6201febe..300fb017257 100644 --- a/src/compiler/spirv/vtn_private.h +++ b/src/compiler/spirv/vtn_private.h @@ -118,15 +118,16 @@ enum vtn_value_type { vtn_value_type_ssa, vtn_value_type_extension, vtn_value_type_image_pointer, - vtn_value_type_sampled_image, }; enum vtn_branch_type { vtn_branch_type_none, + vtn_branch_type_if_merge, vtn_branch_type_switch_break, vtn_branch_type_switch_fallthrough, vtn_branch_type_loop_break, vtn_branch_type_loop_continue, + vtn_branch_type_loop_back_edge, vtn_branch_type_discard, vtn_branch_type_return, }; @@ -157,6 +158,10 @@ struct vtn_loop { */ struct list_head cont_body; + struct vtn_block *header_block; + struct vtn_block *cont_block; + struct vtn_block *break_block; + SpvLoopControlMask control; }; @@ -171,16 +176,18 @@ struct vtn_if { enum vtn_branch_type else_type; struct list_head else_body; + struct vtn_block *merge_block; + SpvSelectionControlMask control; }; struct vtn_case { struct vtn_cf_node node; - struct list_head body; + struct vtn_block *block; - /* The block that starts this case */ - struct vtn_block *start_block; + enum vtn_branch_type type; + struct list_head body; /* The fallthrough case, if any */ struct vtn_case *fallthrough; @@ -201,6 +208,8 @@ struct vtn_switch { uint32_t selector; struct list_head cases; + + struct vtn_block *break_block; }; struct vtn_block { @@ -217,6 +226,14 @@ struct vtn_block { enum vtn_branch_type branch_type; + /* The CF node for which this is a merge target + * + * The SPIR-V spec requires that any given block can be the merge target + * for at most one merge instruction. If this block is a merge target, + * this points back to the block containing that merge instruction. + */ + struct vtn_cf_node *merge_cf_node; + /** Points to the loop that this block starts (if it starts a loop) */ struct vtn_loop *loop; @@ -225,6 +242,9 @@ struct vtn_block { /** Every block ends in a nop intrinsic so that we can find it again */ nir_intrinsic_instr *end_nop; + + /** attached nir_block */ + struct nir_block *block; }; struct vtn_function { @@ -290,9 +310,6 @@ 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 { @@ -388,8 +405,11 @@ struct vtn_type { /* Members for image types */ struct { - /* For images, indicates whether it's sampled or storage */ - bool sampled; + /* GLSL image type for this type. This is not to be confused with + * vtn_type::type which is actually going to be the GLSL type for a + * pointer to an image, likely a uint32_t. + */ + const struct glsl_type *glsl_image; /* Image format for image_load_store type images */ unsigned image_format; @@ -457,12 +477,14 @@ enum vtn_variable_mode { vtn_variable_mode_function, vtn_variable_mode_private, vtn_variable_mode_uniform, + vtn_variable_mode_atomic_counter, 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_constant, vtn_variable_mode_input, vtn_variable_mode_output, vtn_variable_mode_image, @@ -531,8 +553,6 @@ struct vtn_variable { */ int base_location; - int shared_location; - /** * In some early released versions of GLSLang, it implemented all function * calls by making copies of all parameters into temporary variables and @@ -551,30 +571,27 @@ struct vtn_variable { enum gl_access_qualifier access; }; +const struct glsl_type * +vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type, + enum vtn_variable_mode mode); + struct vtn_image_pointer { - struct vtn_pointer *image; + nir_deref_instr *image; nir_ssa_def *coord; nir_ssa_def *sample; nir_ssa_def *lod; }; -struct vtn_sampled_image { - struct vtn_pointer *image; /* Image or array of images */ - struct vtn_pointer *sampler; /* Sampler */ -}; - struct vtn_value { enum vtn_value_type value_type; const char *name; struct vtn_decoration *decoration; struct vtn_type *type; union { - void *ptr; - char *str; + const char *str; nir_constant *constant; struct vtn_pointer *pointer; struct vtn_image_pointer *image; - struct vtn_sampled_image *sampled_image; struct vtn_function *func; struct vtn_block *block; struct vtn_ssa_value *ssa; @@ -621,7 +638,7 @@ struct vtn_builder { * automatically by vtn_foreach_instruction. */ size_t spirv_offset; - char *file; + const char *file; int line, col; /* @@ -644,9 +661,6 @@ 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; - /* True if we need to fix up CS OpControlBarrier */ bool wa_glslang_cs_barrier; @@ -669,6 +683,9 @@ struct vtn_builder { /* when a physical memory model is choosen */ bool physical_ptrs; + + /* memory model specified by OpMemoryModel */ + unsigned mem_model; }; nir_ssa_def * @@ -686,7 +703,7 @@ vtn_untyped_value(struct vtn_builder *b, uint32_t value_id) } /* Consider not using this function directly and instead use - * vtn_push_ssa/vtn_push_value_pointer so that appropriate applying of + * vtn_push_ssa/vtn_push_pointer so that appropriate applying of * decorations is handled by common code. */ static inline struct vtn_value * @@ -695,6 +712,10 @@ vtn_push_value(struct vtn_builder *b, uint32_t value_id, { struct vtn_value *val = vtn_untyped_value(b, value_id); + vtn_fail_if(value_type == vtn_value_type_ssa, + "Do not call vtn_push_value for value_type_ssa. Use " + "vtn_push_ssa_value instead."); + vtn_fail_if(val->value_type != vtn_value_type_invalid, "SPIR-V id %u has already been written by another instruction", value_id); @@ -754,42 +775,43 @@ vtn_constant_int(struct vtn_builder *b, uint32_t value_id) } } -static inline enum gl_access_qualifier vtn_value_access(struct vtn_value *value) +static inline struct vtn_type * +vtn_get_value_type(struct vtn_builder *b, uint32_t value_id) { - 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; - } + struct vtn_value *val = vtn_untyped_value(b, value_id); + vtn_fail_if(val->type == NULL, "Value %u does not have a type", value_id); + return val->type; +} - unreachable("invalid type"); +static inline struct vtn_type * +vtn_get_type(struct vtn_builder *b, uint32_t value_id) +{ + return vtn_value(b, value_id, vtn_value_type_type)->type; } struct vtn_ssa_value *vtn_ssa_value(struct vtn_builder *b, uint32_t value_id); +struct vtn_value *vtn_push_ssa_value(struct vtn_builder *b, uint32_t value_id, + struct vtn_ssa_value *ssa); + +nir_ssa_def *vtn_get_nir_ssa(struct vtn_builder *b, uint32_t value_id); +struct vtn_value *vtn_push_nir_ssa(struct vtn_builder *b, uint32_t value_id, + nir_ssa_def *def); + +struct vtn_value *vtn_push_pointer(struct vtn_builder *b, + uint32_t value_id, + struct vtn_pointer *ptr); -struct vtn_value *vtn_push_value_pointer(struct vtn_builder *b, - uint32_t value_id, - struct vtn_pointer *ptr); +struct vtn_sampled_image { + nir_deref_instr *image; + nir_deref_instr *sampler; +}; -struct vtn_value *vtn_push_ssa(struct vtn_builder *b, uint32_t value_id, - struct vtn_type *type, struct vtn_ssa_value *ssa); +nir_ssa_def *vtn_sampled_image_to_nir_ssa(struct vtn_builder *b, + struct vtn_sampled_image si); + +void +vtn_copy_value(struct vtn_builder *b, uint32_t src_value_id, + uint32_t dst_value_id); struct vtn_ssa_value *vtn_create_ssa_value(struct vtn_builder *b, const struct glsl_type *type); @@ -799,10 +821,6 @@ struct vtn_ssa_value *vtn_ssa_transpose(struct vtn_builder *b, nir_deref_instr *vtn_nir_deref(struct vtn_builder *b, uint32_t id); -struct vtn_pointer *vtn_pointer_for_variable(struct vtn_builder *b, - struct vtn_variable *var, - struct vtn_type *ptr_type); - nir_deref_instr *vtn_pointer_to_deref(struct vtn_builder *b, struct vtn_pointer *ptr); nir_ssa_def * @@ -818,10 +836,11 @@ void vtn_local_store(struct vtn_builder *b, struct vtn_ssa_value *src, enum gl_access_qualifier access); struct vtn_ssa_value * -vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src); +vtn_variable_load(struct vtn_builder *b, struct vtn_pointer *src, + enum gl_access_qualifier access); void vtn_variable_store(struct vtn_builder *b, struct vtn_ssa_value *src, - struct vtn_pointer *dest); + struct vtn_pointer *dest, enum gl_access_qualifier access); void vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, const uint32_t *w, unsigned count); @@ -908,7 +927,7 @@ bool vtn_handle_amd_shader_explicit_vertex_parameter_instruction(struct vtn_buil const uint32_t *words, unsigned count); -SpvMemorySemanticsMask vtn_storage_class_to_memory_semantics(SpvStorageClass sc); +SpvMemorySemanticsMask vtn_mode_to_memory_semantics(enum vtn_variable_mode mode); void vtn_emit_memory_barrier(struct vtn_builder *b, SpvScope scope, SpvMemorySemanticsMask semantics);