From: meghanelogal <[email protected]>

Adding the Sprite Stress Test Feature

Signed-off-by: meghanelogal <[email protected]>
---
 demos/intel_sprite_on.c |  653 +++++++++++++++++++++++++----------------------
 1 file changed, 347 insertions(+), 306 deletions(-)

diff --git a/demos/intel_sprite_on.c b/demos/intel_sprite_on.c
index 23fc56c..ad6b163 100644
--- a/demos/intel_sprite_on.c
+++ b/demos/intel_sprite_on.c
@@ -49,6 +49,8 @@
 
 #include "ioctl_wrappers.h"
 
+
+static int sprite_iteration_count = 1;
 /*
  * Mode setting with the kernel interfaces is a bit of a chore.
  * First you have to find the connector in question and make sure the
@@ -476,7 +478,7 @@ static int prepare_sprite_surfaces(int fd, int 
sprite_width, int sprite_height,
 }
 
 static void ricochet(int tiled, int sprite_w, int sprite_h,
-                    int out_w, int out_h, int dump_info)
+                    int out_w, int out_h, int dump_info, int delay_time)
 {
        int                                 ret;
        int                                 gfx_fd;
@@ -499,7 +501,7 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
                                            prim_fb_id;
        struct drm_intel_sprite_colorkey    set;
        struct connector                    curr_connector;
-       drmModeRes                          *gfx_resources;
+       drmModeRes                          *gfx_resources = NULL;
        struct termios                      orig_term,
                                            curr_term;
        int                                 c_index;
@@ -518,259 +520,264 @@ static void ricochet(int tiled, int sprite_w, int 
sprite_h,
        char                                key;
        int                                 sprite_plane_count = 0;
        int                                 i;
+       int sprite_loop = 0;
+       int disable_timer = 0;
+       drmModePlaneRes *plane_resources;
+       drmModePlane *ovr;
        // Open up I915 graphics device
        gfx_fd = drmOpen("i915", NULL);
        if (gfx_fd < 0) {
                printf("Failed to load i915 driver: %s\n", strerror(errno));
                return;
        }
-
-       // Obtain pointer to struct containing graphics resources
-       gfx_resources = drmModeGetResources(gfx_fd);
-       if (!gfx_resources) {
-               printf("drmModeGetResources failed: %s\n", strerror(errno));
-               return;
-       }
-
-       if (dump_info != 0) {
-               dump_connectors(gfx_fd, gfx_resources);
-               dump_crtcs(gfx_fd, gfx_resources);
-               dump_planes(gfx_fd, gfx_resources);
-       }
-
-       // Save previous terminal settings
-       if (tcgetattr( 0, &orig_term) != 0) {
-               printf("tcgetattr failure: %s\n",
-                               strerror(errno));
-               return;
-       }
-
-       // Set up input to return characters immediately
-       curr_term = orig_term;
-       curr_term.c_lflag &= ~(ICANON | ECHO | ECHONL);
-       curr_term.c_cc[VMIN] = 0;       // No minimum number of characters
-       curr_term.c_cc[VTIME] = 0 ;     // Return immediately, even if
-       // nothing has been entered.
-       if (tcsetattr( 0, TCSANOW, &curr_term) != 0) {
-               printf("tcgetattr failure: %s\n", strerror(errno));
-               return;
-       }
-
-       // Cycle through all connectors and display the flying sprite
-       // where there are displays attached and the hardware will support it.
-       for (c_index = 0; c_index < gfx_resources->count_connectors; c_index++) 
 {
-               curr_connector.id = gfx_resources->connectors[c_index];
-
-               // Find the native (preferred) display mode
-               connector_find_preferred_mode(gfx_fd, gfx_resources, 
&curr_connector);
-               if (curr_connector.mode_valid == 0) {
-                       printf("No valid preferred mode detected\n");
-                       goto out;
-               }
-
-               // Determine if sprite hardware is available on pipe
-               // associated with this connector.
-               sprite_plane_count = connector_find_plane(gfx_fd, 
&curr_connector,
-                                                         &sprite_plane_id);
-               if (!sprite_plane_count) {
-                       printf("Failed to find sprite plane on crtc\n");
-                       goto out;
+       /* Stress Cycle iteration */
+       for (sprite_loop = 0; sprite_loop < sprite_iteration_count; 
sprite_loop++) {
+               // Obtain pointer to struct containing graphics resources
+               disable_timer = 0;
+               gfx_resources = drmModeGetResources(gfx_fd);
+               if (!gfx_resources) {
+                       printf("drmModeGetResources failed: %s\n", 
strerror(errno));
+                       return;
                }
 
-               // Width and height of preferred mode
-               prim_width = curr_connector.mode.hdisplay;
-               prim_height = curr_connector.mode.vdisplay;
-
-               // Allocate and fill memory for primary surface
-               ret = prepare_primary_surface(
-                               gfx_fd,
-                               prim_width,
-                               prim_height,
-                               &prim_handle,
-                               &prim_stride,
-                               &prim_size,
-                               tiled);
-               if (ret != 0) {
-                       printf("Failed to add primary fb (%dx%d): %s\n",
-                               prim_width, prim_height, strerror(errno));
-                       goto out;
+               if (dump_info != 0) {
+                       dump_connectors(gfx_fd, gfx_resources);
+                       dump_crtcs(gfx_fd, gfx_resources);
+                       dump_planes(gfx_fd, gfx_resources);
                }
 
-               // Add the primary surface framebuffer
-               ret = drmModeAddFB(gfx_fd, prim_width, prim_height, 24, 32,
-                                  prim_stride, prim_handle, &prim_fb_id);
-               gem_close(gfx_fd, prim_handle);
-
-               if (ret != 0) {
-                       printf("Failed to add primary fb (%dx%d): %s\n",
-                                       prim_width, prim_height, 
strerror(errno));
-                       goto out;
+               // Save previous terminal settings
+               if (tcgetattr( 0, &orig_term) != 0) {
+                       printf("tcgetattr failure: %s\n",
+                               strerror(errno));
+                       return;
                }
 
-               // Allocate and fill sprite surfaces
-               ret = prepare_sprite_surfaces(gfx_fd, sprite_w, sprite_h, 
num_surfaces,
-                                             &sprite_handles[0],
-                                             &sprite_stride, &sprite_size,
-                                             tiled);
-               if (ret != 0) {
-                       printf("Preparation of sprite surfaces failed %dx%d\n",
-                               sprite_w, sprite_h);
-                       goto out;
+               // Set up input to return characters immediately
+               curr_term = orig_term;
+               curr_term.c_lflag &= ~(ICANON | ECHO | ECHONL);
+               curr_term.c_cc[VMIN] = 0;       // No minimum number of 
characters
+               curr_term.c_cc[VTIME] = 0 ;     // Return immediately, even if
+               // nothing has been entered.
+               if (tcsetattr( 0, TCSANOW, &curr_term) != 0) {
+                       printf("tcgetattr failure: %s\n", strerror(errno));
+                       return;
                }
 
-               // Add the sprite framebuffers
-               for (sprite_index = 0; sprite_index < num_surfaces; 
sprite_index++) {
-                       handles[0] = sprite_handles[sprite_index];
-                       handles[1] = handles[0];
-                       handles[2] = handles[0];
-                       handles[3] = handles[0];
-                       pitches[0] = sprite_stride;
-                       pitches[1] = sprite_stride;
-                       pitches[2] = sprite_stride;
-                       pitches[3] = sprite_stride;
-                       memset(offsets, 0, sizeof(offsets));
-
-                       ret = drmModeAddFB2(gfx_fd, sprite_w, sprite_h,
-                                           DRM_FORMAT_XRGB8888,
-                                           handles, pitches, offsets,
-                                           &sprite_fb_id[sprite_index], 
plane_flags);
-                       gem_close(gfx_fd, sprite_handles[sprite_index]);
-
-                       if (ret) {
-                               printf("Failed to add sprite fb (%dx%d): %s\n",
-                                      sprite_w, sprite_h, strerror(errno));
-
-                               sprite_index--;
-                               while (sprite_index >= 0) {
-                                       drmModeRmFB(gfx_fd, 
sprite_fb_id[sprite_index]);
-                                       sprite_index--;
-                               }
+               // Cycle through all connectors and display the flying sprite
+               // where there are displays attached and the hardware will 
support it.
+               for (c_index = 0; c_index < gfx_resources->count_connectors; 
c_index++)  {
+                       curr_connector.id = gfx_resources->connectors[c_index];
+                       // Find the native (preferred) display mode
+                       connector_find_preferred_mode(gfx_fd, gfx_resources, 
&curr_connector);
+                       if (curr_connector.mode_valid == 0) {
+                               printf("No valid preferred mode detected\n");
                                goto out;
                        }
-               }
 
-               if (dump_info != 0) {
-                       printf("Displayed Mode Connector struct:\n"
-                               "    .id = %d\n"
-                               "    .mode_valid = %d\n"
-                               "    .crtc = %d\n"
-                               "    .pipe = %d\n"
-                               "    drmModeModeInfo ...\n"
-                               "        .name = %s\n"
-                               "        .type = %d\n"
-                               "        .flags = %08x\n"
-                               "    drmModeEncoder ...\n"
-                               "        .encoder_id = %d\n"
-                               "        .encoder_type = %d (%s)\n"
-                               "        .crtc_id = %d\n"
-                               "        .possible_crtcs = %d\n"
-                               "        .possible_clones = %d\n"
-                               "    drmModeConnector ...\n"
-                               "        .connector_id = %d\n"
-                               "        .encoder_id = %d\n"
-                               "        .connector_type = %d (%s)\n"
-                               "        .connector_type_id = %d\n\n",
-                               curr_connector.id,
-                               curr_connector.mode_valid,
-                               curr_connector.crtc,
-                               curr_connector.pipe,
-                               curr_connector.mode.name,
-                               curr_connector.mode.type,
-                               curr_connector.mode.flags,
-                               curr_connector.encoder->encoder_id,
-                               curr_connector.encoder->encoder_type,
-                               
kmstest_encoder_type_str(curr_connector.encoder->encoder_type),
-                               curr_connector.encoder->crtc_id,
-                               curr_connector.encoder->possible_crtcs,
-                               curr_connector.encoder->possible_clones,
-                               curr_connector.connector->connector_id,
-                               curr_connector.connector->encoder_id,
-                               curr_connector.connector->connector_type,
-                               
kmstest_connector_type_str(curr_connector.connector->connector_type),
-                               curr_connector.connector->connector_type_id);
-
-                       printf("Sprite surface dimensions = %dx%d\n"
-                               "Sprite output dimensions = %dx%d\n"
-                               "Press any key to continue >\n",
-                               sprite_w, sprite_h, out_w, out_h);
-
-                       // Wait for a key-press
-                       while( read(0, &key, 1) == 0);
-                       // Purge unread characters
-                       tcflush(0, TCIFLUSH);
-               }
+                       // Determine if sprite hardware is available on pipe
+                       // associated with this connector.
+                       sprite_plane_count = connector_find_plane(gfx_fd, 
&curr_connector,
+                                                                 
&sprite_plane_id);
+                       if (!sprite_plane_count) {
+                               printf("Failed to find sprite plane on crtc\n");
+                               goto out;
+                       }
 
-               // Set up the primary display mode
-               ret = drmModeSetCrtc(gfx_fd, curr_connector.crtc, prim_fb_id,
-                                    0, 0, &curr_connector.id, 1, 
&curr_connector.mode);
-               if (ret != 0) {
-                       printf("Failed to set mode (%dx%d@%dHz): %s\n",
-                               prim_width, prim_height, 
curr_connector.mode.vrefresh,
-                               strerror(errno));
-                       continue;
-               }
+                       // Width and height of preferred mode
+                       prim_width = curr_connector.mode.hdisplay;
+                       prim_height = curr_connector.mode.vdisplay;
+
+                       // Allocate and fill memory for primary surface
+                       ret = prepare_primary_surface(
+                                       gfx_fd,
+                                       prim_width,
+                                       prim_height,
+                                       &prim_handle,
+                                       &prim_stride,
+                                       &prim_size,
+                                       tiled);
+                       if (ret != 0) {
+                               printf("Failed to add primary fb (%dx%d): %s\n",
+                                       prim_width, prim_height, 
strerror(errno));
+                               goto out;
+                       }
 
-               // Set the sprite colorkey state
-               for(i = 0; i < sprite_plane_count; i++) {
-                       set.plane_id = sprite_plane_id[i];
-                       set.min_value = 0;
-                       set.max_value = 0;
-                       set.flags = I915_SET_COLORKEY_NONE;
-                       ret = drmCommandWrite(gfx_fd, 
DRM_I915_SET_SPRITE_COLORKEY, &set,
-                                             sizeof(set));
-                       assert(ret == 0);
-               }
+                       // Add the primary surface framebuffer
+                       ret = drmModeAddFB(gfx_fd, prim_width, prim_height, 24, 
32,
+                                          prim_stride, prim_handle, 
&prim_fb_id);
+                       gem_close(gfx_fd, prim_handle);
 
-               // Set up sprite output dimensions, initial position, etc.
-               if (out_w > prim_width / 2)
-                       out_w = prim_width / 2;
-               if (out_h > prim_height / 2)
-                       out_h = prim_height / 2;
+                       if (ret != 0) {
+                               printf("Failed to add primary fb (%dx%d): %s\n",
+                                               prim_width, prim_height, 
strerror(errno));
+                               goto out;
+                       }
 
-               delta_x = (int *) malloc(sprite_plane_count * sizeof(int));
-               delta_y = (int *) malloc(sprite_plane_count * sizeof(int));
-               sprite_x = (int *) malloc(sprite_plane_count * sizeof(int));
-               sprite_y = (int *) malloc(sprite_plane_count * sizeof(int));
+                       // Allocate and fill sprite surfaces
+                       ret = prepare_sprite_surfaces(gfx_fd, sprite_w, 
sprite_h, num_surfaces,
+                                                     &sprite_handles[0],
+                                                     &sprite_stride, 
&sprite_size,
+                                                     tiled);
+                       if (ret != 0) {
+                               printf("Preparation of sprite surfaces failed 
%dx%d\n",
+                                       sprite_w, sprite_h);
+                               goto out;
+                       }
 
-               /* Initializing the coordinates (x,y) of the available sprites 
on the
-                * connector, equally spaced along the diagonal of the rectangle
-                * {(0,0),(prim_width/2, prim_height/2)}.
-                */
-               for(i = 0; i < sprite_plane_count; i++) {
-                       delta_x[i] = 3;
-                       delta_y[i] = 4;
-                       sprite_x[i] = i * (prim_width / (2 * 
sprite_plane_count));
-                       sprite_y[i] = i * (prim_height / (2 * 
sprite_plane_count));
-               }
+                       // Add the sprite framebuffers
+                       for (sprite_index = 0; sprite_index < num_surfaces; 
sprite_index++) {
+                               handles[0] = sprite_handles[sprite_index];
+                               handles[1] = handles[0];
+                               handles[2] = handles[0];
+                               handles[3] = handles[0];
+                               pitches[0] = sprite_stride;
+                               pitches[1] = sprite_stride;
+                               pitches[2] = sprite_stride;
+                               pitches[3] = sprite_stride;
+                               memset(offsets, 0, sizeof(offsets));
+
+                               ret = drmModeAddFB2(gfx_fd, sprite_w, sprite_h,
+                                                   DRM_FORMAT_XRGB8888,
+                                                   handles, pitches, offsets,
+                                                   
&sprite_fb_id[sprite_index], plane_flags);
+                               gem_close(gfx_fd, sprite_handles[sprite_index]);
+
+                               if (ret) {
+                                       printf("Failed to add sprite fb 
(%dx%d): %s\n",
+                                              sprite_w, sprite_h, 
strerror(errno));
 
-               currTime = 0;
-               prevFlipTime = 0;       // Will force immediate sprite flip
-               prevMoveTime = 0;       // Will force immediate sprite move
-               deltaFlipTime = 500000; // Flip sprite surface every 1/2 second
-               deltaMoveTime = 100000; // Move sprite every 100 ms
-               sprite_index = num_surfaces - 1;
-               keep_moving = 1;
+                                       sprite_index--;
+                                       while (sprite_index >= 0) {
+                                               drmModeRmFB(gfx_fd, 
sprite_fb_id[sprite_index]);
+                                               sprite_index--;
+                                       }
+                                       goto out;
+                               }
+                       }
 
-               // Bounce sprite off the walls
-               while (keep_moving) {
-                       // Obtain system time in usec.
-                       if (gettimeofday( &stTimeVal, NULL ) != 0)
-                               printf("gettimeofday error: %s\n", 
strerror(errno));
-                       else
-                               currTime = ((long long)stTimeVal.tv_sec * 
1000000) + stTimeVal.tv_usec;
+                       if (dump_info != 0) {
+                               printf("Displayed Mode Connector struct:\n"
+                                       "    .id = %d\n"
+                                       "    .mode_valid = %d\n"
+                                       "    .crtc = %d\n"
+                                       "    .pipe = %d\n"
+                                       "    drmModeModeInfo ...\n"
+                                       "        .name = %s\n"
+                                       "        .type = %d\n"
+                                       "        .flags = %08x\n"
+                                       "    drmModeEncoder ...\n"
+                                       "        .encoder_id = %d\n"
+                                       "        .encoder_type = %d (%s)\n"
+                                       "        .crtc_id = %d\n"
+                                       "        .possible_crtcs = %d\n"
+                                       "        .possible_clones = %d\n"
+                                       "    drmModeConnector ...\n"
+                                       "        .connector_id = %d\n"
+                                       "        .encoder_id = %d\n"
+                                       "        .connector_type = %d (%s)\n"
+                                       "        .connector_type_id = %d\n\n",
+                                       curr_connector.id,
+                                       curr_connector.mode_valid,
+                                       curr_connector.crtc,
+                                       curr_connector.pipe,
+                                       curr_connector.mode.name,
+                                       curr_connector.mode.type,
+                                       curr_connector.mode.flags,
+                                       curr_connector.encoder->encoder_id,
+                                       curr_connector.encoder->encoder_type,
+                                       
kmstest_encoder_type_str(curr_connector.encoder->encoder_type),
+                                       curr_connector.encoder->crtc_id,
+                                       curr_connector.encoder->possible_crtcs,
+                                       curr_connector.encoder->possible_clones,
+                                       curr_connector.connector->connector_id,
+                                       curr_connector.connector->encoder_id,
+                                       
curr_connector.connector->connector_type,
+                                       
kmstest_connector_type_str(curr_connector.connector->connector_type),
+                                       
curr_connector.connector->connector_type_id);
+
+                               printf("Sprite surface dimensions = %dx%d\n"
+                                       "Sprite output dimensions = %dx%d\n"
+                                       "Press any key to continue >\n",
+                                       sprite_w, sprite_h, out_w, out_h);
+
+                               // Wait for a key-press
+                               while( read(0, &key, 1) == 0);
+                               // Purge unread characters
+                               tcflush(0, TCIFLUSH);
+                       }
 
-                       // Check if it's time to flip the sprite surface
-                       if (currTime - prevFlipTime > deltaFlipTime) {
-                               sprite_index = (sprite_index + 1) % 
num_surfaces;
+                       // Set up the primary display mode
+                       ret = drmModeSetCrtc(gfx_fd, curr_connector.crtc, 
prim_fb_id,
+                                            0, 0, &curr_connector.id, 1, 
&curr_connector.mode);
+                       if (ret != 0) {
+                               printf("Failed to set mode (%dx%d@%dHz): %s\n",
+                                       prim_width, prim_height, 
curr_connector.mode.vrefresh,
+                                       strerror(errno));
+                               continue;
+                       }
 
-                               prevFlipTime = currTime;
+                       // Set the sprite colorkey state
+                       for(i = 0; i < sprite_plane_count; i++) {
+                               set.plane_id = sprite_plane_id[i];
+                               set.min_value = 0;
+                               set.max_value = 0;
+                               set.flags = I915_SET_COLORKEY_NONE;
+                               ret = drmCommandWrite(gfx_fd, 
DRM_I915_SET_SPRITE_COLORKEY, &set,
+                                             sizeof(set));
+                               assert(ret == 0);
                        }
 
-                       // Move the sprite on the screen and flip
-                       // the surface if the index has changed
-                       // NB: sprite_w and sprite_h must be 16.16 fixed point, 
herego << 16
+                       // Set up sprite output dimensions, initial position, 
etc.
+                       if (out_w > prim_width / 2)
+                               out_w = prim_width / 2;
+                       if (out_h > prim_height / 2)
+                               out_h = prim_height / 2;
+
+                       delta_x = (int *) malloc(sprite_plane_count * 
sizeof(int));
+                       delta_y = (int *) malloc(sprite_plane_count * 
sizeof(int));
+                       sprite_x = (int *) malloc(sprite_plane_count * 
sizeof(int));
+                       sprite_y = (int *) malloc(sprite_plane_count * 
sizeof(int));
+
+                       /* Initializing the coordinates (x,y) of the available 
sprites on the
+                        * connector, equally spaced along the diagonal of the 
rectangle
+                        * {(0,0),(prim_width/2, prim_height/2)}.
+                       */
                        for(i = 0; i < sprite_plane_count; i++) {
-                               if (drmModeSetPlane(gfx_fd, sprite_plane_id[i],
+                               delta_x[i] = 3;
+                               delta_y[i] = 4;
+                               sprite_x[i] = i * (prim_width / (2 * 
sprite_plane_count));
+                               sprite_y[i] = i * (prim_height / (2 * 
sprite_plane_count));
+                       }
+
+                       currTime = 0;
+                       prevFlipTime = 0;       // Will force immediate sprite 
flip
+                       prevMoveTime = 0;       // Will force immediate sprite 
move
+                       deltaFlipTime = 500000; // Flip sprite surface every 
1/2 second
+                       deltaMoveTime = 100000; // Move sprite every 100 ms
+                       sprite_index = num_surfaces - 1;
+                       keep_moving = 1;
+
+                       // Bounce sprite off the walls
+                       while (keep_moving) {
+                               // Obtain system time in usec.
+                               if (gettimeofday( &stTimeVal, NULL ) != 0)
+                                       printf("gettimeofday error: %s\n", 
strerror(errno));
+                               else
+                                       currTime = ((long long)stTimeVal.tv_sec 
* 1000000) + stTimeVal.tv_usec;
+
+                               // Check if it's time to flip the sprite surface
+                               if (currTime - prevFlipTime > deltaFlipTime) {
+                                       sprite_index = (sprite_index + 1) % 
num_surfaces;
+
+                                       prevFlipTime = currTime;
+                               }
+
+                               // Move the sprite on the screen and flip
+                               // the surface if the index has changed
+                               // NB: sprite_w and sprite_h must be 16.16 
fixed point, herego << 16
+                               for(i = 0; i < sprite_plane_count; i++) {
+                                       if (drmModeSetPlane(gfx_fd, 
sprite_plane_id[i],
                                                    curr_connector.crtc,
                                                    sprite_fb_id[sprite_index],
                                                    plane_flags,
@@ -778,95 +785,118 @@ static void ricochet(int tiled, int sprite_w, int 
sprite_h,
                                                    out_w, out_h,
                                                    0, 0,
                                                    sprite_w << 16, sprite_h << 
16))
-                                       printf("Failed to enable sprite plane: 
%s\n",
-                                               strerror(errno));
-                       }
-
-                       // Check if it's time to move the sprite surface
-                       if (currTime - prevMoveTime > deltaMoveTime)  {
+                                               printf("Failed to enable sprite 
plane: %s\n",
+                                                       strerror(errno));
+                               }
 
-                               // Compute the next position for sprite
-                               for(i = 0; i < sprite_plane_count; i++) {
-                                       sprite_x[i] += delta_x[i];
-                                       sprite_y[i] += delta_y[i];
-                                       if (sprite_x[i] < 0) {
-                                               sprite_x[i] = 0;
-                                               delta_x[i] = -delta_x[i];
-                                       }
-                                       else if (sprite_x[i] > prim_width - 
out_w) {
-                                               sprite_x[i] = prim_width - 
out_w;
-                                               delta_x[i] = -delta_x[i];
+                               // Check if it's time to move the sprite surface
+                               if (currTime - prevMoveTime > deltaMoveTime)  {
+
+                                       // Compute the next position for sprite
+                                       for(i = 0; i < sprite_plane_count; i++) 
{
+                                               sprite_x[i] += delta_x[i];
+                                               sprite_y[i] += delta_y[i];
+                                               if (sprite_x[i] < 0) {
+                                                       sprite_x[i] = 0;
+                                                       delta_x[i] = 
-delta_x[i];
+                                               }
+                                               else if (sprite_x[i] > 
prim_width - out_w) {
+                                                       sprite_x[i] = 
prim_width - out_w;
+                                                       delta_x[i] = 
-delta_x[i];
+                                               }
+
+                                               if (sprite_y[i] < 0) {
+                                                       sprite_y[i] = 0;
+                                                       delta_y[i] = 
-delta_y[i];
+                                               }
+                                               else if (sprite_y[i] > 
prim_height - out_h) {
+                                                       sprite_y[i] = 
prim_height - out_h;
+                                                       delta_y[i] = 
-delta_y[i];
+                                               }
                                        }
-
-                                       if (sprite_y[i] < 0) {
-                                               sprite_y[i] = 0;
-                                               delta_y[i] = -delta_y[i];
+                                       prevMoveTime = currTime;
+                               }
+                               if (delay_time != 0) {
+                                       if (disable_timer == delay_time) {
+                                               plane_resources = 
drmModeGetPlaneResources(gfx_fd);
+                                               if (!plane_resources) {
+                                                       
printf("drmModeGetPlaneResources failed:%s\n", strerror(errno));
+                                                       return;
+                                               }
+                                       for (i = 0; i < 
plane_resources->count_planes; i++) {
+                                               ovr = drmModeGetPlane(gfx_fd, 
plane_resources->planes[i]);
+                                               if (!ovr) {
+                                                       printf("drmModeGetPlane 
failed:%s\n", strerror(errno));
+                                                       continue;
+                                               }
+                                               drmModeFreePlane(ovr);
                                        }
-                                       else if (sprite_y[i] > prim_height - 
out_h) {
-                                               sprite_y[i] = prim_height - 
out_h;
-                                               delta_y[i] = -delta_y[i];
+                                       while (sprite_index >= 0) {
+                                               drmModeRmFB(gfx_fd, 
sprite_fb_id[sprite_index]);
+                                               sprite_index--;
                                        }
+                                       keep_moving = 0;
+                                       } else
+                                               disable_timer++;
                                }
-                               prevMoveTime = currTime;
-                       }
 
-                       // Fetch a key from input (non-blocking)
-                       if (read(0, &key, 1) == 1) {
-                               switch (key) {
-                               case 'q':       // Kill the program
-                               case 'Q':
-                                       goto out;
-                                       break;
-                               case 's':       // Slow down sprite movement;
-                                       deltaMoveTime = (deltaMoveTime * 100) / 
90;
-                                       if (deltaMoveTime > 800000) {
-                                               deltaMoveTime = 800000;
-                                       }
-                                       break;
-                               case 'S':       // Speed up sprite movement;
-                                       deltaMoveTime = (deltaMoveTime * 100) / 
110;
-                                       if (deltaMoveTime < 2000) {
-                                               deltaMoveTime = 2000;
+                               // Fetch a key from input (non-blocking)
+                               if (read(0, &key, 1) == 1) {
+                                       switch (key) {
+                                       case 'q':       // Kill the program
+                                       case 'Q':
+                                               goto out;
+                                               break;
+                                       case 's':       // Slow down sprite 
movement;
+                                               deltaMoveTime = (deltaMoveTime 
* 100) / 90;
+                                               if (deltaMoveTime > 800000) {
+                                                       deltaMoveTime = 800000;
+                                               }
+                                               break;
+                                       case 'S':       // Speed up sprite 
movement;
+                                               deltaMoveTime = (deltaMoveTime 
* 100) / 110;
+                                               if (deltaMoveTime < 2000) {
+                                                       deltaMoveTime = 2000;
+                                               }
+                                               break;
+                                       case 'f':       // Slow down sprite 
flipping;
+                                               deltaFlipTime = (deltaFlipTime 
* 100) / 90;
+                                               if (deltaFlipTime > 1000000)
+                                                       deltaFlipTime = 1000000;
+                                               break;
+                                       case 'F':       // Speed up sprite 
flipping;
+                                               deltaFlipTime = (deltaFlipTime 
* 100) / 110;
+                                               if (deltaFlipTime < 20000)
+                                                       deltaFlipTime = 20000;
+                                               break;
+                                       case 'n':       // Next connector
+                                       case 'N':
+                                               keep_moving = 0;
+                                               break;
+                                       default:
+                                               break;
                                        }
-                                       break;
-                               case 'f':       // Slow down sprite flipping;
-                                       deltaFlipTime = (deltaFlipTime * 100) / 
90;
-                                       if (deltaFlipTime > 1000000)
-                                               deltaFlipTime = 1000000;
-                                       break;
-                               case 'F':       // Speed up sprite flipping;
-                                       deltaFlipTime = (deltaFlipTime * 100) / 
110;
-                                       if (deltaFlipTime < 20000)
-                                               deltaFlipTime = 20000;
-                                       break;
-                               case 'n':       // Next connector
-                               case 'N':
-                                       keep_moving = 0;
-                                       break;
-                               default:
-                                       break;
+       
+                                       // Purge unread characters
+                                       tcflush(0, TCIFLUSH);
                                }
 
-                               // Purge unread characters
-                               tcflush(0, TCIFLUSH);
+                               // Wait for min of flip or move deltas
+                               SleepTime = (deltaFlipTime < deltaMoveTime) ?
+                                       deltaFlipTime : deltaMoveTime;
+                               usleep(SleepTime);
                        }
-
-                       // Wait for min of flip or move deltas
-                       SleepTime = (deltaFlipTime < deltaMoveTime) ?
-                               deltaFlipTime : deltaMoveTime;
-                       usleep(SleepTime);
+                       free(sprite_plane_id);
+                       free(sprite_x);
+                       free(sprite_y);
+                       free(delta_x);
+                       free(delta_y);
+                       sprite_plane_id = NULL;
+                       sprite_plane_count = 0;
+                       sprite_x = sprite_y = delta_x = delta_y = NULL;
                }
-
-               free(sprite_plane_id);
-               free(sprite_x);
-               free(sprite_y);
-               free(delta_x);
-               free(delta_y);
-               sprite_plane_id = NULL;
-               sprite_plane_count = 0;
-               sprite_x = sprite_y = delta_x = delta_y = NULL;
+               keep_moving = 1;
        }
-
 out:
        // Purge unread characters
        tcflush(0, TCIFLUSH);
@@ -886,6 +916,8 @@ static void usage(char *name)
                "\t-h\t[optional] output help message\n"
                "\t-t\t[optional] enable tiling\n"
                "\t-o\t[optional] <output rect width>x<output rect height>\n\n"
+               "\t-a\t[time] for passing sleep time in seconds before 
disabling planes in each cycle of stress test\n"
+               "\t-n\t[n] Stress cycle count\n\n"
                "Keyboard control for sprite movement and flip rate ...\n"
                "\t'q' or 'Q' - Quit the program\n"
                "\t'n' or 'N' - Switch to next display\n"
@@ -905,8 +937,9 @@ int main(int argc, char **argv)
        int                 plane_width = 0,
                            plane_height = 0,
                            out_width = 0,
-                           out_height = 0;
-       static char         optstr[] = "ds:o:th";
+                           out_height = 0,
+                           delay_time = 0;
+       static char         optstr[] = "ds:o:th:a:n:";
 
        opterr = 0;
        while ((c = getopt(argc, argv, optstr)) != -1) {
@@ -926,6 +959,14 @@ int main(int argc, char **argv)
                        if (sscanf(optarg, "%dx%d", &out_width, &out_height) != 
2)
                                usage(argv[0]);
                        break;
+               case 'a':               /* Delay time for disabling sprites */
+                       if (sscanf(optarg, "%d", &delay_time) != 1)
+                               usage(argv[0]);
+                       break;
+               case 'n':               /* Stress cycle count  */
+                       if (sscanf(optarg, "%d", &sprite_iteration_count) != 1)
+                               usage(argv[0]);
+                       break;
                default:
                        printf("unknown option %c\n", c);
                        /* fall through */
@@ -942,7 +983,7 @@ int main(int argc, char **argv)
                if (out_height < (plane_height / 2))
                        out_height = plane_height;
 
-               ricochet(enable_tiling, plane_width, plane_height, out_width, 
out_height, dump_info);
+               ricochet(enable_tiling, plane_width, plane_height, out_width, 
out_height, dump_info, delay_time);
        } else {
                printf("Sprite dimensions are required:\n");
                usage(argv[0]);
-- 
1.7.9.5

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to