diff options
author | Pawit Pornkitprasan <p.pawit@gmail.com> | 2013-12-14 10:34:01 +0700 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-12-25 21:10:24 +0000 |
commit | 0e3bc71e74b497c0e9a5c8f6739929be65bf0a70 (patch) | |
tree | bb90724ceac887b54de133ccc1ce100ad2b14522 /jni | |
parent | 0d898382bf19ebfa7ed14cbabfd3166e0a7bb350 (diff) | |
download | android_packages_apps_Camera2-0e3bc71e74b497c0e9a5c8f6739929be65bf0a70.tar.gz android_packages_apps_Camera2-0e3bc71e74b497c0e9a5c8f6739929be65bf0a70.tar.bz2 android_packages_apps_Camera2-0e3bc71e74b497c0e9a5c8f6739929be65bf0a70.zip |
Camera: fix panorama preview on older devices
When PREVIEW_FBO_WIDTH_SCALE is set to 4, the preview FBO becomes
larger than older GPUs can handle. Detect it and reduce the value
to 2 like on pre-KitKat releases.
Change-Id: I20785d157bed48816820476d066ef9d4a9f73672
Diffstat (limited to 'jni')
-rw-r--r-- | jni/mosaic_renderer_jni.cpp | 19 | ||||
-rw-r--r-- | jni/mosaic_renderer_jni.h | 2 |
2 files changed, 20 insertions, 1 deletions
diff --git a/jni/mosaic_renderer_jni.cpp b/jni/mosaic_renderer_jni.cpp index 36f8064c7..2c7ec0d1f 100644 --- a/jni/mosaic_renderer_jni.cpp +++ b/jni/mosaic_renderer_jni.cpp @@ -36,6 +36,7 @@ GLuint gSurfaceTextureID[1]; bool gWarpImage = true; +int PREVIEW_FBO_WIDTH_SCALE = 4; // Low-Res input image frame in YUVA format for preview rendering and processing // and high-res YUVA input image for processing. @@ -396,7 +397,12 @@ void AllocateTextureMemory(int widthHR, int heightHR, int widthLR, int heightLR) gPreviewImage[HR] = ImageUtils::allocateImage(gPreviewImageWidth[HR], gPreviewImageHeight[HR], 4); sem_post(&gPreviewImage_semaphore); +} +// Delay calculation of gPreviewFBOWidth until we update PREVIEW_FBO_WIDTH_SCALE +// (we need an EGL Context to query GL_MAX_TEXTURE_SIZE) +void UpdateTextureCalculation() +{ gPreviewFBOWidth = PREVIEW_FBO_WIDTH_SCALE * gPreviewImageWidth[HR]; gPreviewFBOHeight = PREVIEW_FBO_HEIGHT_SCALE * gPreviewImageHeight[HR]; @@ -511,6 +517,19 @@ JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved) JNIEXPORT jint JNICALL Java_com_android_camera_MosaicRenderer_init( JNIEnv * env, jobject obj) { + // Reduce PREVIEW_FBO_WIDTH_SCALE on older devices + int maxTextureSize; + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); + checkGlError("glGetIntegerv"); + + int requiredTextureSize = PREVIEW_FBO_WIDTH_SCALE * gPreviewImageWidth[HR]; + if (maxTextureSize < requiredTextureSize) { + LOGE("Reducing PREVIEW_FBO_WIDTH_SCALE, max = %d, req = %d", + maxTextureSize, requiredTextureSize); + PREVIEW_FBO_WIDTH_SCALE = 2; + } + UpdateTextureCalculation(); + gSurfTexRenderer[LR].InitializeGLProgram(); gSurfTexRenderer[HR].InitializeGLProgram(); gYVURenderer[LR].InitializeGLProgram(); diff --git a/jni/mosaic_renderer_jni.h b/jni/mosaic_renderer_jni.h index db4d5c232..88a51c897 100644 --- a/jni/mosaic_renderer_jni.h +++ b/jni/mosaic_renderer_jni.h @@ -4,7 +4,7 @@ // The Preview FBO dimensions are determined from the high-res // frame dimensions (gPreviewImageWidth, gPreviewImageHeight) // using the scale factors below. -const int PREVIEW_FBO_WIDTH_SCALE = 4; +/* const int PREVIEW_FBO_WIDTH_SCALE = 4; */ const int PREVIEW_FBO_HEIGHT_SCALE = 2; // The factor below determines the (horizontal) speed at which the viewfinder |