Add multisampling support to renderscript.

Change-Id: I38bf50a5b54aa5df7e4f76ea40027d9e36dc4b5d
diff --git a/libs/rs/driver/rsdGL.cpp b/libs/rs/driver/rsdGL.cpp
index b6fc00e..059e3ec 100644
--- a/libs/rs/driver/rsdGL.cpp
+++ b/libs/rs/driver/rsdGL.cpp
@@ -173,15 +173,12 @@
     }
 }
 
-bool rsdGLInit(const Context *rsc) {
-    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
+void getConfigData(const Context *rsc,
+                   EGLint *configAttribs, size_t configAttribsLen,
+                   uint32_t numSamples) {
+    memset(configAttribs, 0, configAttribsLen*sizeof(*configAttribs));
 
-    dc->gl.egl.numConfigs = -1;
-    EGLint configAttribs[128];
     EGLint *configAttribsPtr = configAttribs;
-    EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
-
-    memset(configAttribs, 0, sizeof(configAttribs));
 
     configAttribsPtr[0] = EGL_SURFACE_TYPE;
     configAttribsPtr[1] = EGL_WINDOW_BIT;
@@ -221,8 +218,25 @@
         configAttribsPtr += 2;
     }
 
+    if (numSamples > 1) {
+        configAttribsPtr[0] = EGL_SAMPLE_BUFFERS;
+        configAttribsPtr[1] = 1;
+        configAttribsPtr[2] = EGL_SAMPLES;
+        configAttribsPtr[3] = numSamples;
+        configAttribsPtr += 4;
+    }
+
     configAttribsPtr[0] = EGL_NONE;
-    rsAssert(configAttribsPtr < (configAttribs + (sizeof(configAttribs) / sizeof(EGLint))));
+    rsAssert(configAttribsPtr < (configAttribs + configAttribsLen));
+}
+
+bool rsdGLInit(const Context *rsc) {
+    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
+
+    dc->gl.egl.numConfigs = -1;
+
+    EGLint configAttribs[128];
+    EGLint context_attribs2[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
 
     ALOGV("%p initEGL start", rsc);
     rsc->setWatchdogGL("eglGetDisplay", __LINE__, __FILE__);
@@ -237,8 +251,18 @@
 
     EGLint numConfigs = -1, n = 0;
     rsc->setWatchdogGL("eglChooseConfig", __LINE__, __FILE__);
-    ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
-    checkEglError("eglGetConfigs", ret);
+
+    // Try minding a multisample config that matches the user request
+    uint32_t minSample = rsc->mUserSurfaceConfig.samplesMin;
+    uint32_t prefSample = rsc->mUserSurfaceConfig.samplesPref;
+    for (uint32_t sampleCount = prefSample; sampleCount >= minSample; sampleCount--) {
+        getConfigData(rsc, configAttribs, (sizeof(configAttribs) / sizeof(EGLint)), sampleCount);
+        ret = eglChooseConfig(dc->gl.egl.display, configAttribs, 0, 0, &numConfigs);
+        checkEglError("eglGetConfigs", ret);
+        if (numConfigs > 0) {
+            break;
+        }
+    }
 
     eglSwapInterval(dc->gl.egl.display, 0);