<p dir="ltr">On Nov 4, 2015 4:02 AM, "Alex Deucher" <<a href="mailto:alexdeucher@gmail.com">alexdeucher@gmail.com</a>> wrote:<br>
><br>
> On Tue, Nov 3, 2015 at 6:47 PM, Marek Olšák <<a href="mailto:maraeo@gmail.com">maraeo@gmail.com</a>> wrote:<br>
> > From: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>><br>
> ><br>
> > ---<br>
> >Â src/gallium/drivers/radeonsi/si_blit.c | 55 ++++++++++++++++++++++++++++++++++<br>
> >Â 1 file changed, 55 insertions(+)<br>
> ><br>
> > diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c<br>
> > index fce014a..e934146 100644<br>
> > --- a/src/gallium/drivers/radeonsi/si_blit.c<br>
> > +++ b/src/gallium/drivers/radeonsi/si_blit.c<br>
> > @@ -731,9 +731,64 @@ static void si_flush_resource(struct pipe_context *ctx,<br>
> >Â Â Â Â Â }<br>
> >Â }<br>
> ><br>
> > +static void si_pipe_clear_buffer(struct pipe_context *ctx,<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â struct pipe_resource *dst,<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â unsigned offset, unsigned size,<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â const void *clear_value,<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â int clear_value_size)<br>
> > +{<br>
> > +Â Â Â Â struct si_context *sctx = (struct si_context*)ctx;<br>
> > +Â Â Â Â const uint32_t *u32 = clear_value;<br>
> > +Â Â Â Â unsigned i;<br>
> > +Â Â Â Â bool clear_value_fits_dword = true;<br>
> > +Â Â Â Â uint8_t *map;<br>
> > +<br>
> > +Â Â Â Â if (clear_value_size > 4)<br>
> > +Â Â Â Â Â Â Â Â for (i = 1; i < clear_value_size / 4; i++)<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â if (u32[0] != u32[i]) {<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â clear_value_fits_dword = false;<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â break;<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â }<br>
> > +<br>
> > +Â Â Â Â /* Use CP DMA for the simple case. */<br>
> > +Â Â Â Â if (offset % 4 == 0 && size % 4 == 0 && clear_value_fits_dword) {<br>
> > +Â Â Â Â Â Â Â Â uint32_t value = u32[0];<br>
> > +<br>
> > +Â Â Â Â Â Â Â Â switch (clear_value_size) {<br>
> > +Â Â Â Â Â Â Â Â case 1:<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â value &= 0xff;<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â value |= (value << 8) | (value << 16) | (value << 24);<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â break;<br>
> > +Â Â Â Â Â Â Â Â case 2:<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â value &= 0xffff;<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â value |= value << 16;<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â break;<br>
> > +Â Â Â Â Â Â Â Â }<br>
> > +<br>
> > +Â Â Â Â Â Â Â Â sctx->b.clear_buffer(ctx, dst, offset, size, value, false);<br>
> > +Â Â Â Â Â Â Â Â return;<br>
> > +Â Â Â Â }<br>
> > +<br>
> > +Â Â Â Â /* TODO: use a compute shader for other cases. */<br>
><br>
> What about using SDMA? It supports byte aligned constant fills at<br>
> least on CIK+.</p>
<p dir="ltr">I think CP DMA supports byte aligned constant fills as well, I just need to test it. The bigger problem is 64 and 128 bit fills. Those can only be done with a shader AFAIK.</p>
<p dir="ltr">><br>
><br>
> > +<br>
> > +Â Â Â Â /* Software fallback. */<br>
> > +Â Â Â Â map = r600_buffer_map_sync_with_rings(&sctx->b, r600_resource(dst),<br>
> > +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PIPE_TRANSFER_WRITE);<br>
> > +Â Â Â Â if (!map)<br>
> > +Â Â Â Â Â Â Â Â return;<br>
> > +<br>
> > +Â Â Â Â map += offset;<br>
> > +Â Â Â Â size /= clear_value_size;<br>
> > +Â Â Â Â for (i = 0; i < size; i++) {<br>
> > +Â Â Â Â Â Â Â Â memcpy(map, clear_value, clear_value_size);<br>
> > +Â Â Â Â Â Â Â Â map += clear_value_size;<br>
> > +Â Â Â Â }<br>
> > +}<br>
> > +<br>
> >Â void si_init_blit_functions(struct si_context *sctx)<br>
> >Â {<br>
> >Â Â Â Â Â sctx->b.b.clear = si_clear;<br>
> > +Â Â Â Â sctx->b.b.clear_buffer = si_pipe_clear_buffer;<br>
> >Â Â Â Â Â sctx->b.b.clear_render_target = si_clear_render_target;<br>
> >Â Â Â Â Â sctx->b.b.clear_depth_stencil = si_clear_depth_stencil;<br>
> >Â Â Â Â Â sctx->b.b.resource_copy_region = si_resource_copy_region;<br>
> > --<br>
> > 2.1.4<br>
> ><br>
> > _______________________________________________<br>
> > mesa-dev mailing list<br>
> > <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> > <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</p>