diff options
Diffstat (limited to 'src/gallium/winsys/sw')
-rw-r--r-- | src/gallium/winsys/sw/dri/dri_sw_winsys.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/gallium/winsys/sw/dri/dri_sw_winsys.c b/src/gallium/winsys/sw/dri/dri_sw_winsys.c index abf92b86b0..5549e152ee 100644 --- a/src/gallium/winsys/sw/dri/dri_sw_winsys.c +++ b/src/gallium/winsys/sw/dri/dri_sw_winsys.c @@ -62,6 +62,14 @@ xm_is_displaytarget_format_supported( struct sw_winsys *ws, return TRUE; } +static INLINE int +bytes_per_line(unsigned stride, unsigned mul) +{ + unsigned mask = mul - 1; + + return ((stride * 8 + mask) & ~mask) / 8; +} + /* pipe_screen::texture_create DISPLAY_TARGET / SCANOUT / SHARED */ static struct sw_displaytarget * xm_displaytarget_create(struct sw_winsys *winsys, @@ -72,21 +80,35 @@ xm_displaytarget_create(struct sw_winsys *winsys, unsigned *stride) { struct xm_displaytarget *xm_dt; - unsigned nblocksy, size, xm_stride; + unsigned nblocksy, size, xm_stride, loader_stride, format_stride; xm_dt = CALLOC_STRUCT(xm_displaytarget); if(!xm_dt) goto no_xm_dt; + format_stride = util_format_get_stride(format, width); + xm_stride = align(format_stride, alignment); + loader_stride = bytes_per_line(format_stride, 32); + nblocksy = util_format_get_nblocksy(format, height); - xm_stride = align(util_format_get_stride(format, width), alignment); 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 = xm_stride; + *stride = loader_stride; return (struct sw_displaytarget *)xm_dt; no_data: |