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

📄 slang_simplify.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
      case SLANG_OPER_LOGICALXOR:         for (i = 0; i < 4; i++) {            const GLint a = oper->children[0].literal[i] ? 1 : 0;            const GLint b = oper->children[1].literal[i] ? 1 : 0;            oper->literal[i] = (GLfloat) (a ^ b);         }         oper->literal_size = oper->children[0].literal_size;         slang_operation_destruct(oper);         oper->type = SLANG_OPER_LITERAL_BOOL;         return;      default:         ; /* nothing */      }   }   if (oper->num_children == 4       && isFloat[0] && isFloat[1] && isFloat[2] && isFloat[3]) {      /* vec4(flt, flt, flt, flt) constructor */      if (oper->type == SLANG_OPER_CALL) {         if (strcmp((char *) oper->a_id, "vec4") == 0) {            oper->literal[0] = oper->children[0].literal[0];            oper->literal[1] = oper->children[1].literal[0];            oper->literal[2] = oper->children[2].literal[0];            oper->literal[3] = oper->children[3].literal[0];            oper->literal_size = 4;            slang_operation_destruct(oper);            oper->type = SLANG_OPER_LITERAL_FLOAT;            return;         }      }   }   if (oper->num_children == 3 && isFloat[0] && isFloat[1] && isFloat[2]) {      /* vec3(flt, flt, flt) constructor */      if (oper->type == SLANG_OPER_CALL) {         if (strcmp((char *) oper->a_id, "vec3") == 0) {            oper->literal[0] = oper->children[0].literal[0];            oper->literal[1] = oper->children[1].literal[0];            oper->literal[2] = oper->children[2].literal[0];            oper->literal[3] = oper->literal[2];            oper->literal_size = 3;            slang_operation_destruct(oper);            oper->type = SLANG_OPER_LITERAL_FLOAT;            return;         }      }   }   if (oper->num_children == 2 && isFloat[0] && isFloat[1]) {      /* vec2(flt, flt) constructor */      if (oper->type == SLANG_OPER_CALL) {         if (strcmp((char *) oper->a_id, "vec2") == 0) {            oper->literal[0] = oper->children[0].literal[0];            oper->literal[1] = oper->children[1].literal[0];            oper->literal[2] = oper->literal[1];            oper->literal[3] = oper->literal[1];            oper->literal_size = 2;            slang_operation_destruct(oper); /* XXX oper->locals goes NULL! */            oper->type = SLANG_OPER_LITERAL_FLOAT;            assert(oper->num_children == 0);            return;         }      }   }   if (oper->num_children == 1 && isFloat[0]) {      /* vec2/3/4(flt, flt) constructor */      if (oper->type == SLANG_OPER_CALL) {         const char *func = (const char *) oper->a_id;         if (strncmp(func, "vec", 3) == 0 && func[3] >= '2' && func[3] <= '4') {            oper->literal[0] =            oper->literal[1] =            oper->literal[2] =            oper->literal[3] = oper->children[0].literal[0];            oper->literal_size = func[3] - '0';            assert(oper->literal_size >= 2);            assert(oper->literal_size <= 4);            slang_operation_destruct(oper); /* XXX oper->locals goes NULL! */            oper->type = SLANG_OPER_LITERAL_FLOAT;            assert(oper->num_children == 0);            return;         }      }   }}/** * Insert casts to try to adapt actual parameters to formal parameters for a * function call when an exact match for the parameter types is not found. * Example: *   void foo(int i, bool b) {} *   x = foo(3.15, 9); * Gets translated into: *   x = foo(int(3.15), bool(9)) */GLboolean_slang_cast_func_params(slang_operation *callOper, const slang_function *fun,                        const slang_name_space * space,                        slang_atom_pool * atoms, slang_info_log *log){   const GLboolean haveRetValue = _slang_function_has_return_value(fun);   const int numParams = fun->param_count - haveRetValue;   int i;   int dbg = 0;   if (dbg)      printf("Adapt call of %d args to func %s (%d params)\n",             callOper->num_children, (char*) fun->header.a_name, numParams);   for (i = 0; i < numParams; i++) {      slang_typeinfo argType;      slang_variable *paramVar = fun->parameters->variables[i];      /* Get type of arg[i] */      if (!slang_typeinfo_construct(&argType))         return GL_FALSE;      if (!_slang_typeof_operation_(&callOper->children[i], space,                                    &argType, atoms, log)) {         slang_typeinfo_destruct(&argType);         return GL_FALSE;      }      /* see if arg type matches parameter type */      if (!slang_type_specifier_equal(&argType.spec,                                      &paramVar->type.specifier)) {         /* need to adapt arg type to match param type */         const char *constructorName =            slang_type_specifier_type_to_string(paramVar->type.specifier.type);         slang_operation *child = slang_operation_new(1);         if (dbg)            printf("Need to adapt types of arg %d\n", i);         slang_operation_copy(child, &callOper->children[i]);         child->locals->outer_scope = callOper->children[i].locals;#if 0         if (_slang_sizeof_type_specifier(&argType.spec) >             _slang_sizeof_type_specifier(&paramVar->type.specifier)) {         }#endif         callOper->children[i].type = SLANG_OPER_CALL;         callOper->children[i].a_id = slang_atom_pool_atom(atoms, constructorName);         callOper->children[i].num_children = 1;         callOper->children[i].children = child;      }      slang_typeinfo_destruct(&argType);   }   if (dbg) {      printf("===== New call to %s with cast arguments ===============\n",             (char*) fun->header.a_name);      slang_print_tree(callOper, 5);   }   return GL_TRUE;}/** * Adapt the arguments for a function call to match the parameters of * the given function. * This is for: * 1. converting/casting argument types to match parameters * 2. breaking up vector/matrix types into individual components to *    satisfy constructors. */GLboolean_slang_adapt_call(slang_operation *callOper, const slang_function *fun,                  const slang_name_space * space,                  slang_atom_pool * atoms, slang_info_log *log){   const GLboolean haveRetValue = _slang_function_has_return_value(fun);   const int numParams = fun->param_count - haveRetValue;   int i;   int dbg = 0;   if (dbg)      printf("Adapt %d args to %d parameters for %s\n",             callOper->num_children, numParams, (char *) fun->header.a_name);   /* Only try adapting for constructors */   if (fun->kind != SLANG_FUNC_CONSTRUCTOR)      return GL_FALSE;   if (callOper->num_children != numParams) {      /* number of arguments doesn't match number of parameters */      /* For constructor calls, we can try to unroll vector/matrix args       * into individual floats/ints and try to match the function params.       */      for (i = 0; i < numParams; i++) {         slang_typeinfo argType;         GLint argSz, j;         /* Get type of arg[i] */         if (!slang_typeinfo_construct(&argType))            return GL_FALSE;         if (!_slang_typeof_operation_(&callOper->children[i], space,                                       &argType, atoms, log)) {            slang_typeinfo_destruct(&argType);            return GL_FALSE;         }         /*           paramSz = _slang_sizeof_type_specifier(&paramVar->type.specifier);           assert(paramSz == 1);         */         argSz = _slang_sizeof_type_specifier(&argType.spec);         if (argSz > 1) {            slang_operation origArg;            /* break up arg[i] into components */            if (dbg)               printf("Break up arg %d from 1 to %d elements\n", i, argSz);            slang_operation_construct(&origArg);            slang_operation_copy(&origArg, &callOper->children[i]);            /* insert argSz-1 new children/args */            for (j = 0; j < argSz - 1; j++) {               (void) slang_operation_insert(&callOper->num_children,                                             &callOper->children, i);            }            /* replace arg[i+j] with subscript/index oper */            for (j = 0; j < argSz; j++) {               callOper->children[i + j].type = SLANG_OPER_SUBSCRIPT;               callOper->children[i + j].locals = _slang_variable_scope_new(callOper->locals);               callOper->children[i + j].num_children = 2;               callOper->children[i + j].children = slang_operation_new(2);               slang_operation_copy(&callOper->children[i + j].children[0],                                    &origArg);               callOper->children[i + j].children[1].type                  = SLANG_OPER_LITERAL_INT;               callOper->children[i + j].children[1].literal[0] = (GLfloat) j;            }         }      }   }   if (callOper->num_children < (GLuint) numParams) {      /* still not enough args for all params */      return GL_FALSE;   }   else if (callOper->num_children > (GLuint) numParams) {      /* now too many arguments */      /* just truncate */      callOper->num_children = (GLuint) numParams;   }   if (dbg) {      printf("===== New call to %s with adapted arguments ===============\n",             (char*) fun->header.a_name);      slang_print_tree(callOper, 5);   }   return GL_TRUE;}

⌨️ 快捷键说明

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