ユーザ用ツール

サイト用ツール


opengl:glesemulator

Desktop 向け OpenGL ES 2.0 / OpenGL ES 3.0 / OpenGL ES 3.1 (AEP) 実行環境

互換性のチェックや動作確認目的で OpenGL ES 2.0 / 3.0 / 3.1 の実行環境を集めています。まとめてみました。

WebGL や NativeClient (NaCl) など、GPU/OS を問わず OpenGL ES 2.0 が 3D API の標準になりつつあります。 そのため Desktop 上でも OpenGL ES 2.0 を必要とするケースが増えています。

  1. モバイル向けアプリ開発のための GPU エミュレーション。あくまで開発ツールとして
  2. Desktop 上で ES 2.0 アプリケーションを走らせるため。

以前の OpenGL ES 2.0 Emulator は GPU のハードウエア Emulation が目的であり 1. のためでしたが、今後は 2. の用途も増えて来ると考えられます。 WebGL のために開発された ANGLE もそのひとつです。

なお OpenGL は下位互換性があるため、 OpenGL ES と OpenGL との差は少なく両方で動作するアプリケーションを書くことは難しくありません。 これらの lib に依存しなくてもアプリケーション側で API 差を吸収することも可能です。

また Linux などの Unix 系環境の場合は、 Mesa 3D により比較的簡単に OpenGL ES 2.0/3.0 API を利用することができるようです。

サイト 名称 用途 Type API win osx linux lib 圧縮tex
OpenGL 4.5以降 OpenGL ES 3.1 Compatibility Application Native ES3.1 (AEP) 32/64 32/64 無し ETC2(EAC)/ASTC
OpenGL 4.3以降 OpenGL ES 3.0 Compatibility Application Native ES3 32/64 32/64 無し ETC2(EAC)/S3TC(DXT)
Qualcomm Developer Network Adreno SDK GPU Emu API Tr EGL+ES3 (ES3.1) 32/64 64 32/64 libEGL, libGLESv2 ETC2(EAC)/ATITC
ARM Mali Developer Center OpenGL ES Emulator GPU Emu API Tr EGL+ES3 32/64 32/64 libEGL, libGLESv2 ETC2(EAC)/ASTC
Imagination PowerVR Insider PVRVFrame GPU Emu API Tr EGL+ES3 (ES3.1) 32/64 64 32/64 libEGL, libGLESv2 ETC2/EAC)/PVRTC2
Mesa 3D Graphics Library Mesa 3D Application Na/Sw EGL+ES3 32/64 libEGL, libGLESv2 ETC2(EAC)/S3TC(DXT)
サイト 名称 用途 Type API win osx linux lib 圧縮tex
OpenGL 4.1以降 OpenGL ES 2.0 Compatibility Application Native ES2 32/64 64 32/64 無し S3TC(DXT)
Qualcomm Developer Network Adreno SDK GPU Emu API Tr EGL+ES2 32/64 64 32/64 libEGL, libGLESv2 ATITC/ETC1
ARM Mali Developer Center OpenGL ES Emulator GPU Emu API Tr EGL+ES2 32/64 ? 32/64 libEGL, libGLESv2 ETC1
Imagination PowerVR Insider PVRVFrame GPU Emu API Tr EGL+ES2 32/64 64 32/64 libEGL, libGLESv2 PVRTC/ETC1
NVIDIA Developer Zone x86 Windows OpenGL ES 2.0 Emulator GPU Emu API Tr EGL+ES2 32 libGLES20 S3TC(DXT)
Google angleproject ANGLE Project Application API Tr EGL+ES2 32/64 libEGL, libGLESv2 S3TC(DXT)
AMD Developer Central RADEON OpenGL ES 2.0 API Application Native EGL+ES2 32/64 ? ? libEGL, libGLESv2 無し
Mesa 3D Graphics Library Mesa 3D Application Na/Sw EGL+ES2 32/64 libEGL, libGLESv2 S3TC(DXT)

GPU Emulation

対象の GPU 機能を再現することが目的です。 そのため対象ハード相当の機能が再現されており、PVRTC や ATITC など固有の専用テクスチャも読み込める点が特徴です。 例えば ASTC 対応 GPU がなかった時代でも Emulator 上では ASTC を使用することができました。

逆に GPU に無い機能は disable されているため、他の OpenGL ES 環境よりも使える機能に制限がかかることがあります。 プロファイラなどの様々なツールとセットで提供されていることも多く、GPU 向けの SDK の一部となっています。

