diff --git a/src/intel/vulkan/anv_drirc_gen.py b/src/intel/vulkan/anv_drirc_gen.py
index 3a7c6db5d1b..bb4cb9d351f 100644
--- a/src/intel/vulkan/anv_drirc_gen.py
+++ b/src/intel/vulkan/anv_drirc_gen.py
@@ -243,6 +243,9 @@ def declare_options(android_version):
B("anv_enable_fully_covered", False,
"Enable fullyCoveredFragmentShaderInputVariable (Alchemist and newer only).",
c_name="fully_covered"),
+ B("anv_fake_image_compression_control_xe2_plus", android_version >= 37,
+ "Enable VK_EXT_image_compression_control with no actual effect",
+ c_name= "fake_image_compression_control_xe2_plus"),
B("compression_control_enabled", android_version >= 37,
"Enable VK_EXT_image_compression_control support",
c_name="compression_control_enabled"),
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 08ddc719930..cc8870c0af1 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -331,7 +331,9 @@ anv_image_choose_isl_surf_usage(struct anv_physical_device *device,
isl_usage |= ISL_SURF_USAGE_RENDER_TARGET_BIT;
}
- if (comp_flags & VK_IMAGE_COMPRESSION_DISABLED_EXT) {
+ if (device->has_compression_control &&
+ device->expose_compression_control &&
+ (comp_flags & VK_IMAGE_COMPRESSION_DISABLED_EXT)) {
anv_perf_warn(VK_LOG_OBJS(&device->vk.base),
"Disabling aux: "
"image compression disabled via create flags");
@@ -3467,7 +3469,7 @@ anv_get_image_subresource_layout(struct anv_device *device,
VkImageCompressionPropertiesEXT *comp_props =
vk_find_struct(layout->pNext, IMAGE_COMPRESSION_PROPERTIES_EXT);
- if (comp_props) {
+ if (comp_props && device->physical->expose_compression_control) {
comp_props->imageCompressionFixedRateFlags =
VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT;
comp_props->imageCompressionFlags = VK_IMAGE_COMPRESSION_DISABLED_EXT;
diff --git a/src/intel/vulkan/anv_physical_device.c b/src/intel/vulkan/anv_physical_device.c
index 4229d007ba9..7d2c5de2ba6 100644
--- a/src/intel/vulkan/anv_physical_device.c
+++ b/src/intel/vulkan/anv_physical_device.c
@@ -134,6 +134,7 @@ static void
get_device_extensions(const struct anv_physical_device *device,
struct vk_device_extension_table *ext)
{
+ const struct anv_instance *instance = device->instance;
const bool rt_enabled = ANV_SUPPORT_RT && device->info.has_ray_tracing &&
!intel_use_jay_any_stage(&device->info);
const bool hw_video_encode_supported = device->info.verx10 < 125;
@@ -143,7 +144,7 @@ get_device_extensions(const struct anv_physical_device *device,
*ext = (struct vk_device_extension_table) {
.KHR_8bit_storage = true,
- .KHR_16bit_storage = !device->instance->drirc.debug.no_16bit,
+ .KHR_16bit_storage = !instance->drirc.debug.no_16bit,
.KHR_acceleration_structure = rt_enabled,
.KHR_bind_memory2 = true,
.KHR_buffer_device_address = true,
@@ -228,7 +229,7 @@ get_device_extensions(const struct anv_physical_device *device,
.KHR_shader_constant_data = true,
.KHR_shader_draw_parameters = true,
.KHR_shader_expect_assume = true,
- .KHR_shader_float16_int8 = !device->instance->drirc.debug.no_16bit,
+ .KHR_shader_float16_int8 = !instance->drirc.debug.no_16bit,
.KHR_shader_float_controls = true,
.KHR_shader_float_controls2 = true,
.KHR_shader_integer_dot_product = true,
@@ -329,7 +330,7 @@ get_device_extensions(const struct anv_physical_device *device,
.EXT_host_image_copy = true,
.EXT_host_query_reset = true,
.EXT_image_2d_view_of_3d = true,
- .EXT_image_compression_control = device->has_compression_control,
+ .EXT_image_compression_control = device->expose_compression_control,
.EXT_image_drm_format_modifier = true,
.EXT_image_robustness = true,
.EXT_image_sliced_view_of_3d = true,
@@ -388,7 +389,7 @@ get_device_extensions(const struct anv_physical_device *device,
.EXT_shader_uniform_buffer_unsized_array = true,
.EXT_subgroup_size_control = !device->brw_disable_subgroup_size_control,
#ifdef ANV_USE_WSI_PLATFORM
- .EXT_image_compression_control_swapchain = device->has_compression_control,
+ .EXT_image_compression_control_swapchain = device->expose_compression_control,
.EXT_swapchain_maintenance1 = true,
#endif
.EXT_texel_buffer_alignment = true,
@@ -423,7 +424,8 @@ static void
get_features(const struct anv_physical_device *pdevice,
struct vk_features *features)
{
- struct vk_app_info *app_info = &pdevice->instance->vk.app_info;
+ const struct anv_instance *instance = pdevice->instance;
+ const struct vk_app_info *app_info = &instance->vk.app_info;
const bool rt_enabled = ANV_SUPPORT_RT && pdevice->info.has_ray_tracing;
@@ -470,7 +472,7 @@ get_features(const struct anv_physical_device *pdevice,
* read/writes, on Gfx11 & Gfx12.0 we emulate for 3 formats.
*/
.shaderStorageImageReadWithoutFormat = pdevice->info.verx10 >= 125 ||
- pdevice->instance->drirc.debug.read_without_format_emu,
+ instance->drirc.debug.read_without_format_emu,
.shaderStorageImageWriteWithoutFormat = true,
.shaderUniformBufferArrayDynamicIndexing = true,
.shaderSampledImageArrayDynamicIndexing = true,
@@ -479,7 +481,7 @@ get_features(const struct anv_physical_device *pdevice,
.shaderClipDistance = true,
.shaderCullDistance = true,
.shaderFloat64 = pdevice->info.has_64bit_float ||
- pdevice->instance->drirc.debug.fp64_emu,
+ instance->drirc.debug.fp64_emu,
.shaderInt64 = true,
.shaderInt16 = true,
.shaderResourceMinLod = true,
@@ -500,8 +502,8 @@ get_features(const struct anv_physical_device *pdevice,
.inheritedQueries = true,
/* Vulkan 1.1 */
- .storageBuffer16BitAccess = !pdevice->instance->drirc.debug.no_16bit,
- .uniformAndStorageBuffer16BitAccess = !pdevice->instance->drirc.debug.no_16bit,
+ .storageBuffer16BitAccess = !instance->drirc.debug.no_16bit,
+ .uniformAndStorageBuffer16BitAccess = !instance->drirc.debug.no_16bit,
.storagePushConstant16 = true,
.storageInputOutput16 = true,
.multiview = true,
@@ -521,8 +523,8 @@ get_features(const struct anv_physical_device *pdevice,
.storagePushConstant8 = true,
.shaderBufferInt64Atomics = true,
.shaderSharedInt64Atomics = false,
- .shaderFloat16 = !pdevice->instance->drirc.debug.no_16bit,
- .shaderInt8 = !pdevice->instance->drirc.debug.no_16bit,
+ .shaderFloat16 = !instance->drirc.debug.no_16bit,
+ .shaderInt8 = !instance->drirc.debug.no_16bit,
.descriptorIndexing = true,
.shaderInputAttachmentArrayDynamicIndexing = false,
@@ -620,7 +622,7 @@ get_features(const struct anv_physical_device *pdevice,
/* VK_EXT_custom_border_color */
.customBorderColors = true,
.customBorderColorWithoutFormat =
- pdevice->instance->drirc.debug.custom_border_colors_without_format,
+ instance->drirc.debug.custom_border_colors_without_format,
/* VK_KHR_depth_clamp_zero_one */
.depthClampZeroOne = true,
@@ -948,7 +950,7 @@ get_features(const struct anv_physical_device *pdevice,
.videoDecodeVP9 = true,
/* VK_EXT_image_compression_control */
- .imageCompressionControl = pdevice->has_compression_control,
+ .imageCompressionControl = pdevice->expose_compression_control,
/* VK_KHR_shader_float_controls2 */
.shaderFloatControls2 = true,
@@ -1058,7 +1060,7 @@ get_features(const struct anv_physical_device *pdevice,
.deviceAddressCommands = true,
/* VK_EXT_swapchain_compression_control */
- .imageCompressionControlSwapchain = pdevice->has_compression_control,
+ .imageCompressionControlSwapchain = pdevice->expose_compression_control,
};
/* The new DOOM and Wolfenstein games require depthBounds without
@@ -2903,9 +2905,17 @@ anv_physical_device_try_create(struct vk_instance *vk_instance,
* to always return the same memory types for Images with same properties
* we can't support EXT_image_compression_control on Xe2+.
*/
- device->has_compression_control =
- instance->drirc.features.compression_control_enabled &&
- device->info.ver < 20;
+ device->has_compression_control = device->info.ver < 20;
+
+ /* Whether we want to expose the extension depends on DRIRC (for platforms
+ * that support this or fake on Xe2+ due to Android VP17 profile
+ * requirement).
+ */
+ device->expose_compression_control =
+ (instance->drirc.features.fake_image_compression_control_xe2_plus &&
+ device->info.ver >= 20) ||
+ (instance->drirc.features.compression_control_enabled &&
+ device->has_compression_control);
if (is_virtio) {
struct util_sync_provider *sync = intel_virtio_sync_provider(fd);
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index ee79ccacd7e..8daf2c751de 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -1554,8 +1554,10 @@ struct anv_physical_device {
bool has_scratch_page;
- /** Whether we allow the application to control compression */
+ /** Whether the device can support compression control */
bool has_compression_control;
+ /** Whether the device expose support for compression control */
+ bool expose_compression_control;
struct {
uint32_t family_count;
diff --git a/src/util/00-anv-defaults.conf b/src/util/00-anv-defaults.conf
index 0e9acf6bdd9..8ac641b9bca 100644
--- a/src/util/00-anv-defaults.conf
+++ b/src/util/00-anv-defaults.conf
@@ -80,6 +80,7 @@
+