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

Author: George Sapountzis <[email protected]>
Date:   Sun Mar 28 19:30:03 2010 +0300

drisw: probably better hack for stride and some comments

---

 src/gallium/state_trackers/dri/sw/drisw.c       |   19 ++++-
 src/gallium/targets/dri-swrast/swrast_drm_api.c |    4 +-
 src/gallium/winsys/sw/dri/dri_sw_winsys.c       |   25 +------
 src/glx/drisw_glx.c                             |   89 ++++++++---------------
 4 files changed, 50 insertions(+), 87 deletions(-)

diff --git a/src/gallium/state_trackers/dri/sw/drisw.c 
b/src/gallium/state_trackers/dri/sw/drisw.c
index a75fdf1..b7eba63 100644
--- a/src/gallium/state_trackers/dri/sw/drisw.c
+++ b/src/gallium/state_trackers/dri/sw/drisw.c
@@ -48,8 +48,13 @@
  * for createImage/destroyImage similar to DRI2 getBuffers. Probably not worth
  * it, given the scope of DRISW, unless it falls naturally from properly
  * solving the other issues.
+ *
+ * fences:
+ *
+ * No fences are used, are they needed for llvmpipe / cell ?
  */
 
+#include "util/u_format.h"
 #include "util/u_memory.h"
 #include "util/u_inlines.h"
 #include "pipe/p_context.h"
@@ -75,14 +80,19 @@ get_drawable_info(__DRIdrawable *dPriv, int *w, int *h)
                            dPriv->loaderPrivate);
 }
 
+/*
+ * Set the width to 'stride / cpp'. PutImage seems to correctly clip the width
+ * to the actual width of the dst drawable. Even if this is not specified but
+ * an implementation detail, it is the correct thing to do, so rely on it. XXX
+ */
 static INLINE void
-put_image(__DRIdrawable *dPriv, void *data)
+put_image(__DRIdrawable *dPriv, void *data, unsigned width)
 {
    __DRIscreen *sPriv = dPriv->driScreenPriv;
    const __DRIswrastLoaderExtension *loader = sPriv->swrast_loader;
 
    loader->putImage(dPriv, __DRI_SWRAST_IMAGE_OP_SWAP,
-                    0, 0, dPriv->w, dPriv->h,
+                    0, 0, width, dPriv->h,
                     data, dPriv->loaderPrivate);
 }
 
