2025-04-27 07:49:33 -04:00

500 lines
14 KiB
C

/*
** Copyright 1992, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/
#include <windows.h>
#include "ctk.h"
#include "conform.h"
#include "util.h"
#include "utils.h"
#include "pathdata.h"
#include "driver.h"
TK_WindowRec wind;
machineRec machine;
bufferRec buffer;
epsilonRec epsilon;
GLfloat colorMap[][3] = {
{
0.0, 0.0, 0.0
},
{
1.0, 0.0, 0.0
},
{
0.0, 1.0, 0.0
},
{
1.0, 1.0, 0.0
},
{
0.0, 0.0, 1.0
},
{
1.0, 0.0, 1.0
},
{
0.0, 1.0, 1.0
},
{
1.0, 1.0, 1.0
}
};
static long Setup(int argc, char **argv)
{
FILE *file;
long i, j;
machine.randSeed = 1;
machine.pathLevel = 0;
machine.verboseLevel = 1;
machine.stateCheckFlag = GL_TRUE;
machine.failMode = GL_FALSE;
buffer.visualID = -99;
DriverInit();
for (i = 1; i < argc; i++) {
if (STREQ(argv[i], "-1")) { /* run single test. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-1 (No test name).\n\n");
return GL_TRUE;
} else {
if (DriverSetup1(argv[++i]) == ERROR) {
Output(0, "-1 (Bad test name).\n\n");
return GL_TRUE;
}
}
} else if (STREQ(argv[i], "-A")) { /* all display+bitmap pixel formats. */
buffer.visualID = -99;
} else if (STREQ(argv[i], "-S")) { /* all display pixel formats. */
buffer.visualID = -98;
} else if (STREQ(argv[i], "-B")) { /* all bitmap pixel formats. */
buffer.visualID = -97;
} else if (STREQ(argv[i], "-D")) { /* display. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-D (No Display ID).\n\n");
return GL_TRUE;
} else {
buffer.visualID = ATOI(argv[++i]);
if (buffer.visualID < 0 || buffer.visualID > 90) {
Output(0, "-D (Bad Display ID).\n\n");
return GL_TRUE;
}
}
} else if (STREQ(argv[i], "-d")) { /* bitmap. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-d (No Bitmap ID).\n\n");
return GL_TRUE;
} else {
buffer.visualID = ATOI(argv[++i]);
if (buffer.visualID < 0 || buffer.visualID > 90) {
Output(0, "-d (Bad Bitmap ID).\n\n");
return GL_TRUE;
}
buffer.visualID = -buffer.visualID;
}
} else if (STREQ(argv[i], "-f")) { /* use test set. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-f (No file name).\n\n");
return GL_TRUE;
} else {
if (DriverSetup2(argv[++i]) == ERROR) {
Output(0, "-f (Bad file).\n\n");
return GL_TRUE;
}
}
} else if (STREQ(argv[i], "-G")) { /* generate test set. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-G (No file name).\n\n");
} else {
file = fopen(argv[++i], "w");
if (file != NULL) {
fprintf(file, "# %s Tests.\n", appl.title);
for (j = 0; !STREQ(driver[j].name, "End of List"); j++) {
fprintf(file, "#%s\n", driver[j].id);
}
fclose(file);
Output(0, "Test file %s created.\n\n", argv[i]);
} else {
Output(0, "-G (Bad file name).\n\n");
}
}
return GL_TRUE;
} else if (STREQ(argv[i], "-g")) { /* generate test set. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-g (No file name).\n\n");
} else {
file = fopen(argv[++i], "w");
if (file != NULL) {
fprintf(file, "# %s Tests.\n", appl.title);
for (j = 0; !STREQ(driver[j].name, "End of List"); j++) {
fprintf(file, "%s\n", driver[j].id);
}
fclose(file);
Output(0, "Test file %s created.\n\n", argv[i]);
} else {
Output(0, "-g (Bad file name).\n\n");
}
}
return GL_TRUE;
} else if (STREQ(argv[i], "-h")) { /* help. */
Output(0, "Options:\n");
Output(0, "\t-A\t\tRun tests on all pixel formats.\n");
Output(0, "\t-S\t\tRun tests on all display pixel formats.\n");
Output(0, "\t-B\t\tRun tests on all bitmap pixel formats.\n");
Output(0, "\t-1 \"test\"\tSingle test using \"test\" id.\n");
Output(0, "\t-D \"id\"\t\tUse display id.\n");
Output(0, "\t-d \"id\"\t\tUse bitmap id.\n");
Output(0, "\t-f \"file\"\tUse test set in \"file\".\n");
Output(0, "\t-g \"file\"\tGenerate test set in \"file\".\n");
Output(0, "\t-h\t\tPrint this help screen.\n");
Output(0, "\t-p [1-3]\tSet path level.\n");
Output(0, "\t-r \"seed\"\tSet random seed.\n");
Output(0, "\t-s\t\tSkip state check.\n");
Output(0, "\t-v [0-2]\tVerbose level.\n");
Output(0, "\t-x\t\tForce fail for visual tests.\n");
Output(0, "\n");
return GL_TRUE;
} else if (STREQ(argv[i], "-p")) { /* path options. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-p (No path number).\n\n");
return GL_TRUE;
} else {
machine.pathLevel = ATOI(argv[++i]);
if (machine.pathLevel > 4) {
Output(0, "-p (Bad path number).\n\n");
return GL_TRUE;
}
}
} else if (STREQ(argv[i], "-r")) { /* random seed. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-r (No random seed).\n\n");
return GL_TRUE;
} else {
machine.randSeed = (unsigned int)ATOI(argv[++i]);
}
} else if (STREQ(argv[i], "-s")) { /* skip state check. */
machine.stateCheckFlag = GL_FALSE;
} else if (STREQ(argv[i], "-x")) { /* force fail. */
machine.failMode = GL_TRUE;
} else if (STREQ(argv[i], "-v")) { /* verbose. */
if (i+1 >= argc || argv[i+1][0] == '-') {
Output(0, "-v (No verbose level).\n\n");
return GL_TRUE;
} else {
machine.verboseLevel = ATOI(argv[++i]);
if (machine.verboseLevel < 0 || machine.verboseLevel > 2) {
Output(0, "-v (Bad verbose level).\n\n");
return GL_TRUE;
}
}
} else {
Output(0, "%s (Bad option).\n\n", argv[i]);
return GL_TRUE;
}
}
return GL_FALSE;
}
static void BufferSetup(void)
{
long i;
buffer.render = (GLint)wind.render;
buffer.colorMode = (TK_WIND_IS_RGB(wind.info)) ? GL_RGB : GL_COLOR_INDEX;
buffer.doubleBuf = (TK_WIND_IS_SB(wind.info)) ? GL_FALSE : GL_TRUE;
glDrawBuffer(GL_FRONT);
glReadBuffer(GL_FRONT);
glGetIntegerv(GL_AUX_BUFFERS, &buffer.auxBuf);
glGetIntegerv(GL_STEREO, &buffer.stereoBuf);
glGetIntegerv(GL_RED_BITS, &buffer.colorBits[0]);
glGetIntegerv(GL_GREEN_BITS, &buffer.colorBits[1]);
glGetIntegerv(GL_BLUE_BITS, &buffer.colorBits[2]);
glGetIntegerv(GL_ALPHA_BITS, &buffer.colorBits[3]);
glGetIntegerv(GL_INDEX_BITS, &buffer.ciBits);
glGetIntegerv(GL_DEPTH_BITS, &buffer.zBits);
glGetIntegerv(GL_STENCIL_BITS, &buffer.stencilBits);
glGetIntegerv(GL_ACCUM_RED_BITS, &buffer.accumBits[0]);
glGetIntegerv(GL_ACCUM_GREEN_BITS, &buffer.accumBits[1]);
glGetIntegerv(GL_ACCUM_BLUE_BITS, &buffer.accumBits[2]);
glGetIntegerv(GL_ACCUM_ALPHA_BITS, &buffer.accumBits[3]);
if (buffer.colorMode == GL_RGB) {
buffer.maxRGBComponent = 0;
if (buffer.colorBits[1] > buffer.colorBits[buffer.maxRGBComponent]) {
buffer.maxRGBComponent = 1;
}
if (buffer.colorBits[2] > buffer.colorBits[buffer.maxRGBComponent]) {
buffer.maxRGBComponent = 2;
}
for (i = 0; i < 3; i++) {
buffer.minRGB[i] = 0.0;
buffer.maxRGB[i] = 0.0;
}
buffer.maxRGB[buffer.maxRGBComponent] = 1.0;
buffer.minRGBBit = MIN(buffer.colorBits[0], MIN(buffer.colorBits[1],
buffer.colorBits[2]));
buffer.maxRGBBit = MAX(buffer.colorBits[0], MAX(buffer.colorBits[1],
buffer.colorBits[2]));
} else {
buffer.minIndex = 0;
buffer.maxIndex = (GLint)POW(2.0, (float)buffer.ciBits) - 1;
}
}
static float CalcEpsilon(long bits)
{
float e;
if (bits == 0) {
e = epsilon.zero;
} else {
e = 1.0 / (POW(2.0, (float)bits) - 1.0) + epsilon.zero;
if (e > 1.0) {
e = 1.0;
}
}
return e;
}
static void EpsilonSetup(void)
{
long i;
epsilon.zero = 1.0 / POW(2.0, 13.0);
for (i = 0; i < 4; i++) {
epsilon.color[i] = CalcEpsilon(buffer.colorBits[i]);
}
epsilon.ci = 0.5;
epsilon.z = CalcEpsilon(buffer.zBits);
epsilon.stencil = CalcEpsilon(buffer.stencilBits);
for (i = 0; i < 4; i++) {
epsilon.accum[i] = CalcEpsilon(buffer.accumBits[i]);
}
}
static void MachineReport(void)
{
Output(0, "Setup Report.\n");
if (machine.verboseLevel > 0) {
Output(0, " Verbose level = %d.\n", machine.verboseLevel);
}
Output(0, " Random number seed = %d.\n", machine.randSeed);
if (machine.pathLevel == 0) {
Output(0, " Path inactive.\n");
} else if (machine.pathLevel == 99) {
Output(0, " Fast inert path.\n");
} else {
Output(0, " Path level = %d.\n", machine.pathLevel);
}
if (machine.failMode == GL_TRUE) {
Output(0, " Fail mode on.\n");
}
Output(0, "\n");
}
static void VisualReport(void)
{
Output(0, "Visual Report.\n");
if (buffer.visualID != -99) {
if (buffer.visualID > 0)
Output(0, " Display ID = %d. ", buffer.visualID);
else
Output(0, " Bitmap ID = %d. ", -buffer.visualID);
if (buffer.render == TK_WIND_DIRECT) {
Output(0, "Direct Rendering.\n");
} else {
Output(0, "Indirect Rendering.\n");
}
}
if (buffer.doubleBuf == GL_TRUE) {
Output(0, " Double Buffered.\n");
} else {
Output(0, " Single Buffered.\n");
}
if (buffer.colorMode == GL_RGB) {
Output(0, " RGBA (%d, %d, %d, %d).\n", buffer.colorBits[0],
buffer.colorBits[1], buffer.colorBits[2], buffer.colorBits[3]);
} else {
Output(0, " Color Index (%d).\n", buffer.ciBits);
}
if (buffer.stencilBits) {
Output(0, " Stencil (%d).\n", buffer.stencilBits);
}
if (buffer.zBits) {
Output(0, " Depth (%d).\n", buffer.zBits);
}
if (buffer.accumBits[0]) {
Output(0, " Accumulation (%d, %d, %d, %d).\n", buffer.accumBits[0],
buffer.accumBits[1], buffer.accumBits[2], buffer.accumBits[3]);
}
if (buffer.auxBuf > 0) {
Output(0, " %d Auxilary Buffer", buffer.auxBuf);
if (buffer.auxBuf > 1) {
Output(0, "s.\n");
} else {
Output(0, ".\n");
}
}
Output(0, "\n");
}
static void EpsilonReport(void)
{
Output(2, "Epsilon Report.\n");
Output(2, " zero error epsilon = %.3g.\n", epsilon.zero);
if (buffer.colorMode == GL_RGB) {
Output(2, " RGBA error epsilon = %.3g, %.3g, %.3g, %.3g.\n",
epsilon.color[0], epsilon.color[1], epsilon.color[2],
epsilon.color[3]);
} else {
Output(2, " Color index error epsilon = %.3g.\n", epsilon.ci);
}
Output(2, " Depth buffer error epsilon = %.3g.\n", epsilon.z);
Output(2, " Stencil plane error epsilon = %.3g.\n", epsilon.stencil);
Output(2, " Accumulation error epsilon = %.3g, %.3g, %.3g, %.3g.\n",
epsilon.accum[0], epsilon.accum[1], epsilon.accum[2],
epsilon.accum[3]);
Output(2, "\n");
}
long Exec(TK_EventRec *ptr)
{
if (ptr->event == TK_EVENT_EXPOSE) {
BufferSetup();
EpsilonSetup();
StateSetup();
MachineReport();
VisualReport();
EpsilonReport();
Driver();
return 0;
}
return 1;
}
int main(int argc, char **argv)
{
TK_VisualIDsRec list;
long flags[100], i;
BOOL bTestAll = FALSE;
printf("%s Test\n", appl.title);
printf("Version %s\n", appl.version);
printf("\n");
if (Setup(argc, argv) == GL_TRUE) {
tkQuit();
return 1;
}
StrMake(wind.name, "%s Test", appl.name);
wind.x = CW_USEDEFAULT;
wind.y = CW_USEDEFAULT;
wind.width = WINDSIZEX;
wind.height = WINDSIZEY;
wind.eventMask = TK_EVENT_EXPOSE;
switch (buffer.visualID) {
case -99: // test all display and bitmap pixel formats
bTestAll = TRUE;
// fall through
case -98: // test all display pixel formats
tkGet(TK_VISUALIDS, (void *)&list);
for (i = 0; i < list.count; i++) {
wind.type = TK_WIND_VISUAL;
buffer.visualID = (GLint)list.IDs[i];
wind.info = buffer.visualID;
wind.render = TK_WIND_DIRECT;
if (tkNewWindow(&wind)) {
tkExec(Exec);
tkCloseWindow();
} else {
Output(0, "Display ID %d not found.\n", buffer.visualID);
}
Output(0, "\n");
}
if (!bTestAll)
break;
// fall through
case -97: // test all bitmap pixel formats
tkGet(TK_VISUALIDS, (void *)&list);
for (i = 0; i < list.count; i++) {
wind.type = TK_WIND_VISUAL;
buffer.visualID = -(GLint)list.IDs[i];
wind.info = buffer.visualID;
wind.render = TK_WIND_DIRECT;
if (tkNewWindow(&wind)) {
tkExec(Exec);
tkCloseWindow();
} else {
Output(0, "Bitmap ID %d not found.\n", -buffer.visualID);
}
Output(0, "\n");
}
break;
default:
wind.type = TK_WIND_VISUAL;
wind.info = buffer.visualID;
wind.render = TK_WIND_DIRECT;
if (tkNewWindow(&wind)) {
tkExec(Exec);
Output(0, "\n");
} else {
Output(0, "Requested ID %d not found.\n\n", abs(buffer.visualID));
}
break;
}
tkQuit();
return 0;
}