| 19 |
19 |
|
| 20 |
20 |
package org.distorted.main;
|
| 21 |
21 |
|
| 22 |
|
import android.app.ActivityManager;
|
| 23 |
|
import android.content.Context;
|
| 24 |
|
import android.content.pm.ConfigurationInfo;
|
| 25 |
22 |
import android.opengl.GLES30;
|
| 26 |
23 |
import android.opengl.GLSurfaceView;
|
| 27 |
24 |
|
| ... | ... | |
| 48 |
45 |
private final DistortedScreen mScreen;
|
| 49 |
46 |
private final Fps mFPS;
|
| 50 |
47 |
private boolean mErrorShown;
|
| 51 |
|
private static boolean mSupportsGigaminx;
|
| 52 |
48 |
|
| 53 |
49 |
private static class Fps
|
| 54 |
50 |
{
|
| ... | ... | |
| 128 |
124 |
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
|
| 129 |
125 |
{
|
| 130 |
126 |
DistortedLibrary.setMax(EffectType.VERTEX,61); // 60 Minx quaternions + rotate
|
|
127 |
MeshBase.setMaxEffComponents(242); // 242 moving parts (Gigaminx)
|
|
128 |
|
| 131 |
129 |
VertexEffectRotate.enable();
|
| 132 |
130 |
VertexEffectQuaternion.enable();
|
| 133 |
131 |
BaseEffect.Type.enableEffects();
|
| 134 |
132 |
|
| 135 |
|
assignMaxComponents();
|
| 136 |
|
|
| 137 |
133 |
DistortedLibrary.onSurfaceCreated(mView.getContext(),this,1);
|
| 138 |
134 |
}
|
| 139 |
135 |
|
| ... | ... | |
| 178 |
174 |
}
|
| 179 |
175 |
}
|
| 180 |
176 |
|
| 181 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 182 |
|
// Go around bugs on Qualcomm Adreno driver V@331 (present in Samsung Galaxy J4+ and at least some
|
| 183 |
|
// versions of other Samsung Galaxy phones).
|
| 184 |
|
// On this driver, it is not possible to assign more than about 6000 bytes for uniform variables in
|
| 185 |
|
// the vertex shader. We thus need to limit the size of our uniform arrays. The only way seems to be
|
| 186 |
|
// to limit the number of Mesh components, but then on this platform we cannot support the largest
|
| 187 |
|
// object in terms of number of movable parts - the Gigaminx.
|
| 188 |
|
|
| 189 |
|
private void assignMaxComponents()
|
| 190 |
|
{
|
| 191 |
|
Context context = mView.getContext();
|
| 192 |
|
|
| 193 |
|
final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
| 194 |
|
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
|
| 195 |
|
|
| 196 |
|
int glESversion = configurationInfo.reqGlEsVersion;
|
| 197 |
|
int major = glESversion >> 16;
|
| 198 |
|
int minor = glESversion & 0xff;
|
| 199 |
|
|
| 200 |
|
MeshBase.setMaxEffComponents(242); // the largest object, Gigaminx, has 242 components
|
| 201 |
|
mSupportsGigaminx = true;
|
| 202 |
|
|
| 203 |
|
if( major==3 && minor==0 )
|
| 204 |
|
{
|
| 205 |
|
String vendor = GLES30.glGetString(GLES30.GL_VENDOR);
|
| 206 |
|
String version = GLES30.glGetString(GLES30.GL_VERSION);
|
| 207 |
|
|
| 208 |
|
if( vendor.contains("Qualcomm") && version.contains("V@331") )
|
| 209 |
|
{
|
| 210 |
|
// on driver version 331, do not support Gigaminx.
|
| 211 |
|
// Then Cube5 is the largest with 98 components.
|
| 212 |
|
MeshBase.setMaxEffComponents(98);
|
| 213 |
|
mSupportsGigaminx = false;
|
| 214 |
|
}
|
| 215 |
|
}
|
| 216 |
|
}
|
| 217 |
|
|
| 218 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 219 |
|
|
| 220 |
|
public static boolean supportsGigaminx()
|
| 221 |
|
{
|
| 222 |
|
return mSupportsGigaminx;
|
| 223 |
|
}
|
| 224 |
|
|
| 225 |
177 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 226 |
178 |
|
| 227 |
179 |
float getFPS()
|
Properly solve the issue with Qualcomm driver V@331 having buggy UBO size.