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
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结构在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,