!radv_image_is_tc_compat_htile(image))
return;
- if (!radv_layout_is_htile_compressed(image, layout, in_render_loop,
+ if (!radv_layout_is_htile_compressed(cmd_buffer->device, image, layout, in_render_loop,
radv_image_queue_family_mask(image,
cmd_buffer->queue_family_index,
cmd_buffer->queue_family_index))) {
uint32_t db_z_info = ds->db_z_info;
uint32_t db_stencil_info = ds->db_stencil_info;
- if (!radv_layout_is_htile_compressed(image, layout, in_render_loop,
+ if (!radv_layout_is_htile_compressed(cmd_buffer->device, image, layout, in_render_loop,
radv_image_queue_family_mask(image,
cmd_buffer->queue_family_index,
cmd_buffer->queue_family_index))) {
cmd_buffer->state.offset_scale = cmd_buffer->state.attachments[idx].ds.offset_scale;
}
- if (radv_layout_is_htile_compressed(iview->image, layout, in_render_loop,
+ if (radv_layout_is_htile_compressed(cmd_buffer->device, iview->image, layout, in_render_loop,
radv_image_queue_family_mask(iview->image,
cmd_buffer->queue_family_index,
cmd_buffer->queue_family_index))) {
const VkImageSubresourceRange *range,
struct radv_sample_locations_state *sample_locs)
{
+ struct radv_device *device = cmd_buffer->device;
+
if (!radv_image_has_htile(image))
return;
if (src_layout == VK_IMAGE_LAYOUT_UNDEFINED) {
radv_initialize_htile(cmd_buffer, image, range);
- } else if (!radv_layout_is_htile_compressed(image, src_layout, src_render_loop, src_queue_mask) &&
- radv_layout_is_htile_compressed(image, dst_layout, dst_render_loop, dst_queue_mask)) {
+ } else if (!radv_layout_is_htile_compressed(device, image, src_layout, src_render_loop, src_queue_mask) &&
+ radv_layout_is_htile_compressed(device, image, dst_layout, dst_render_loop, dst_queue_mask)) {
radv_initialize_htile(cmd_buffer, image, range);
- } else if (radv_layout_is_htile_compressed(image, src_layout, src_render_loop, src_queue_mask) &&
- !radv_layout_is_htile_compressed(image, dst_layout, dst_render_loop, dst_queue_mask)) {
+ } else if (radv_layout_is_htile_compressed(device, image, src_layout, src_render_loop, src_queue_mask) &&
+ !radv_layout_is_htile_compressed(device, image, dst_layout, dst_render_loop, dst_queue_mask)) {
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_FLUSH_AND_INV_DB |
RADV_CMD_FLAG_FLUSH_AND_INV_DB_META;
}
}
-bool radv_layout_is_htile_compressed(const struct radv_image *image,
+bool radv_layout_is_htile_compressed(const struct radv_device *device,
+ const struct radv_image *image,
VkImageLayout layout,
bool in_render_loop,
unsigned queue_mask)
* depth pass because this allows compression and this reduces
* the number of decompressions from/to GENERAL.
*/
- return radv_image_is_tc_compat_htile(image) &&
- queue_mask == (1u << RADV_QUEUE_GENERAL) &&
- !(image->usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
- !in_render_loop;
+ if (radv_image_is_tc_compat_htile(image) &&
+ queue_mask == (1u << RADV_QUEUE_GENERAL)) {
+ /* GFX10+ supports compressed writes to HTILE. */
+ return device->physical_device->rad_info.chip_class >= GFX10 ||
+ (!(image->usage & VK_IMAGE_USAGE_STORAGE_BIT) &&
+ !in_render_loop);
+ } else {
+ return false;
+ }
default:
return radv_image_is_tc_compat_htile(image);
}
iview->base_mip == 0 &&
iview->base_layer == 0 &&
iview->layer_count == iview->image->info.array_size &&
- radv_layout_is_htile_compressed(iview->image, layout, in_render_loop, queue_mask) &&
+ radv_layout_is_htile_compressed(cmd_buffer->device, iview->image, layout, in_render_loop, queue_mask) &&
radv_image_extent_compare(iview->image, &iview->extent))
return true;
return false;
if (!radv_image_view_can_fast_clear(cmd_buffer->device, iview))
return false;
- if (!radv_layout_is_htile_compressed(iview->image, image_layout, in_render_loop,
+ if (!radv_layout_is_htile_compressed(cmd_buffer->device, iview->image, image_layout, in_render_loop,
radv_image_queue_family_mask(iview->image,
cmd_buffer->queue_family_index,
cmd_buffer->queue_family_index)))