[Piglit] [PATCH 1/2] ext_timer_query: add Windows support in time-elapsed.c

Brian Paul brianp at vmware.com
Thu Sep 4 13:56:15 PDT 2014


On 09/04/2014 02:25 PM, Emil Velikov wrote:
> Hi Brian,
>
> Wouldn't it be better if we add a couple of wrapper functions: piglit_get_time
> and piglit_sleep ? This way we'll be able to keep the tests clean and
> OS-agnostic and avoid the trivial duplication introduced with the second patch :)

I want to do that too.  But the two "get time" functions in the two test 
aren't identical (one returns float, the other int64, for example) and I 
don't have time right now to unify things.

I'd like to commit these as-is for the time being.

-Brian


>
> Cheers,
> Emil
>
> On 04/09/14 20:34, Brian Paul wrote:
>> From: Meng-Lin Wu <menglinw at vmware.com>
>>
>> Reviewed-by: Brian Paul <brianp at vmware.com>
>> ---
>>   tests/spec/ext_timer_query/CMakeLists.gl.txt |    5 +--
>>   tests/spec/ext_timer_query/time-elapsed.c    |   58 +++++++++++++++++++-------
>>   2 files changed, 44 insertions(+), 19 deletions(-)
>>
>> diff --git a/tests/spec/ext_timer_query/CMakeLists.gl.txt b/tests/spec/ext_timer_query/CMakeLists.gl.txt
>> index 4d345c5..52f7fb2 100644
>> --- a/tests/spec/ext_timer_query/CMakeLists.gl.txt
>> +++ b/tests/spec/ext_timer_query/CMakeLists.gl.txt
>> @@ -9,8 +9,5 @@ link_libraries (
>>   	${OPENGL_glu_LIBRARY}
>>   )
>>
>> -IF (UNIX)
>> -	piglit_add_executable (ext_timer_query-time-elapsed time-elapsed.c)
>> -ENDIF (UNIX)
>> -
>> +piglit_add_executable (ext_timer_query-time-elapsed time-elapsed.c)
>>   piglit_add_executable (ext_timer_query-lifetime lifetime.c)
>> diff --git a/tests/spec/ext_timer_query/time-elapsed.c b/tests/spec/ext_timer_query/time-elapsed.c
>> index c25abfc..885f875 100644
>> --- a/tests/spec/ext_timer_query/time-elapsed.c
>> +++ b/tests/spec/ext_timer_query/time-elapsed.c
>> @@ -29,7 +29,9 @@
>>    * Test TIME_ELAPSED and TIMESTAMP queries.
>>    */
>>
>> +#if !defined(_WIN32) && !defined(WIN32)
>>   #include <sys/time.h>
>> +#endif
>>
>>   PIGLIT_GL_TEST_CONFIG_BEGIN
>>
>> @@ -87,6 +89,31 @@ static float
>>   get_time(void)
>>   {
>>   	static bool inited = false;
>> +
>> +#if defined(_WIN32) || defined(WIN32)
>> +	static LARGE_INTEGER frequency;
>> +	LARGE_INTEGER counter;
>> +	static GLint64 base_usec = 0;
>> +	GLint64 usec;
>> +	
>> +	if(!frequency.QuadPart)
>> +		QueryPerformanceFrequency(&frequency);
>> +	QueryPerformanceCounter(&counter);
>> +	
>> +	usec = (GLint64)(counter.QuadPart * INT64_C(1000000)/frequency.QuadPart);
>> +	
>> +	/* Return a value that is roughly microseconds since program
>> +	 * startup, to avoid large usec reducing precision of the
>> +	 * return value.
>> +	 */
>> +	if (!inited) {
>> +		inited = true;
>> +		base_usec = usec;
>> +	}
>> +	usec -= base_usec;
>> +	
>> +	return (double)usec/1000000.0;
>> +#else
>>   	static time_t base_sec = 0;
>>   	struct timeval tv;
>>
>> @@ -103,6 +130,7 @@ get_time(void)
>>   	tv.tv_sec -= base_sec;
>>
>>   	return (double)tv.tv_sec + tv.tv_usec / 1000000.0;
>> +#endif
>>   }
>>
>>   static float
>> @@ -161,10 +189,10 @@ piglit_display(void)
>>   	float green[4] = {0.0, 1.0, 0.0, 0.0};
>>   	GLuint q[2];
>>   	int iters;
>> -	int num_results = 5;
>> -	float cpu_time[num_results];
>> -	float gpu_time[num_results];
>> -	float delta[num_results];
>> +#define	NUM_RESULTS 5
>> +	float cpu_time[NUM_RESULTS];
>> +	float gpu_time[NUM_RESULTS];
>> +	float delta[NUM_RESULTS];
>>   	float cpu_time_mean;
>>   	float delta_mean, delta_stddev;
>>   	float cpu_overhead;
>> @@ -195,13 +223,13 @@ piglit_display(void)
>>   	 * some time-consuming shader with a single draw call instead.
>>   	 */
>>   	cpu_overhead = 0;
>> -	for (i = 0; i < num_results; i++) {
>> +	for (i = 0; i < NUM_RESULTS; i++) {
>>   		cpu_time[i] = draw(q, 1);
>>   		gpu_time[i] = get_gpu_time(q);
>>
>>   		cpu_overhead += cpu_time[i] - gpu_time[i];
>>   	}
>> -	cpu_overhead /= num_results;
>> +	cpu_overhead /= NUM_RESULTS;
>>
>>   	/* Find a number of draw calls that takes about 1/10th of a
>>   	 * second.
>> @@ -219,20 +247,20 @@ retry:
>>   	/* Now, do several runs like this so we can determine if the
>>   	 * timer matches up with wall time.
>>   	 */
>> -	for (i = 0; i < num_results; i++) {
>> +	for (i = 0; i < NUM_RESULTS; i++) {
>>   		cpu_time[i] = draw(q, iters);
>>   		gpu_time[i] = get_gpu_time(q);
>>   	}
>>
>>   	cpu_time_mean = 0;
>>   	delta_mean = 0;
>> -	for (i = 0; i < num_results; i++) {
>> +	for (i = 0; i < NUM_RESULTS; i++) {
>>   		delta[i] = cpu_time[i] - cpu_overhead - gpu_time[i];
>>   		cpu_time_mean += cpu_time[i];
>>   		delta_mean += delta[i];
>>   	}
>> -	cpu_time_mean /= num_results;
>> -	delta_mean /= num_results;
>> +	cpu_time_mean /= NUM_RESULTS;
>> +	delta_mean /= NUM_RESULTS;
>>
>>   	/* There's some risk of our "get to 0.1 seconds" loop deciding
>>   	 * that a small number of iters was sufficient if we got
>> @@ -246,9 +274,9 @@ retry:
>>
>>   	/* Calculate stddevs. */
>>   	delta_stddev = 0;
>> -	for (i = 0; i < num_results; i++) {
>> +	for (i = 0; i < NUM_RESULTS; i++) {
>>   		float d = delta[i] - delta_mean;
>> -		delta_stddev += d * d / (num_results - 1);
>> +		delta_stddev += d * d / (NUM_RESULTS - 1);
>>   	}
>>   	delta_stddev = sqrt(delta_stddev);
>>
>> @@ -263,10 +291,10 @@ retry:
>>   	 * in our CPU (wall) time, while scheduling other tasks
>>   	 * doesn't end up counted toward our GPU time.
>>   	 */
>> -	t = delta_mean / (delta_stddev / sqrt(num_results));
>> +	t = delta_mean / (delta_stddev / sqrt(NUM_RESULTS));
>>
>>   	/* Integral of Student's t distribution for 4 degrees of
>> -	 * freedom (num_results = 5), two-tailed (we care about
>> +	 * freedom (NUM_RESULTS = 5), two-tailed (we care about
>>   	 * difference above or below 0, not just one direction), at
>>   	 * p = .05.
>>   	 */
>> @@ -290,7 +318,7 @@ retry:
>>
>>   		printf("%20s %20s %20s\n",
>>   		       "gpu_time", "cpu_time", "delta");
>> -		for (i = 0; i < num_results; i++) {
>> +		for (i = 0; i < NUM_RESULTS; i++) {
>>   			printf("%20f %20f %20f\n",
>>   			       gpu_time[i], cpu_time[i], delta[i]);
>>   		}
>>
>



More information about the Piglit mailing list