[Intel-gfx] [PATCH] demos/intel_sprite_on : Sprite Stress Testing
meghanelogal
megha.i.nelogal at intel.com
Tue Mar 3 00:52:53 PST 2015
From: meghanelogal <megha.i.nelogal at intel.com>
Adding the Sprite Stress Test Feature
Signed-off-by: meghanelogal <megha.i.nelogal at intel.com>
---
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
More information about the Intel-gfx
mailing list