svga: add a helper function to send ResolveCopy command
authorCharmaine Lee <charmainel@vmware.com>
Mon, 16 Oct 2017 18:31:15 +0000 (11:31 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 10 Sep 2018 19:07:30 +0000 (13:07 -0600)
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/drivers/svga/svga_cmd.h
src/gallium/drivers/svga/svga_cmd_vgpu10.c

index b191ed5..f6cb4fc 100644 (file)
@@ -685,9 +685,16 @@ SVGA3D_vgpu10_TransferFromBuffer(struct svga_winsys_context *swc,
 /*Cap2 commands*/
 enum pipe_error
 SVGA3D_vgpu10_IntraSurfaceCopy(struct svga_winsys_context *swc,
-                        struct svga_winsys_surface *src,
-                        unsigned level, unsigned face,
-                        const SVGA3dCopyBox *box);
+                               struct svga_winsys_surface *src,
+                               unsigned level, unsigned face,
+                               const SVGA3dCopyBox *box);
 
+enum pipe_error
+SVGA3D_vgpu10_ResolveCopy(struct svga_winsys_context *swc,
+                          unsigned dstSubResource,
+                          struct svga_winsys_surface *dst,
+                          unsigned srcSubResource,
+                          struct svga_winsys_surface *src,
+                          const SVGA3dSurfaceFormat copyFormat);
 
 #endif /* __SVGA3D_H__ */
index e0e47e1..c1e471e 100644 (file)
@@ -1375,9 +1375,9 @@ SVGA3D_vgpu10_TransferFromBuffer(struct svga_winsys_context *swc,
 
 enum pipe_error
 SVGA3D_vgpu10_IntraSurfaceCopy(struct svga_winsys_context *swc,
-                        struct svga_winsys_surface *surface,
-                        unsigned level, unsigned face,
-                        const SVGA3dCopyBox *box)
+                               struct svga_winsys_surface *surface,
+                               unsigned level, unsigned face,
+                               const SVGA3dCopyBox *box)
 {
    SVGA3dCmdIntraSurfaceCopy *cmd =
       SVGA3D_FIFOReserve(swc,
@@ -1396,3 +1396,30 @@ SVGA3D_vgpu10_IntraSurfaceCopy(struct svga_winsys_context *swc,
 
    return PIPE_OK;
 }
+
+enum pipe_error
+SVGA3D_vgpu10_ResolveCopy(struct svga_winsys_context *swc,
+                          unsigned dstSubResource,
+                          struct svga_winsys_surface *dst,
+                          unsigned srcSubResource,
+                          struct svga_winsys_surface *src,
+                          const SVGA3dSurfaceFormat copyFormat)
+{
+   SVGA3dCmdDXResolveCopy *cmd =
+      SVGA3D_FIFOReserve(swc,
+                         SVGA_3D_CMD_DX_RESOLVE_COPY,
+                         sizeof(SVGA3dCmdDXResolveCopy),
+                         2); /* two relocations */
+   if (!cmd)
+      return PIPE_ERROR_OUT_OF_MEMORY;
+
+   cmd->dstSubResource = dstSubResource;
+   swc->surface_relocation(swc, &cmd->dstSid, NULL, dst, SVGA_RELOC_WRITE);
+   cmd->srcSubResource = srcSubResource;
+   swc->surface_relocation(swc, &cmd->srcSid, NULL, src, SVGA_RELOC_READ);
+   cmd->copyFormat = copyFormat;
+
+   swc->commit(swc);
+
+   return PIPE_OK;
+}