⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_nvfragprog.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 4 页
字号:
               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = result[1] = result[2] = result[3] =                  (GLfloat) _mesa_pow(2.0, a[0]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_FLR:            {               GLfloat a[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = FLOORF(a[0]);               result[1] = FLOORF(a[1]);               result[2] = FLOORF(a[2]);               result[3] = FLOORF(a[3]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_FRC:            {               GLfloat a[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = a[0] - FLOORF(a[0]);               result[1] = a[1] - FLOORF(a[1]);               result[2] = a[2] - FLOORF(a[2]);               result[3] = a[3] - FLOORF(a[3]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_KIL_NV: /* NV_f_p only */            {               const GLuint swizzle = inst->DstReg.CondSwizzle;               const GLuint condMask = inst->DstReg.CondMask;               if (test_cc(machine->CondCodes[GET_SWZ(swizzle, 0)], condMask) ||                   test_cc(machine->CondCodes[GET_SWZ(swizzle, 1)], condMask) ||                   test_cc(machine->CondCodes[GET_SWZ(swizzle, 2)], condMask) ||                   test_cc(machine->CondCodes[GET_SWZ(swizzle, 3)], condMask)) {                  return GL_FALSE;               }            }            break;         case OPCODE_KIL: /* ARB_f_p only */            {               GLfloat a[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               if (a[0] < 0.0F || a[1] < 0.0F || a[2] < 0.0F || a[3] < 0.0F) {                  return GL_FALSE;               }            }            break;         case OPCODE_LG2:  /* log base 2 */            {               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = result[1] = result[2] = result[3]                  = LOG2(a[0]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_LIT:            {               const GLfloat epsilon = 1.0F / 256.0F; /* from NV VP spec */               GLfloat a[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               a[0] = MAX2(a[0], 0.0F);               a[1] = MAX2(a[1], 0.0F);               /* XXX ARB version clamps a[3], NV version doesn't */               a[3] = CLAMP(a[3], -(128.0F - epsilon), (128.0F - epsilon));               result[0] = 1.0F;               result[1] = a[0];               /* XXX we could probably just use pow() here */               if (a[0] > 0.0F) {                  if (a[1] == 0.0 && a[3] == 0.0)                     result[2] = 1.0;                  else                     result[2] = EXPF(a[3] * LOGF(a[1]));               }               else {                  result[2] = 0.0;               }               result[3] = 1.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_LRP:            {               GLfloat a[4], b[4], c[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               fetch_vector4( ctx, &inst->SrcReg[2], machine, program, c );               result[0] = a[0] * b[0] + (1.0F - a[0]) * c[0];               result[1] = a[1] * b[1] + (1.0F - a[1]) * c[1];               result[2] = a[2] * b[2] + (1.0F - a[2]) * c[2];               result[3] = a[3] * b[3] + (1.0F - a[3]) * c[3];               store_vector4( inst, machine, result );            }            break;         case OPCODE_MAD:            {               GLfloat a[4], b[4], c[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               fetch_vector4( ctx, &inst->SrcReg[2], machine, program, c );               result[0] = a[0] * b[0] + c[0];               result[1] = a[1] * b[1] + c[1];               result[2] = a[2] * b[2] + c[2];               result[3] = a[3] * b[3] + c[3];               store_vector4( inst, machine, result );            }            break;         case OPCODE_MAX:            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = MAX2(a[0], b[0]);               result[1] = MAX2(a[1], b[1]);               result[2] = MAX2(a[2], b[2]);               result[3] = MAX2(a[3], b[3]);               store_vector4( inst, machine, result );#if DEBUG_FRAG               printf("MAX (%g %g %g %g) = (%g %g %g %g), (%g %g %g %g)\n",                      result[0], result[1], result[2], result[3],                       a[0], a[1], a[2], a[3],                      b[0], b[1], b[2], b[3]);#endif            }            break;         case OPCODE_MIN:            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = MIN2(a[0], b[0]);               result[1] = MIN2(a[1], b[1]);               result[2] = MIN2(a[2], b[2]);               result[3] = MIN2(a[3], b[3]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_MOV:            {               GLfloat result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, result );               store_vector4( inst, machine, result );#if DEBUG_FRAG               printf("MOV (%g %g %g %g)\n",                      result[0], result[1], result[2], result[3]);#endif            }            break;         case OPCODE_MUL:            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = a[0] * b[0];               result[1] = a[1] * b[1];               result[2] = a[2] * b[2];               result[3] = a[3] * b[3];               store_vector4( inst, machine, result );#if DEBUG_FRAG               printf("MUL (%g %g %g %g) = (%g %g %g %g) * (%g %g %g %g)\n",                      result[0], result[1], result[2], result[3],                       a[0], a[1], a[2], a[3],                      b[0], b[1], b[2], b[3]);#endif            }            break;         case OPCODE_PK2H: /* pack two 16-bit floats in one 32-bit float */            {               GLfloat a[4], result[4];               GLhalfNV hx, hy;               GLuint *rawResult = (GLuint *) result;               GLuint twoHalves;               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               hx = _mesa_float_to_half(a[0]);               hy = _mesa_float_to_half(a[1]);               twoHalves = hx | (hy << 16);               rawResult[0] = rawResult[1] = rawResult[2] = rawResult[3]                  = twoHalves;               store_vector4( inst, machine, result );            }            break;         case OPCODE_PK2US: /* pack two GLushorts into one 32-bit float */            {               GLfloat a[4], result[4];               GLuint usx, usy, *rawResult = (GLuint *) result;               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               a[0] = CLAMP(a[0], 0.0F, 1.0F);               a[1] = CLAMP(a[1], 0.0F, 1.0F);               usx = IROUND(a[0] * 65535.0F);               usy = IROUND(a[1] * 65535.0F);               rawResult[0] = rawResult[1] = rawResult[2] = rawResult[3]                  = usx | (usy << 16);               store_vector4( inst, machine, result );            }            break;         case OPCODE_PK4B: /* pack four GLbytes into one 32-bit float */            {               GLfloat a[4], result[4];               GLuint ubx, uby, ubz, ubw, *rawResult = (GLuint *) result;               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               a[0] = CLAMP(a[0], -128.0F / 127.0F, 1.0F);               a[1] = CLAMP(a[1], -128.0F / 127.0F, 1.0F);               a[2] = CLAMP(a[2], -128.0F / 127.0F, 1.0F);               a[3] = CLAMP(a[3], -128.0F / 127.0F, 1.0F);               ubx = IROUND(127.0F * a[0] + 128.0F);               uby = IROUND(127.0F * a[1] + 128.0F);               ubz = IROUND(127.0F * a[2] + 128.0F);               ubw = IROUND(127.0F * a[3] + 128.0F);               rawResult[0] = rawResult[1] = rawResult[2] = rawResult[3]                  = ubx | (uby << 8) | (ubz << 16) | (ubw << 24);               store_vector4( inst, machine, result );            }            break;         case OPCODE_PK4UB: /* pack four GLubytes into one 32-bit float */            {               GLfloat a[4], result[4];               GLuint ubx, uby, ubz, ubw, *rawResult = (GLuint *) result;               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               a[0] = CLAMP(a[0], 0.0F, 1.0F);               a[1] = CLAMP(a[1], 0.0F, 1.0F);               a[2] = CLAMP(a[2], 0.0F, 1.0F);               a[3] = CLAMP(a[3], 0.0F, 1.0F);               ubx = IROUND(255.0F * a[0]);               uby = IROUND(255.0F * a[1]);               ubz = IROUND(255.0F * a[2]);               ubw = IROUND(255.0F * a[3]);               rawResult[0] = rawResult[1] = rawResult[2] = rawResult[3]                  = ubx | (uby << 8) | (ubz << 16) | (ubw << 24);               store_vector4( inst, machine, result );            }            break;         case OPCODE_POW:            {               GLfloat a[4], b[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector1( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = result[1] = result[2] = result[3]                  = (GLfloat)_mesa_pow(a[0], b[0]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_RCP:            {               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );#if DEBUG_FRAG               if (a[0] == 0)                  printf("RCP(0)\n");               else if (IS_INF_OR_NAN(a[0]))                  printf("RCP(inf)\n");#endif               result[0] = result[1] = result[2] = result[3]                  = 1.0F / a[0];               store_vector4( inst, machine, result );            }            break;         case OPCODE_RFL:            {               GLfloat axis[4], dir[4], result[4], tmp[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, axis );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, dir );               tmp[3] = axis[0] * axis[0]                      + axis[1] * axis[1]                      + axis[2] * axis[2];               tmp[0] = (2.0F * (axis[0] * dir[0] +                                 axis[1] * dir[1] +                                 axis[2] * dir[2])) / tmp[3];               result[0] = tmp[0] * axis[0] - dir[0];               result[1] = tmp[0] * axis[1] - dir[1];               result[2] = tmp[0] * axis[2] - dir[2];               /* result[3] is never written! XXX enforce in parser! */               store_vector4( inst, machine, result );            }            break;         case OPCODE_RSQ: /* 1 / sqrt() */            {               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               a[0] = FABSF(a[0]);               result[0] = result[1] = result[2] = result[3] = INV_SQRTF(a[0]);               store_vector4( inst, machine, result );#if DEBUG_FRAG               printf("RSQ %g = 1/sqrt(|%g|)\n", result[0], a[0]);#endif            }            break;         case OPCODE_SCS: /* sine and cos */            {               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = (GLfloat)_mesa_cos(a[0]);               result[1] = (GLfloat)_mesa_sin(a[0]);               result[2] = 0.0;  /* undefined! */               result[3] = 0.0;  /* undefined! */               store_vector4( inst, machine, result );            }            break;         case OPCODE_SEQ: /* set on equal */            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = (a[0] == b[0]) ? 1.0F : 0.0F;               result[1] = (a[1] == b[1]) ? 1.0F : 0.0F;               result[2] = (a[2] == b[2]) ? 1.0F : 0.0F;               result[3] = (a[3] == b[3]) ? 1.0F : 0.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_SFL: /* set false, operands ignored */            {               static const GLfloat result[4] = { 0.0F, 0.0F, 0.0F, 0.0F };               store_vector4( inst, machine, result );            }            break;         case OPCODE_SGE: /* set on greater or equal */            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = (a[0] >= b[0]) ? 1.0F : 0.0F;               result[1] = (a[1] >= b[1]) ? 1.0F : 0.0F;               result[2] = (a[2] >= b[2]) ? 1.0F : 0.0F;               result[3] = (a[3] >= b[3]) ? 1.0F : 0.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_SGT: /* set on greater */            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = (a[0] > b[0]) ? 1.0F : 0.0F;               result[1] = (a[1] > b[1]) ? 1.0F : 0.0F;               result[2] = (a[2] > b[2]) ? 1.0F : 0.0F;               result[3] = (a[3] > b[3]) ? 1.0F : 0.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_SIN:            {               GLfloat a[4], result[4];               fetch_vector1( ctx, &inst->SrcReg[0], machine, program, a );               result[0] = result[1] = result[2] = 		       result[3] = (GLfloat)_mesa_sin(a[0]);               store_vector4( inst, machine, result );            }            break;         case OPCODE_SLE: /* set on less or equal */            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = (a[0] <= b[0]) ? 1.0F : 0.0F;               result[1] = (a[1] <= b[1]) ? 1.0F : 0.0F;               result[2] = (a[2] <= b[2]) ? 1.0F : 0.0F;               result[3] = (a[3] <= b[3]) ? 1.0F : 0.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_SLT: /* set on less */            {               GLfloat a[4], b[4], result[4];               fetch_vector4( ctx, &inst->SrcReg[0], machine, program, a );               fetch_vector4( ctx, &inst->SrcReg[1], machine, program, b );               result[0] = (a[0] < b[0]) ? 1.0F : 0.0F;               result[1] = (a[1] < b[1]) ? 1.0F : 0.0F;               result[2] = (a[2] < b[2]) ? 1.0F : 0.0F;               result[3] = (a[3] < b[3]) ? 1.0F : 0.0F;               store_vector4( inst, machine, result );            }            break;         case OPCODE_SNE: /* set on not equal */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -