From 37f03e89f22dd2139bbdec1888ac1b9a51e4df12 Mon Sep 17 00:00:00 2001 From: Caio Marcelo de Oliveira Filho Date: Thu, 23 Sep 2021 22:59:40 -0700 Subject: [PATCH] intel: Add and use max_constant_urb_size_kb This knowledge was repeated in multiple places so move the values to intel_device_info struct. Reviewed-by: Lionel Landwerlin Acked-by: Jason Ekstrand Part-of: --- src/gallium/drivers/crocus/crocus_state.c | 9 ++------- src/intel/common/intel_urb_config.c | 3 +-- src/intel/dev/intel_device_info.c | 3 +++ src/intel/dev/intel_device_info.h | 6 ++++++ src/intel/dev/intel_device_info_test.c | 2 ++ src/intel/vulkan/genX_cmd_buffer.c | 9 ++------- src/mesa/drivers/dri/i965/gfx7_urb.c | 3 +-- 7 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c index 0b6545176f5..273a259ef7f 100644 --- a/src/gallium/drivers/crocus/crocus_state.c +++ b/src/gallium/drivers/crocus/crocus_state.c @@ -1321,13 +1321,8 @@ emit_pipeline_select(struct crocus_batch *batch, uint32_t pipeline) static void crocus_alloc_push_constants(struct crocus_batch *batch) { -#if GFX_VERx10 == 75 - const unsigned push_constant_kb = batch->screen->devinfo.gt == 3 ? 32 : 16; -#elif GFX_VER == 8 - const unsigned push_constant_kb = 32; -#else - const unsigned push_constant_kb = 16; -#endif + const unsigned push_constant_kb = + batch->screen->devinfo.max_constant_urb_size_kb; unsigned size_per_stage = push_constant_kb / 5; /* For now, we set a static partitioning of the push constant area, diff --git a/src/intel/common/intel_urb_config.c b/src/intel/common/intel_urb_config.c index 283e521ec92..f7fabde8cb0 100644 --- a/src/intel/common/intel_urb_config.c +++ b/src/intel/common/intel_urb_config.c @@ -87,8 +87,7 @@ intel_get_urb_config(const struct intel_device_info *devinfo, if (devinfo->ver >= 12) urb_size_kB -= 4 * devinfo->l3_banks; - const unsigned push_constant_kB = - (devinfo->ver >= 8 || (devinfo->is_haswell && devinfo->gt == 3)) ? 32 : 16; + const unsigned push_constant_kB = devinfo->max_constant_urb_size_kb; const bool active[4] = { true, tess_present, tess_present, gs_present }; diff --git a/src/intel/dev/intel_device_info.c b/src/intel/dev/intel_device_info.c index 5e9e86ba8e0..5cf6e0e7112 100644 --- a/src/intel/dev/intel_device_info.c +++ b/src/intel/dev/intel_device_info.c @@ -219,6 +219,7 @@ static const struct intel_device_info intel_device_info_snb_gt2 = { .has_64bit_float = true, \ .has_surface_tile_offset = true, \ .timestamp_frequency = 12500000, \ + .max_constant_urb_size_kb = 16, \ .cs_prefetch_size = 512 static const struct intel_device_info intel_device_info_ivb_gt1 = { @@ -394,6 +395,7 @@ static const struct intel_device_info intel_device_info_hsw_gt3 = { [MESA_SHADER_GEOMETRY] = 640, }, }, + .max_constant_urb_size_kb = 32, .simulator_id = 9, }; @@ -419,6 +421,7 @@ static const struct intel_device_info intel_device_info_hsw_gt3 = { .max_gs_threads = 504, \ .max_wm_threads = 384, \ .timestamp_frequency = 12500000, \ + .max_constant_urb_size_kb = 32, \ .cs_prefetch_size = 512 static const struct intel_device_info intel_device_info_bdw_gt1 = { diff --git a/src/intel/dev/intel_device_info.h b/src/intel/dev/intel_device_info.h index d6bce7d90b6..b26296bcb9d 100644 --- a/src/intel/dev/intel_device_info.h +++ b/src/intel/dev/intel_device_info.h @@ -265,6 +265,12 @@ struct intel_device_info unsigned max_entries[4]; } urb; + /* Maximum size in Kb that can be allocated to constants in the URB, this + * is usually divided among the stages for implementing push constants. + * See 3DSTATE_PUSH_CONSTANT_ALLOC_*. + */ + unsigned max_constant_urb_size_kb; + /** * Size of the command streamer prefetch. This is important to know for * self modifying batches. diff --git a/src/intel/dev/intel_device_info_test.c b/src/intel/dev/intel_device_info_test.c index 8ff22cf0999..06e51ace785 100644 --- a/src/intel/dev/intel_device_info_test.c +++ b/src/intel/dev/intel_device_info_test.c @@ -28,6 +28,8 @@ main(int argc, char *argv[]) assert(devinfo.num_thread_per_eu != 0); assert(devinfo.timestamp_frequency != 0); assert(devinfo.cs_prefetch_size > 0); + + assert(devinfo.ver < 7 || devinfo.max_constant_urb_size_kb > 0); } return 0; diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 9b091203255..d24bb822744 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2501,13 +2501,8 @@ cmd_buffer_alloc_push_constants(struct anv_cmd_buffer *cmd_buffer) if (stages == cmd_buffer->state.gfx.push_constant_stages) return; -#if GFX_VER >= 8 - const unsigned push_constant_kb = 32; -#elif GFX_VERx10 == 75 - const unsigned push_constant_kb = cmd_buffer->device->info.gt == 3 ? 32 : 16; -#else - const unsigned push_constant_kb = 16; -#endif + const unsigned push_constant_kb = + cmd_buffer->device->info.max_constant_urb_size_kb; const unsigned num_stages = util_bitcount(stages & VK_SHADER_STAGE_ALL_GRAPHICS); diff --git a/src/mesa/drivers/dri/i965/gfx7_urb.c b/src/mesa/drivers/dri/i965/gfx7_urb.c index 0f06d26d82e..79c28c15658 100644 --- a/src/mesa/drivers/dri/i965/gfx7_urb.c +++ b/src/mesa/drivers/dri/i965/gfx7_urb.c @@ -71,8 +71,7 @@ gfx7_allocate_push_constants(struct brw_context *brw) bool tess_present = brw->programs[MESA_SHADER_TESS_EVAL]; unsigned avail_size = 16; - unsigned multiplier = - (devinfo->ver >= 8 || (devinfo->is_haswell && devinfo->gt == 3)) ? 2 : 1; + unsigned multiplier = devinfo->max_constant_urb_size_kb / 16; int stages = 2 + gs_present + 2 * tess_present;