星期四, 7月 06, 2006

X protocol - begin

X Windows 由Server經由socket 聽取 client 的 request,在螢幕上繪圖。
X Server除了負責螢幕的繪圖動作,同時還負責mouse, keyboard的輸入,將這些輸入動作經由socket利用event傳給 client。

X Sever太大了,所以拿nanaX 的code來看。配合 "X Windows System Protocol"

srvmain.c 的 GsSelect( ) 中的GsHandleClient( ) 負責從stream中讀取command,parse and execute.

GsHandleClient 中 的nxReq 就是Request : ref protocol "Request Format"
typedef  struct {
BYTE8 reqType; // opcode
BYTE8 hilength;
UINT16 length;
} nxReq;
reqType : opcode , 128 ~255 reserved for extension.
extension 的定義不在X protocl 的core protocol定義中。

hilength - length 合併成一個24 bit的data,代表request packet的length (這個跟X protocol 講的好像不一樣,X protocol用一個16 bit的欄位代表,單位是4 bytes)。

ref /usr/X11R6/include/X11/Xproto.h 有類似的宣告:
typedef struct _xReq {
CARD8 reqType;
CARD8 data;
CARD16 length B16;
} xReq;
接下來 Xproto.h 就宣告"Request codes",定義了1~127 的Code Name (Operation)。

這127個 operation 就是X Server提供的core protocol (?),可以對照pdf sect.9 的內容,解釋每個operation的動作和argument。

從這裡可以看到XServer提供的功能都是很基本的 。
--- 從Wiki上查到。X protocol 能一直維持 128個,不被增加的原因是X Server的設計理念: "如果不是 非他不可, 否則不用把他加進來"。



效能瓶頸大概有兩部份:
  1. Client/Server架構,decode/decode和透過socket傳輸,比較花時間。
  2. X Server本身提供的command很少。沒有辦法利用到hardware加速功能。
command的部份,大概就是靠extension 來補足(就是 request 中 Type > 128 的地方?)。

Client/Server架構就....不知道要怎麼解決了...

沒有留言:

張貼留言