HOST PC 側のビデオカード (GPU) の影響を受けるため、必ずしもどの環境でも安定して動作するとは限りません。 GPU の種類だけでなくドライバのバージョンによって相性問題が生じるので、安定動作を望むならある程度の試行錯誤が必要です。 すべての Emulator が安定して動く環境を探すのは意外に困難です。

開発用なので、アプリケーションにそのまま組み込んで利用することはできません。

Adreno, PowerVR, Mali

それぞれ付属の libEGL.dll, libGLESv2.dll を使用します。 import lib がセットとなっているため、link するだけで OpenGL ES の API が使えるようになります。 ヘッダ類は専用のものが付属していますが、khronos からダウンロードできる最新の OpenGL ES ヘッダで十分使い物になります。

OpenGL ES 3.1 への対応も徐々に行われています。 専用 Context を作らずに ComputeShader が利用できるものもあるので、使い方はそれぞれのライブラリに依存します。 まだドキュメントが揃っていないので、直接サンプルを探したほうが早いかもしれません。

Tegra

Tegra だけ lib 名が異なり関数の呼び出し規約も異なっています。 そのため汎用の GLES2/gl2.h などのヘッダを使えず、必ず付属のヘッダを使う必要があります。 (具体的には khrplatform.h が違う) dll は 1 つだけですが EGL も含まれています。 なぜか GLSL ES Version 1.1 を返す問題あり。

Tegra 2/3/4 は OpenGL ES 3.0 をサポートしないこともあり、更新が止まっているようです。 次の Tegra K1 は OpenGL 4.4 をサポートすると言われており、Emulation する必要がなくなりました。

OpenGL の GL ES Compatibility

  • GL_ARB_ES2_compatibility
  • GL_ARB_ES3_compatibility
  • GL_ARB_ES3_1_compatibility

OpenGL 4.x には OpenGL ES 互換モードが搭載されています。以下各 GPU の対応状況。 (いずれも D3D11 世代の GPU のみ)

GPU OpenGL API ES2 Compatibility ES3 Compatibility ES3_1 Compatibility ES3_1 AEP GPU
GeForce OpenGL 4.5 Y (Context) Y (Context) Y (Context) Y GeForce 400~ Fermi, Kepler, Maxwell 等
RADEON OpenGL 4.5 Y Y Y N RADEON HD 5000~
Intel HD Graphics OpenGL 4.0~4.3 Y (Context) Y (Context) Y (Context) N Intel HD Graphics 2500/4000 ~
  • Context = EXT_create_context_es2_profile 等

EGL ではなく WGL や GLX 等の Native API を使いますがそれ以外の API は共通です。 安定して動くので、Mobile との共通アプリケーションを走らせる場合に有効です。

OpenGL 4.5 以上の ES31 Compatibility (GL_ARB_ES3_1_compatibility)

OpenGL 4.5 以上では OpenGL ES 3.1 の互換性が保たれています。

// Windows
static const int  opengl_es31[]= {
  WGL_CONTEXT_MAJOR_VERSION_ARB,   3,
  WGL_CONTEXT_MINOR_VERSION_ARB,   1,
  WGL_CONTEXT_FLAGS_ARB,           0,
  WGL_CONTEXT_PROFILE_MASK_ARB,    WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
  0,
};
HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es31 );
// X11
static const int  opengl_es31[]= {
  GLX_CONTEXT_MAJOR_VERSION_ARB,   3,
  GLX_CONTEXT_MINOR_VERSION_ARB,   1,
  GLX_CONTEXT_FLAGS_ARB,           0,
  GLX_CONTEXT_PROFILE_MASK_ARB,    GLX_CONTEXT_ES2_PROFILE_BIT_EXT,
  None,
};
GLXContext context= glXCreateContextAttribsARB( display, config, 0, True, opengl_es31 );

厳密にはこの手順が必要なのは EXT_create_context_es2_profile が有効な場合だけです。

