void CVPParser::ParseSwizzledSrcReg(const char *token,struct nvfx_src *reg) { s32 idx; if(!token) return; if(token[0]=='-') { reg->negate = TRUE; token++; } if(token[0]=='|') { reg->abs = TRUE; token++; } if(token[0]=='v') { if(token[1]=='e') token = ParseInputReg(token,&idx); else if(token[1]=='[') { token = ParseInputReg(&token[2],&idx); if(*token==']') token++; } reg->reg.type = NVFXSR_INPUT; reg->reg.index = idx; } else if(token[0]=='R') { token = ParseTempReg(token,&idx); reg->reg.type = NVFXSR_TEMP; reg->reg.index = idx; } else if(token[0]=='c' && token[1]=='[') { token = ParseParamReg(&token[2],reg); } token = ParseRegSwizzle(token,reg); }
void CFPParser::ParseVectorSrc(const char *token,struct nvfx_src *reg) { s32 idx; //f32 sign = 1.0f; if(!token) return; if(token[0]=='-') { reg->negate = TRUE; token++; } else if(token[0]=='+') { reg->negate = FALSE; token++; } if(token[0]=='|') { reg->abs = TRUE; token++; } if(token[0]=='R' || token[0]=='H') { token = ParseTempReg(token,&idx); reg->reg.type = NVFXSR_TEMP; reg->reg.index = idx; } else if(token[0]=='f') { if(token[1]=='[') { token = ParseInputReg(&token[2],&idx); if(*token==']') token++; } else token = ParseInputReg(token,&idx); reg->reg.type = NVFXSR_INPUT; reg->reg.index = idx; } else if(token[0]=='c' && token[1]=='[' && isdigit(token[2])) { char *p = (char*)(token + 2); while(isdigit(*p)) p++; reg->reg.index = atoi(token+2); reg->reg.type = GetConstRegType(reg->reg.index); if(*p==']') p++; token = p; } token = ParseRegSwizzle(token,reg); }
void CVPParser::ParseSwizzledSrcReg(const char *token,struct nvfx_src *reg) { s32 idx; if(!token) return; if(token[0]=='-') { reg->negate = TRUE; token++; } if(token[0]=='|') { reg->abs = TRUE; token++; } if(token[0]=='v') { if(token[1]=='e') token = ParseInputReg(token,&idx); else if(token[1]=='[') { token = ParseInputReg(&token[2],&idx); if(*token==']') token++; } reg->reg.type = NVFXSR_INPUT; reg->reg.index = idx; } else if(token[0]=='R') { token = ParseTempReg(token,&idx); reg->reg.type = NVFXSR_TEMP; reg->reg.index = idx; } else if(token[0]=='c' && token[1]=='[') { token = ParseParamReg(&token[2],reg); } if(token && *token!='\0') { if(token[0]=='.') { u32 k; token++; reg->swz[0] = reg->swz[1] = reg->swz[2] = reg->swz[3] = 0; for(k=0;token[k] && k<4;k++) { if(token[k]=='x') reg->swz[k] = NVFX_SWZ_X; else if(token[k]=='y') reg->swz[k] = NVFX_SWZ_Y; else if(token[k]=='z') reg->swz[k] = NVFX_SWZ_Z; else if(token[k]=='w') reg->swz[k] = NVFX_SWZ_W; } if(k && k<4) { u8 lastswz = reg->swz[k - 1]; while(k<4) { reg->swz[k] = lastswz; k++; } } } } }
void CFPParser::ParseScalarSrc(const char *token,struct nvfx_src *reg) { s32 idx = -1; if(!token) return; if(token[0]=='-') { reg->negate = TRUE; token++; } else if(token[0]=='+') { reg->negate = FALSE; token++; } if(token[0]=='|') { reg->abs = TRUE; token++; } if(token[0]=='R' || token[0]=='H') { token = ParseTempReg(token,&idx); reg->reg.type = NVFXSR_TEMP; reg->reg.index = idx; } else if(token[0]=='f') { if(token[1]=='[') { token = ParseInputReg(&token[2],&idx); if(*token==']') token++; } else token = ParseInputReg(token,&idx); reg->reg.type = NVFXSR_INPUT; reg->reg.index = idx; } else if(token[0]=='c' && token[1]=='[' && isdigit(token[2])) { char *p = (char*)(token + 2); while(isdigit(*p)) p++; reg->reg.index = atoi(token+2); reg->reg.type = GetConstRegType(reg->reg.index); if(*p==']') p++; token = p; } if(token && *token!='\0') { if(token[0]=='.') { u32 k; token++; reg->swz[0] = reg->swz[1] = reg->swz[2] = reg->swz[3] = 0; for(k=0;token[k] && k<4;k++) { if(token[k]=='x') reg->swz[k] = NVFX_SWZ_X; else if(token[k]=='y') reg->swz[k] = NVFX_SWZ_Y; else if(token[k]=='z') reg->swz[k] = NVFX_SWZ_Z; else if(token[k]=='w') reg->swz[k] = NVFX_SWZ_W; } if(k && k<4) { u8 lastswz = reg->swz[k - 1]; while(k<4) { reg->swz[k] = lastswz; k++; } } } } }