hk: gate min LOD emulation on the feature

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35169>
This commit is contained in:
Alyssa Rosenzweig 2025-05-26 12:48:10 -04:00 committed by Marge Bot
parent 3065815c7c
commit ab9da6bc49
4 changed files with 31 additions and 6 deletions

View file

@ -57,6 +57,7 @@
#include "vk_graphics_state.h"
#include "vk_pipeline.h"
#include "vk_render_pass.h"
#include "vk_shader.h"
#include "vk_standard_sample_locations.h"
#include "vk_util.h"
@ -1313,7 +1314,7 @@ hk_build_meta_shader_locked(struct hk_device *dev, struct hk_internal_key *key,
hk_preprocess_nir_internal(dev->vk.physical, b.shader);
struct hk_api_shader *s;
if (hk_compile_shader(dev, &info, NULL, NULL, &s) != VK_SUCCESS)
if (hk_compile_shader(dev, &info, NULL, NULL, NULL, &s) != VK_SUCCESS)
return NULL;
/* ..and cache it before we return. The key is on the stack right now, so

View file

@ -32,6 +32,7 @@
#include "vk_debug_utils.h"
#include "vk_device.h"
#include "vk_pipeline_cache.h"
#include "vk_shader.h"
#include <fcntl.h>
#include <xf86drm.h>
@ -483,7 +484,7 @@ hk_CreateDevice(VkPhysicalDevice physicalDevice,
.robustness = &vk_robustness_disabled,
.stage = MESA_SHADER_FRAGMENT,
};
hk_compile_shader(dev, &info, NULL, pAllocator, &dev->null_fs);
hk_compile_shader(dev, &info, NULL, NULL, pAllocator, &dev->null_fs);
if (!dev->null_fs) {
result = VK_ERROR_OUT_OF_HOST_MEMORY;
goto fail_meta;

View file

@ -222,6 +222,19 @@ hk_populate_fs_key(struct hk_fs_key *key,
key->force_sample_shading = true;
}
enum hk_feature_key {
HK_FEAT_MIN_LOD = BITFIELD_BIT(0),
};
static enum hk_feature_key
hk_make_feature_key(const struct vk_features *features)
{
if (!features)
return ~0U;
return (features->minLod ? HK_FEAT_MIN_LOD : 0);
}
static void
hk_hash_graphics_state(struct vk_physical_device *device,
const struct vk_graphics_pipeline_state *state,
@ -238,6 +251,10 @@ hk_hash_graphics_state(struct vk_physical_device *device,
const bool is_multiview = state->rp->view_mask != 0;
_mesa_blake3_update(&blake3_ctx, &is_multiview, sizeof(is_multiview));
}
enum hk_feature_key feature_key = hk_make_feature_key(features);
_mesa_blake3_update(&blake3_ctx, &feature_key, sizeof(feature_key));
_mesa_blake3_final(&blake3_ctx, blake3_out);
}
@ -636,7 +653,8 @@ static void
hk_lower_nir(struct hk_device *dev, nir_shader *nir,
const struct vk_pipeline_robustness_state *rs, bool is_multiview,
uint32_t set_layout_count,
struct vk_descriptor_set_layout *const *set_layouts)
struct vk_descriptor_set_layout *const *set_layouts,
enum hk_feature_key features)
{
if (HK_PERF(dev, NOROBUST)) {
rs = &vk_robustness_disabled;
@ -694,7 +712,9 @@ hk_lower_nir(struct hk_device *dev, nir_shader *nir,
*/
NIR_PASS(_, nir, agx_nir_lower_texture_early, true /* support_lod_bias */);
NIR_PASS(_, nir, agx_nir_lower_image_view_min_lod);
if (features & HK_FEAT_MIN_LOD) {
NIR_PASS(_, nir, agx_nir_lower_image_view_min_lod);
}
if (!HK_PERF(dev, NOBORDER)) {
NIR_PASS(_, nir, agx_nir_lower_custom_border);
@ -1054,10 +1074,12 @@ hk_lower_hw_vs(nir_shader *nir, struct hk_shader *shader)
VkResult
hk_compile_shader(struct hk_device *dev, struct vk_shader_compile_info *info,
const struct vk_graphics_pipeline_state *state,
const struct vk_features *vk_features,
const VkAllocationCallbacks *pAllocator,
struct hk_api_shader **shader_out)
{
VkResult result;
enum hk_feature_key features = hk_make_feature_key(vk_features);
/* We consume the NIR, regardless of success or failure */
nir_shader *nir = info->nir;
@ -1076,7 +1098,7 @@ hk_compile_shader(struct hk_device *dev, struct vk_shader_compile_info *info,
const bool is_multiview = state && state->rp->view_mask != 0;
hk_lower_nir(dev, nir, info->robustness, is_multiview,
info->set_layout_count, info->set_layouts);
info->set_layout_count, info->set_layouts, features);
gl_shader_stage sw_stage = nir->info.stage;
@ -1263,7 +1285,7 @@ hk_compile_shaders(struct vk_device *vk_dev, uint32_t shader_count,
for (uint32_t i = 0; i < shader_count; i++) {
VkResult result =
hk_compile_shader(dev, &infos[i], state, pAllocator,
hk_compile_shader(dev, &infos[i], state, features, pAllocator,
(struct hk_api_shader **)&shaders_out[i]);
if (result != VK_SUCCESS) {
/* Clean up all the shaders before this point */

View file

@ -362,6 +362,7 @@ hk_nir_lower_descriptors(nir_shader *nir,
VkResult hk_compile_shader(struct hk_device *dev,
struct vk_shader_compile_info *info,
const struct vk_graphics_pipeline_state *state,
const struct vk_features *features,
const VkAllocationCallbacks *pAllocator,
struct hk_api_shader **shader_out);