laclefblog logo

Sun, 03 Aug 2008

DRM_I830_CMDBUFFER: -22

まず、ノート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"になっているので、待っていて良いのかしら。