diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 72621f81999..14dd495cb15 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -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 diff --git a/src/panfrost/vulkan/meson.build b/src/panfrost/vulkan/meson.build index f3a93775564..724418eda9b 100644 --- a/src/panfrost/vulkan/meson.build +++ b/src/panfrost/vulkan/meson.build @@ -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 = [] diff --git a/src/panfrost/vulkan/panvk_macros.h b/src/panfrost/vulkan/panvk_macros.h index c5b3d78019a..927f49756bb 100644 --- a/src/panfrost/vulkan/panvk_macros.h +++ b/src/panfrost/vulkan/panvk_macros.h @@ -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 diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c index f561ed92880..b86f5e77df0 100644 --- a/src/panfrost/vulkan/panvk_physical_device.c +++ b/src/panfrost/vulkan/panvk_physical_device.c @@ -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, diff --git a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c index 2e50cee7849..ee6133b8e4b 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_fb_preload.c @@ -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;