summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorPawit Pornkitprasan <p.pawit@gmail.com>2013-12-14 10:34:01 +0700
committerSteve Kondik <shade@chemlab.org>2013-12-25 21:10:24 +0000
commit0e3bc71e74b497c0e9a5c8f6739929be65bf0a70 (patch)
treebb90724ceac887b54de133ccc1ce100ad2b14522 /jni
parent0d898382bf19ebfa7ed14cbabfd3166e0a7bb350 (diff)
downloadandroid_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.cpp19
-rw-r--r--jni/mosaic_renderer_jni.h2
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