2016-04-27 8 views
1

私はファイル記述子によってスクリーンvsyncイベントを捕まえることができると思います。投票| epoll] ing it。GLX Vsyncイベント

私が正しい場合、通常、glXSwapBuffers()私のような何かを行うことができるようにプロセスをブロックしません:VSYNCイベントが起こるとするときだから私は、私は関係なく、すべてのイベントをtrigの可能性ができ

int init() { 
    create epollfd; 
    add Xconnection number to it; 
    add some other fd like socket timer tty etc... 
    possibly add a vsync fd like dri/card0 or fb0 or other??? 
    return epollfd; 
} 

main() { 
    int run = 1; 
    int epollfd = init(); 

    while(run) { 
     epoll_wait(epollfd, ...) { 

     if(trigedfd = socket) { 
      do network computing; 
     } 

     if(trigedfd = timer) { 
      do physics computing; 
     } 

     if(trigedfd = tty) { 
      do electronic communications; 
     } 

     if(trigedfd = Xconnection number) { 
      switch(Xevent) { 
       case key event: 
        do key computing; 
       case mouse event: 
        do mouse computing; 
       case vsync???: 
        do GL computings; 
        glXSwapBuffers(); 
      } 
     } 

     if(trigedfd = dri/card0 or fb0 or other???) { 
      do GL computings; 
      glXSwapBuffers(); 
     } 
    } 
} 

を私がX描画関数だけを使用し、おそらくGLをvsyncに使用する場合、同じ時間の引き裂き効果を避けてください。

libdrmを教えてください。

vsyncイベントをキャッチするためにどのようなfdを使用する必要がありますか、このfdでshureを作成する方法は、発生したイベントはvsyncイベントですか?

+0

私はそれを一口にしたいと思います。 私は接続でき、 "vsyncが起こったときに私を覚えてください"という要求を送るサーバーのように振る舞う分離プロセスを作ることができます。このプロセスはglFinishでブロックし、ソケットやパイプなどで何かを送ることができます。それも避けてください。 –

+0

これはなぜ正確にお望みですか?これは[XY問題]のケース(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)ですか? – davmac

+0

私は自分自身のライブラリ/ apiを作成しています。プロセスのすべてのincommingイベントに対して1つの同期ポイントしか持ちません。 –

答えて

1

vsyncイベントを表示するためにlibdrm APIを使用できるようです。 this blog entry、特にthis example codeを参照してください。コードからのコメントは、それがどのように動作するかを説明します。

/* (...) 
* The DRM_MODE_PAGE_FLIP_EVENT flag tells drmModePageFlip() to send us a 
* page-flip event on the DRM-fd when the page-flip happened. The last argument 
* is a data-pointer that is returned with this event. 
* (...) 
*/ 

あなたはどのあなた(libdrmから)drmHandleEventメソッドによって呼び出されますVsyncが発生したときに通知するページフリップイベントハンドラを設定する必要がありますdrmファイル記述子にアクティビティがあるときに呼び出すことができます。

ただし、これをすべてXクライアントにマッピングすることは困難または不可能かもしれません。 自分でdrmデバイスを開き、vsyncイベントをリッスンするだけで(モードの設定などを試みることなく)、これも不可能になることがありますか。関連コード:

drmEventContext ev; 
memset(&ev, 0, sizeof(ev)); 
ev.version = DRM_EVENT_CONTEXT_VERSION; 
ev.page_flip_handler = modeset_page_flip_event; 

// When file descriptor input is available: 
drmHandleEvent(fd, &ev); 
// If above works, "modeset_page_flip_event" will be called on vertical refresh. 

問題は、あなたが実際にページフリップ(バッファスワップ)要求を発行している場合、ページフリップイベントのみを生成しているように見えるということです。おそらく、そのような要求を発行したのはXサーバだろうが、vsyncが実際に発生したとき(つまり、DRM_MODE_PAGE_FLIP_EVENTフラグを使用して)通知されることを必ずしも要求しているわけでもない。

上記のすべての難しさ/信頼性の欠如/一般unworkabilityを考えると正しいDRIデバイスを開くことの難しさ(/dev/dri/card0または/dev/dri/card1か...?)

もあります、最も簡単な解決策は、おそらくにある:

  1. 標準のGL呼び出しを使用してvsyncを待機するには、別のスレッドを使用します。 this page on the OpenGL wikiによれば、vsyncを有効にするにはglXSwapIntervalEXT(1)を使用し、次に実際に垂直リトレースが発生するようにglXSwapBuffersglFinishを使用する必要があります。
  2. 次に、メインスレッドに垂直帰線が発生したことを通知します。パイプにデータを送信することでこれを行うことができますが、Linuxではeventfdを使用します。

更新

あなたはGLX_INTEL_swap_event extensionを使用することができる場合があります

glXSelectEventのパラメータによって受け入れられ、glXGetSelectedEventのパラメータに返さ:

GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000

返品済み"スワップ完全な" イベントの分野で:

GLX_EXCHANGE_COMPLETE_INTEL 0x8180
GLX_COPY_COMPLETE_INTEL 0x8181
GLX_FLIP_COMPLETE_INTEL 0x8182

...

クライアントは、スワップ完全GLXを受信するように依頼することができますイベントをウィンドウに表示します。 イベントが受信されると、呼び出し側はevent_typeフィールドをチェックすることによってどのようなスワップが発生したのかを判断できます。

これは、拡張機能がサポートされている場合、あなたはX接続ファイル記述子に表示されます、通常のXイベント、経由(VSYNCが有効になっている場合は垂直帰に相当)スワップ通知を受け取ることができる、ということを意味します。

+0

私はすでにこのブログとコードを見て、私はモードセットを起動しようとしました。それは私に "drm device/dev/dri/card0はダムバッファをサポートしていません"と言いました。 私は/ dev/dri/card0しか持っていません。 私はその時点でdrm側でもっと試したことはありませんでしたが、X11拡張機能で可能だったと思っていました... –

+0

@LewisAnesaダムバッファは必要ありません。バッファーをまったくマッピングする必要はありません。イベントを受け取るだけです(ページフリップイベント)。唯一の未解決な問題は、これらのイベントが実際に配信されるかどうかです。 – davmac

+0

はい、作業後にこれらの調査を続けます(フランス時間帯)、おそらくglXSwapIntervalEXT(1)によってv-syncをアクティブにすると、これらのイベントがdriデバイスによって配信されます。 xlibのマニュアルなど、libdrmに関するドキュメントは見たことがありません。 –

関連する問題