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,

相关内容

热门资讯

一季度增长12.2%后,王莉定... 来源:茅台时空 据茅台官微报道,茅台酱香系列酒一季度交出营业收入78.8亿元、同比增长12.2%的成...
曦智科技沈亦晨:将与上海国资联... 曦智科技创始人、董事长沈亦晨 图片来源:主办方供图 5月10日,上海曦智科技创始人、董事长沈亦晨出现...
东实环境“还贷式IPO”困境:... 图源:图虫创意 来源|时代商业研究院 作者|特约研究员赖钧洪、郑琳 编辑|郑琳 作为东莞市国资委10...
为什么是宁波?扛起中国五金出口... 中国作为全球最大的五金制品生产国和出口国,正以绿色转型、品牌出海为方向,在全球五金供应链中占据核心地...
微信:关于开展涉税虚假宣传信息... 近期,平台接到用户投诉举报,发现个别账户发布“纳税15万,国家补贴5万”“4月恢复核定征收”等涉税虚...
央视调查:AI“买家秀”误导消... IT之家 5 月 10 日消息,据央视新闻今日报道,在网购场景中,由于消费者无法直接接触商品,所以评...
(机遇香港)“温情经济”升温 ... 中新社香港5月10日电 (记者 邱兆翔)5月10日是母亲节。在香港,不少子女与父母一早出门饮茶庆祝,...
原创 3... 5月8日,彭博社一段视频访谈把华尔街炸了。有"新债王"之称的双线资本创始人冈拉克,公开承认自己已经在...
网点关停潮?一半全国性银行机构... 营业网点是商业银行经营的最小细胞,也是直接触达客户、创造价值的核心战场,其竞争力直接关系到银行经营效...
粮农组织:战火阴影下4月全球食... 来源:财联社 联合国粮农组织(FAO)周五指出,由于中东局势紧张及霍尔木兹海峡反复被封,全球粮食价格...
原创 帮... 老铁们,帮主又来了。今天聊个事儿,保证让你觉得,原来国家战略离你的钱包可以这么近!四部门刚发了个文,...
吸引全球资本,亚洲新一轮“超级... 投资者正将目光转向亚洲,寻找全球股市上涨行情的下一个突破口。 在人工智能浪潮驱动下,韩国股市本月涨幅...
越秀区多维经营账服务细致入微的... 越秀区多维经营账服务细致入微的代理机构参考 在广州越秀区这一商贸活跃的核心区域,中小企业对财税服务...
教人挣钱的自媒体平台叫什么 教人挣钱的自媒体平台叫什么?这问题问得太到位了。说实话,我也曾经翻遍全网、踩过无数坑,就为了找一个真...
湖人被无情戏耍又是三节崩 里夫... 与雷霆的半决赛打到第三场,一种无望的情绪已彻底裹挟了湖人全队,彻底无法被摆脱了。 所有人都清楚,湖人...
原创 欧... 据环球网综合报道,欧盟正处于前所未有的抉择压力之下。在俄乌冲突延续近四年的沉重阴影下,欧盟内部关于援...
原创 1... 雷达财经出品 文|丁禹 编|孟帅 五一假期刚刚结束,市值百亿的川酒上市公司水井坊,其核心管理层再次迎...
美银Hartnett:材料板块... 美银证券首席投资策略师Michael Hartnett在最新报告中点名材料板块,称其将是下一个“牛市...
情绪消费的好日子,还剩多久 文|强调Next 2025年是中国潮玩行业最热闹的一年,也是从业者最难熬的一年。 热闹是真的热闹。...