mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-05 13:20:10 +01:00
intel/blorp_blit: Enable splitting large blorp blits
Detect when the surface sizes are too large for a blorp blit. When it is too large, the blorp blit will be split into a smaller operation and attempted again. For gen7, this fixes the cts test: ES3-CTS.gtf.GL3Tests.framebuffer_blit.framebuffer_blit_functionality_multisampled_to_singlesampled_blit It will also enable us to increase our renderable size from 8k x 8k to 16k x 16k. Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
efea8e7244
commit
da381ae647
1 changed files with 40 additions and 1 deletions
|
|
@ -1484,10 +1484,42 @@ surf_retile_w_to_y(const struct isl_device *isl_dev,
|
|||
info->tile_y_sa /= 2;
|
||||
}
|
||||
|
||||
static bool
|
||||
can_shrink_surface(const struct brw_blorp_surface_info *surf)
|
||||
{
|
||||
/* The current code doesn't support offsets into the aux buffers. This
|
||||
* should be possible, but we need to make sure the offset is page
|
||||
* aligned for both the surface and the aux buffer surface. Generally
|
||||
* this mean using the page aligned offset for the aux buffer.
|
||||
*
|
||||
* Currently the cases where we must split the blit are limited to cases
|
||||
* where we don't have a aux buffer.
|
||||
*/
|
||||
if (surf->aux_addr.buffer != NULL)
|
||||
return false;
|
||||
|
||||
/* We can't support splitting the blit for gen <= 7, because the qpitch
|
||||
* size is calculated by the hardware based on the surface height for
|
||||
* gen <= 7. In gen >= 8, the qpitch is controlled by the driver.
|
||||
*/
|
||||
if (surf->surf.msaa_layout == ISL_MSAA_LAYOUT_ARRAY)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool
|
||||
can_shrink_surfaces(const struct blorp_params *params)
|
||||
{
|
||||
return false;
|
||||
return
|
||||
can_shrink_surface(¶ms->src) &&
|
||||
can_shrink_surface(¶ms->dst);
|
||||
}
|
||||
|
||||
static unsigned
|
||||
get_max_surface_size()
|
||||
{
|
||||
return 16384;
|
||||
}
|
||||
|
||||
struct blt_axis {
|
||||
|
|
@ -1781,6 +1813,13 @@ try_blorp_blit(struct blorp_batch *batch,
|
|||
brw_blorp_get_blit_kernel(batch->blorp, params, wm_prog_key);
|
||||
|
||||
unsigned result = 0;
|
||||
unsigned max_surface_size = get_max_surface_size(devinfo, params);
|
||||
if (params->src.surf.logical_level0_px.width > max_surface_size ||
|
||||
params->dst.surf.logical_level0_px.width > max_surface_size)
|
||||
result |= BLIT_WIDTH_SHRINK;
|
||||
if (params->src.surf.logical_level0_px.height > max_surface_size ||
|
||||
params->dst.surf.logical_level0_px.height > max_surface_size)
|
||||
result |= BLIT_HEIGHT_SHRINK;
|
||||
|
||||
if (result == 0) {
|
||||
batch->blorp->exec(batch, params);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue