Add isMultisampled() to GrRenderTarget. Cleanup MSAA vs smooth lines logic in GrGpuGL.

Skia issue: 178

Review URL: http://codereview.appspot.com/4382041/



git-svn-id: http://skia.googlecode.com/svn/trunk@1067 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGL.cpp b/gpu/src/GrGpuGL.cpp
index e5f9fa2..a9e0e1d 100644
--- a/gpu/src/GrGpuGL.cpp
+++ b/gpu/src/GrGpuGL.cpp
@@ -481,6 +481,8 @@
         GR_GL(Disable(GR_GL_LINE_SMOOTH));
         GR_GL(Disable(GR_GL_POINT_SMOOTH));
         GR_GL(Disable(GR_GL_MULTISAMPLE));
+        fHWAAState.fMSAAEnabled = false;
+        fHWAAState.fSmoothLineEnabled = false;
     }
 
     GR_GL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE));
@@ -534,6 +536,7 @@
 GrRenderTarget* GrGpuGL::createPlatformRenderTargetHelper(
                                                 intptr_t platformRenderTarget,
                                                 int stencilBits,
+                                                bool isMultisampled,
                                                 int width,
                                                 int height) {
     GrGLRenderTarget::GLRenderTargetIDs rtIDs;
@@ -552,7 +555,8 @@
     rtIDs.fRTFBOID  = (GrGLuint)platformRenderTarget;
     rtIDs.fTexFBOID = (GrGLuint)platformRenderTarget;
 
-    return new GrGLRenderTarget(this, rtIDs, NULL, stencilBits, viewport, NULL);
+    return new GrGLRenderTarget(this, rtIDs, NULL, stencilBits, 
+                                isMultisampled, viewport, NULL);
 }
 
 GrRenderTarget* GrGpuGL::createRenderTargetFrom3DApiStateHelper() {
@@ -569,9 +573,13 @@
     GrGLuint stencilBits;
     GR_GL_GetIntegerv(GR_GL_STENCIL_BITS, (GrGLint*)&stencilBits);
 
+    GrGLint samples;
+    GR_GL_GetIntegerv(GR_GL_SAMPLES, &samples);
+
     rtIDs.fOwnIDs = false;
 
-    return new GrGLRenderTarget(this, rtIDs, NULL, stencilBits, viewport, NULL);
+    return new GrGLRenderTarget(this, rtIDs, NULL, stencilBits, 
+                                (samples > 0), viewport, NULL);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1518,6 +1526,42 @@
     }
 }
 
+void GrGpuGL::flushAAState(GrPrimitiveType type) {
+    if (GR_GL_SUPPORT_DESKTOP) {
+        // ES doesn't support toggling GL_MULTISAMPLE and doesn't have
+        // smooth lines.
+
+        // we prefer smooth lines over multisampled lines
+        // msaa should be disabled if drawing smooth lines.
+        if (kLines_PrimitiveType == type) {
+            if (!fHWAAState.fSmoothLineEnabled && 
+                (kAntialias_StateBit & fCurrDrawState.fFlagBits)) {
+                GR_GL(Enable(GR_GL_LINE_SMOOTH));
+                fHWAAState.fSmoothLineEnabled = true;
+            } else if (fHWAAState.fSmoothLineEnabled && 
+                       !(kAntialias_StateBit & fCurrDrawState.fFlagBits)) {
+                GR_GL(Disable(GR_GL_LINE_SMOOTH));
+                fHWAAState.fSmoothLineEnabled = false;
+            }
+            if (fCurrDrawState.fRenderTarget->isMultisampled() && 
+                fHWAAState.fMSAAEnabled) {
+                GR_GL(Disable(GR_GL_MULTISAMPLE));
+                fHWAAState.fMSAAEnabled = false;
+            }
+        } else if (fCurrDrawState.fRenderTarget->isMultisampled() &&
+                   !!(kAntialias_StateBit & fCurrDrawState.fFlagBits) !=
+                   fHWAAState.fMSAAEnabled) {
+            if (fHWAAState.fMSAAEnabled) {
+                GR_GL(Disable(GR_GL_MULTISAMPLE));
+                fHWAAState.fMSAAEnabled = false;
+            } else {
+                GR_GL(Enable(GR_GL_MULTISAMPLE));
+                fHWAAState.fMSAAEnabled = true;
+            }
+        }
+    }
+}
+
 bool GrGpuGL::flushGLStateCommon(GrPrimitiveType type) {
 
     // GrGpu::setupClipAndFlushState should have already checked this
@@ -1595,6 +1639,8 @@
 
     flushRenderTarget();
 
+    flushAAState(type);
+
     if ((fCurrDrawState.fFlagBits & kDither_StateBit) !=
         (fHWDrawState.fFlagBits & kDither_StateBit)) {
         if (fCurrDrawState.fFlagBits & kDither_StateBit) {
@@ -1615,34 +1661,6 @@
         GR_GL(ColorMask(mask, mask, mask, mask));
     }
 
-    if (GR_GL_SUPPORT_DESKTOP) {
-        // ES doesn't support toggling GL_MULTISAMPLE and doesn't have
-        // smooth lines.
-        if (fDirtyFlags.fRenderTargetChanged ||
-            (fCurrDrawState.fFlagBits & kAntialias_StateBit) !=
-            (fHWDrawState.fFlagBits & kAntialias_StateBit)) {
-            GrGLint msaa = 0;
-            // only perform query if we know MSAA is supported.
-            // calling on non-MSAA target caused a crash in one environment,
-            // though I don't think it should.
-            if (fAASamples[kHigh_AALevel]) {
-                GR_GL_GetIntegerv(GR_GL_SAMPLE_BUFFERS, &msaa);
-            }
-            if (fCurrDrawState.fFlagBits & kAntialias_StateBit) {
-                if (msaa) {
-                    GR_GL(Enable(GR_GL_MULTISAMPLE));
-                } else {
-                    GR_GL(Enable(GR_GL_LINE_SMOOTH));
-                }
-            } else {
-                if (msaa) {
-                    GR_GL(Disable(GR_GL_MULTISAMPLE));
-                }
-                GR_GL(Disable(GR_GL_LINE_SMOOTH));
-            }
-        }
-    }
-
     bool blendOff = canDisableBlend();
     if (fHWBlendDisabled != blendOff) {
         if (blendOff) {