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

📄 slang_assemble_typeinfo.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
					slang_assembly_typeinfo_destruct (&_ti);
					return GL_FALSE;
				}
				ti->spec.type = _slang_type_base (_ti.spec.type);
			}
			slang_assembly_typeinfo_destruct (&_ti);
		}
		break;
	case slang_oper_call:
		{
			GLboolean exists;

			if (!_slang_typeof_function (op->a_id, op->children, op->num_children, space, &ti->spec,
					&exists, atoms))
				return GL_FALSE;
			if (!exists)
			{
				slang_struct *s = slang_struct_scope_find (space->structs, op->a_id, GL_TRUE);
				if (s != NULL)
				{
					ti->spec.type = slang_spec_struct;
					ti->spec._struct = (slang_struct *) slang_alloc_malloc (sizeof (slang_struct));
					if (ti->spec._struct == NULL)
						return GL_FALSE;
					if (!slang_struct_construct (ti->spec._struct))
					{
						slang_alloc_free (ti->spec._struct);
						ti->spec._struct = NULL;
						return GL_FALSE;
					}
					if (!slang_struct_copy (ti->spec._struct, s))
						return GL_FALSE;
				}
				else
				{
					const char *name;
					slang_type_specifier_type type;

					name = slang_atom_pool_id (atoms, op->a_id);
					type = slang_type_specifier_type_from_string (name);
					if (type == slang_spec_void)
						return GL_FALSE;
					ti->spec.type = type;
				}
			}
		}
		break;
	case slang_oper_field:
		{
			slang_assembly_typeinfo _ti;

			if (!slang_assembly_typeinfo_construct (&_ti))
				return GL_FALSE;
			if (!_slang_typeof_operation_ (op->children, space, &_ti, atoms))
			{
				slang_assembly_typeinfo_destruct (&_ti);
				return GL_FALSE;
			}
			if (_ti.spec.type == slang_spec_struct)
			{
				slang_variable *field;
				
				field = _slang_locate_variable (_ti.spec._struct->fields, op->a_id, GL_FALSE);
				if (field == NULL)
				{
					slang_assembly_typeinfo_destruct (&_ti);
					return GL_FALSE;
				}
				if (!slang_type_specifier_copy (&ti->spec, &field->type.specifier))
				{
					slang_assembly_typeinfo_destruct (&_ti);
					return GL_FALSE;
				}
				ti->can_be_referenced = _ti.can_be_referenced;
			}
			else
			{
				GLuint rows;
				const char *swizzle;
				slang_type_specifier_type base;

				/* determine the swizzle of the field expression */
				if (!_slang_type_is_vector (_ti.spec.type))
				{
					slang_assembly_typeinfo_destruct (&_ti);
					return GL_FALSE;
				}
				rows = _slang_type_dim (_ti.spec.type);
				swizzle = slang_atom_pool_id (atoms, op->a_id);
				if (!_slang_is_swizzle (swizzle, rows, &ti->swz))
				{
					slang_assembly_typeinfo_destruct (&_ti);
					return GL_FALSE;
				}
				ti->is_swizzled = GL_TRUE;
				ti->can_be_referenced = _ti.can_be_referenced && _slang_is_swizzle_mask (&ti->swz,
					rows);
				if (_ti.is_swizzled)
				{
					slang_swizzle swz;

					/* swizzle the swizzle */
					_slang_multiply_swizzles (&swz, &_ti.swz, &ti->swz);
					ti->swz = swz;
				}
				base = _slang_type_base (_ti.spec.type);
				switch (ti->swz.num_components)
				{
				case 1:
					ti->spec.type = base;
					break;
				case 2:
					switch (base)
					{
					case slang_spec_float:
						ti->spec.type = slang_spec_vec2;
						break;
					case slang_spec_int:
						ti->spec.type = slang_spec_ivec2;
						break;
					case slang_spec_bool:
						ti->spec.type = slang_spec_bvec2;
						break;
					default:
						break;
					}
					break;
				case 3:
					switch (base)
					{
					case slang_spec_float:
						ti->spec.type = slang_spec_vec3;
						break;
					case slang_spec_int:
						ti->spec.type = slang_spec_ivec3;
						break;
					case slang_spec_bool:
						ti->spec.type = slang_spec_bvec3;
						break;
					default:
						break;
					}
					break;
				case 4:
					switch (base)
					{
					case slang_spec_float:
						ti->spec.type = slang_spec_vec4;
						break;
					case slang_spec_int:
						ti->spec.type = slang_spec_ivec4;
						break;
					case slang_spec_bool:
						ti->spec.type = slang_spec_bvec4;
						break;
					default:
						break;
					}
					break;
				default:
					break;
				}
			}
			slang_assembly_typeinfo_destruct (&_ti);
		}
		break;
	case slang_oper_postincrement:
	case slang_oper_postdecrement:
		if (!_slang_typeof_operation_ (op->children, space, ti, atoms))
			return GL_FALSE;
		ti->can_be_referenced = GL_FALSE;
		ti->is_swizzled = GL_FALSE;
		break;
	default:
		return GL_FALSE;
	}

	return GL_TRUE;
}

/* _slang_typeof_function() */

GLboolean _slang_typeof_function (slang_atom a_name, slang_operation *params, GLuint num_params,
	slang_assembly_name_space *space, slang_type_specifier *spec, GLboolean *exists,
	slang_atom_pool *atoms)
{
	slang_function *fun;
	
	fun = _slang_locate_function (space->funcs, a_name, params, num_params, space, atoms);
	*exists = fun != NULL;
	if (fun == NULL)
		return GL_TRUE;
	return slang_type_specifier_copy (spec, &fun->header.type.specifier);
}

/* _slang_type_is_matrix() */

GLboolean _slang_type_is_matrix (slang_type_specifier_type ty)
{
	switch (ty)
	{
	case slang_spec_mat2:
	case slang_spec_mat3:
	case slang_spec_mat4:
		return GL_TRUE;
	default:
		return GL_FALSE;
	}
}

/* _slang_type_is_vector() */

GLboolean _slang_type_is_vector (slang_type_specifier_type ty)
{
	switch (ty)
	{
	case slang_spec_vec2:
	case slang_spec_vec3:
	case slang_spec_vec4:
	case slang_spec_ivec2:
	case slang_spec_ivec3:
	case slang_spec_ivec4:
	case slang_spec_bvec2:
	case slang_spec_bvec3:
	case slang_spec_bvec4:
		return GL_TRUE;
	default:
		return GL_FALSE;
	}
}

/* _slang_type_base_of_vector() */

slang_type_specifier_type _slang_type_base (slang_type_specifier_type ty)
{
	switch (ty)
	{
	case slang_spec_float:
	case slang_spec_vec2:
	case slang_spec_vec3:
	case slang_spec_vec4:
		return slang_spec_float;
	case slang_spec_int:
	case slang_spec_ivec2:
	case slang_spec_ivec3:
	case slang_spec_ivec4:
		return slang_spec_int;
	case slang_spec_bool:
	case slang_spec_bvec2:
	case slang_spec_bvec3:
	case slang_spec_bvec4:
		return slang_spec_bool;
	case slang_spec_mat2:
		return slang_spec_vec2;
	case slang_spec_mat3:
		return slang_spec_vec3;
	case slang_spec_mat4:
		return slang_spec_vec4;
	default:
		return slang_spec_void;
	}
}

/* _slang_type_dim */

GLuint _slang_type_dim (slang_type_specifier_type ty)
{
	switch (ty)
	{
	case slang_spec_float:
	case slang_spec_int:
	case slang_spec_bool:
		return 1;
	case slang_spec_vec2:
	case slang_spec_ivec2:
	case slang_spec_bvec2:
	case slang_spec_mat2:
		return 2;
	case slang_spec_vec3:
	case slang_spec_ivec3:
	case slang_spec_bvec3:
	case slang_spec_mat3:
		return 3;
	case slang_spec_vec4:
	case slang_spec_ivec4:
	case slang_spec_bvec4:
	case slang_spec_mat4:
		return 4;
	default:
		return 0;
	}
}

⌨️ 快捷键说明

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