From: Marek Olšák <marek.ol...@amd.com>

Most of the original code is simply wrong.

This patch makes sure that at least the returned GPU offsets and strides
are correct. This doesn't fix the incorrect CPU upload path for non-zero
planes. GBM doesn't seem to have the capability to map a specific plane
for CPU access.
---
 .../util/piglit-framework-gl/piglit_drm_dma_buf.c  | 23 +++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c 
b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
index c3225c3..869d9db 100644
--- a/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
+++ b/tests/util/piglit-framework-gl/piglit_drm_dma_buf.c
@@ -322,54 +322,55 @@ piglit_gbm_buf_create(unsigned w, unsigned h, unsigned 
fourcc,
        dst_data = gbm_bo_map(bo, 0, 0, buf_w, buf_h, GBM_BO_TRANSFER_WRITE,
                              &dst_stride, &map_data);
        if (!dst_data) {
                fprintf(stderr, "Failed to map GBM bo\n");
                gbm_bo_destroy(bo);
                return NULL;
        }
 
        buf->w = w;
        buf->h = h;
-       buf->offset[0] = 0;
-       buf->stride[0] = dst_stride;
+       buf->offset[0] = gbm_bo_get_offset(bo, 0);
+       buf->stride[0] = gbm_bo_get_stride_for_plane(bo, 0);
        buf->fd = -1;
        buf->priv = bo;
 
        for (i = 0; i < h; ++i) {
                memcpy((char *)dst_data + i * dst_stride,
                       src_data + i * src_stride,
                       w * cpp);
        }
 
        switch (fourcc) {
        case DRM_FORMAT_NV12:
-               buf->offset[1] = dst_stride * h;
-               buf->stride[1] = dst_stride;
                for (i = 0; i < h/2; ++i) {
-                       memcpy(((char *)dst_data + buf->offset[1]) + i * 
buf->stride[1],
+                       memcpy(((char *)dst_data + dst_stride * h) + i * 
dst_stride,
                                (src_data + (w*h)) + i * src_stride, w);
                }
+               buf->offset[1] = gbm_bo_get_offset(bo, 1);
+               buf->stride[1] = gbm_bo_get_stride_for_plane(bo, 1);
                break;
        case DRM_FORMAT_YUV420:
        case DRM_FORMAT_YVU420:
-               buf->offset[1] = dst_stride * h;
-               buf->stride[1] = dst_stride / 2;
                for (i = 0; i < h/2; ++i) {
-                       memcpy(((char *)dst_data + buf->offset[1]) + i * 
buf->stride[1],
+                       memcpy(((char *)dst_data + dst_stride * h) + i * 
dst_stride / 2,
                                (src_data + (w*h)) + i * src_stride / 2, w / 2);
                }
-               buf->offset[2] = buf->offset[1] + (dst_stride * h / 2 / 2);
-               buf->stride[2] = dst_stride / 2;
+               unsigned cpu_offset2 = dst_stride * h + (dst_stride * h / 2 / 
2);
                for (i = 0; i < h/2; ++i) {
-                       memcpy(((char *)dst_data + buf->offset[2]) + i * 
buf->stride[2],
+                       memcpy(((char *)dst_data + cpu_offset2) + i * 
dst_stride / 2,
                                (src_data + (w*h) + (w*h/4)) + i * src_stride / 
2, w / 2);
                }
+               buf->offset[1] = gbm_bo_get_offset(bo, 1);
+               buf->stride[1] = gbm_bo_get_stride_for_plane(bo, 1);
+               buf->offset[2] = gbm_bo_get_offset(bo, 2);
+               buf->stride[2] = gbm_bo_get_stride_for_plane(bo, 2);
                break;
        default:
                break;
        }
 
        gbm_bo_unmap(bo, map_data);
 
 
        return true;
 }
-- 
2.7.4

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to