panvk: Add v13 support

Signed-off-by: Mary Guillemard <mary.guillemard@collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34032>
This commit is contained in:
Mary Guillemard 2025-03-12 13:50:48 +01:00
parent c7b94b098c
commit 7a8d0b78e9
5 changed files with 48 additions and 7 deletions

View file

@ -647,7 +647,6 @@ prepare_tiler_primitive_size(struct panvk_cmd_buffer *cmdbuf)
{
struct cs_builder *b =
panvk_get_cs_builder(cmdbuf, PANVK_SUBQUEUE_VERTEX_TILER);
const struct panvk_shader *vs = cmdbuf->state.gfx.vs.shader;
const struct vk_input_assembly_state *ia =
&cmdbuf->vk.dynamic_graphics_state.ia;
float primitive_size;
@ -665,13 +664,16 @@ prepare_tiler_primitive_size(struct panvk_cmd_buffer *cmdbuf)
* points."
*
* If no point size is written, ensure that the size is always 1.0f.
* On v13+, the point size default to 1.0f.
*/
#if PAN_ARCH < 13
case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
if (vs->info.vs.writes_point_size)
if (cmdbuf->state.gfx.vs.shader->info.vs.writes_point_size)
return;
primitive_size = 1.0f;
break;
#endif
case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
primitive_size = cmdbuf->vk.dynamic_graphics_state.rs.line.width;
@ -680,8 +682,13 @@ prepare_tiler_primitive_size(struct panvk_cmd_buffer *cmdbuf)
return;
}
#if PAN_ARCH >= 13
cs_move32_to(b, cs_sr_reg32(b, IDVS, LINE_WIDTH),
fui(primitive_size));
#else
cs_move32_to(b, cs_sr_reg32(b, IDVS, PRIMITIVE_SIZE),
fui(primitive_size));
#endif
}
static uint32_t
@ -1802,9 +1809,12 @@ set_tiler_idvs_flags(struct cs_builder *b, struct panvk_cmd_buffer *cmdbuf,
pan_pack(&tiler_idvs_flags, PRIMITIVE_FLAGS, cfg) {
cfg.draw_mode = translate_prim_topology(ia->primitive_topology);
#if PAN_ARCH < 13
cfg.point_size_array_format = writes_point_size
? MALI_POINT_SIZE_ARRAY_FORMAT_FP16
: MALI_POINT_SIZE_ARRAY_FORMAT_NONE;
#endif
cfg.layer_index_enable = writes_layer;
cfg.position_fifo_format = extended_fifo

View file

@ -13,7 +13,8 @@ panvk_entrypoints = custom_target(
'--out-h', '@OUTPUT0@', '--out-c', '@OUTPUT1@', '--prefix', 'panvk',
'--device-prefix', 'panvk_v6', '--device-prefix', 'panvk_v7',
'--device-prefix', 'panvk_v9', '--device-prefix', 'panvk_v10',
'--device-prefix', 'panvk_v12', '--beta', with_vulkan_beta.to_string()
'--device-prefix', 'panvk_v12', '--device-prefix', 'panvk_v13',
'--beta', with_vulkan_beta.to_string()
],
depend_files : vk_entrypoints_gen_depend_files,
)
@ -62,7 +63,7 @@ valhall_archs = [9, 10]
valhall_inc_dir = ['valhall']
valhall_files = []
avalon_archs = [12]
avalon_archs = [12, 13]
avalon_inc_dir = ['avalon']
avalon_files = []
@ -80,7 +81,7 @@ jm_files = [
'jm/panvk_vX_queue.c',
]
csf_archs = [10, 12]
csf_archs = [10, 12, 13]
csf_inc_dir = ['csf']
csf_files = [
'csf/panvk_vX_cmd_buffer.c',
@ -118,7 +119,7 @@ common_per_arch_files = [
'panvk_vX_shader.c',
]
foreach arch : [6, 7, 10, 12]
foreach arch : [6, 7, 10, 12, 13]
per_arch_files = common_per_arch_files
inc_panvk_per_arch = []

View file

@ -58,6 +58,9 @@ panvk_catch_indirect_alloc_failure(VkResult error)
case 12: \
panvk_arch_name(name, v12)(__VA_ARGS__); \
break; \
case 13: \
panvk_arch_name(name, v13)(__VA_ARGS__); \
break; \
default: \
unreachable("Unsupported architecture"); \
} \
@ -78,6 +81,9 @@ panvk_catch_indirect_alloc_failure(VkResult error)
case 12: \
ret = panvk_arch_name(name, v12)(__VA_ARGS__); \
break; \
case 13: \
ret = panvk_arch_name(name, v13)(__VA_ARGS__); \
break; \
default: \
unreachable("Unsupported architecture"); \
} \
@ -94,6 +100,8 @@ panvk_catch_indirect_alloc_failure(VkResult error)
#define panvk_per_arch(name) panvk_arch_name(name, v10)
#elif PAN_ARCH == 12
#define panvk_per_arch(name) panvk_arch_name(name, v12)
#elif PAN_ARCH == 13
#define panvk_per_arch(name) panvk_arch_name(name, v13)
#else
#error "Unsupported arch"
#endif

