diff options
author | Alex Sakhartchouk <alexst@google.com> | 2012-02-28 14:35:31 -0800 |
---|---|---|
committer | Alex Sakhartchouk <alexst@google.com> | 2012-02-28 14:35:31 -0800 |
commit | f203b83d2fac1def48dfba23d7020a8c6b4abb70 (patch) | |
tree | 4a99dcf672b70d1555e0c851860f9aaec7ad6cc0 /libs/rs | |
parent | eb8b1fe91faa6ecaf1fb119bd557f96bde9f6bbc (diff) | |
download | frameworks_base-f203b83d2fac1def48dfba23d7020a8c6b4abb70.zip frameworks_base-f203b83d2fac1def48dfba23d7020a8c6b4abb70.tar.gz frameworks_base-f203b83d2fac1def48dfba23d7020a8c6b4abb70.tar.bz2 |
Add multisampling support to renderscript.
Change-Id: I38bf50a5b54aa5df7e4f76ea40027d9e36dc4b5d
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/driver/rsdGL.cpp | 44 |
1 files changed, 34 insertions, 10 deletions
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 @@ void rsdGLShutdown(const Context *rsc) { } } -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 @@ bool rsdGLInit(const Context *rsc) { 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 @@ bool rsdGLInit(const Context *rsc) { 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); |