xf86-video-intel源码分析4 —— intel_options.c和intel_options.h(1)
admin
2024-02-14 10:35:22
0

intel_options.h

intel_options.h位于src目录下,内容为:

#define INTEL_OPTIONS_H#include 
#include 
#include /** Note: "ColorKey" is provided for compatibility with the i810 driver.* However, the correct option name is "VideoKey".  "ColorKey" usually* refers to the tranparency key for 8+24 overlays, not for video overlays.*/enum intel_options {OPTION_ACCEL_ENABLE,OPTION_ACCEL_METHOD,OPTION_BACKLIGHT,OPTION_EDID,OPTION_DRI,OPTION_PRESENT,OPTION_VIDEO_KEY,OPTION_COLOR_KEY,OPTION_TILING_2D,OPTION_TILING_FB,OPTION_ROTATION,OPTION_VSYNC,OPTION_PAGEFLIP,OPTION_SWAPBUFFERS_WAIT,OPTION_TRIPLE_BUFFER,OPTION_PREFER_OVERLAY,OPTION_HOTPLUG,OPTION_REPROBE,
#if defined(XvMCExtension) && defined(ENABLE_XVMC)OPTION_XVMC,
#define INTEL_XVMC 1
#endif
#ifdef USE_SNAOPTION_ZAPHOD,OPTION_VIRTUAL,OPTION_TEAR_FREE,OPTION_CRTC_PIXMAPS,
#endif
#ifdef USE_UXAOPTION_FALLBACKDEBUG,OPTION_DEBUG_FLUSH_BATCHES,OPTION_DEBUG_FLUSH_CACHES,OPTION_DEBUG_WAIT,OPTION_BUFFER_CACHE,
#endifNUM_OPTIONS,
};extern const OptionInfoRec intel_options[];
OptionInfoPtr intel_options_get(ScrnInfoPtr scrn);
unsigned intel_option_cast_to_unsigned(OptionInfoPtr, int id, unsigned val);
Bool intel_option_cast_to_bool(OptionInfoPtr, int id, Bool val);#endif /* INTEL_OPTIONS_H */

intel_options.h中包括了一些枚举值以及函数声明,下边分析intel_options.c时再做详细说明。

同时,根据它包含的头文件(#include )可以看到,它是与xorg-server强相关的。

intel_options.c

intel_options.c同样位于src目录下,内容如下:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif#include 
#include 
#include #include "intel_options.h"const OptionInfoRec intel_options[] = {{OPTION_ACCEL_ENABLE,	"Accel",	OPTV_BOOLEAN,	{0},	0},{OPTION_ACCEL_METHOD,	"AccelMethod",	OPTV_STRING,	{0},	0},{OPTION_BACKLIGHT,	"Backlight",	OPTV_STRING,	{0},	0},{OPTION_EDID,		"CustomEDID",	OPTV_STRING,	{0},	0},{OPTION_DRI,		"DRI",		OPTV_STRING,	{0},	0},{OPTION_PRESENT,	"Present",	OPTV_BOOLEAN,	{0},	1},{OPTION_COLOR_KEY,	"ColorKey",	OPTV_INTEGER,	{0},	0},{OPTION_VIDEO_KEY,	"VideoKey",	OPTV_INTEGER,	{0},	0},{OPTION_TILING_2D,	"Tiling",	OPTV_BOOLEAN,	{0},	1},{OPTION_TILING_FB,	"LinearFramebuffer",	OPTV_BOOLEAN,	{0},	0},{OPTION_ROTATION,	"HWRotation",	OPTV_BOOLEAN,	{0},	1},{OPTION_VSYNC,		"VSync",	OPTV_BOOLEAN,	{0},	1},{OPTION_PAGEFLIP,	"PageFlip",	OPTV_BOOLEAN,	{0},	1},{OPTION_SWAPBUFFERS_WAIT, "SwapbuffersWait", OPTV_BOOLEAN,	{0},	1},{OPTION_TRIPLE_BUFFER,	"TripleBuffer", OPTV_BOOLEAN,	{0},	1},{OPTION_PREFER_OVERLAY, "XvPreferOverlay", OPTV_BOOLEAN, {0}, 0},{OPTION_HOTPLUG,	"HotPlug",	OPTV_BOOLEAN,	{0},	1},{OPTION_REPROBE,	"ReprobeOutputs", OPTV_BOOLEAN,	{0},	0},
#ifdef INTEL_XVMC{OPTION_XVMC,		"XvMC",		OPTV_BOOLEAN,	{0},	1},
#endif
#ifdef USE_SNA{OPTION_ZAPHOD,		"ZaphodHeads",	OPTV_STRING,	{0},	0},{OPTION_VIRTUAL,	"VirtualHeads",	OPTV_INTEGER,	{0},	0},{OPTION_TEAR_FREE,	"TearFree",	OPTV_BOOLEAN,	{0},	0},{OPTION_CRTC_PIXMAPS,	"PerCrtcPixmaps", OPTV_BOOLEAN,	{0},	0},
#endif
#ifdef USE_UXA{OPTION_FALLBACKDEBUG,	"FallbackDebug",OPTV_BOOLEAN,	{0},	0},{OPTION_DEBUG_FLUSH_BATCHES, "DebugFlushBatches", OPTV_BOOLEAN, {0}, 0},{OPTION_DEBUG_FLUSH_CACHES, "DebugFlushCaches", OPTV_BOOLEAN, {0}, 0},{OPTION_DEBUG_WAIT, "DebugWait", OPTV_BOOLEAN, {0}, 0},{OPTION_BUFFER_CACHE,	"BufferCache",	OPTV_BOOLEAN,   {0},    1},
#endif{-1,			NULL,		OPTV_NONE,	{0},	0}
};OptionInfoPtr intel_options_get(ScrnInfoPtr scrn)
{OptionInfoPtr options;xf86CollectOptions(scrn, NULL);if (!(options = malloc(sizeof(intel_options))))return NULL;memcpy(options, intel_options, sizeof(intel_options));xf86ProcessOptions(scrn->scrnIndex, scrn->options, options);return options;
}Bool intel_option_cast_to_bool(OptionInfoPtr options, int id, Bool val)
{
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,901,0)xf86getBoolValue(&val, xf86GetOptValString(options, id));
#endifreturn val;
}static int
namecmp(const char *s1, const char *s2)
{char c1, c2;if (!s1 || *s1 == 0) {if (!s2 || *s2 == 0)return 0;elsereturn 1;}while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')s1++;while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')s2++;c1 = isupper(*s1) ? tolower(*s1) : *s1;c2 = isupper(*s2) ? tolower(*s2) : *s2;while (c1 == c2) {if (c1 == '\0')return 0;s1++;while (*s1 == '_' || *s1 == ' ' || *s1 == '\t')s1++;s2++;while (*s2 == '_' || *s2 == ' ' || *s2 == '\t')s2++;c1 = isupper(*s1) ? tolower(*s1) : *s1;c2 = isupper(*s2) ? tolower(*s2) : *s2;}return c1 - c2;
}unsigned intel_option_cast_to_unsigned(OptionInfoPtr options, int id, unsigned val)
{
#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,901,0)const char *str = xf86GetOptValString(options, id);
#elseconst char *str = NULL;
#endifunsigned v;if (str == NULL || *str == '\0')return val;if (namecmp(str, "on") == 0)return val;if (namecmp(str, "true") == 0)return val;if (namecmp(str, "yes") == 0)return val;if (namecmp(str, "0") == 0)return 0;if (namecmp(str, "off") == 0)return 0;if (namecmp(str, "false") == 0)return 0;if (namecmp(str, "no") == 0)return 0;v = atoi(str);if (v)return v;return val;
}
  • OptionInfoRec结构

