summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2024-03-20 10:52:52 +0200
committerMarge Bot <emma+marge@anholt.net>2024-03-20 19:29:05 +0000
commit4fbdfdce9c63537225ea10dafa9e23a34e351684 (patch)
tree529a48f7b5b472e60a0f3d2496b37fc9e8d79e90
parent7730fa5683c41c3a2de042f5bc046c92029a4d8a (diff)
anv: allocate pipeline bindings tables dynamically on the heap
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: José Roberto de Souza <jose.souza@intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28290>
-rw-r--r--src/intel/vulkan/anv_pipeline.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index 56fbbb61687..65aca90f1ce 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -411,9 +411,6 @@ struct anv_pipeline_stage {
enum brw_robustness_flags robust_flags;
- struct anv_pipeline_binding surface_to_descriptor[256];
- struct anv_pipeline_binding sampler_to_descriptor[256];
- struct anv_pipeline_embedded_sampler_binding embedded_sampler_to_binding[2048];
struct anv_pipeline_bind_map bind_map;
bool uses_bt_for_push_descs;
@@ -434,6 +431,29 @@ struct anv_pipeline_stage {
struct anv_shader_bin *bin;
};
+static void
+anv_stage_allocate_bind_map_tables(struct anv_pipeline *pipeline,
+ struct anv_pipeline_stage *stage,
+ void *mem_ctx)
+{
+ struct anv_pipeline_binding *surface_bindings =
+ brw_shader_stage_requires_bindless_resources(stage->stage) ? NULL :
+ rzalloc_array(mem_ctx, struct anv_pipeline_binding, 256);
+ struct anv_pipeline_binding *sampler_bindings =
+ brw_shader_stage_requires_bindless_resources(stage->stage) ? NULL :
+ rzalloc_array(mem_ctx, struct anv_pipeline_binding, 256);
+ struct anv_pipeline_embedded_sampler_binding *embedded_sampler_bindings =
+ rzalloc_array(mem_ctx, struct anv_pipeline_embedded_sampler_binding,
+ anv_pipeline_sets_layout_embedded_sampler_count(
+ &pipeline->layout));
+
+ stage->bind_map = (struct anv_pipeline_bind_map) {
+ .surface_to_descriptor = surface_bindings,
+ .sampler_to_descriptor = sampler_bindings,
+ .embedded_sampler_to_binding = embedded_sampler_bindings,
+ };
+}
+
static enum brw_robustness_flags
anv_get_robust_flags(const struct vk_pipeline_robustness_state *rstate)
{
@@ -2004,12 +2024,6 @@ anv_graphics_pipeline_load_nir(struct anv_graphics_base_pipeline *pipeline,
assert(stages[s].stage == s);
- stages[s].bind_map = (struct anv_pipeline_bind_map) {
- .surface_to_descriptor = stages[s].surface_to_descriptor,
- .sampler_to_descriptor = stages[s].sampler_to_descriptor,
- .embedded_sampler_to_binding = stages[s].embedded_sampler_to_binding,
- };
-
/* Only use the create NIR from the pStages[] element if we don't have
* an imported library for the same stage.
*/
@@ -2273,6 +2287,8 @@ anv_graphics_pipeline_compile(struct anv_graphics_base_pipeline *pipeline,
link_optimize, s))
continue;
+ anv_stage_allocate_bind_map_tables(&pipeline->base, &stages[s], tmp_ctx);
+
anv_pipeline_nir_preprocess(&pipeline->base, &stages[s]);
}
@@ -2614,11 +2630,7 @@ anv_pipeline_compile_cs(struct anv_compute_pipeline *pipeline,
if (stage.bin == NULL) {
int64_t stage_start = os_time_get_nano();
- stage.bind_map = (struct anv_pipeline_bind_map) {
- .surface_to_descriptor = stage.surface_to_descriptor,
- .sampler_to_descriptor = stage.sampler_to_descriptor,
- .embedded_sampler_to_binding = stage.embedded_sampler_to_binding,
- };
+ anv_stage_allocate_bind_map_tables(&pipeline->base, &stage, mem_ctx);
/* Set up a binding for the gl_NumWorkGroups */
stage.bind_map.surface_count = 1;
@@ -3018,12 +3030,6 @@ anv_graphics_pipeline_import_lib(struct anv_graphics_base_pipeline *pipeline,
stages[s].subgroup_size_type = lib->retained_shaders[s].subgroup_size_type;
stages[s].imported.nir = lib->retained_shaders[s].nir;
stages[s].imported.bin = lib->base.shaders[s];
-
- stages[s].bind_map = (struct anv_pipeline_bind_map) {
- .surface_to_descriptor = stages[s].surface_to_descriptor,
- .sampler_to_descriptor = stages[s].sampler_to_descriptor,
- .embedded_sampler_to_binding = stages[s].embedded_sampler_to_binding,
- };
}
/* When not link optimizing, import the executables (shader descriptions
@@ -3551,8 +3557,8 @@ anv_pipeline_init_ray_tracing_stages(struct anv_ray_tracing_pipeline *pipeline,
},
};
- stages[i].bind_map.embedded_sampler_to_binding =
- stages[i].embedded_sampler_to_binding;
+ anv_stage_allocate_bind_map_tables(&pipeline->base, &stages[i],
+ tmp_pipeline_ctx);
pipeline->base.active_stages |= sinfo->stage;