[Beignet] [PATCH] utests: fix compiler_fill_image_2d_array random bug

Pan Xiuli xiuli.pan at intel.com
Wed Oct 28 22:46:36 PDT 2015


Use safer image write instead of map and memset. When
create image without data, we could not set pitch and
we don't know the pitch either. So use map and memset
the space is too dangerous if pitch is bigger than
w*sizeof(bpp), in this case the actually pitch is 512
but memset use pitch as 64*4=256. With only half space
set to 0, there will be undefined behavior when we want
to check the result for those space that we haven't set
to 0.

Signed-off-by: Pan Xiuli <xiuli.pan at intel.com>
---
 utests/compiler_fill_image_2d_array.cpp | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/utests/compiler_fill_image_2d_array.cpp b/utests/compiler_fill_image_2d_array.cpp
index fc09362..ab7470e 100644
--- a/utests/compiler_fill_image_2d_array.cpp
+++ b/utests/compiler_fill_image_2d_array.cpp
@@ -11,6 +11,7 @@ static void compiler_fill_image_2d_array(void)
   size_t origin[3] = { };
   size_t region[3];
   uint32_t* dst;
+  uint32_t* src;
 
   memset(&desc, 0x0, sizeof(cl_image_desc));
   memset(&format, 0x0, sizeof(cl_image_format));
@@ -28,9 +29,16 @@ static void compiler_fill_image_2d_array(void)
 
   OCL_CREATE_IMAGE(buf[0], 0, &format, &desc, NULL);
 
-  OCL_MAP_BUFFER_GTT(0);
-  memset(buf_data[0], 0, sizeof(uint32_t) * w * h * array);
-  OCL_UNMAP_BUFFER_GTT(0);
+  region[0] = w;
+  region[1] = h;
+  region[2] = array;
+
+  // As we don't know the pitch right now, we cannot
+  // use map to setup the image. It is safer to use
+  // write image
+  src = (uint32_t*)malloc(sizeof(uint32_t) * w * h * array);
+  memset(src, 0, sizeof(uint32_t) * w * h * array);
+  OCL_WRITE_IMAGE(buf[0], origin, region, src);
 
   // Run the kernel
   OCL_SET_ARG(0, sizeof(cl_mem), &buf[0]);
@@ -43,9 +51,6 @@ static void compiler_fill_image_2d_array(void)
   OCL_NDRANGE(3);
 
   // Check result
-  region[0] = w;
-  region[1] = h;
-  region[2] = array;
   dst = (uint32_t*)malloc(w*h*array*sizeof(uint32_t));
   OCL_READ_IMAGE(buf[0], origin, region, dst);
 
@@ -79,6 +84,7 @@ static void compiler_fill_image_2d_array(void)
     }
   }
   free(dst);
+  free(src);
 }
 
 MAKE_UTEST_FROM_FUNCTION(compiler_fill_image_2d_array);
-- 
2.1.4



More information about the Beignet mailing list