OptionInfoRec结构在xf86-video-intel源码路径下是无法搜索到其定义的,也就是说它实际上属于其它包。在/usr/include/下搜索,可以看到其在/usr/include/xorg/xf86Opt.h文件中,如下所示:

$ sudo grep -rn "OptionInfoRec" /usr/include/
/usr/include/xorg/xf86Opt.h:71:} OptionInfoRec, *OptionInfoPtr;
/usr/include/xorg/xf86Opt.h:121:extern _X_EXPORT OptionInfoPtr xf86TokenToOptinfo(const OptionInfoRec * table,
/usr/include/xorg/xf86Opt.h:123:extern _X_EXPORT const char *xf86TokenToOptName(const OptionInfoRec * table,
/usr/include/xorg/xf86Opt.h:125:extern _X_EXPORT Bool xf86IsOptionSet(const OptionInfoRec * table, int token);
/usr/include/xorg/xf86Opt.h:126:extern _X_EXPORT const char *xf86GetOptValString(const OptionInfoRec * table,
/usr/include/xorg/xf86Opt.h:128:extern _X_EXPORT Bool xf86GetOptValInteger(const OptionInfoRec * table,
/usr/include/xorg/xf86Opt.h:130:extern _X_EXPORT Bool xf86GetOptValULong(const OptionInfoRec * table, int token,
/usr/include/xorg/xf86Opt.h:132:extern _X_EXPORT Bool xf86GetOptValReal(const OptionInfoRec * table, int token,
/usr/include/xorg/xf86Opt.h:134:extern _X_EXPORT Bool xf86GetOptValFreq(const OptionInfoRec * table, int token,
/usr/include/xorg/xf86Opt.h:137:extern _X_EXPORT Bool xf86GetOptValBool(const OptionInfoRec * table, int token,
/usr/include/xorg/xf86Opt.h:139:extern _X_EXPORT Bool xf86ReturnOptValBool(const OptionInfoRec * table,
/usr/include/xorg/xf86Crtc.h:971:xf86AssignNoOutputInitialSize(ScrnInfoPtr scrn, const OptionInfoRec *options,
/usr/include/xorg/xf86str.h:223:    const OptionInfoRec *(*AvailableOptions) (int chipid, int bustype);

那么xf86Opt.h这个文件是在哪个包中?上边讲intel_options.h的时候提到了它与xorg-server强相关,那么尝试在xorg-server源码中进行搜索,看看能否找到此文件以及OptionInfoRec结构。

前提是要先把xorg-server的源码下载下来,去哪里下载?

下载地址为:GitHub - freedesktop/xorg-xserver: X server

源码下载后,在其中搜索,结果如下:

$ grep -rn "OptionInfoRec," ./
./hw/xfree86/doc/ddxDesign.xml:2944:      } OptionInfoRec, *OptionInfoPtr;
./hw/xfree86/common/xf86Opt.h:71:} OptionInfoRec, *OptionInfoPtr;

由xf86Opt.h得到OptionInfoRec结构体的定义如下:

typedef struct {int token;const char *name;OptionValueType type;ValueUnion value;Bool found;
} OptionInfoRec, *OptionInfoPtr;

弄清楚了OptionInfoRec结构的定义,翻回头来看常量结构体数组const OptionInfoRec intel_options[],其意义就一目了然了。这里仅以第一项详细说明。

{OPTION_ACCEL_ENABLE,	"Accel",	OPTV_BOOLEAN,	{0},	0},

OPTION_ACCEL_ENABLE是在intel_options.h中定义的,是枚举值0。对应的是OptionInfoRec结构中的int token成员。

"Accel"对应OptionInfoRec结构中的const char *name成员。

OPTV_BOOLEAN的定义同样不在xf86-video-intel源码中,但根据其名字就可以推断出来,是布尔类型。对应OptionInfoRec结构中的OptionValueType type成员。

其余两个成员ValueUnion value和Bool found的值都为0,

相关内容

热门资讯

哈易购APP非法期货交易欺骗投...   哈易购APP宣传可做白银铂金贵金属订购交易,但实际上并没有取得相关交易资质!哈易购APP本质上就...
消息称百度旗下昆仑芯瞄准500... 6 月 29 日消息,据《The Information》昨日援引知情人士消息,百度旗下 AI 芯片...
打造夏日消费新场景 第35届北... 北京商报讯(记者 翟枫瑞)6月29日消息,第35届北京国际燕京啤酒文化节新闻发布会在京举行。本届啤酒...
社保基金持仓数据出炉,一季度增... 最近各大上市公司一季度财报都公开了,咱们国家社保基金的持仓数据也全部曝光。目前社保拿着比亚迪价值44...
36氪首发 | 海思、中兴团队... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,广州宸思通讯科技有限公司(以下简称“宸思科技”)近日完...
两天蒸发47亿市值!一纸税务通... 一纸税务通知书,能让一家百亿龙头两天蒸发47亿市值。 6月22日,北大荒(600598.SH)公告称...
SK海力士将投资1100万亿韩... SK集团会长崔泰源6月29日在韩国“三大重大计划”发布会上宣布,公司将投资1100万亿韩元扩大半导体...
两只A股,终止上市! 两家A股公司,即将摘牌。 6月29日,退市沪科(600608.SH)公告称,上海证券交易所将在202...
原创 M... 一家成立近十年的自动驾驶公司,在IPO时吸引了14家基石投资者认购近一半的发行股份,其中不乏奔驰、比...
基金忠言|国寿安保滤镜碎,三年... 图片来源:视觉中国 蓝鲸新闻6月29日讯(记者 祁和忠)保险系基金公司国寿安保总经理换人了。 6月2...
三星电机计划加码玻璃基板!相关... 6月29日,玻璃基板概念股午后有所回升, 华工科技(000988.SZ)逼近涨停, 彩虹股份(600...
拉萨海关持续壮大外贸经营主体 ...   新华网拉萨6月28日电(记者蒋梦辰)近日,记者从拉萨海关获悉,今年前5个月,西藏有进出口实绩的外...
机构:二季报临近,医药生物板块... 6月29日,华源证券发布了一篇医药生物行业的研究报告,报告指出,业绩期临近,产业链景气度有望再次迎来...
每日收评科创50放量涨超4.5... 财联社6月29日讯,三大指数全线收红,创业板指探底回升,科创50指数大涨4.61%。沪深两市成交额3...
6月多地土拍结构性升温:深圳单... 进入2026年6月,不少城市核心区地块集中诞生高溢价宗地,热度突出的城市包含深圳、杭州、长沙。 其中...
业绩炸裂!盛达资源半年预盈3.... 6月29日,贵金属矿山龙头盛达资源(000603.SZ)发布 2026 年半年度业绩预告,上半年业绩...
A股午后拉升三大股指收涨:半导... A股三大股指6月29日开盘涨跌互现。早盘沪强深弱,创指一度跌超2%。半导体午后拉升,带动两市上涨,沪...
原创 空... 前言 大家好,我是老金。 这几天,两幅极度割裂的画面放在一起,把我看笑了。 一边是在持续的热浪下,欧...
澳大利亚审慎监管局拟放宽银行风... 澳大利亚审慎监管局(APRA)6月29日就修改 银行信用风险资本设定公开征求意见,旨在加大信贷投放以...