X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fspirv%2Fvtn_variables.c;h=1bb48642b3f11447784dd5c8bece54d20828b3fa;hb=f59ae6883853fd7c7ee0965111fc19d20f6acfd2;hp=960bc01ef689f246ad0d89faf8c355b2cda6c44b;hpb=7ae506e5b8073ec8791272cb84b83c79adf9d4e7;p=mesa.git diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 960bc01ef68..1bb48642b3f 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1510,6 +1510,34 @@ vtn_get_builtin_location(struct vtn_builder *b, *location = SYSTEM_VALUE_GLOBAL_GROUP_SIZE; set_mode_system_value(b, mode); break; + case SpvBuiltInBaryCoordNoPerspAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_LINEAR_PIXEL; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordNoPerspCentroidAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_LINEAR_CENTROID; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordNoPerspSampleAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_LINEAR_SAMPLE; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordSmoothAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_PERSP_PIXEL; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordSmoothCentroidAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_PERSP_CENTROID; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordSmoothSampleAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_PERSP_SAMPLE; + set_mode_system_value(b, mode); + break; + case SpvBuiltInBaryCoordPullModelAMD: + *location = SYSTEM_VALUE_BARYCENTRIC_PULL_MODEL; + set_mode_system_value(b, mode); + break; default: vtn_fail("Unsupported builtin: %s (%u)", spirv_builtin_to_string(builtin), builtin); @@ -1530,6 +1558,9 @@ apply_var_decoration(struct vtn_builder *b, case SpvDecorationFlat: var_data->interpolation = INTERP_MODE_FLAT; break; + case SpvDecorationExplicitInterpAMD: + var_data->interpolation = INTERP_MODE_EXPLICIT; + break; case SpvDecorationCentroid: var_data->centroid = true; break; @@ -1543,20 +1574,20 @@ apply_var_decoration(struct vtn_builder *b, var_data->read_only = true; break; case SpvDecorationNonReadable: - var_data->image.access |= ACCESS_NON_READABLE; + var_data->access |= ACCESS_NON_READABLE; break; case SpvDecorationNonWritable: var_data->read_only = true; - var_data->image.access |= ACCESS_NON_WRITEABLE; + var_data->access |= ACCESS_NON_WRITEABLE; break; case SpvDecorationRestrict: - var_data->image.access |= ACCESS_RESTRICT; + var_data->access |= ACCESS_RESTRICT; break; case SpvDecorationVolatile: - var_data->image.access |= ACCESS_VOLATILE; + var_data->access |= ACCESS_VOLATILE; break; case SpvDecorationCoherent: - var_data->image.access |= ACCESS_COHERENT; + var_data->access |= ACCESS_COHERENT; break; case SpvDecorationComponent: var_data->location_frac = dec->operands[0]; @@ -1811,13 +1842,23 @@ vtn_storage_class_to_mode(struct vtn_builder *b, mode = vtn_variable_mode_ssbo; nir_mode = nir_var_mem_ssbo; break; - case SpvStorageClassPhysicalStorageBufferEXT: + case SpvStorageClassPhysicalStorageBuffer: mode = vtn_variable_mode_phys_ssbo; nir_mode = nir_var_mem_global; break; case SpvStorageClassUniformConstant: - mode = vtn_variable_mode_uniform; - nir_mode = nir_var_uniform; + if (b->shader->info.stage == MESA_SHADER_KERNEL) { + if (b->options->constant_as_global) { + mode = vtn_variable_mode_cross_workgroup; + nir_mode = nir_var_mem_global; + } else { + mode = vtn_variable_mode_ubo; + nir_mode = nir_var_mem_ubo; + } + } else { + mode = vtn_variable_mode_uniform; + nir_mode = nir_var_uniform; + } break; case SpvStorageClassPushConstant: mode = vtn_variable_mode_push_constant; @@ -1941,10 +1982,10 @@ vtn_pointer_to_ssa(struct vtn_builder *b, struct vtn_pointer *ptr) /* In this case, we're looking for a block index and not an actual * deref. * - * For PhysicalStorageBufferEXT pointers, we don't have a block index + * For PhysicalStorageBuffer pointers, we don't have a block index * at all because we get the pointer directly from the client. This * assumes that there will never be a SSBO binding variable using the - * PhysicalStorageBufferEXT storage class. This assumption appears + * PhysicalStorageBuffer storage class. This assumption appears * to be correct according to the Vulkan spec because the table, * "Shader Resource and Storage Class Correspondence," the only the * Uniform storage class with BufferBlock or the StorageBuffer @@ -2028,10 +2069,10 @@ vtn_pointer_from_ssa(struct vtn_builder *b, nir_ssa_def *ssa, /* This is a pointer to something internal or a pointer inside a * block. It's just a regular cast. * - * For PhysicalStorageBufferEXT pointers, we don't have a block index + * For PhysicalStorageBuffer pointers, we don't have a block index * at all because we get the pointer directly from the client. This * assumes that there will never be a SSBO binding variable using the - * PhysicalStorageBufferEXT storage class. This assumption appears + * PhysicalStorageBuffer storage class. This assumption appears * to be correct according to the Vulkan spec because the table, * "Shader Resource and Storage Class Correspondence," the only the * Uniform storage class with BufferBlock or the StorageBuffer @@ -2114,7 +2155,7 @@ assign_missing_member_locations(struct vtn_variable *var) static void vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, struct vtn_type *ptr_type, SpvStorageClass storage_class, - nir_constant *initializer) + nir_constant *const_initializer, nir_variable *var_initializer) { vtn_assert(ptr_type->base_type == vtn_base_type_pointer); struct vtn_type *type = ptr_type->deref; @@ -2165,7 +2206,7 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, case vtn_variable_mode_phys_ssbo: vtn_fail("Cannot create a variable with the " - "PhysicalStorageBufferEXT storage class"); + "PhysicalStorageBuffer storage class"); break; default: @@ -2337,10 +2378,14 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val, unreachable("Should have been caught before"); } - if (initializer) { + /* We can only have one type of initializer */ + assert(!(const_initializer && var_initializer)); + if (const_initializer) { var->var->constant_initializer = - nir_constant_clone(initializer, var->var); + nir_constant_clone(const_initializer, var->var); } + if (var_initializer) + var->var->pointer_initializer = var_initializer; vtn_foreach_decoration(b, val, var_decoration_cb, var); vtn_foreach_decoration(b, val, ptr_decoration_cb, val->pointer); @@ -2462,11 +2507,25 @@ vtn_handle_variables(struct vtn_builder *b, SpvOp opcode, struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_pointer); SpvStorageClass storage_class = w[3]; - nir_constant *initializer = NULL; - if (count > 4) - initializer = vtn_value(b, w[4], vtn_value_type_constant)->constant; + nir_constant *const_initializer = NULL; + nir_variable *var_initializer = NULL; + if (count > 4) { + struct vtn_value *init = vtn_untyped_value(b, w[4]); + switch (init->value_type) { + case vtn_value_type_constant: + const_initializer = init->constant; + break; + case vtn_value_type_pointer: + var_initializer = init->pointer->var->var; + break; + default: + vtn_fail("SPIR-V variable initializer %u must be constant or pointer", + w[4]); + } + } + + vtn_create_variable(b, val, ptr_type, storage_class, const_initializer, var_initializer); - vtn_create_variable(b, val, ptr_type, storage_class, initializer); break; }