View file

@ -609,6 +609,18 @@ get_device_properties(const struct panvk_instance *instance,
/* Ensure that the max threads count per workgroup is valid for Bifrost */
assert(arch > 8 || device->kmod.props.max_threads_per_wg <= 1024);
float pointSizeRangeMin;
float pointSizeRangeMax;
/* On v13+, point size handling changed entirely */
if (arch >= 13) {
pointSizeRangeMin = 1.0;
pointSizeRangeMax = 1024.0;
} else {
pointSizeRangeMin = 0.125;
pointSizeRangeMax = 4095.9375;
}
*properties = (struct vk_properties){
.apiVersion = get_api_version(arch),
.driverVersion = vk_get_driver_version(),
@ -822,7 +834,7 @@ get_device_properties(const struct panvk_instance *instance,
.maxCullDistances = 0,
.maxCombinedClipAndCullDistances = 0,
.discreteQueuePriorities = 2,
.pointSizeRange = {0.125, 4095.9375},
.pointSizeRange = {pointSizeRangeMin, pointSizeRangeMax},
.lineWidthRange = {0.0, 7.9921875},
.pointSizeGranularity = (1.0 / 16.0),
.lineWidthGranularity = (1.0 / 128.0),
@ -1092,6 +1104,7 @@ panvk_physical_device_init(struct panvk_physical_device *device,
case 10:
case 12:
case 13:
break;
default:
@ -1267,6 +1280,7 @@ DEVICE_PER_ARCH_FUNCS(6);
DEVICE_PER_ARCH_FUNCS(7);
DEVICE_PER_ARCH_FUNCS(10);
DEVICE_PER_ARCH_FUNCS(12);
DEVICE_PER_ARCH_FUNCS(13);
VKAPI_ATTR VkResult VKAPI_CALL
panvk_CreateDevice(VkPhysicalDevice physicalDevice,

View file

@ -675,9 +675,17 @@ cmd_emit_dcd(struct panvk_cmd_buffer *cmdbuf, struct pan_fb_info *fbinfo,
* Thing's haven't been benchmarked to determine what's
* preferable (saving bandwidth vs having ZS preloaded
* earlier), so let's leave it like that for now.
*
* On v13+, we don't have EARLY_ZS_ALWAYS instead we use
* PREPASS_ALWAYS.
*/
#if PAN_ARCH >= 13
fbinfo->bifrost.pre_post.modes[dcd_idx] =
MALI_PRE_POST_FRAME_SHADER_MODE_PREPASS_ALWAYS;
#else
fbinfo->bifrost.pre_post.modes[dcd_idx] =
MALI_PRE_POST_FRAME_SHADER_MODE_EARLY_ZS_ALWAYS;
#endif
}
return VK_SUCCESS;