<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jan 18, 2019 at 6:05 PM Bas Nieuwenhuizen <<a href="mailto:bas@basnieuwenhuizen.nl">bas@basnieuwenhuizen.nl</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Fri, Jan 18, 2019 at 5:44 PM Marek Olšák <<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>> wrote:<br>
><br>
> From: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
><br>
> ---<br>
>  src/gallium/drivers/radeonsi/si_buffer.c | 27 ++++++++++++++++++++++++<br>
>  src/gallium/drivers/radeonsi/si_pipe.h   |  1 +<br>
>  2 files changed, 28 insertions(+)<br>
><br>
> diff --git a/src/gallium/drivers/radeonsi/si_buffer.c b/src/gallium/drivers/radeonsi/si_buffer.c<br>
> index 4766cf4bdfa..a1e421b8b0d 100644<br>
> --- a/src/gallium/drivers/radeonsi/si_buffer.c<br>
> +++ b/src/gallium/drivers/radeonsi/si_buffer.c<br>
> @@ -16,20 +16,22 @@<br>
>   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
>   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
>   * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL<br>
>   * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,<br>
>   * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR<br>
>   * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE<br>
>   * USE OR OTHER DEALINGS IN THE SOFTWARE.<br>
>   */<br>
><br>
>  #include "radeonsi/si_pipe.h"<br>
> +#include "sid.h"<br>
> +<br>
>  #include "util/u_memory.h"<br>
>  #include "util/u_upload_mgr.h"<br>
>  #include "util/u_transfer.h"<br>
>  #include <inttypes.h><br>
>  #include <stdio.h><br>
><br>
>  bool si_rings_is_buffer_referenced(struct si_context *sctx,<br>
>                                    struct pb_buffer *buf,<br>
>                                    enum radeon_bo_usage usage)<br>
>  {<br>
> @@ -506,20 +508,38 @@ static void *si_buffer_transfer_map(struct pipe_context *ctx,<br>
>         data = si_buffer_map_sync_with_rings(sctx, rbuffer, usage);<br>
>         if (!data) {<br>
>                 return NULL;<br>
>         }<br>
>         data += box->x;<br>
><br>
>         return si_buffer_get_transfer(ctx, resource, usage, box,<br>
>                                         ptransfer, data, NULL, 0);<br>
>  }<br>
><br>
> +static void si_buffer_write_data(struct si_context *sctx, struct r600_resource *buf,<br>
> +                                unsigned offset, unsigned size, const void *data)<br>
> +{<br>
> +       struct radeon_cmdbuf *cs = sctx->gfx_cs;<br>
> +<br>
> +       si_need_gfx_cs_space(sctx);<br>
> +<br>
> +       sctx->flags |= SI_CONTEXT_PS_PARTIAL_FLUSH |<br>
> +                      SI_CONTEXT_CS_PARTIAL_FLUSH |<br>
> +                      si_get_flush_flags(sctx, SI_COHERENCY_SHADER, L2_LRU);<br>
> +       si_emit_cache_flush(sctx);<br>
<br>
Maybe only do the cache flush if the buffer is referenced by the<br>
current cmd buffer?<br>
<br>
(I'm kinda surprised reading this that we don't do<br>
DISCARD_WHOLE_RESOURCE if the offset is 0 and the size equal to the<br>
buffer size. )<br></blockquote><div><br></div><div>Thanks, that's a good point. We promote to DISCARD_WHOLE_RESOURCE in si_buffer_transfer_map. I'll remove the hunk in si_buffer_subdata, because it doesn't do optimizations that si_buffer_transfer_map does.</div><div><br></div><div>Marek</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
> +<br>
> +       si_cp_write_data(sctx, buf, offset, size, V_370_TC_L2, V_370_ME, data);<br>
> +<br>
> +       radeon_emit(cs, PKT3(PKT3_PFP_SYNC_ME, 0, 0));<br>
> +       radeon_emit(cs, 0);<br>
> +}<br>
> +<br>
>  static void si_buffer_do_flush_region(struct pipe_context *ctx,<br>
>                                       struct pipe_transfer *transfer,<br>
>                                       const struct pipe_box *box)<br>
>  {<br>
>         struct si_transfer *stransfer = (struct si_transfer*)transfer;<br>
>         struct r600_resource *rbuffer = r600_resource(transfer->resource);<br>
><br>
>         if (stransfer->u.staging) {<br>
>                 /* Copy the staging buffer into the original one. */<br>
>                 si_copy_buffer((struct si_context*)ctx, transfer->resource,<br>
> @@ -568,20 +588,27 @@ static void si_buffer_transfer_unmap(struct pipe_context *ctx,<br>
><br>
>  static void si_buffer_subdata(struct pipe_context *ctx,<br>
>                               struct pipe_resource *buffer,<br>
>                               unsigned usage, unsigned offset,<br>
>                               unsigned size, const void *data)<br>
>  {<br>
>         struct pipe_transfer *transfer = NULL;<br>
>         struct pipe_box box;<br>
>         uint8_t *map = NULL;<br>
><br>
> +       if (size <= SI_TRANSFER_WRITE_DATA_THRESHOLD &&<br>
> +           offset % 4 == 0 && size % 4 == 0 && (uintptr_t)data % 4 == 0) {<br>
> +               si_buffer_write_data((struct si_context*)ctx,<br>
> +                                    r600_resource(buffer), offset, size, data);<br>
> +               return;<br>
> +       }<br>
> +<br>
>         u_box_1d(offset, size, &box);<br>
>         map = si_buffer_transfer_map(ctx, buffer, 0,<br>
>                                        PIPE_TRANSFER_WRITE |<br>
>                                        PIPE_TRANSFER_DISCARD_RANGE |<br>
>                                        usage,<br>
>                                        &box, &transfer);<br>
>         if (!map)<br>
>                 return;<br>
><br>
>         memcpy(map, data, size);<br>
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h<br>
> index 5bd3d9641d2..f79828f3438 100644<br>
> --- a/src/gallium/drivers/radeonsi/si_pipe.h<br>
> +++ b/src/gallium/drivers/radeonsi/si_pipe.h<br>
> @@ -94,20 +94,21 @@<br>
>  #define SI_PREFETCH_ES                 (1 << 3)<br>
>  #define SI_PREFETCH_GS                 (1 << 4)<br>
>  #define SI_PREFETCH_VS                 (1 << 5)<br>
>  #define SI_PREFETCH_PS                 (1 << 6)<br>
><br>
>  #define SI_MAX_BORDER_COLORS           4096<br>
>  #define SI_MAX_VIEWPORTS               16<br>
>  #define SIX_BITS                       0x3F<br>
>  #define SI_MAP_BUFFER_ALIGNMENT                64<br>
>  #define SI_MAX_VARIABLE_THREADS_PER_BLOCK 1024<br>
> +#define SI_TRANSFER_WRITE_DATA_THRESHOLD 64<br>
><br>
>  #define SI_RESOURCE_FLAG_TRANSFER      (PIPE_RESOURCE_FLAG_DRV_PRIV << 0)<br>
>  #define SI_RESOURCE_FLAG_FLUSHED_DEPTH (PIPE_RESOURCE_FLAG_DRV_PRIV << 1)<br>
>  #define SI_RESOURCE_FLAG_FORCE_MSAA_TILING (PIPE_RESOURCE_FLAG_DRV_PRIV << 2)<br>
>  #define SI_RESOURCE_FLAG_DISABLE_DCC   (PIPE_RESOURCE_FLAG_DRV_PRIV << 3)<br>
>  #define SI_RESOURCE_FLAG_UNMAPPABLE    (PIPE_RESOURCE_FLAG_DRV_PRIV << 4)<br>
>  #define SI_RESOURCE_FLAG_READ_ONLY     (PIPE_RESOURCE_FLAG_DRV_PRIV << 5)<br>
>  #define SI_RESOURCE_FLAG_32BIT         (PIPE_RESOURCE_FLAG_DRV_PRIV << 6)<br>
>  #define SI_RESOURCE_FLAG_SO_FILLED_SIZE        (PIPE_RESOURCE_FLAG_DRV_PRIV << 7)<br>
><br>
> --<br>
> 2.17.1<br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
> <a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div></div>