📄 ps_1_4.cpp
字号:
// could be a dst mask or a arg replicator
// if dst mask and alpha included then make up a alpha instruction: maybe best to wait until instruction args completed
mOpParrams[mArgCnt].MaskRep = cursymboldef->mPass2Data;
break;
case sid_DSTMOD:
case sid_DSTSAT:
case sid_PRESRCMOD:
case sid_POSTSRCMOD:
mOpParrams[mArgCnt].Mod |= cursymboldef->mPass2Data;
break;
case sid_NUMVAL:
passed = setOpParram(cursymboldef);
// keep track of how many values are used
// update Constants array position
mConstantsPos++;
break;
case sid_SEPERATOR:
mArgCnt++;
break;
} // end of switch
if(!passed) break;
}// end of for: i<TokenInstCnt
// check to see if there is still an instruction left in the pipe
if(passed) {
BuildMachineInst();
// if there are no more instructions in the pipe than OpInst should be invalid
if(mOpInst != sid_INVALID) passed = false;
}
return passed;
}
bool PS_1_4::setOpParram(const SymbolDef* symboldef)
{
bool success = true;
if(mArgCnt<MAXOPPARRAMS) {
if(mOpParrams[mArgCnt].Filled) mArgCnt++;
}
if (mArgCnt<MAXOPPARRAMS) {
mOpParrams[mArgCnt].Filled = true;
mOpParrams[mArgCnt].Arg = symboldef->mPass2Data;
}
else success = false;
return success;
}
// *********************************************************************************
// this is where the tests are carried out to make sure the PS_1_4 compiler works
#ifdef _DEBUG
// check the functionality of functions in PS_1_4: each test will print to the output file PASSED of FAILED
void PS_1_4::test()
{
struct test1result{
char character;
int line;
};
struct testfloatresult{
char *teststr;
float fvalue;
int charsize;
};
char TestStr1[] = " \n\r //c \n\r// test\n\r \t c - \n\r , e";
test1result test1results[] = {
{'c', 4},
{'-', 4},
{',', 5},
{'e', 5}
};
testfloatresult testfloatresults[] = {
{"1 test", 1.0f, 1},
{"2.3f test", 2.3f, 3},
{"-0.5 test", -0.5f, 4},
{" 23.6 test", 23.6f, 5},
{" -0.021 test", -0.021f, 8},
{"12 test", 12.0f, 2},
{"3test", 3.0f, 1}
};
SymbolID test3result[] = { sid_MOV, sid_COMMA, sid_MUL, sid_ADD, sid_NEGATE, sid_T0
};
#define PART2INST 17
char TestStr3[] = "mov r0,c1";
char TestSymbols[] = "mov";
char passed[] = "PASSED\n";
char failed[] = "***** FAILED *****\n";
int resultID = 0;
// loop variable used in for loops
int i;
fp = fopen("ASMTests.txt", "wt");
// **************************************************************
// first test: see if positionToNextSymbol can find a valid Symbol
fprintf(fp, "Testing: positionToNextSymbol\n");
mSource = TestStr1;
mCharPos = 0;
mCurrentLine = 1;
mEndOfSource = (int)strlen(mSource);
while (positionToNextSymbol()) {
fprintf(fp," character found: [%c] Line:%d : " , mSource[mCharPos], mCurrentLine);
if( (mSource[mCharPos] == test1results[resultID].character) && (mCurrentLine==test1results[resultID].line)) fprintf(fp, passed);
else fprintf(fp, failed);
resultID++;
mCharPos++;
}
fprintf(fp, "finished testing: positionToNextSymbol\n");
// **************************************************************
// Second Test
// did the type lib get initialized properly with a default name index
fprintf(fp, "\nTesting: getTypeDefText\n");
char* resultstr = getTypeDefText(sid_MOV);
fprintf(fp, " default name of mov is: [%s]: %s", resultstr, (strcmp("mov", resultstr)==0)?passed:failed);
fprintf(fp, "finished testing: getTypeDefText\n");
// **************************************************************
// **************************************************************
// fourth test - does isSymbol work correctly
fprintf(fp, "\nTesting: isSymbol\n");
mSource = TestStr3;
mCharPos = 0;
fprintf(fp, " before: [%s]\n", mSource + mCharPos);
fprintf(fp, " symbol to find: [%s]\n", TestSymbols);
if(isSymbol(TestSymbols, resultID)) {
fprintf(fp, " after: [%s] : %s", mSource + resultID + 1, (mSource[resultID + 1] == 'r')? passed:failed);
}
else fprintf(fp, failed);
fprintf(fp," symbol size: %d\n", resultID);
fprintf(fp, "finished testing: isSymbol\n");
// **************************************************************
fprintf(fp, "\nTesting: isFloatValue\n");
float fvalue = 0;
int charsize = 0;
char teststrfloat1[] = "1 test";
mCharPos = 0;
int testsize = ARRAYSIZE(testfloatresults);
for(i=0; i<testsize; i++) {
mSource = testfloatresults[i].teststr;
fprintf(fp, " test string [%s]\n", mSource);
isFloatValue(fvalue, charsize);
fprintf(fp, " value is: %f should be %f: %s", fvalue, testfloatresults[i].fvalue, (fvalue == testfloatresults[i].fvalue)?passed:failed);
fprintf(fp, " char size is: %d should be %d: %s", charsize, testfloatresults[i].charsize, (charsize == testfloatresults[i].charsize)?passed:failed);
}
fprintf(fp, "finished testing: isFloatValue\n");
// **************************************************************
// simple compile test:
char CompileTest1src[] = "ps.1.4\n";
SymbolID CompileTest1result[] = {sid_PS_1_4};
testCompile("Basic PS_1_4", CompileTest1src, CompileTest1result, ARRAYSIZE(CompileTest1result));
// **************************************************************
char CompileTest2src[] = "ps.1.1\n";
SymbolID CompileTest2result[] = {sid_PS_1_1};
testCompile("Basic PS_1_1", CompileTest2src, CompileTest2result, ARRAYSIZE(CompileTest2result));
// **************************************************************
char CompileTest3src[] = "ps.1.4\ndef c0, 1.0, 2.0, 3.0, 4.0\n";
SymbolID CompileTest3result[] = {sid_PS_1_4, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE};
testCompile("PS_1_4 with defines", CompileTest3src, CompileTest3result, ARRAYSIZE(CompileTest3result));
// **************************************************************
char CompileTest4src[] = "ps.1.4\n//test kkl \ndef c0, 1.0, 2.0, 3.0, 4.0\ndef c3, 1.0, 2.0, 3.0, 4.0\n";
SymbolID CompileTest4result[] = {sid_PS_1_4, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE,sid_DEF, sid_C3, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE};
testCompile("PS_1_4 with 2 defines", CompileTest4src, CompileTest4result, ARRAYSIZE(CompileTest4result));
// **************************************************************
char CompileTest5src[] = "ps.1.4\ndef c0, 1.0, 2.0, 3.0, 4.0\n";
SymbolID CompileTest5result[] = {sid_PS_1_4, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE};
GLuint CompileTest5MachinInstResults[] = {mi_SETCONSTANTS, GL_CON_0_ATI, 0};
testCompile("PS_1_4 with defines", CompileTest3src, CompileTest3result, ARRAYSIZE(CompileTest3result), CompileTest5MachinInstResults, ARRAYSIZE(CompileTest5MachinInstResults));
// **************************************************************
char CompileTest6Src[] = "ps.1.4\nmov r0.xzw, c1 \nmul r3, r2, c3";
SymbolID CompileTest6result[] = {sid_PS_1_4, sid_MOV, sid_R0, sid_RBA, sid_COMMA, sid_C1,
sid_MUL, sid_R3, sid_COMMA, sid_R2, sid_COMMA, sid_C3};
testCompile("PS_1_4 ALU simple", CompileTest6Src, CompileTest6result, ARRAYSIZE(CompileTest6result));
// **************************************************************
// test to see if PS_1_4 compile pass 2 generates the proper machine instructions
char CompileTest7Src[] = "ps.1.4\ndef c0,1.0,2.0,3.0,4.0\nmov_x8 r1,v0\nmov r0,r1.g";
SymbolID CompileTest7result[] = {
sid_PS_1_4, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE, sid_MOV, sid_X8, sid_R1, sid_COMMA,
sid_V0, sid_MOV, sid_R0, sid_COMMA, sid_R1, sid_GGGG
};
GLuint CompileTest7MachinInstResults[] = {
mi_SETCONSTANTS, GL_CON_0_ATI, 0,
mi_COLOROP1, GL_MOV_ATI, GL_REG_1_ATI, RGB_BITS, GL_8X_BIT_ATI, GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE,
mi_ALPHAOP1, GL_MOV_ATI, GL_REG_1_ATI, GL_8X_BIT_ATI, GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE,
mi_COLOROP1, GL_MOV_ATI, GL_REG_0_ATI, RGB_BITS, GL_NONE,GL_REG_1_ATI, GL_GREEN, GL_NONE,
mi_ALPHAOP1, GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_REG_1_ATI, GL_GREEN, GL_NONE,
};
testCompile("PS_1_4 ALU simple modifier", CompileTest7Src, CompileTest7result, ARRAYSIZE(CompileTest7result), CompileTest7MachinInstResults, ARRAYSIZE(CompileTest7MachinInstResults));
// **************************************************************
// test to see if a PS_1_1 can be compiled - pass 1 and pass 2 are checked
char TestStr5[] = "ps.1.1\ndef c0,1.0,2.0,3.0,4.0\ntex t0\n// test\ntex t1\ndp3 t0.rgb, t0_bx2, t1_bx2\n+ mov r0,1 - t0";
SymbolID test5result[] = {
sid_PS_1_1, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE, sid_TEX, sid_1T0, sid_TEX, sid_1T1,
sid_DP3, sid_1T0, sid_RGB, sid_COMMA, sid_1T0, sid_BX2, sid_COMMA, sid_1T1, sid_BX2,
sid_PLUS, sid_MOV, sid_1R0, sid_COMMA, sid_INVERT, sid_1T0
};
GLuint test5MachinInstResults[] = {
mi_SETCONSTANTS, GL_CON_0_ATI, 0, mi_SAMPLEMAP, GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI, mi_SAMPLEMAP, GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI,
mi_COLOROP2, GL_DOT3_ATI, GL_REG_0_ATI, RGB_BITS, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI,
GL_REG_1_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI,
mi_COLOROP1, GL_MOV_ATI, GL_REG_0_ATI, RGB_BITS, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_COMP_BIT_ATI, mi_ALPHAOP1, GL_MOV_ATI, GL_REG_0_ATI,
GL_NONE, GL_REG_0_ATI, GL_NONE, GL_COMP_BIT_ATI,
};
testCompile("PS_1_1 Texture simple", TestStr5, test5result, ARRAYSIZE(test5result), test5MachinInstResults, ARRAYSIZE(test5MachinInstResults));
// **************************************************************
// test to see if a PS_1_2 CISC instructions can be compiled - pass 1 and pass 2 are checked
char TestStr6[] = "ps.1.2\ndef c0,1.0,2.0,3.0,4.0\ntex t0\n// test\ntexreg2ar t1, t0";
SymbolID test6result[] = {
sid_PS_1_2, sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA,
sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE,
sid_TEX, sid_1T0,
sid_TEXREG2AR, sid_1T1, sid_COMMA, sid_1T0
};
GLuint test6MachinInstResults[] = {
// def c0
mi_SETCONSTANTS, GL_CON_0_ATI, 0,
// texld r0, t0.str
mi_SAMPLEMAP, GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI,
// mov r1.r, r0.a
mi_COLOROP1, GL_MOV_ATI, GL_REG_1_ATI, GL_RED_BIT_ATI, GL_NONE, GL_REG_0_ATI, GL_ALPHA, GL_NONE,
// mov r1.g, r0.r
mi_COLOROP1, GL_MOV_ATI, GL_REG_1_ATI, GL_GREEN_BIT_ATI, GL_NONE, GL_REG_0_ATI, GL_RED, GL_NONE,
// texld r1, r1
mi_SAMPLEMAP, GL_REG_1_ATI, GL_REG_1_ATI, GL_SWIZZLE_STR_ATI,
};
testCompile("PS_1_2 CISC instructions", TestStr6, test6result, ARRAYSIZE(test6result), test6MachinInstResults, ARRAYSIZE(test6MachinInstResults));
// **************************************************************
// test to see if a PS_1_4 two phase can be compiled - pass 1 and pass 2 are checked
char TestStr7[] = "ps.1.4\ndef c0,1.0,2.0,3.0,4.0\ntexld r0, t0\n// test\nmul r0, r0, c0\nphase\ntexld r1, r0\nmul r0,r0,r1\n";
SymbolID test7result[] = {
sid_PS_1_4,
// def c0,1.0,2.0,3.0,4.0
sid_DEF, sid_C0, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE, sid_COMMA, sid_VALUE,
// texld r0, t0
sid_TEXLD, sid_R0, sid_COMMA, sid_T0,
// mul r0, r0, c0
sid_MUL, sid_R0, sid_COMMA, sid_R0, sid_COMMA, sid_C0,
// phase
sid_PHASE,
// texld r1, r0
sid_TEXLD, sid_R1, sid_COMMA, sid_R0,
// mul r0, r0, r1
sid_MUL, sid_R0, sid_COMMA, sid_R0, sid_COMMA, sid_R1,
};
GLuint test7MachinInstResults[] = {
// def c0
mi_SETCONSTANTS, GL_CON_0_ATI, 0,
// texld r0, t0.str
mi_SAMPLEMAP, GL_REG_0_ATI, GL_TEXTURE0_ARB, GL_SWIZZLE_STR_ATI,
// mul r0, r0, c0
mi_COLOROP2, GL_MUL_ATI, GL_REG_0_ATI, RGB_BITS, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_CON_0_ATI, GL_NONE, GL_NONE,
mi_ALPHAOP2, GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_CON_0_ATI, GL_NONE, GL_NONE,
// phase
// texld r1, r0.str
mi_SAMPLEMAP, GL_REG_1_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI,
// pass ro register
mi_PASSTEXCOORD, GL_REG_0_ATI, GL_REG_0_ATI, GL_SWIZZLE_STR_ATI,
// mul r0, r0, r1
mi_COLOROP2, GL_MUL_ATI, GL_REG_0_ATI, RGB_BITS, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE,
// mul r0.a, r0
mi_ALPHAOP2, GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_REG_1_ATI, GL_NONE, GL_NONE,
};
testCompile("PS_1_4 texture complex : Phase - instructions", TestStr7, test7result, ARRAYSIZE(test7result), test7MachinInstResults, ARRAYSIZE(test7MachinInstResults));
fclose(fp);
fp = NULL;
//reset contexts
// **************************************************************
}
void PS_1_4::testCompile(char* testname, char* teststr, SymbolID* testresult, uint testresultsize, GLuint* MachinInstResults, uint MachinInstResultsSize)
{
char passed[] = "PASSED\n";
char failed[] = "***** FAILED ****\n";
setActiveContexts(ckp_PS_BASE);
fprintf(fp, "\n*** TESTING: %s Compile: Check Pass 1 and 2\n", testname);
fprintf(fp, " source to compile:\n[\n%s\n]\n", teststr);
bool compiled = compile(teststr);
fprintf(fp, " Pass 1 Lines scaned: %d, Tokens produced: %d out of %d: %s",
mCurrentLine, mTokenInstructions.size(), testresultsize,
(mTokenInstructions.size() == (uint)testresultsize) ? passed : failed);
fprintf(fp, "\n Validating Pass 1:\n");
fprintf(fp, "\n Tokens:\n");
for(uint i = 0; i<(mTokenInstructions.size()); i++) {
fprintf(fp," Token[%d] [%s] %d: [%s] %d: %s", i, getTypeDefText(mTokenInstructions[i].mID),
mTokenInstructions[i].mID, getTypeDefText(testresult[i]), testresult[i],
(mTokenInstructions[i].mID == (uint)testresult[i]) ? passed : failed);
}
if(MachinInstResults != NULL) {
fprintf(fp, "\n Machine Instructions:\n");
fprintf(fp, " Pass 2 Machine Instructions generated: %d out of %d: %s", getMachineInstCount(),
MachinInstResultsSize, (getMachineInstCount() == MachinInstResultsSize) ? passed : failed);
size_t MIcount = getMachineInstCount();
fprintf(fp, "\n Validating Pass 2:\n");
for(i = 0; i<MIcount; i++) {
fprintf(fp," instruction[%d] = 0x%x : 0x%x : %s", i, getMachineInst(i), MachinInstResults[i], (getMachineInst(i) == MachinInstResults[i]) ? passed : failed);
}
fprintf(fp, "\n Constants:\n");
for(i=0; i<4; i++) {
fprintf(fp, " Constants[%d] = %f : %s", i, mConstants[i], (mConstants[i] == (1.0f+i)) ? passed : failed);
}
}
if(!compiled) fprintf(fp, failed);
fprintf(fp, "\nfinished testing: %s Compile: Check Pass 2\n\n", testname);
setActiveContexts(ckp_PS_BASE);
}
void PS_1_4::testbinder()
{
FILE* fp;
char BindTestStr[] = "mov_x8 r0,v0";
char passed[] = "PASSED\n";
char failed[] = "FAILED\n";
#define BinderInstCnt 8
GLuint BindMachinInst[BinderInstCnt] = {mi_COLOROP1, GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_8X_BIT_ATI,
GL_PRIMARY_COLOR_ARB, GL_NONE, GL_NONE};
fp = fopen("ASMTests.txt", "at");
fprintf(fp,"Testing: bindMachineInstToFragmentShader\n");
// fill Machin instruction container with predefined code
clearAllMachineInst();
for(int i=0; i<BinderInstCnt; i++) {
mPhase2ALU_mi.push_back(BindMachinInst[i]);
}
fprintf(fp,"bindMachineInstToFragmentShader succes: %s\n",bindAllMachineInstToFragmentShader()?passed:failed);
fprintf(fp,"finished testing: bindAllMachineInstToFragmentShader\n");
fclose(fp);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -