[Piglit] [PATCH 6/7] cl-program-tester: Defer parsing of input/output values until test execution

Tom Stellard tom at stellard.net
Mon Sep 30 07:47:45 PDT 2013


From: Tom Stellard <thomas.stellard at amd.com>

This will make it possible to write tests using generic types.
---
 tests/cl/program/program-tester.c | 61 +++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 21 deletions(-)

diff --git a/tests/cl/program/program-tester.c b/tests/cl/program/program-tester.c
index 557dc4b..fbfeb7b 100644
--- a/tests/cl/program/program-tester.c
+++ b/tests/cl/program/program-tester.c
@@ -211,6 +211,7 @@ struct test_arg {
 	/* kernel arg data */
 	cl_uint index;
 	size_t size_in_mem;
+	char *raw_value;
 	void* value;
 
 	/* tolerance */
@@ -231,6 +232,7 @@ struct test_arg create_test_arg()
 
 		.index = 0,
 		.size_in_mem = 0,
+		.raw_value = NULL,
 		.value = NULL,
 
 		.toli = 0,
@@ -1007,11 +1009,10 @@ get_test_arg(const char* src, struct test* test, bool arg_in)
 		/* Get value */
 		regex_get_match_str(&value, src, pmatch, 3);
 		if(regex_match(value, REGEX_FULL_MATCH(REGEX_NULL))) {
-			test_arg.value = NULL;
+			test_arg.raw_value = NULL;
 		} else {
-			get_test_arg_value(&test_arg, value, test_arg.vec_elements);
+			test_arg.raw_value = value;
 		}
-		free(value);
 	} else if(regex_match(src, REGEX_FULL_MATCH(REGEX_ARG_BUFFER))) { // buffer
 		char* array_length_str = NULL;
 		const char* tolerance_str = NULL;
@@ -1059,24 +1060,11 @@ get_test_arg(const char* src, struct test* test, bool arg_in)
 					exit_report_result(PIGLIT_WARN);
 				}
 			} else if(regex_match(value, REGEX_FULL_MATCH(REGEX_REPEAT))) {
-				regmatch_t rmatch[3];
-				char* repeat_value_str;
-
-				regex_get_matches(value, REGEX_REPEAT, rmatch, 3, 0);
-				regex_get_match_str(&repeat_value_str, value, rmatch, 2);
-
-				get_test_arg_value(&test_arg,
-				                   repeat_value_str,
-				                   get_array_length(repeat_value_str));
-
-				free(repeat_value_str);
+				test_arg.raw_value = value;
 			} else if(regex_match(value, REGEX_ARRAY)) {
-				get_test_arg_value(&test_arg,
-				                   value,
-				                   test_arg.length * test_arg.vec_elements);
+				test_arg.raw_value = value;
 			}
 		}
-		free(value);
 	}
 
 	if(arg_in) {
@@ -1729,6 +1717,7 @@ test_kernel(const struct piglit_cl_program_test_config* config,
 
 		switch(test_arg.type) {
 		case TEST_ARG_VALUE:
+			get_test_arg_value(&test_arg, test_arg.raw_value, test_arg.vec_elements);
 			arg_set = piglit_cl_set_kernel_arg(kernel,
 			                                   test_arg.index,
 							   test_arg.vec_elements * piglit_cl_type_get_size(test_arg.cl_type),
@@ -1738,7 +1727,22 @@ test_kernel(const struct piglit_cl_program_test_config* config,
 			struct buffer_arg buffer_arg;
 			buffer_arg.index = test_arg.index;
 
-			if(test_arg.value != NULL) {
+			if(test_arg.raw_value != NULL) {
+				if(regex_match(test_arg.raw_value, REGEX_FULL_MATCH(REGEX_REPEAT))) {
+					regmatch_t rmatch[3];
+					char* repeat_value_str;
+
+					regex_get_matches(test_arg.raw_value, REGEX_REPEAT, rmatch, 3, 0);
+					regex_get_match_str(&repeat_value_str, test_arg.raw_value, rmatch, 2);
+
+					get_test_arg_value(&test_arg,
+					                   repeat_value_str,
+					                   get_array_length(repeat_value_str));
+				} else {
+					get_test_arg_value(&test_arg,
+					                   test_arg.raw_value,
+						           test_arg.length * test_arg.vec_elements);
+				}
 				buffer_arg.buffer = piglit_cl_create_buffer(env->context,
 				                                            CL_MEM_READ_WRITE,
 				                                            test_arg.size_in_mem);
@@ -1802,7 +1806,7 @@ test_kernel(const struct piglit_cl_program_test_config* config,
 				break;
 			}
 
-			if(test_arg.value != NULL) {
+			if(test_arg.raw_value != NULL) {
 				buffer_arg.buffer = piglit_cl_create_buffer(env->context,
 				                                            CL_MEM_READ_WRITE,
 				                                            test_arg.size_in_mem);
@@ -1875,7 +1879,22 @@ test_kernel(const struct piglit_cl_program_test_config* config,
 				}
 			}
 
-			if(test_arg.value != NULL) {
+			if(test_arg.raw_value != NULL) {
+				if(regex_match(test_arg.raw_value, REGEX_FULL_MATCH(REGEX_REPEAT))) {
+					regmatch_t rmatch[3];
+					char* repeat_value_str;
+
+					regex_get_matches(test_arg.raw_value, REGEX_REPEAT, rmatch, 3, 0);
+					regex_get_match_str(&repeat_value_str, test_arg.raw_value, rmatch, 2);
+
+					get_test_arg_value(&test_arg,
+					                   repeat_value_str,
+					                   get_array_length(repeat_value_str));
+				} else {
+					get_test_arg_value(&test_arg,
+					                   test_arg.raw_value,
+						           test_arg.length * test_arg.vec_elements);
+				}
 				void* read_value = malloc(test_arg.size_in_mem);
 
 				if(piglit_cl_read_buffer(env->context->command_queues[0],
-- 
1.7.11.4



More information about the Piglit mailing list