diff options
| author | José Fonseca <jfonseca@vmware.com> | 2011-03-11 14:49:45 +0000 | 
|---|---|---|
| committer | José Fonseca <jfonseca@vmware.com> | 2011-03-11 15:03:21 +0000 | 
| commit | 530ad1ff6f6e0af9d84789dccbc0e18ad1c6b11c (patch) | |
| tree | e24ba083b04283cf5838c4848be3d41332121edb /src/gallium/drivers | |
| parent | f0ea6395b6ff26c426d50b982e9973a3c89fdc1c (diff) | |
svga: Propagate discard/unsynchronized flags to the host when doing texture DMAs.
Diffstat (limited to 'src/gallium/drivers')
| -rw-r--r-- | src/gallium/drivers/svga/svga_cmd.c | 5 | ||||
| -rw-r--r-- | src/gallium/drivers/svga/svga_cmd.h | 3 | ||||
| -rw-r--r-- | src/gallium/drivers/svga/svga_resource_texture.c | 42 | 
3 files changed, 38 insertions, 12 deletions
| diff --git a/src/gallium/drivers/svga/svga_cmd.c b/src/gallium/drivers/svga/svga_cmd.c index 05eab8a517..1ed1d5d25b 100644 --- a/src/gallium/drivers/svga/svga_cmd.c +++ b/src/gallium/drivers/svga/svga_cmd.c @@ -422,7 +422,8 @@ SVGA3D_SurfaceDMA(struct svga_winsys_context *swc,                    struct svga_transfer *st,         // IN                    SVGA3dTransferType transfer,      // IN                    const SVGA3dCopyBox *boxes,       // IN -                  uint32 numBoxes)                  // IN +                  uint32 numBoxes,                  // IN +                  SVGA3dSurfaceDMAFlags flags)      // IN  {     struct svga_texture *texture = svga_texture(st->base.resource);      SVGA3dCmdSurfaceDMA *cmd; @@ -465,7 +466,7 @@ SVGA3D_SurfaceDMA(struct svga_winsys_context *swc,     pSuffix = (SVGA3dCmdSurfaceDMASuffix *)((uint8_t*)cmd + sizeof *cmd + boxesSize);     pSuffix->suffixSize = sizeof *pSuffix;     pSuffix->maximumOffset = st->hw_nblocksy*st->base.stride; -   memset(&pSuffix->flags, 0, sizeof pSuffix->flags); +   pSuffix->flags = flags;     swc->commit(swc); diff --git a/src/gallium/drivers/svga/svga_cmd.h b/src/gallium/drivers/svga/svga_cmd.h index 0e568d78e6..223ab17df8 100644 --- a/src/gallium/drivers/svga/svga_cmd.h +++ b/src/gallium/drivers/svga/svga_cmd.h @@ -102,7 +102,8 @@ SVGA3D_SurfaceDMA(struct svga_winsys_context *swc,                    struct svga_transfer *st,                    SVGA3dTransferType transfer,                    const SVGA3dCopyBox *boxes, -                  uint32 numBoxes); +                  uint32 numBoxes, +                  SVGA3dSurfaceDMAFlags flags);  enum pipe_error  SVGA3D_BufferDMA(struct svga_winsys_context *swc, diff --git a/src/gallium/drivers/svga/svga_resource_texture.c b/src/gallium/drivers/svga/svga_resource_texture.c index 994f30719a..f882bfef59 100644 --- a/src/gallium/drivers/svga/svga_resource_texture.c +++ b/src/gallium/drivers/svga/svga_resource_texture.c @@ -156,7 +156,8 @@ static INLINE void  svga_transfer_dma_band(struct svga_context *svga,                         struct svga_transfer *st,                         SVGA3dTransferType transfer, -                       unsigned y, unsigned h, unsigned srcy) +                       unsigned y, unsigned h, unsigned srcy, +                       SVGA3dSurfaceDMAFlags flags)  {     struct svga_texture *texture = svga_texture(st->base.resource);      SVGA3dCopyBox box; @@ -192,10 +193,10 @@ svga_transfer_dma_band(struct svga_context *svga,                  util_format_get_blocksize(texture->b.b.format) * 8 /                  (util_format_get_blockwidth(texture->b.b.format)*util_format_get_blockheight(texture->b.b.format))); -   ret = SVGA3D_SurfaceDMA(svga->swc, st, transfer, &box, 1); +   ret = SVGA3D_SurfaceDMA(svga->swc, st, transfer, &box, 1, flags);     if(ret != PIPE_OK) {        svga_context_flush(svga, NULL); -      ret = SVGA3D_SurfaceDMA(svga->swc, st, transfer, &box, 1); +      ret = SVGA3D_SurfaceDMA(svga->swc, st, transfer, &box, 1, flags);        assert(ret == PIPE_OK);     }  } @@ -204,7 +205,8 @@ svga_transfer_dma_band(struct svga_context *svga,  static INLINE void  svga_transfer_dma(struct svga_context *svga,                    struct svga_transfer *st, -                  SVGA3dTransferType transfer) +                  SVGA3dTransferType transfer, +                  SVGA3dSurfaceDMAFlags flags)  {     struct svga_texture *texture = svga_texture(st->base.resource);      struct svga_screen *screen = svga_screen(texture->b.b.screen); @@ -223,7 +225,9 @@ svga_transfer_dma(struct svga_context *svga,     if(!st->swbuf) {        /* Do the DMA transfer in a single go */ -      svga_transfer_dma_band(svga, st, transfer, st->base.box.y, st->base.box.height, 0); +      svga_transfer_dma_band(svga, st, transfer, +                             st->base.box.y, st->base.box.height, 0, +                             flags);        if(transfer == SVGA3D_READ_HOST_VRAM) {           svga_context_flush(svga, &fence); @@ -269,7 +273,14 @@ svga_transfer_dma(struct svga_context *svga,              }           } -         svga_transfer_dma_band(svga, st, transfer, y, h, srcy); +         svga_transfer_dma_band(svga, st, transfer, y, h, srcy, flags); + +         /* +          * Prevent the texture contents to be discarded on the next band +          * upload. +          */ + +         flags.discard = FALSE;           if(transfer == SVGA3D_READ_HOST_VRAM) {              svga_context_flush(svga, &fence); @@ -398,8 +409,11 @@ svga_texture_get_transfer(struct pipe_context *pipe,           goto no_swbuf;     } -   if (usage & PIPE_TRANSFER_READ) -      svga_transfer_dma(svga, st, SVGA3D_READ_HOST_VRAM); +   if (usage & PIPE_TRANSFER_READ) { +      SVGA3dSurfaceDMAFlags flags; +      memset(&flags, 0, sizeof flags); +      svga_transfer_dma(svga, st, SVGA3D_READ_HOST_VRAM, flags); +   }     return &st->base; @@ -458,7 +472,17 @@ svga_texture_transfer_destroy(struct pipe_context *pipe,     struct svga_transfer *st = svga_transfer(transfer);     if (st->base.usage & PIPE_TRANSFER_WRITE) { -      svga_transfer_dma(svga, st, SVGA3D_WRITE_HOST_VRAM); +      SVGA3dSurfaceDMAFlags flags; + +      memset(&flags, 0, sizeof flags); +      if (transfer->usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) { +         flags.discard = TRUE; +      } +      if (transfer->usage & PIPE_TRANSFER_UNSYNCHRONIZED) { +         flags.unsynchronized = TRUE; +      } + +      svga_transfer_dma(svga, st, SVGA3D_WRITE_HOST_VRAM, flags);        ss->texture_timestamp++;        tex->view_age[transfer->level] = ++(tex->age);        if (transfer->resource->target == PIPE_TEXTURE_CUBE) | 
