summaryrefslogtreecommitdiffstats
path: root/tests/test-sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test-sdl.c')
-rw-r--r--tests/test-sdl.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/tests/test-sdl.c b/tests/test-sdl.c
new file mode 100644
index 0000000..d336132
--- /dev/null
+++ b/tests/test-sdl.c
@@ -0,0 +1,246 @@
+/*
+ test-sdl.c -- Measure fullscreen SDL write speed.
+ Version 0.4
+
+ Copyright (C) 2003 Matthew Allum, Openedhand Ltd.
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Matthew Allum mallum@openedhand.com
+
+ ===
+
+ Compile with
+
+ gcc `sdl-config --cflags` `sdl-config --libs` test-sdl.c -o test-sdl
+
+*/
+
+#include "SDL.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#define VERSION "0.4"
+
+#define WIDTH 1152
+#define HEIGHT 768
+
+enum {
+ MULTIBLIT_NONE = 0,
+ MULTIBLIT_X,
+ MULTIBLIT_Y,
+};
+
+
+static unsigned long long
+GetTimeInMillis(void)
+{
+ struct timeval tp;
+
+ gettimeofday(&tp, 0);
+ return (unsigned long long)(tp.tv_sec * 1000) + (tp.tv_usec / 1000);
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr,
+ "test-sdl " VERSION "\n"
+ "usage: test-sdl [-w <win width>] [-h <win height>] [--hwsurface] [--fullscreen] [--cycles <int>]\n");
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ int WantMultiBlit = MULTIBLIT_NONE;
+ SDL_VideoInfo *vid_info;
+ SDL_Surface *screen, *buffer;
+ Uint32 color;
+ Uint16 *bufp;
+ SDL_Rect dest, rect_part_src, rect_part_dest;
+ int x,y,i;
+ int cycles, TotalCycles = 100;
+ unsigned long long start_clock, finish_clock, diff_clock;
+
+ int width = WIDTH;
+ int height = HEIGHT;
+
+ int Verbose = 0;
+ int SurfaceType = SDL_SWSURFACE;
+
+ for (i = 1; i < argc; i++) {
+
+ if (!strcmp ("--width", argv[i]) || !strcmp ("-w", argv[i])) {
+ if (++i>=argc) usage ();
+ width = atoi(argv[i]);
+ if (width < 1) usage();
+ continue;
+ }
+
+ if (!strcmp ("--height", argv[i]) || !strcmp ("-h", argv[i])) {
+ if (++i>=argc) usage ();
+ height = atoi(argv[i]);
+ if (height < 1) usage();
+ continue;
+ }
+
+ if (!strcmp ("--cycles", argv[i])) {
+ if (++i>=argc) usage ();
+ TotalCycles = atoi(argv[i]);
+ if (TotalCycles < 1) usage();
+ continue;
+ }
+
+ if (!strcmp ("--fullscreen", argv[i]) ) {
+ SurfaceType = SDL_FULLSCREEN;
+ continue;
+ }
+
+ if (!strcmp ("--hwsurface", argv[i]) ) {
+ SurfaceType = SDL_HWSURFACE;
+ continue;
+ }
+
+ if (!strcmp ("--multiblit=x", argv[i]) ) {
+ WantMultiBlit = MULTIBLIT_X;
+ continue;
+ }
+
+ if (!strcmp ("--multiblit=y", argv[i]) ) {
+ WantMultiBlit = MULTIBLIT_Y;
+ continue;
+ }
+
+ if (!strcmp ("--verbose", argv[i]) || !strcmp ("-v", argv[i])) {
+ Verbose = 1;
+ continue;
+ }
+
+ usage();
+ }
+
+ if((SDL_Init(SDL_INIT_VIDEO)==-1)) {
+ printf("Could not initialize SDL: %s.\n", SDL_GetError());
+ exit(-1);
+ }
+
+ SDL_GetVideoInfo();
+
+ /* XXX FULLSCREEN */
+ screen = SDL_SetVideoMode(width, height, 16, SurfaceType);
+
+ buffer = SDL_CreateRGBSurface(SDL_HWSURFACE, width, height, 16,
+ screen->format->Rmask, screen->format->Gmask,
+ screen->format->Bmask, screen->format->Amask);
+
+ start_clock = GetTimeInMillis();
+
+ for (x=0; x < width; x++)
+ for (y=0; y < height; y++)
+ {
+ int b = (x + y) % 255;
+ int g = x % 255;
+ int r = y % 255;
+
+ color = SDL_MapRGB(buffer->format, r, g, b);
+ bufp = (Uint16 *)buffer->pixels + y*buffer->pitch/2 + x;
+ *bufp = color;
+ }
+
+ finish_clock = GetTimeInMillis();
+
+ if (Verbose)
+ {
+ printf("test-sdl: Surface ( %i X %i, %i KB ) Created in %lli ms\n",
+ width, height, (width*height*2) / 1024, finish_clock - start_clock);
+ }
+
+
+ dest.x = 0;
+ dest.y = 0;
+ dest.w = buffer->w;
+ dest.h = buffer->h;
+
+ buffer = SDL_DisplayFormat(buffer);
+
+ start_clock = GetTimeInMillis();
+
+ switch (WantMultiBlit)
+ {
+ case MULTIBLIT_NONE:
+ for (cycles=0; cycles < TotalCycles; cycles++)
+ {
+ SDL_BlitSurface(buffer, NULL, screen, &dest);
+ SDL_UpdateRects(screen, 1, &dest);
+ }
+ break;
+ case MULTIBLIT_Y:
+ for (cycles=0; cycles < TotalCycles; cycles++)
+ {
+ rect_part_dest.x = rect_part_src.x = 0;
+ rect_part_dest.w = rect_part_src.w = width;
+ rect_part_dest.h = rect_part_src.h = 1;
+ for (y = 0; y < height; y++)
+ {
+ i = y + cycles;
+ if (i >= height) i -= height;
+ rect_part_src.y = y;
+ rect_part_dest.y = i;
+ SDL_BlitSurface(buffer, &rect_part_src, screen, &rect_part_dest);
+ }
+ SDL_UpdateRects(screen, 1, &dest);
+ }
+ break;
+ case MULTIBLIT_X:
+ for (cycles=0; cycles < TotalCycles; cycles++)
+ {
+ rect_part_dest.y = rect_part_src.y = 0;
+ rect_part_dest.w = rect_part_src.w = 1;
+ rect_part_dest.h = rect_part_src.h = height;
+ for (x = 0; x < width; x++)
+ {
+ i = x + cycles;
+ if (i >= width) i -= width;
+ rect_part_src.x = x;
+ rect_part_dest.x = i;
+ SDL_BlitSurface(buffer, &rect_part_src, screen, &rect_part_dest);
+ }
+ SDL_UpdateRects(screen, 1, &dest);
+ }
+ break;
+ }
+
+
+ finish_clock = GetTimeInMillis();
+ diff_clock = finish_clock - start_clock;
+
+ printf("test-sdl: write speed: %lli KB/sec\n",
+ ( (unsigned long long)((width*height*2)/1024) * 1000 * i) / diff_clock);
+
+ if (Verbose)
+ {
+ printf("test-sdl: Approx frame rate: %lli frames/sec\n",
+ (unsigned long long) cycles*1000 / diff_clock);
+ }
+
+
+ SDL_Quit();
+
+ exit(0);
+}