summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/sw/dri
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/sw/dri')
-rw-r--r--src/gallium/winsys/sw/dri/dri_sw_winsys.c28
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 abf92b86b04..5549e152ee8 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: