mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-27 10:08:13 +02:00
We lower NIR's load_constant to load_global_constant, which uses A64 bindless messages. As such, we do the following math to produce the address for each load: base_lo@32 <- BRW_SHADER_RELOC_CONST_DATA_ADDR_LOW base_hi@32 <- BRW_SHADER_RELOC_CONST_DATA_ADDR_HIGH base@64 <- pack_64_2x32_split(base_lo, base_hi) addr@64 <- iadd(base@64, u2u64(offset@32)) On platforms that emulate 64-bit math, we have to emit additional code for the 64-bit iadd to handle the possibility of a carry happening and affecting the top bits. However, NIR constant data is always uploaded adjacent to the shader assembly, in the same buffer. These buffers are required to live in a 4GB region of memory starting at Instruction State Base Address. We always place the base address at a 4GB address. So the constant data always lives in a buffer entirely contained within a 4GB region, which means any offsets from the start of the buffer cannot possibly affect the high bits. So instead, we can simply do a 32-bit addition between the low bits of the base and the offset, then pack that with the unchanged high bits. On iris, IRIS_MEMZONE_SHADER is at [0, 4GB) so the high bits are always zero. We don't even need to patch that portion of the address and can simply use u2u64 to promote the 32-bit add result to a 64-bit value where the top bits are 0. shader-db on Icelake indicates that this: - Helps instructions: -1.13% in 135 affected programs - Helps spills/fills: -4.08% / -4.18% in 4 affected programs - Gains us 1 SIMD16 compute shader instead of SIMD8 Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20999> |
||
|---|---|---|
| .. | ||
| driinfo_iris.h | ||
| iris_batch.c | ||
| iris_batch.h | ||
| iris_binder.c | ||
| iris_binder.h | ||
| iris_blit.c | ||
| iris_blorp.c | ||
| iris_border_color.c | ||
| iris_bufmgr.c | ||
| iris_bufmgr.h | ||
| iris_clear.c | ||
| iris_context.c | ||
| iris_context.h | ||
| iris_defines.h | ||
| iris_disk_cache.c | ||
| iris_draw.c | ||
| iris_fence.c | ||
| iris_fence.h | ||
| iris_fine_fence.c | ||
| iris_fine_fence.h | ||
| iris_formats.c | ||
| iris_genx_macros.h | ||
| iris_genx_protos.h | ||
| iris_measure.c | ||
| iris_measure.h | ||
| iris_monitor.c | ||
| iris_monitor.h | ||
| iris_perf.c | ||
| iris_perf.h | ||
| iris_performance_query.c | ||
| iris_pipe.h | ||
| iris_pipe_control.c | ||
| iris_program.c | ||
| iris_program_cache.c | ||
| iris_query.c | ||
| iris_resolve.c | ||
| iris_resource.c | ||
| iris_resource.h | ||
| iris_screen.c | ||
| iris_screen.h | ||
| iris_state.c | ||
| iris_utrace.c | ||
| iris_utrace.h | ||
| meson.build | ||