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非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...