@@ -102,6 +112,7 @@ drisw_present_texture(__DRIdrawable *dPriv,
    struct pipe_surface *psurf;
    struct pipe_transfer *ptrans;
    void *pmap;
+   unsigned width;
 
    pipe = dri1_get_pipe_context(screen);
    psurf = dri1_get_pipe_surface(drawable, ptex);
@@ -112,11 +123,13 @@ drisw_present_texture(__DRIdrawable *dPriv,
                                    PIPE_TRANSFER_READ,
                                    0, 0, dPriv->w, dPriv->h);
 
+   width = ptrans->stride / util_format_get_blocksize(ptex->format);
+
    pmap = pipe->transfer_map(pipe, ptrans);
 
    assert(pmap);
 
-   put_image(dPriv, pmap);
+   put_image(dPriv, pmap, width);
 
    pipe->transfer_unmap(pipe, ptrans);
 
diff --git a/src/gallium/targets/dri-swrast/swrast_drm_api.c 
b/src/gallium/targets/dri-swrast/swrast_drm_api.c
index 1fdfccc..1f24d76 100644
--- a/src/gallium/targets/dri-swrast/swrast_drm_api.c
+++ b/src/gallium/targets/dri-swrast/swrast_drm_api.c
@@ -38,8 +38,8 @@
  * This function should be put in targets/common or winsys/sw/common and shared
  * with targets/libgl-xlib and winsys/sw/drm.
  *
- * For targets/common, you get layering violations in the build system unless
- * all of drm_api's are moved under targets.
+ * For targets/common, you get layering violations unless all of drm_api's are
+ * moved under targets.
  */
 
 #ifdef GALLIUM_SOFTPIPE
diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c 
b/src/gallium/winsys/sw/dri/dri_sw_winsys.c
index ee8ec91..1c1e561 100644
--- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c
+++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c
@@ -62,15 +62,6 @@ xm_is_displaytarget_format_supported( struct sw_winsys *ws,
    return TRUE;
 }
 
-/* see bytes_per_line in libGL */
-static INLINE int
-bytes_per_line(unsigned pitch_bits, unsigned mul)
-{
-   unsigned mask = mul - 1;
-
-   return ((pitch_bits + mask) & ~mask) / 8;
-}
-
 /* pipe_screen::texture_create DISPLAY_TARGET / SCANOUT / SHARED */
 static struct sw_displaytarget *
 xm_displaytarget_create(struct sw_winsys *winsys,
@@ -81,7 +72,7 @@ xm_displaytarget_create(struct sw_winsys *winsys,
                         unsigned *stride)
 {
    struct xm_displaytarget *xm_dt;
-   unsigned nblocksy, size, xm_stride, loader_stride, format_stride;
+   unsigned nblocksy, size, xm_stride, format_stride;
 
    xm_dt = CALLOC_STRUCT(xm_displaytarget);
    if(!xm_dt)
@@ -89,27 +80,15 @@ xm_displaytarget_create(struct sw_winsys *winsys,
 
    format_stride = util_format_get_stride(format, width);
    xm_stride = align(format_stride, alignment);
-   loader_stride = bytes_per_line(format_stride * 8, 32);
 
    nblocksy = util_format_get_nblocksy(format, height);
    size = xm_stride * nblocksy;
 
-#ifdef DEBUG
-   debug_printf("swrast format stride: %8d\n", format_stride);
-   debug_printf("swrast pipe stride  : %8d\n", xm_stride);
-   debug_printf("swrast loader stride: %8d\n", loader_stride);
-#endif
-
-   /*
-    * Allocate with the aligned stride required by the pipe but set the stride
-    * to the one hardcoded in the loaders XXX
-    */
-
    xm_dt->data = align_malloc(size, alignment);
    if(!xm_dt->data)
       goto no_data;
 
-   *stride = loader_stride;
+   *stride = xm_stride;
    return (struct sw_displaytarget *)xm_dt;
 
 no_data:
diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c
index b561523..786faff 100644
--- a/src/glx/drisw_glx.c
+++ b/src/glx/drisw_glx.c
@@ -129,10 +129,32 @@ swrastGetDrawableInfo(__DRIdrawable * draw,
    *h = uh;
 }
 
+/**
+ * Align renderbuffer pitch.
+ *
+ * This should be chosen by the driver and the loader (libGL, xserver/glx)
+ * should use the driver provided pitch.
+ *
+ * It seems that the xorg loader (that is the xserver loading swrast_dri for
+ * indirect rendering, not client-side libGL) requires that the pitch is
+ * exactly the image width padded to 32 bits. XXX
+ *
+ * The above restriction can probably be overcome by using ScratchPixmap and
+ * CopyArea in the xserver, similar to ShmPutImage, and setting the width of
+ * the scratch pixmap to 'pitch / cpp'.
+ */
+static inline int
+bytes_per_line(unsigned pitch_bits, unsigned mul)
+{
+   unsigned mask = mul - 1;
+
+   return ((pitch_bits + mask) & ~mask) / 8;
+}
+
 static void
-swrastPutImage2(__DRIdrawable * draw, int op,
-                int x, int y, int w, int h,
-                char *data, int pitch, void *loaderPrivate)
+swrastPutImage(__DRIdrawable * draw, int op,
+               int x, int y, int w, int h,
+               char *data, void *loaderPrivate)
 {
    __GLXDRIdrawablePrivate *pdp = loaderPrivate;
    __GLXDRIdrawable *pdraw = &(pdp->base);
@@ -158,7 +180,7 @@ swrastPutImage2(__DRIdrawable * draw, int op,
    ximage->data = data;
    ximage->width = w;
    ximage->height = h;
-   ximage->bytes_per_line = pitch;
+   ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
 
    XPutImage(dpy, drawable, gc, ximage, 0, 0, x, y, w, h);
 
@@ -166,9 +188,9 @@ swrastPutImage2(__DRIdrawable * draw, int op,
 }
 
 static void
-swrastGetImage2(__DRIdrawable * read,
-                int x, int y, int w, int h,
-                char *data, int pitch, void *loaderPrivate)
+swrastGetImage(__DRIdrawable * read,
+               int x, int y, int w, int h,
+               char *data, void *loaderPrivate)
 {
    __GLXDRIdrawablePrivate *prp = loaderPrivate;
    __GLXDRIdrawable *pread = &(prp->base);
@@ -182,64 +204,13 @@ swrastGetImage2(__DRIdrawable * read,
    ximage->data = data;
    ximage->width = w;
    ximage->height = h;
-   ximage->bytes_per_line = pitch;
+   ximage->bytes_per_line = bytes_per_line(w * ximage->bits_per_pixel, 32);
 
    XGetSubImage(dpy, readable, x, y, w, h, ~0L, ZPixmap, ximage, 0, 0);
 
    ximage->data = NULL;
 }
 
-/**
- * Align renderbuffer pitch.
- *
- * This should be chosen by the driver and the loader (libGL, xserver/glx)
- * should use the driver provided pitch.
- *
- * It seems that the xorg loader (that is the xserver loading swrast_dri for
- * indirect rendering, not client-side libGL) requires that the pitch is
- * exactly the image width padded to 32 bits. XXX
- *
- * Is this a hard requirement that requires extra copies for different pitches
- * or can the xorg loader use the driver pitch without extra copies ?
- */
-static inline int
-bytes_per_line(unsigned pitch_bits, unsigned mul)
-{
-   unsigned mask = mul - 1;
-
-   return ((pitch_bits + mask) & ~mask) / 8;
-}
-
-static void
-swrastPutImage(__DRIdrawable * draw, int op,
-               int x, int y, int w, int h,
-               char *data, void *loaderPrivate)
-{
-   __GLXDRIdrawablePrivate *pdp = loaderPrivate;
-   int bpp, pitch;
-
-   bpp = pdp->ximage->bits_per_pixel;
-
-   pitch = bytes_per_line(w * bpp, 32);
-
-   swrastPutImage2(draw, op, x, y, w, h, data, pitch, loaderPrivate);
-}
-
-static void
-swrastGetImage(__DRIdrawable * read,
-               int x, int y, int w, int h,
-               char *data, void *loaderPrivate)
-{
-   __GLXDRIdrawablePrivate *prp = loaderPrivate;
-   int bpp, pitch;
-
-   bpp = prp->ximage->bits_per_pixel;
-
-   pitch = bytes_per_line(w * bpp, 32);
-
-   swrastGetImage2(read, x, y, w, h, data, pitch, loaderPrivate);
-}
-
 static const __DRIswrastLoaderExtension swrastLoaderExtension = {
    {__DRI_SWRAST_LOADER, __DRI_SWRAST_LOADER_VERSION},
    swrastGetDrawableInfo,

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to