[Piglit] [PATCH 1/2] ext_timer_query: add Windows support in time-elapsed.c
Emil Velikov
emil.l.velikov at gmail.com
Thu Sep 4 13:25:03 PDT 2014
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 :)
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