radv/ac: mark used descriptor sets in shader info.

This pre calculates the used descriptor sets.

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2017-04-18 05:44:46 +10:00
parent 0b62669c8d
commit 4087eaecd0
2 changed files with 35 additions and 0 deletions

View File

@ -23,6 +23,12 @@
#include "nir.h" #include "nir.h"
#include "ac_shader_info.h" #include "ac_shader_info.h"
#include "ac_nir_to_llvm.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 static void
gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info) gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info)
{ {
@ -36,11 +42,36 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, struct ac_shader_info *info)
case nir_intrinsic_load_num_work_groups: case nir_intrinsic_load_num_work_groups:
info->cs.grid_components_used = instr->num_components; info->cs.grid_components_used = instr->num_components;
break; 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:
mark_sampler_desc(instr->variables[0]->var, info);
break;
default: default:
break; 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 static void
gather_info_block(nir_block *block, struct ac_shader_info *info) gather_info_block(nir_block *block, struct ac_shader_info *info)
{ {
@ -49,6 +80,9 @@ gather_info_block(nir_block *block, struct ac_shader_info *info)
case nir_instr_type_intrinsic: case nir_instr_type_intrinsic:
gather_intrinsic_info(nir_instr_as_intrinsic(instr), info); gather_intrinsic_info(nir_instr_as_intrinsic(instr), info);
break; break;
case nir_instr_type_tex:
gather_tex_info(nir_instr_as_tex(instr), info);
break;
default: default:
break; break;
} }

View File

@ -29,6 +29,7 @@ struct ac_nir_compiler_options;
struct ac_shader_info { struct ac_shader_info {
bool needs_push_constants; bool needs_push_constants;
uint32_t desc_set_used_mask;
struct { struct {
bool has_vertex_buffers; /* needs vertex buffers and base/start */ bool has_vertex_buffers; /* needs vertex buffers and base/start */
bool needs_draw_id; bool needs_draw_id;