まず、ノートPCでデュアルスクリーン(VGAコネクタを接続してデュアルディスプレィ)環境を構築する。
$ xrandr --output VGA --left-of LVDS
次に、pygletで、OpenGLコンテキストの異なる(コンテキストを共有しない)ウィンドウを2つ生成し、それぞれのスクリーンに表示するプログラムを作成し、実行する。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pyglet
class TestWindow(pyglet.window.Window, object):
def __init__(self, screen, **kwargs):
template = pyglet.gl.Config(double_buffer=True, depth_size=24, stencil_size=8)
config = screen.get_best_config(template)
context = config.create_context(None)
pyglet.window.Window.__init__(self, fullscreen=True, context=context, **kwargs)
# pyglet.window.Window.__init__(self, fullscreen=True, **kwargs)
platform = pyglet.window.get_platform()
display = platform.get_default_display()
screens = display.get_screens()
# screen = display.get_default_screen()
window1 = TestWindow(screen=screens[0])
window2 = TestWindow(screen=screens[1])
label1 = pyglet.text.Label('Hello 1', font_name='vlgothic', font_size=55,
x=500, y=500, anchor_x='center', anchor_y='center',
color=(255, 255, 255, 255))
label2 = pyglet.text.Label('Hello 2', font_name='vlgothic', font_size=55,
x=500, y=500, anchor_x='center', anchor_y='center',
color=(255, 0, 0, 255))
@window1.event
def on_draw():
window1.clear()
label1.draw()
@window2.event
def on_draw():
window2.clear()
label2.draw()
pyglet.app.run()
このプログラムをコンソールから実行すると、ノートPC側画面には真っ黒なウィンドウが表示されるが、文字が表示されない。プログラムを終了すると、コンソールに以下の1行メッセージが残されている。
DRM_I830_CMDBUFFER: -22
dmesgを参照すると、関連していると思われるメッセージが残っている。
$ dmesg | tail -n 2 [ 5856.052388] [drm:i915_emit_box] *ERROR* Bad box 1024,0..1024,768 [ 5856.052397] [drm:i915_cmdbuffer] *ERROR* i915_dispatch_cmdbuffer failed
また、glxgearsをノートPC側画面で表示しようとすると、同じメッセージが出て、glxgearsが強制終了する。
Google様で検索すると、Ubuntuのlaunchpadに同メッセージのバグレポートがあった。
僕の使っているノートPCはLet'snote R5で、チップセットはモバイルインテル(R) 945GMS Expressなので、このエラーと原因は同じだと思う。
デュアルスクリーンのままXを再起動すると、時々正常に表示される事がある。いまいち再現性が確立し難い。
既に解決方法は示されている様だし、Statusが"In Progress"になっているので、待っていて良いのかしら。