From: Meng-Lin Wu <[email protected]>

Reviewed-by: Brian Paul <[email protected]>
---
 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]);
                }
-- 
1.7.10.4

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to