On Wed, Nov 30, 2016 at 8:12 PM, Jordan Justen <jordan.l.jus...@intel.com> wrote:
> 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.jus...@intel.com> > --- > src/intel/blorp/blorp_blit.c | 37 ++++++++++++++++++++++++++++++++++++- > 1 file changed, 36 insertions(+), 1 deletion(-) > > diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c > index 782144a..58e9e0c 100644 > --- a/src/intel/blorp/blorp_blit.c > +++ b/src/intel/blorp/blorp_blit.c > @@ -1487,9 +1487,37 @@ surf_retile_w_to_y(const struct isl_device *isl_dev, > } > > static bool > +can_shrink_surface(const struct brw_blorp_surface_info *surf) > +{ > + return > + /* 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. > + */ > + surf->aux_addr.buffer == NULL && > + /* 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. > + */ > + surf->surf.msaa_layout != ISL_MSAA_LAYOUT_ARRAY; > This might be a bit clearer as if (surf->aux_addr.buffer != NULL) > +} > + > +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 { > @@ -1716,6 +1744,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_TOO_LARGE; > + if (params->src.surf.logical_level0_px.height > max_surface_size || > + params->dst.surf.logical_level0_px.height > max_surface_size) > + result |= BLIT_HEIGHT_TOO_LARGE; > > if (result == 0) { > batch->blorp->exec(batch, params); > -- > 2.10.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev