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) {