// Windows
const char* extension_string= wglGetExtensionsStringARB( hDC );
if( strstr( extension_string, "WGL_EXT_create_context_es2_profile" ) != NULL ){}
// X11
const char* extension_string= glXQueryExtensionsString( display, screen );
if( strstr( extension_string, "GLX_EXT_create_context_es2_profile" ) != NULL ){}
GL_VERSION: OpenGL ES 3.1 NVIDIA 346.22
GL_RENDERER: GeForce GTX 650/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10
  • 2015/02 GeForce では必ずしも上記のように VERSION 3.1 を指定する必要がないようです。Android 同様に ES 2.0 Context を作っても ES 3.1 Context を返します。OpenGL 4.5 以上であれば Linux でも OpenGL ES 3.1 を使用できます。
    • また GeForce の場合は Android の Tegra K1 同様に、OpenGL ES 3.1 AEP (GL_ANDROID_extension_pack_es31a) に対応しています。
  • 2015/06 Intel HD Graphics (Ivy Bridge/BayTrail 世代以上) でも新しいドライバでは ES 3.1 Context の生成が可能です。

OpenGL 4.3 以上の ES3 Compatibility (GL_ARB_ES3_compatibility)

OpenGL 4.3 以上では OpenGL ES 3.0 と互換性があります。 また Intel HD Graphics 4000 も OpenGL 4.0 ながら GL_ARB_ES3_compatibility 対応となっており、Desktop GPU の D3D11 世代ではすべての GPU で OpenGL ES 3.0 も使用できることになります。

具体的な使用方法は OpenGL ES 2.0 の ES2 Compatibility と同じです。

static const int  opengl_es30[]= {
  WGL_CONTEXT_MAJOR_VERSION_ARB,   3,
  WGL_CONTEXT_MINOR_VERSION_ARB,   0,
  WGL_CONTEXT_FLAGS_ARB,           0,
  WGL_CONTEXT_PROFILE_MASK_ARB,    WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
  0,
};
HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es30 );
GL_VERSION: OpenGL ES 3.0 305.53
GL_RENDERER: GeForce GTX 560 Ti/PCIe/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.00

OpenGL 4.1 以上の ES2 Compatibility (GL_ARB_ES2_compatibility)

OpenGL 4.1 では OpenGL ES 2.0 相当の API を利用することができます。 基本的には OpenGL 4.x の Context のままで、 ES2 互換の API 追加やシンボル定義により差を吸収しています。

関数のエントリさえ準備できればあとは Khronos の汎用 GLES2/gl2.h ヘッダでコンパイルできます。 gl.h 以外の API を取り出すための手順は、Windows 上の通常の GL 命令や Extension と扱いは変わりません。

EGL ではないので、 EGL による機能制限を受けることがない代わりに プラットフォームごとに異なるコードが必要となります Windows なら WGL 、X11 なら glX 等。

RADEON

WGL_EXT_create_context_es2_profile が無いので、通常の OpenGL として context を作成します。 この場合 Core Profile Context ではなく Compatibility Profile Context を指定しておく必要があります。

シェーダーは #version 100 を受け入れるので、この場合 GLSL ES とみなします。 ただし driver が define symbol GL_ES を定義しないので、もし利用しているならばコンパイル時に自分で定義しておく必要があります。

GeForce / Intel HD Graphics

WGL_EXT_create_context_es2_profile なので、自分で context を作り直す必要があります。 具体的には version 2.0 で WGL_CONTEXT_ES2_POROFILE_BIT_EXT を指定します。

static const int  opengl_es20[]= {
  WGL_CONTEXT_MAJOR_VERSION_ARB,   2,
  WGL_CONTEXT_MINOR_VERSION_ARB,   0,
  WGL_CONTEXT_FLAGS_ARB,           0,
  WGL_CONTEXT_PROFILE_MASK_ARB,    WGL_CONTEXT_ES2_PROFILE_BIT_EXT,
  0,
};
HGLRC hglrc= wglCreateContextAttribsARB( hDC, 0, opengl_es20 );

これで context を作りなおすと下記のように OpenGL ES 2.0 になります。

GL_VERSION: OpenGL ES 2.0 280.26
GL_RENDERER: GeForce GTX 460/PCI/SSE2
GL_VENDOR: NVIDIA Corporation
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00

define symbol GL_ES が定義されているので、RADEON の方法よりも互換性が高いといえるでしょう。

Angle Project

Windows の Direct3D 9/11 上に OpenGL ES 2.0 を実装したライブラリです。 OpenGL のドライバがなくても動作できることが特徴となります。

