drisw: probably better hack for stride and some comments
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
+30
-59
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user