Mesa (master): st/xorg: Add EXA UploadToScreen and DownloadFromScreen hooks .

Michel Dänzer daenzer at kemper.freedesktop.org
Wed Sep 2 14:09:09 UTC 2009


Module: Mesa
Branch: master
Commit: 385620e5ebcbd5ee1fb4eaf75083ea540ac53955
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=385620e5ebcbd5ee1fb4eaf75083ea540ac53955

Author: Michel Dänzer <daenzer at vmware.com>
Date:   Wed Sep  2 15:41:40 2009 +0200

st/xorg: Add EXA UploadToScreen and DownloadFromScreen hooks.

---

 src/gallium/state_trackers/xorg/xorg_exa.c |   64 ++++++++++++++++++++++++++++
 1 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/src/gallium/state_trackers/xorg/xorg_exa.c b/src/gallium/state_trackers/xorg/xorg_exa.c
index 1ed807d..a17a71f 100644
--- a/src/gallium/state_trackers/xorg/xorg_exa.c
+++ b/src/gallium/state_trackers/xorg/xorg_exa.c
@@ -98,6 +98,68 @@ ExaMarkSync(ScreenPtr pScreen)
 }
 
 static Bool
+ExaDownloadFromScreen(PixmapPtr pPix, int x,  int y, int w,  int h, char *dst,
+		      int dst_pitch)
+{
+    ScreenPtr pScreen = pPix->drawable.pScreen;
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    modesettingPtr ms = modesettingPTR(pScrn);
+    struct exa_context *exa = ms->exa;
+    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
+    struct pipe_transfer *transfer;
+
+    if (!priv || !priv->tex)
+	return FALSE;
+
+    if (exa->ctx->is_texture_referenced(exa->ctx, priv->tex, 0, 0) &
+	PIPE_REFERENCED_FOR_WRITE)
+	exa->ctx->flush(exa->ctx, 0, NULL);
+
+    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
+					   PIPE_TRANSFER_READ, x, y, w, h);
+    if (!transfer)
+	return FALSE;
+
+    util_copy_rect((unsigned char*)dst, &priv->tex->block, dst_pitch, 0, 0,
+		   w, h, exa->scrn->transfer_map(exa->scrn, transfer),
+		   transfer->stride, 0, 0);
+
+    exa->scrn->transfer_unmap(exa->scrn, transfer);
+    exa->scrn->tex_transfer_destroy(transfer);
+
+    return TRUE;
+}
+
+static Bool
+ExaUploadToScreen(PixmapPtr pPix, int x, int y, int w, int h, char *src,
+		  int src_pitch)
+{
+    ScreenPtr pScreen = pPix->drawable.pScreen;
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    modesettingPtr ms = modesettingPTR(pScrn);
+    struct exa_context *exa = ms->exa;
+    struct exa_pixmap_priv *priv = exaGetPixmapDriverPrivate(pPix);
+    struct pipe_transfer *transfer;
+
+    if (!priv || !priv->tex)
+	return FALSE;
+
+    transfer = exa->scrn->get_tex_transfer(exa->scrn, priv->tex, 0, 0, 0,
+					   PIPE_TRANSFER_WRITE, x, y, w, h);
+    if (!transfer)
+	return FALSE;
+
+    util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
+		   &priv->tex->block, transfer->stride, 0, 0, w, h,
+		   (unsigned char*)src, src_pitch, 0, 0);
+
+    exa->scrn->transfer_unmap(exa->scrn, transfer);
+    exa->scrn->tex_transfer_destroy(transfer);
+
+    return TRUE;
+}
+
+static Bool
 ExaPrepareAccess(PixmapPtr pPix, int index)
 {
     ScreenPtr pScreen = pPix->drawable.pScreen;
@@ -599,6 +661,8 @@ xorg_exa_init(ScrnInfoPtr pScrn)
    pExa->Composite          = ExaComposite;
    pExa->DoneComposite      = ExaDoneComposite;
    pExa->PixmapIsOffscreen  = ExaPixmapIsOffscreen;
+   pExa->DownloadFromScreen = ExaDownloadFromScreen;
+   pExa->UploadToScreen     = ExaUploadToScreen;
    pExa->PrepareAccess      = ExaPrepareAccess;
    pExa->FinishAccess       = ExaFinishAccess;
    pExa->CreatePixmap       = ExaCreatePixmap;




More information about the mesa-commit mailing list