「 2014年07月 」一覧

フルスペックOpenGLとGLES 3.0 とで比較してみた

EGL使ったものと通常のGLX(OpenGL)とで性能差を感じたので、実験してみたいと思います。
JetsonTK1でEGL使用した場合には、OpenGLES 3.0のコンテキストが使用されます。通常の初期化をGLX経由でした場合には OpenGL 4.4のコンテキストとなります。

これらで同じようにパフォーマンス有利に働くように、頂点バッファ(バッファオブジェクト)、頂点配列オブジェクト(VAO)らを用いて、トーラスを描画するプログラムを作成してみました。
これで平均のフレームレートを計測してみようと思います。

OpenGL 4.4 (GLX) の場合

GL_VERSION = 4.4.0 NVIDIA 19.3
GL_RENDERER = GK20A/AXI
36075 frames in 30.0 seconds = 1202.478 FPS
30672 frames in 30.0 seconds = 1022.298 FPS
31040 frames in 30.0 seconds = 1034.529 FPS
30626 frames in 30.0 seconds = 1020.849 FPS
31759 frames in 30.0 seconds = 1058.631 FPS

OpenGLES 3.0 (EGL) の場合

R:8, G:8, B:8, A:8, Depth:24
GL_VERSION = OpenGL ES 3.0 19.3
GL_RENDERER = GK20A/AXI
7293 frames in 30.0 seconds = 243.029 FPS
5748 frames in 30.0 seconds = 191.589 FPS
5741 frames in 30.0 seconds = 191.364 FPS
6332 frames in 30.0 seconds = 211.061 FPS
5015 frames in 30.0 seconds = 167.141 FPS
6324 frames in 30.0 seconds = 210.780 FPS
5463 frames in 30.0 seconds = 182.089 FPS

まとめ

通常GLのほうが、およそ5倍のFPSとなっていました。
あまりCPUで処理をしていないので、描画系に何か違いがありそうです。
EGLのほうではダブルバッファのフラグが見当たらなかったこともあって、設定など特にしていませんがこれが影響しているかも。
 またフレームレートが安定しないボードだったので、可変フレームレートで描画するようにしてみました。見かけの速度が一定となると、多少変動したところで見栄えが悪くなることはないのできれいに見えます。処理が遅くて安定しない環境では、可変フレームレートで描画するようなプログラムもいいなと感じました。

ubuntu-screenshot-torus


Jetson TK1でGLXでOpenGLを使ってみる

前回はEGLで組んでみましたが、折角普通のLinux,OpenGLが使えるボードということで、X11とGLXで前回同様のアプリケーションを作成してみようと思います。

NVIDIAでLinux OpenGL といえば、関数エントリが共有ライブラリに準備されていることで有名です。この組み込み用ではどうであるか確認してみます。

$ nm -Do /usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1

## 一部抜粋  ###

/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:00067478 T glActiveStencilFaceEXT
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0005ec80 T glActiveTexture
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:00064688 T glActiveTextureARB
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006b58c T glActiveVaryingNV
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0005d82c T glAlphaFunc
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006ed38 T glAlphaFuncx
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:000656d4 T glAreProgramsResidentNV
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0005e4d8 T glAreTexturesResident
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:00064568 T glAreTexturesResidentEXT
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0005e19c T glArrayElement
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006440c T glArrayElementEXT
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006aa24 T glAttachObjectARB
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:000603f8 T glAttachShader
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0005b800 T glBegin
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:00061498 T glBeginConditionalRender
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006b154 T glBeginConditionalRenderNV
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:0006b10c T glBeginConditionalRenderNVX
/usr/lib/arm-linux-gnueabihf/tegra/libGL.so.1:00066d08 T glBeginOcclusionQueryNV

今回のボードでも前例通り各関数の実体が含まれるようです。
そこで、GLヘッダを読み込む前に、 GL_GLEXT_PROTOTYPES (1) を定義して extern宣言させた状態にしておきます。

早速プログラムを示します。

このプログラムを実行してみたのがこんな感じです。
Ubuntu-screenshot-glx

