X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Famd%2Fcommon%2Fac_shader_info.c;h=3299b47e6b879f97b7934dd7fa4e947eec3df040;hb=90c3bf07892c27c86c2474b14388e6b627454d76;hp=79c13767f67ec60cf6ea00a6b6ae43a1f1a93aa9;hpb=ec4785afb7bbba0627719731ceba05deeb58baac;p=mesa.git diff --git a/src/amd/common/ac_shader_info.c b/src/amd/common/ac_shader_info.c index 79c13767f67..3299b47e6b8 100644 --- a/src/amd/common/ac_shader_info.c +++ b/src/amd/common/ac_shader_info.c @@ -20,9 +20,15 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ -#include "nir.h" +#include "nir/nir.h" #include "ac_shader_info.h" #include "ac_nir_to_llvm.h" + +static void mark_sampler_desc(nir_variable *var, struct ac_shader_info *info) +{ + info->desc_set_used_mask = (1 << var->data.descriptor_set); +} + static void gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info) { @@ -33,14 +39,76 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info) case nir_intrinsic_load_draw_id: info->vs.needs_draw_id = true; break; + case nir_intrinsic_load_instance_id: + info->vs.needs_instance_id = true; + break; case nir_intrinsic_load_num_work_groups: - info->cs.grid_components_used = instr->num_components; + info->cs.uses_grid_size = true; + break; + case nir_intrinsic_load_local_invocation_id: + case nir_intrinsic_load_work_group_id: { + unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa); + while (mask) { + unsigned i = u_bit_scan(&mask); + + if (instr->intrinsic == nir_intrinsic_load_work_group_id) + info->cs.uses_block_id[i] = true; + else + info->cs.uses_thread_id[i] = true; + } + break; + } + case nir_intrinsic_load_local_invocation_index: + info->cs.uses_local_invocation_idx = true; + break; + case nir_intrinsic_load_sample_id: + info->ps.force_persample = true; break; + case nir_intrinsic_load_sample_pos: + info->ps.force_persample = true; + break; + case nir_intrinsic_load_view_index: + info->needs_multiview_view_index = true; + break; + case nir_intrinsic_vulkan_resource_index: + info->desc_set_used_mask |= (1 << nir_intrinsic_desc_set(instr)); + break; + case nir_intrinsic_image_load: + case nir_intrinsic_image_store: + case nir_intrinsic_image_atomic_add: + case nir_intrinsic_image_atomic_min: + case nir_intrinsic_image_atomic_max: + case nir_intrinsic_image_atomic_and: + case nir_intrinsic_image_atomic_or: + case nir_intrinsic_image_atomic_xor: + case nir_intrinsic_image_atomic_exchange: + case nir_intrinsic_image_atomic_comp_swap: + case nir_intrinsic_image_size: { + const struct glsl_type *type = instr->variables[0]->var->type; + if(instr->variables[0]->deref.child) + type = instr->variables[0]->deref.child->type; + + enum glsl_sampler_dim dim = glsl_get_sampler_dim(type); + if (dim == GLSL_SAMPLER_DIM_SUBPASS || + dim == GLSL_SAMPLER_DIM_SUBPASS_MS) + info->ps.uses_input_attachments = true; + mark_sampler_desc(instr->variables[0]->var, info); + break; + } default: break; } } +static void +gather_tex_info(nir_tex_instr *instr, struct ac_shader_info *info) +{ + if (instr->sampler) + mark_sampler_desc(instr->sampler->var, info); + if (instr->texture) + mark_sampler_desc(instr->texture->var, info); +} + static void gather_info_block(nir_block *block, struct ac_shader_info *info) { @@ -49,6 +117,9 @@ gather_info_block(nir_block *block, struct ac_shader_info *info) case nir_instr_type_intrinsic: gather_intrinsic_info(nir_instr_as_intrinsic(instr), info); break; + case nir_instr_type_tex: + gather_tex_info(nir_instr_as_tex(instr), info); + break; default: break; } @@ -61,7 +132,7 @@ gather_info_input_decl(nir_shader *nir, nir_variable *var, struct ac_shader_info *info) { - switch (nir->stage) { + switch (nir->info.stage) { case MESA_SHADER_VERTEX: info->vs.has_vertex_buffers = true; break;