例えば 旧 Atom の Z シリーズ (GMA500~ PowerVR SGX 搭載) には OpenGL のドライバがありませんでした。 Angle Project のライブラリを用いることで、OpenGL ES 2.0 用プログラムを実行できるようになります。 (VAIO type P , Windows 7 x86 で確認)

使い方は前述の GPU Emulator と全く同じで、libEGL や libGLESv2 を使うだけです。 lib 名や呼び出し規約が同一なので、他の GPU Emulator と入れ替えて使用できます。

注意: build 時に copy される d3dcompiler_46.dll も必要です。eglInitialize() が失敗する場合は d3dcompiler_46.dll が存在していない可能性があります。

build 手順 (VisualStudio 2010~)

  1. git でソースを clone
  2. projects/src/angle.sln を開く
  3. build

そのままだと D3D9 ベースの 32bit 版が作られます。 64bit ライブラリを build するには下記の手順が必要です。(2014/04/18 VisualStudio 2013 で確認)

  1. Configuration Manager で platform に x64 を追加する。(win32 を元にして新規に作る)
  2. libEGL / libGLESv2 の Property を開く
  3. x64 の Linker → General → Additional Library Directories を開く
  4. path を「~/Lib/win8/um/x86」から「~/Lib/win8/um/x64」に変更

Direct3D 11 を有効にするにはソース内の define を変更します。

  • src/libGLESv2/renderer/Renderer.cpp 内の ANGLE_ENABLE_D3D11 を 1 にする。

この場合 HOST PC が D3D11 対応の場合は D3D11 を利用し、対応していない場合は D3D9 が用いられます。

↓Direct3D 9 で走らせた場合

GL_VERSION: OpenGL ES 2.0 (ANGLE 1.3.d70707b435ef)
GL_RENDERER: ANGLE (NVIDIA GeForce GTX 650 Direct3D9Ex vs_3_0 ps_3_0)
GL_VENDOR: Google Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 (ANGLE 1.3.d70707b435ef)

↓Direct3D 11 の場合

GL_VERSION: OpenGL ES 2.0 (ANGLE 1.3.d70707b435ef)
GL_RENDERER: ANGLE (NVIDIA GeForce GTX 650 Direct3D11 vs_5_0 ps_5_0)
GL_VENDOR: Google Inc.
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 1.00 (ANGLE 1.3.d70707b435ef)

Direct3D 11 で動作可能になったことで、現在 OpenGL ES 3.0 への対応も進められているようです。

Mesa 3D

Ubuntu の場合の install 方法

$ sudo apt-get install libgl1-mesa-dev libgles2-mesa-dev mesa-utils-extra

OpenGL ES 2.0 / 3.0 API を利用できます。 ES 3.0 が使えるかどうかは HOST GPU/CPU、OS 環境によって異なります。 対応しているバージョンを調べるには、mesa-utils-extra に含まれている es2_info コマンドを使います。 ただし llvmpipe はソフトウエアレンダラ。

// Ubuntu 14.04 : VMware Player
EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenVG 
GL_VERSION: OpenGL ES 2.0 Mesa 10.1.0
GL_RENDERER: Gallium 0.4 on SVGA3D; build: RELEASE;

// Ubuntu 14.04 : RADEON HD 6750M
EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3 
GL_VERSION: OpenGL ES 3.0 Mesa 10.1.0
GL_RENDERER: Gallium 0.4 on llvmpipe (LLVM 3.4, 256 bits)

// Ubuntu 14.04 : Intel HD 4000
EGL_CLIENT_APIS: OpenGL OpenGL_ES OpenGL_ES2 OpenGL_ES3 
GL_VERSION: OpenGL ES 3.0 Mesa 10.1.0
GL_RENDERER: Mesa DRI Intel(R) Ivybridge Mobile 
GL_EXTENSIONS:

es2_info コマンドは Nexus 7 (2012) 上の Ubuntu 13.04 desktop など、ARM ベースの Linux 上でも使えます。

ライブラリは libEGL / libGLESv2 をリンクします。

FLB_LIBFLAGS= -lm -lEGL -lGLESv2 -lX11

RADEON OpenGL ES 2.0 API

RADEON のドライバに含まれる Native OpenGL ES 2.0 API です。 初期の頃は 64bit でも動く物が少なく貴重な API でした。 OpenGL ES 4.1 で ES Compatibility が登場したため、今となっては EGL が使えること以外は出番がないと思います。

opengl/glesemulator.txt · 最終更新: 2015/06/24 16:18 by oga