GL_RENDERER: GK20A/AXI
GL_VENDOR: NVIDIA Corporation
GL_VERSION: 4.4.0 NVIDIA 19.3
FPS: 1294.80
FPS: 1151.00
FPS: 1046.20
FPS: 1073.00
FPS: 1049.40
FPS: 1051.40
FPS: 987.60
FPS: 995.60
FPS: 1008.20
FPS: 1582.60

平均するとおよそ1000ちょいのFPSといったところでしょうか。前回のEGLに比べると多少パフォーマンスがよい傾向にありそうです。
VSyncをオフにしてみようと思ったのですが、 glXSwapIntervalEXT がこの環境では使用できず試してみることは出来ませんでした。コンテキストは予想通り最新の 4.4 が取得されました。

プログラムコードがglVertexAttribPointerでクライアント配列を渡している部分があったり、毎描画フレームで無駄な処理をしているところが多いので、もしかするとCPU側でバラツキの要因を持っているのかもしれません。


Jetson TK1 で EGLを使ってみる

検索でライブラリは見つかるものの標準パスの位置にlibEGLやlibGLESv2らの共有オブジェクトがなかったので、下記のようにしてシンボリックリンクを張ってみました。

cd /usr/lib/arm-linux-gnueabihf
sudo ln -s tegra-egl/libEGL.so.1  libEGL.so
sudo ln -s tegra-egl/libGLESv2.so.2 libGLESv2.so

標準では EGLやGLES2のヘッダがないために、Khronos OpenGL ES Registry からダウンロードしてきます。ダウンロードしたファイルらはとりあえずプログラムと同じ場所にディレクトリ構成があうようにして配置しました。
使用したプログラムはこのようなものです。

これを動かすと、こんな感じになります。
Ubuntu-screenshot-egl

GL_RENDERER: GK20A/AXI
GL_VENDOR: NVIDIA Corporation
GL_VERSION: OpenGL ES 3.0 19.3
EGL_VENDOR : NVIDIA
EGL_VERSION: 1.4
EGL_CLIENT_APIS : OpenGL_ES OpenGL
FPS: 262.60
FPS: 177.60
FPS: 155.40
FPS: 167.00
FPS: 169.40
FPS: 257.00
FPS: 269.20
FPS: 177.00

このバージョンでは既にOpenGL ES 3.0 のコンテキストとなっているようです。
GLESv2のライブラリをリンクして、プログラム中では ES 2.0 を指定しているつもりでしたが、ちょっと奇妙な状態です。


Jetson TK1 GL関連を確認中

glxgearsを動かしてみたいので、mesa-utilsをインストールしました。

約 2200FPS程度で glxgearsは動きました。
このときの情報を infoオプション付きで動かしたところ、各値は以下のようになっていました。

GL_EXTENSIONS については、以前の記事で出していたので割愛。この結果を見ると通常の OpenGL で 4.4バージョンのコンテキストで動いているようです。

libGL.soを検索してみるとこのシステムの中には複数存在しているようです。

そこでglxgearsはどのようなライブラリを使っているのか確認してみました。

