vc4: Sanity check strides for imported BOs.
authorEric Anholt <eric@anholt.net>
Fri, 15 Apr 2016 20:17:26 +0000 (13:17 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 18 Apr 2016 17:10:44 +0000 (10:10 -0700)
If we're going to sample from or render to them at some particular size,
we'd better make sure that they actually are that size.  Causes some tests
under simulation to generate appropriate error messages instead of
failures.

src/gallium/drivers/vc4/vc4_resource.c

index ea212af0512fdc25bc93862a18a6554daa48347b..2f89da5f9f137cc47f3c8dc22014d5ba3627f356 100644 (file)
@@ -529,20 +529,33 @@ vc4_resource_from_handle(struct pipe_screen *pscreen,
         struct vc4_resource *rsc = vc4_resource_setup(pscreen, tmpl);
         struct pipe_resource *prsc = &rsc->base.b;
         struct vc4_resource_slice *slice = &rsc->slices[0];
+        uint32_t expected_stride = align(prsc->width0 / rsc->cpp,
+                                         vc4_utile_width(rsc->cpp));
 
         if (!rsc)
                 return NULL;
 
+        if (handle->stride != expected_stride) {
+                static bool warned = false;
+                if (!warned) {
+                        warned = true;
+                        fprintf(stderr,
+                                "Attempting to import %dx%d %s with "
+                                "unsupported stride %d instead of %d\n",
+                                prsc->width0, prsc->height0,
+                                util_format_short_name(prsc->format),
+                                handle->stride,
+                                expected_stride);
+                }
+                return NULL;
+        }
+
         rsc->tiled = false;
         rsc->bo = vc4_screen_bo_from_handle(pscreen, handle);
         if (!rsc->bo)
                 goto fail;
 
-        if (!using_vc4_simulator)
-                slice->stride = handle->stride;
-        else
-                slice->stride = align(prsc->width0 * rsc->cpp, 16);
-
+        slice->stride = handle->stride;
         slice->tiling = VC4_TILING_FORMAT_LINEAR;
 
         rsc->vc4_format = get_resource_texture_format(prsc);