68478eab4b
but couldn't release immediately since they depended on virtual GPU features which were not yet publicly released in any products. This checkin moves those features from our internal repository to the open source repository. Future development on these tests and examples will take place directly in the open source repository. The primary feature added by this patch is 'Screen Object', a new dynamic display management extension supported by Workstation 7.0 and Fusion 3.0. See the README for a quick explanation.
82 lines
1.9 KiB
C
82 lines
1.9 KiB
C
/*
|
|
* Very tiny benchmark for very tiny 2D updates.
|
|
*
|
|
* This sets an SVGA video mode, and uses a sequence of very tiny 2D
|
|
* FIFO updates to repaint the screen pixel-by-pixel in a loop. To
|
|
* measure performance, attach mksPerfTool and view the amount of CPU
|
|
* time used by the MKS and the number of FIFO commands per second.
|
|
* Do *not* use the MKS "frames per second" as a performance metric
|
|
* for this test, as the MKS's "frames" are arbitrary and unrelated
|
|
* to our test's frames.
|
|
*/
|
|
|
|
#include "svga.h"
|
|
#include "intr.h"
|
|
|
|
/*
|
|
* paintScreen --
|
|
*
|
|
* Repaint the screen once: Fill the framebuffer,
|
|
* and use very tiny FIFO updates to cover it all.
|
|
*/
|
|
|
|
void
|
|
paintScreen(uint32 color)
|
|
{
|
|
uint32 *fb = (uint32*) gSVGA.fbMem;
|
|
int x, y;
|
|
static uint32 fence = 0;
|
|
|
|
/*
|
|
* Flow control: Before we re-write the beginning of the
|
|
* framebuffer, make sure the host has at least finished drawing
|
|
* the beginning of the last frame.
|
|
*
|
|
* This isn't as strict as it should be: For proper 2D flow
|
|
* control, we really need to either do a full sync at the end of
|
|
* each frame, or double-buffer (alternating buffers on every other
|
|
* frame). This method can produce glitches, but it's still decent
|
|
* for benchmarking purposes.
|
|
*/
|
|
|
|
SVGA_SyncToFence(fence);
|
|
fence = SVGA_InsertFence();
|
|
|
|
/*
|
|
* Update the screen, pixel by pixel.
|
|
*/
|
|
|
|
for (y = 0; y < gSVGA.height; y++) {
|
|
uint32 *row = fb;
|
|
fb = (uint32*) (gSVGA.pitch + (uint8*)fb);
|
|
|
|
for (x = 0; x < gSVGA.width; x++) {
|
|
*(row++) = color;
|
|
SVGA_Update(x, y, 1, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* main --
|
|
*
|
|
* Main loop and initialization.
|
|
*/
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
Intr_Init();
|
|
Intr_SetFaultHandlers(SVGA_DefaultFaultHandler);
|
|
SVGA_Init();
|
|
SVGA_SetMode(640, 480, 32);
|
|
|
|
while (1) {
|
|
/* Alternate colors on each frame */
|
|
paintScreen(0x747cba);
|
|
paintScreen(0xbebebe);
|
|
}
|
|
|
|
return 0;
|
|
}
|