どうやら tegraディレクトリ以下のライブラリを参照して、mesaディレクトリ以下は見ていないようです(たぶん。


Jetson TK1で地デジ録画

Raspberry Piで地デジ録画をやってみた事例はあるので、ではJetson TK1でやってみるか!と思って試してみました。基本的にはARMですし、プリインストールのOSがUbuntuベースであるのでそこまで難易度が高いわけではありません。

必要になるのが地デジチューナーです。ここではUSB接続の KTV-FSUSB2を使用しました。数年前に購入して、改造を施して押し入れに眠っていた物です。この改造についてはここでは触れません。
このドライバのソースをGitHubよりダウンロードしていきます。それとパッチもまた適用しておきます。
これらの手順についてこれから説明します。

ドライバの構築

GitHub(https://github.com/sh0/recfsusb2n)からダウンロードしてきました。
パッチについては、こちら(適当な何かの別館 recfsusb2n tsspliteer_lite内蔵・httpサーバー機能追加・recpt1ctl対応パッチ)。

ダウンロードしたらこれらをターゲット上へコピーしておきます。

$ unzip recfsusb2n-master.zip
$ mv recfsusb2n-master recfsusb2n
$ mkdir patch
$ unzip recfsusb2n_http_patch2.zip -d patch
$ cd patch
$ cp Makefile ../recfsusb2n/src/
$ cp *.h ../recfsusb2n/src/
$ cp *.cpp ../recfsusb2n/src/

Makefileを開いて、boost_thread-mtの箇所を書き換える。
そして、#LIBSの行を有効化して、元々のLIBS行をコメントアウトします。

LIBS   = -lpthread -lboost_system -lboost_thread -lboost_filesystem
#LIBS = -lpthread -lboost_thread -lboost_filesystem

boostライブラリを取得してきます。

$ sudo apt-get install libboost-thread-dev libboost-filesystem-dev

ビルドします

$ cd recfsusb2n/src
$ make

パーミッションルールの追加を行います

$ sudo gedit /lib/udev/rules.d/89-tuner.rules

ウィンドウが開いたら、以下のように中身を記述します。見やすいように改行を入れていますが、1行で書いてしまって下さい。

設定をリロードさせた後、念のため再起動します。ここではパワーオフまでです。

$ sudo udevadm control --reload-rules
$ sudo poweroff

KTV-FSUSB2を取り付けて、電源を入れます。
起動したらターミナルから認識しているかどうかを確認してみます。
以下のようになったら認識できていると思います。

適当に録画してみる

$ cd recfsusb2n/src
$ ./recfsusb2n -bv 27 30 test.ts

このtsファイルをWindows7側などに持ってきて、再生できるか確認してみます。
うまく動作していれば、そのままテレビ映像が表示されます

リアルタイム視聴してみる -NGでしたが-

VLCをインストールします。

$ sudo apt-get install vlc

インストール後、下記のようにコマンドを打ち込んでテレビ映像が表示されるか確認します。

$ ./recfsusb2n --b25 27 - - | vlc -

しかしながら、自分の環境では初期フレームは何か表示されるものの視聴できませんでした。

今回はパッチ当てて内蔵HTTPサーバー機能というものを取り込んでいるので、これで確認してみたいと思います。

$ ./recfsusb2n --b25 -v --http 8888

vlcを起動して、 http://localhost:8888/27/ を開いてしばらく待つと、ようやく再生が始まりました。
ただ非常に重く、CPUで全部デコード処理をやっているかのようです。
HWアクセラレータがデフォルトではOFF状態だったので、これらをONにしてみましたが変化せず。
ファイルキャッシュとして 300 だったものを10倍にしてみたところ多少はマシになったように思いますが視聴には耐えない感じ

$ sudo apt-get install vainfo
$ vainfo

結果を確認してみると、DRIのドライバがないようでハードウェアアクセラレートが効かない模様。
だからリアルタイム視聴がうまくいかなかったのだと思います。

まとめ

現時点でのドライバの都合もあるので、録画そのものは出来るけど視聴はこのボードでは難しいようです。
消費電力を売りにして、録画だけ行うサーバーにするのはアリのようです。当初は、うまくいったらCUDAを使ってエフェクトをリアルタイムで適用しつつ録画を再生するなんてことを考えていましたが、現時点ではそれは夢となってしまいました。
 また、ちゃんとした録画サーバーにするにはFoltiaだとか、epgrecだとかのシステムを入れる必要があると思いますが、それらについては未検証です。動くとは思いますが…。
折角のTegra K1搭載のボードなので、もうしばらくはグラフィックス寄りのプログラムを書いていじってみたいと思います。よって録画関連のテストはここまで!


Jetson TK1のOpenGL Extensionリスト

NVIDIA GTC Japan 2014 に参加してきました。そしてJETSON TK1を触ることが出来たので、Tegra K1 の OpenGL Extension リストを取得してみました。噂通り標準のOpenGLサポートしていることがうかがえます。たくさんの拡張名が出てきました。
ついでに、NVIDIA拡張も色々と入っているようで…。

GL_AMD_multi_draw_indirect
GL_AMD_seamless_cubemap_per_texture
GL_ARB_arrays_of_arrays
GL_ARB_base_instance
GL_ARB_bindless_texture
GL_ARB_blend_func_extended
GL_ARB_buffer_storage
GL_ARB_clear_buffer_object
GL_ARB_clear_texture
GL_ARB_color_buffer_float
GL_ARB_compatibility
GL_ARB_compressed_texture_pixel_storage
GL_ARB_conservative_depth
GL_ARB_compute_shader
GL_ARB_compute_variable_group_size
GL_ARB_copy_buffer
GL_ARB_copy_image
GL_ARB_debug_output
GL_ARB_depth_buffer_float
GL_ARB_depth_clamp
GL_ARB_depth_texture
GL_ARB_draw_buffers
GL_ARB_draw_buffers_blend
GL_ARB_draw_indirect
GL_ARB_draw_elements_base_vertex
GL_ARB_draw_instanced
GL_ARB_enhanced_layouts
GL_ARB_ES2_compatibility
GL_ARB_ES3_compatibility
GL_ARB_explicit_attrib_location
GL_ARB_explicit_uniform_location
GL_ARB_fragment_coord_conventions
GL_ARB_fragment_layer_viewport
GL_ARB_fragment_program
GL_ARB_fragment_program_shadow
GL_ARB_fragment_shader
GL_ARB_framebuffer_no_attachments
GL_ARB_framebuffer_object
GL_ARB_framebuffer_sRGB
GL_ARB_geometry_shader4
GL_ARB_get_program_binary
GL_ARB_gpu_shader5
GL_ARB_gpu_shader_fp64
GL_ARB_half_float_pixel
GL_ARB_half_float_vertex
GL_ARB_imaging
GL_ARB_indirect_parameters
GL_ARB_instanced_arrays
GL_ARB_internalformat_query
GL_ARB_internalformat_query2
GL_ARB_invalidate_subdata
GL_ARB_map_buffer_alignment
GL_ARB_map_buffer_range
GL_ARB_multi_bind
GL_ARB_multi_draw_indirect
GL_ARB_multisample
GL_ARB_multitexture
GL_ARB_occlusion_query
GL_ARB_occlusion_query2
GL_ARB_pixel_buffer_object
GL_ARB_point_parameters
GL_ARB_point_sprite
GL_ARB_program_interface_query
GL_ARB_provoking_vertex
GL_ARB_robust_buffer_access_behavior
GL_ARB_robustness
GL_ARB_sample_shading
GL_ARB_sampler_objects
GL_ARB_seamless_cube_map
GL_ARB_seamless_cubemap_per_texture
GL_ARB_separate_shader_objects
GL_ARB_shader_atomic_counters
GL_ARB_shader_bit_encoding
GL_ARB_shader_draw_parameters
GL_ARB_shader_group_vote
GL_ARB_shader_image_load_store
GL_ARB_shader_image_size
GL_ARB_shader_objects
GL_ARB_shader_precision
GL_ARB_query_buffer_object
GL_ARB_shader_storage_buffer_object
GL_ARB_shader_subroutine
GL_ARB_shader_texture_lod
GL_ARB_shading_language_100
GL_ARB_shading_language_420pack
GL_ARB_shading_language_include
GL_ARB_shading_language_packing
GL_ARB_shadow
GL_ARB_stencil_texturing
GL_ARB_sync
GL_ARB_tessellation_shader
GL_ARB_texture_border_clamp
GL_ARB_texture_buffer_object
GL_ARB_texture_buffer_object_rgb32
GL_ARB_texture_buffer_range
GL_ARB_texture_compression
GL_ARB_texture_compression_bptc
GL_ARB_texture_compression_rgtc
GL_ARB_texture_cube_map
GL_ARB_texture_cube_map_array
GL_ARB_texture_env_add
GL_ARB_texture_env_combine
GL_ARB_texture_env_crossbar
GL_ARB_texture_env_dot3
GL_ARB_texture_float
GL_ARB_texture_gather
GL_ARB_texture_mirror_clamp_to_edge
GL_ARB_texture_mirrored_repeat
GL_ARB_texture_multisample
GL_ARB_texture_non_power_of_two
GL_ARB_texture_query_levels
GL_ARB_texture_query_lod
GL_ARB_texture_rectangle
GL_ARB_texture_rg
GL_ARB_texture_rgb10_a2ui
GL_ARB_texture_stencil8
GL_ARB_texture_storage
GL_ARB_texture_storage_multisample
GL_ARB_texture_swizzle
GL_ARB_texture_view
GL_ARB_timer_query
GL_ARB_transform_feedback2
GL_ARB_transform_feedback3
GL_ARB_transform_feedback_instanced
GL_ARB_transpose_matrix
GL_ARB_uniform_buffer_object
GL_ARB_vertex_array_bgra
GL_ARB_vertex_array_object
GL_ARB_vertex_attrib_64bit
GL_ARB_vertex_attrib_binding
GL_ARB_vertex_buffer_object
GL_ARB_vertex_program
GL_ARB_vertex_shader
GL_ARB_vertex_type_10f_11f_11f_rev
GL_ARB_vertex_type_2_10_10_10_rev
GL_ARB_viewport_array
GL_ARB_window_pos
GL_ATI_draw_buffers
GL_ATI_texture_float
GL_ATI_texture_mirror_once
GL_S3_s3tc
GL_EXT_texture_env_add
GL_EXT_abgr
GL_EXT_bgra
GL_EXT_bindable_uniform
GL_EXT_blend_color
GL_EXT_blend_equation_separate
GL_EXT_blend_func_separate
GL_EXT_blend_minmax
GL_EXT_blend_subtract
GL_EXT_compiled_vertex_array
GL_EXT_Cg_shader
GL_EXT_depth_bounds_test
GL_EXT_direct_state_access
GL_EXT_draw_buffers2
GL_EXT_draw_instanced
GL_EXT_draw_range_elements
GL_EXT_fog_coord
GL_EXT_framebuffer_blit
GL_EXT_framebuffer_multisample
GL_EXTX_framebuffer_mixed_formats
GL_EXT_framebuffer_multisample_blit_scaled
GL_EXT_framebuffer_object
GL_EXT_framebuffer_sRGB
GL_EXT_geometry_shader4
GL_EXT_gpu_program_parameters
GL_EXT_gpu_shader4
GL_EXT_multi_draw_arrays
GL_EXT_packed_depth_stencil
GL_EXT_packed_float
GL_EXT_packed_pixels
GL_EXT_pixel_buffer_object
GL_EXT_point_parameters
GL_EXT_provoking_vertex
GL_EXT_rescale_normal
GL_EXT_secondary_color
GL_EXT_separate_shader_objects
GL_EXT_separate_specular_color
GL_EXT_shader_image_load_store
GL_EXT_shader_integer_mix
GL_EXT_shadow_funcs
GL_EXT_stencil_two_side
GL_EXT_stencil_wrap
GL_EXT_texture3D
GL_EXT_texture_array
GL_EXT_texture_buffer_object
GL_EXT_texture_compression_dxt1
GL_EXT_texture_compression_latc
GL_EXT_texture_compression_rgtc
GL_EXT_texture_compression_s3tc
GL_EXT_texture_cube_map
GL_EXT_texture_edge_clamp
GL_EXT_texture_env_combine
GL_EXT_texture_env_dot3
GL_EXT_texture_filter_anisotropic
GL_EXT_texture_integer
GL_EXT_texture_lod
GL_EXT_texture_lod_bias
GL_EXT_texture_mirror_clamp
GL_EXT_texture_object
GL_EXT_texture_shared_exponent
GL_EXT_texture_sRGB
GL_EXT_texture_sRGB_decode
GL_EXT_texture_storage
GL_EXT_texture_swizzle
GL_EXT_timer_query
GL_EXT_transform_feedback2
GL_EXT_vertex_array
GL_EXT_vertex_array_bgra
GL_EXT_vertex_attrib_64bit
GL_EXT_x11_sync_object
GL_EXT_import_sync_object
GL_IBM_rasterpos_clip
GL_IBM_texture_mirrored_repeat
GL_KHR_debug
GL_KHR_texture_compression_astc_ldr
GL_KTX_buffer_region
GL_NV_bindless_multi_draw_indirect
GL_NV_bindless_texture
GL_NV_blend_equation_advanced
GL_NV_blend_equation_advanced_coherent
GL_NV_blend_square
GL_NV_compute_program5
GL_NV_conditional_render
GL_NV_copy_depth_to_color
GL_NV_copy_image
GL_NV_depth_buffer_float
GL_NV_depth_clamp
GL_NV_draw_texture
GL_NV_ES1_1_compatibility
GL_NV_explicit_multisample
GL_NV_fence
GL_NV_float_buffer
GL_NV_fog_distance
GL_NV_fragment_program
GL_NV_fragment_program_option
GL_NV_fragment_program2
GL_NV_framebuffer_multisample_coverage
GL_NV_geometry_shader4
GL_NV_gpu_program4
GL_NV_gpu_program4_1
GL_NV_gpu_program5
GL_NV_gpu_program5_mem_extended
GL_NV_gpu_program_fp64
GL_NV_gpu_shader5
GL_NV_half_float
GL_NV_light_max_exponent
GL_NV_multisample_coverage
GL_NV_multisample_filter_hint
GL_NV_occlusion_query
GL_NV_packed_depth_stencil
GL_NV_parameter_buffer_object
GL_NV_parameter_buffer_object2
GL_NV_path_rendering
GL_NV_pixel_data_range
GL_NV_point_sprite
GL_NV_primitive_restart
GL_NV_register_combiners
GL_NV_register_combiners2
GL_NV_shader_atomic_counters
GL_NV_shader_atomic_float
GL_NV_shader_buffer_load
GL_NV_shader_storage_buffer_object
GL_NV_texgen_reflection
GL_NV_texture_barrier
GL_NV_texture_compression_vtc
GL_NV_texture_env_combine4
GL_NV_texture_expand_normal
GL_NV_texture_multisample
GL_NV_texture_rectangle
GL_NV_texture_shader
GL_NV_texture_shader2
GL_NV_texture_shader3
GL_NV_transform_feedback
GL_NV_transform_feedback2
GL_NV_vdpau_interop
GL_NV_vertex_array_range
GL_NV_vertex_array_range2
GL_NV_vertex_attrib_integer_64bit
GL_NV_vertex_buffer_unified_memory
GL_NV_vertex_program
GL_NV_vertex_program1_1
GL_NV_vertex_program2
GL_NV_vertex_program2_option
GL_NV_vertex_program3
GL_NVX_conditional_render
GL_NVX_nvenc_interop
GL_NVX_shader_thread_group
GL_NVX_shader_thread_shuffle
GL_SGIS_generate_mipmap
GL_SGIS_texture_lod
GL_SGIX_depth_texture
GL_SGIX_shadow
GL_SUN_slice_accum

標準のOpenGLが動くためか、EGLのライブラリは v2 までのものしか含まれていない様子。
スペック上は GLES 3.0 サポートだったような気がしますが、これはまぁフルスペックの GL 4.4 内の GL_ARB_ES3_compatibility があるからこちらで対応よろしくってことでしょうか。


ARMのプログラムを作成してデバッグする 第1回+

前回の仮想ターゲット作成で1つ問題になった点がありました。それがネットワークです。
一応ifconfigではIPも付与されているし通信できそうに感じましたが、ホストとゲストでpingが通りませんでした。
ついでに複数ゲストを用意してみましたが、これもダメでした。

調べて色々と実験した結果、次のことがわかりました。
「そもそも QEMU のユーザーモードネットワークと呼ばれる物がデフォルトで、これは http は FW(NAT) を追加するけど、icmpを通過させないようだ。だからpingで疎通を確認するには使えないと言うことがわかった。」

また、OpenVPNを導入するとインストールされるTAP Win32を利用することで一応ゲストとの通信が出来ることもわかりました。
このときには 起動パラメータに -net nic -net tap,TAP32 を足すことで、LAN内のDHCPからアドレスをもらってネットワークで通信することができるようになりました。この場合はWindowsに指定してあるTAPアダプタと実LANをブリッジすることも必要です。
アダプタを1つゲストに渡すってイメージでしょうか。

ということでようやく癖もわかったところで、本来の環境の準備を再開できそうです。


ARMのプログラムを作成してデバッグする 第1回

手軽にやるためにWindowsの環境でなんとかやってみたいと思います。
ターゲット環境はQEMUを用いて ARM Linux を動かすことで対処したいと思います。
開発環境は出来ればWindowsでやりたいですが、Linuxのほうが楽らしいのでまずはUbuntuでARM用のクロスコンパイルを実現させます.

使用している環境は、Windows 7Pro SP1とUbuntu 14.04(amd64)です。
今回の記事では、動作環境の準備をの方を整えていきます。

UbuntuでARM用のイメージを準備する

まずはARM Linuxを起動させるために、Ubuntu上で作業します.
自分の環境では手軽にVMware内にUbuntuを準備して作業しました。
そのUbuntuの準備が出来たら、下記のように端末から入力して linaro のツールをインストールしてしまいます。

sudo apt-get update
sudo apt-get install linaro-image-tools

起動用のイメージは下記のサイトでおいてあるので利用します。

http://releases.linaro.org/platform/linaro-n/nano/final/

実行してyキーを押した後は放置します。作業が完了すると以下のようなメッセージが出ていると思います。

途中でエラーが出てしまいますが、ファイルさえ出来れば気にしないでおきます。
できあがったイメージを適当な場所にマウントして、必要となるファイルを取り出します。
パーミッションの都合で一部rootで作業します.

取り出したらこの2つのファイルをWindows側にコピーします。
そして、vexpress.img もWindows側へコピーします。

qemuで起動してみる

QEMUをインストールしたフォルダを、コマンドプロンプトで開きます。
そして次のようなコマンドで起動させます。

起動過程はこんな感じで表示されます。

qemu-arm

起動後には eth0 が認識されているようです。
しかしこの仮想環境の中から外部ネットワークへ出ることは出来なかったです。
(QEMU設定の問題かも・・・)

qemu-arm-2

まとめ

とりあえずはイメージの起動まではできたところで一区切りとしておきます。
この環境に繋いでデバッグを行うことやプログラムイメージを作成する点については、また次回以降に。

余談

今更感ですが、Ubuntuで ia32-libs はすでに deprecated 状態のようです。
そろそろ32bit終わりの感じですね。

参考

http://blog.kmckk.com/archives/4349088.html
https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Virtual_ARM_Linux_environment


XInputの注意事項

最近になってゲームパッドのコーナーを見てみると、純正XBOX 360パッド以外でもたくさんの XINPUTの対応パッドが並んでいることに気付きました。これはXINPUT無視できないなーと感じました。また多くのパッドが DirectInput との切り替えスイッチを持っていて、両対応できるようになっていました。
 これはアプリケーション側も両対応しておいたほうが何かと都合良さそうな感じです。

ひとつ注意事項があります。
VisualStudio 2012など使っていると DirectXSDKが統合されたこともあり、XInputのインクルードやライブラリのリンクについてちょちょいとやってしまえるのですが、ここに罠があります。
 VisualStudio 2012 では標準の対象 OS が Windows8 であることを想定しているため、XInput も Windows8のものをリンクするようになっています(XInput.lib指定時)。これを回避して、Windows7やWindows8で動くようにするためには、リンクするライブラリを “Xinput9_1_0.lib” に変更します。これで Windows7の環境でも動作させることが出来るようになります。ただ古いバージョンになるため使用できるAPIに制限が出来てしまいますので、注意が必要です。

参考: XInput Versions(MSDN)