|
|
@ -311,189 +311,4 @@ void CDriverGL::setPixelProgramConstantMatrix (uint index, IDriver::TMatrix matr
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO_REMOVE_PARSER
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
// ***************** CPixelProgramConversionARB *****************************
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const char * CPixelProgramConversionARB::ARBPixelProgramInputRegisterToName[CPPOperand::InputRegisterCount] =
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"color.primary",
|
|
|
|
|
|
|
|
"color.secondary",
|
|
|
|
|
|
|
|
"texcoord[0]",
|
|
|
|
|
|
|
|
"texcoord[1]",
|
|
|
|
|
|
|
|
"texcoord[2]",
|
|
|
|
|
|
|
|
"texcoord[3]",
|
|
|
|
|
|
|
|
"texcoord[4]",
|
|
|
|
|
|
|
|
"texcoord[5]",
|
|
|
|
|
|
|
|
"texcoord[6]",
|
|
|
|
|
|
|
|
"texcoord[7]",
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
const char * CPixelProgramConversionARB::ARBPixelProgramOutputRegisterToName[CPPOperand::OutputRegisterCount] =
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"color",
|
|
|
|
|
|
|
|
"depth"
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
bool CPixelProgramConversionARB::convert(const CPixelProgramParser::CPProgram &inParsedProgram, std::string & code)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CPixelProgramParser::TPProgram parsedProgram = inParsedProgram._Program;
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
code = "!!ARBfp1.0\n";
|
|
|
|
|
|
|
|
// declare temporary registers
|
|
|
|
|
|
|
|
GLint glMaxTempVar;
|
|
|
|
|
|
|
|
nglGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, &glMaxTempVar);
|
|
|
|
|
|
|
|
uint usedTempVar = inParsedProgram.getUsedVariablesNb();
|
|
|
|
|
|
|
|
if(usedTempVar>glMaxTempVar)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
nlwarning(" Used temporary registers number is superior to maximum ARB_FRAGMENT_PROGRAM temporaries registers.");
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ARBProgramTemporaryRegisters(code, usedTempVar);
|
|
|
|
|
|
|
|
// declare constant register
|
|
|
|
|
|
|
|
if(!CProgramConversionARB::constantRegisters(inParsedProgram._Constants, code)) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(uint k = 0; k < parsedProgram.size(); ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
std::string instr;
|
|
|
|
|
|
|
|
ARBPixelProgramDumpInstr(parsedProgram[k], instr);
|
|
|
|
|
|
|
|
code += instr + "\r\n";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
code += "END\n";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
// Dump an instruction in a string
|
|
|
|
|
|
|
|
void CPixelProgramConversionARB::ARBPixelProgramDumpInstr(const CPPInstruction &instr, std::string &out)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
nlassert(instr.Opcode.PPOp < CPPInstruction::OpcodeCount);
|
|
|
|
|
|
|
|
// Special case for EXP with a scalar output argument (y component) -> translate to FRC
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out = std::string();
|
|
|
|
|
|
|
|
switch(instr.Opcode.PPOp)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
case CPPInstruction::ADD:
|
|
|
|
|
|
|
|
out = "ADD";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::DP3:
|
|
|
|
|
|
|
|
out = "DP3";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::DP4:
|
|
|
|
|
|
|
|
out = "DP4";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::EXP:
|
|
|
|
|
|
|
|
out = "EXP";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::FRC:
|
|
|
|
|
|
|
|
out = "FRC";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::LOG:
|
|
|
|
|
|
|
|
out = "LOG";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::MAD:
|
|
|
|
|
|
|
|
out = "MAD";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::MAX:
|
|
|
|
|
|
|
|
out = "MAX";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::MIN:
|
|
|
|
|
|
|
|
out = "MIN";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::MOV:
|
|
|
|
|
|
|
|
out = "MOV";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::MUL:
|
|
|
|
|
|
|
|
out = "MUL";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::RCP:
|
|
|
|
|
|
|
|
out = "RCP";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::RSQ:
|
|
|
|
|
|
|
|
out = "RSQ";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::SUB:
|
|
|
|
|
|
|
|
out = "SUB";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::ABS:
|
|
|
|
|
|
|
|
out = "ABS";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::CMP:
|
|
|
|
|
|
|
|
out = "CMP";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::CRS:
|
|
|
|
|
|
|
|
out = "XPD";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::LRP:
|
|
|
|
|
|
|
|
out = "LRP";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::POW:
|
|
|
|
|
|
|
|
out = "POW";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::TEX:
|
|
|
|
|
|
|
|
out = "TEX";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::TEXB:
|
|
|
|
|
|
|
|
out = "TXB";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPInstruction::TEXP:
|
|
|
|
|
|
|
|
out = "TXP";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
nlwarning("no match with a ARB Pixel Program Operator");
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(instr.Sat) out += "_SAT";
|
|
|
|
|
|
|
|
out += " ";
|
|
|
|
|
|
|
|
uint nbOp = instr.getNumUsedSrc();
|
|
|
|
|
|
|
|
std::string destOperand;
|
|
|
|
|
|
|
|
ARBPixelProgramDumpOperand(instr.Dest, true, destOperand);
|
|
|
|
|
|
|
|
out += destOperand;
|
|
|
|
|
|
|
|
for(uint k = 0; k < nbOp; ++k)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
out += ", ";
|
|
|
|
|
|
|
|
std::string srcOperand;
|
|
|
|
|
|
|
|
ARBPixelProgramDumpOperand(instr.getSrc(k), false, srcOperand);
|
|
|
|
|
|
|
|
out += srcOperand;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
out +="; \n";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ***************************************************************************
|
|
|
|
|
|
|
|
void CPixelProgramConversionARB::ARBPixelProgramDumpOperand(const CPPOperand &op, bool destOperand, std::string &out)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
out = op.Negate ? " -" : " ";
|
|
|
|
|
|
|
|
switch(op.Type)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
case CPPOperand::Variable: out += "R" + NLMISC::toString(op.Value.VariableValue); break;
|
|
|
|
|
|
|
|
case CPPOperand::Constant:
|
|
|
|
|
|
|
|
out += "c[";
|
|
|
|
|
|
|
|
out += NLMISC::toString(op.Value.ConstantValue) + "]";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPOperand::InputRegister: out += string("fragment.") + ARBPixelProgramInputRegisterToName[(uint) op.Value.InputRegisterValue]; break;
|
|
|
|
|
|
|
|
case CPPOperand::OutputRegister:
|
|
|
|
|
|
|
|
nlassert(op.Value.OutputRegisterValue < CVPOperand::OutputRegisterCount);
|
|
|
|
|
|
|
|
out += "result." + std::string(ARBPixelProgramOutputRegisterToName[op.Value.OutputRegisterValue]);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPOperand::Sampler2DRegister:
|
|
|
|
|
|
|
|
out += string("texture[") + op.Value.SamplerValue + "], 2D";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CPPOperand::Sampler3DRegister:
|
|
|
|
|
|
|
|
out += string("texture[") + op.Value.SamplerValue + "], 3D";
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ARBProgramSuffix(op, destOperand, out);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // NL3D
|
|
|
|
} // NL3D
|
|
|
|