Android Emulator on macOS で OpenGL ES 3.0 を使いたい
ANGLE か Host GL のどっちかなら行けると思うんだけどな〜
結論: 灯台元暗し
https://scrapbox.io/files/6282ebc037fee7001d666bef.mp4
OpenGL ES 2.0 にリミットされている環境では ANDROID_EMU_gles_max_version_2 extension が付与される
これはどこから来るかというと
libOpenglRender の RenderControl.cpp にある maxVersionToFeatureString から来ており
それは同ファイルの rcGetGLString で呼ばれている
ここでは guestExtVer が
GLESDynamicVersion がオンなら maxVersion
オフなら GLES 2.0 になるようになっている
maxVersion は FrameBuffer::getMaxGLESVersion らしい
getMaxGLESVersion は sMaxGLESVersion を返すだけ
それを設定するのは FrameBuffer::setMaxGLESVersion
それを呼ぶのは FrameBuffer::initialize
設定される値は calcMaxVersionFromDispatch(fb->m_eglDisplay)
calcMaxVersionFromDispatch は GLESVersionDetector.cpp にある
レンダラーが host か swiftshader_indirect か angle_indirect か angle9_indirect なら
s_egl.eglGetMaxGLESVersion(dpy) を呼ぶ
そうでなかったら
sTryContextCreation(dpy, GLES_DISPATCH_MAX_VERSION_3_1) が成功したら GLES 3.1
失敗したら
sTryContextCreation(dpy, GLES_DISPATCH_MAX_VERSION_3_0) が成功したら GLES 3.0
失敗したら GLES 2.0
playStore image だったら最大バージョンを GLES 3.0 にする (最初は最小かと思った)
現実的には eglGetMaxGLESVersion なので eglGetMaxGLESVersion は何をするかと言うと
(EGLint)dpy->getMaxGlesVersion()
EglOsApi_darwin.cpp に飛んで
code:cpp
virtual EglOS::GlesVersion getMaxGlesVersion() {
switch (sSupportInfo->maxOpenGLProfile) {
case MAC_OPENGL_PROFILE_LEGACY:
return EglOS::GlesVersion::ES2;
case MAC_OPENGL_PROFILE_3_2:
case MAC_OPENGL_PROFILE_4_1:
return EglOS::GlesVersion::ES30;
default:
return EglOS::GlesVersion::ES2;
}
}
になるはずだが‥?
適当に判定コードをコピってくる
code:check-glver.m
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
static const NSOpenGLPixelFormatAttribute core32TestProfile[] = {
NSOpenGLPFAAccelerated,
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize ,32,
NSOpenGLPFADepthSize ,24,
NSOpenGLPFAStencilSize ,8,
0
};
static const NSOpenGLPixelFormatAttribute core41TestProfile[] = {
NSOpenGLPFAAccelerated,
NSOpenGLPFANoRecovery,
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize ,32,
NSOpenGLPFADepthSize ,24,
NSOpenGLPFAStencilSize ,8,
0
};
int setupCoreProfileNativeFormats() {
NSOpenGLPixelFormat* core41Supported =
if (core41Supported) {
return (int)401;
}
NSOpenGLPixelFormat* core32Supported =
if (core32Supported) {
return (int)302;
}
return (int)1;
}
int main() {
printf("supported=%d\n", setupCoreProfileNativeFormats());
return 0;
}
$ clang check-glver.m -framework Cocoa
$ ./a.out
supported=401
はて………
なんか GLESDynamicVersion が有効になってないセンを追うのがいい気がしてきた (勘)
~/.android/advancedFeatures.ini には書いてあるんだけどな〜
set/glesApiLevelPreference (GLESAPILEVEL_PREFERENCE) によって上書きされる?