anv: Enable MSAA compression
This just enables basic MSAA compression (no fast clears) for all multisampled surfaces. This improves the framerate of the Sascha "multisampling" demo by 76% on my Sky Lake laptop. Running Talos on medium settings with 8x MSAA, this improves the framerate in the benchmark by 80%. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
@@ -8,7 +8,7 @@ Missing Features:
|
|||||||
|
|
||||||
Performance:
|
Performance:
|
||||||
- Multi-{sampled/gen8,LOD} HiZ
|
- Multi-{sampled/gen8,LOD} HiZ
|
||||||
- Compressed multisample support
|
- MSAA fast clears
|
||||||
- Pushing pieces of UBOs?
|
- Pushing pieces of UBOs?
|
||||||
- Enable guardband clipping
|
- Enable guardband clipping
|
||||||
- Use soft-pin to avoid relocations
|
- Use soft-pin to avoid relocations
|
||||||
|
@@ -1398,7 +1398,8 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
struct anv_attachment_state *att_state =
|
struct anv_attachment_state *att_state =
|
||||||
&cmd_buffer->state.attachments[att];
|
&cmd_buffer->state.attachments[att];
|
||||||
|
|
||||||
if (att_state->aux_usage == ISL_AUX_USAGE_NONE)
|
if (att_state->aux_usage == ISL_AUX_USAGE_NONE ||
|
||||||
|
att_state->aux_usage == ISL_AUX_USAGE_MCS)
|
||||||
return; /* Nothing to resolve */
|
return; /* Nothing to resolve */
|
||||||
|
|
||||||
assert(att_state->aux_usage == ISL_AUX_USAGE_CCS_E ||
|
assert(att_state->aux_usage == ISL_AUX_USAGE_CCS_E ||
|
||||||
|
@@ -238,6 +238,15 @@ make_surface(const struct anv_device *dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (aspect == VK_IMAGE_ASPECT_COLOR_BIT && vk_info->samples > 1) {
|
||||||
|
assert(image->aux_surface.isl.size == 0);
|
||||||
|
assert(!(vk_info->usage & VK_IMAGE_USAGE_STORAGE_BIT));
|
||||||
|
ok = isl_surf_get_mcs_surf(&dev->isl_dev, &anv_surf->isl,
|
||||||
|
&image->aux_surface.isl);
|
||||||
|
if (ok) {
|
||||||
|
add_surface(image, &image->aux_surface);
|
||||||
|
image->aux_usage = ISL_AUX_USAGE_MCS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
|
@@ -228,6 +228,25 @@ static void
|
|||||||
populate_sampler_prog_key(const struct gen_device_info *devinfo,
|
populate_sampler_prog_key(const struct gen_device_info *devinfo,
|
||||||
struct brw_sampler_prog_key_data *key)
|
struct brw_sampler_prog_key_data *key)
|
||||||
{
|
{
|
||||||
|
/* Almost all multisampled textures are compressed. The only time when we
|
||||||
|
* don't compress a multisampled texture is for 16x MSAA with a surface
|
||||||
|
* width greater than 8k which is a bit of an edge case. Since the sampler
|
||||||
|
* just ignores the MCS parameter to ld2ms when MCS is disabled, it's safe
|
||||||
|
* to tell the compiler to always assume compression.
|
||||||
|
*/
|
||||||
|
key->compressed_multisample_layout_mask = ~0;
|
||||||
|
|
||||||
|
/* SkyLake added support for 16x MSAA. With this came a new message for
|
||||||
|
* reading from a 16x MSAA surface with compression. The new message was
|
||||||
|
* needed because now the MCS data is 64 bits instead of 32 or lower as is
|
||||||
|
* the case for 8x, 4x, and 2x. The key->msaa_16 bit-field controls which
|
||||||
|
* message we use. Fortunately, the 16x message works for 8x, 4x, and 2x
|
||||||
|
* so we can just use it unconditionally. This may not be quite as
|
||||||
|
* efficient but it saves us from recompiling.
|
||||||
|
*/
|
||||||
|
if (devinfo->gen >= 9)
|
||||||
|
key->msaa_16 = ~0;
|
||||||
|
|
||||||
/* XXX: Handle texture swizzle on HSW- */
|
/* XXX: Handle texture swizzle on HSW- */
|
||||||
for (int i = 0; i < MAX_SAMPLERS; i++) {
|
for (int i = 0; i < MAX_SAMPLERS; i++) {
|
||||||
/* Assume color sampler, no swizzling. (Works for BDW+) */
|
/* Assume color sampler, no swizzling. (Works for BDW+) */
|
||||||
|
@@ -222,6 +222,11 @@ color_attachment_compute_aux_usage(struct anv_device *device,
|
|||||||
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
|
||||||
att_state->fast_clear = false;
|
att_state->fast_clear = false;
|
||||||
return;
|
return;
|
||||||
|
} else if (iview->image->aux_usage == ISL_AUX_USAGE_MCS) {
|
||||||
|
att_state->aux_usage = ISL_AUX_USAGE_MCS;
|
||||||
|
att_state->input_aux_usage = ISL_AUX_USAGE_MCS;
|
||||||
|
att_state->fast_clear = false;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(iview->image->aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT);
|
assert(iview->image->aux_surface.isl.usage & ISL_SURF_USAGE_CCS_BIT);
|
||||||
|
Reference in New Issue
Block a user