aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-04-27 14:25:44 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-04-27 14:25:44 +0000
commitf6b070da5e337d13bd08ca488a0140d8facef8b8 (patch)
tree15d753d5f84c684a482b389a8d61ba16c745e3cf
parente9b087e958f3c165a5ac271d3abfb83bdb4c1b9d (diff)
Clamp requested MSAA sample count to GL_MAX_SAMPLES
Review URL: http://codereview.appspot.com/6135044/ git-svn-id: http://skia.googlecode.com/svn/trunk@3777 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--src/gpu/gl/GrGLCaps.cpp7
-rw-r--r--src/gpu/gl/GrGLCaps.h6
-rw-r--r--src/gpu/gl/GrGpuGL.cpp2
3 files changed, 15 insertions, 0 deletions
diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp
index c7e9380c00..797abb4d80 100644
--- a/src/gpu/gl/GrGLCaps.cpp
+++ b/src/gpu/gl/GrGLCaps.cpp
@@ -20,6 +20,7 @@ void GrGLCaps::reset() {
fStencilFormats.reset();
fStencilVerifiedColorConfigs.reset();
fMSFBOType = kNone_MSFBOType;
+ fMaxSampleCount = 0;
fCoverageAAType = kNone_CoverageAAType;
fMaxFragmentUniformVectors = 0;
fRGBA8RenderbufferSupport = false;
@@ -45,6 +46,7 @@ GrGLCaps& GrGLCaps::operator = (const GrGLCaps& caps) {
fStencilVerifiedColorConfigs = caps.fStencilVerifiedColorConfigs;
fMaxFragmentUniformVectors = caps.fMaxFragmentUniformVectors;
fMSFBOType = caps.fMSFBOType;
+ fMaxSampleCount = caps.fMaxSampleCount;
fCoverageAAType = caps.fCoverageAAType;
fMSAACoverageModes = caps.fMSAACoverageModes;
fRGBA8RenderbufferSupport = caps.fRGBA8RenderbufferSupport;
@@ -206,6 +208,11 @@ void GrGLCaps::initFSAASupport(const GrGLContextInfo& ctxInfo) {
compareProc);
}
}
+ if (kNone_MSFBOType != fMSFBOType) {
+ GR_GL_GetIntegerv(ctxInfo.interface(),
+ GR_GL_MAX_SAMPLES,
+ &fMaxSampleCount);
+ }
}
const GrGLCaps::MSAACoverageMode& GrGLCaps::getMSAACoverageMode(
diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h
index 31c4392a10..eb095765c6 100644
--- a/src/gpu/gl/GrGLCaps.h
+++ b/src/gpu/gl/GrGLCaps.h
@@ -137,6 +137,11 @@ public:
MSFBOType msFBOType() const { return fMSFBOType; }
/**
+ * Reports the maximum number of samples supported.
+ */
+ int maxSampleCount() const { return fMaxSampleCount; }
+
+ /**
* Reports the type of coverage sample AA support.
*/
CoverageAAType coverageAAType() const { return fCoverageAAType; }
@@ -257,6 +262,7 @@ private:
int fMaxFragmentUniformVectors;
MSFBOType fMSFBOType;
+ int fMaxSampleCount;
CoverageAAType fCoverageAAType;
SkTDArray<MSAACoverageMode> fMSAACoverageModes;
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index a9b345bdba..9abd01c966 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -866,6 +866,8 @@ bool renderbuffer_storage_msaa(GrGLContextInfo& ctxInfo,
created = (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctxInfo.interface()));
}
if (!created) {
+ // glRBMS will fail if requested samples is > max samples.
+ sampleCount = GrMin(sampleCount, ctxInfo.caps().maxSampleCount());
GL_ALLOC_CALL(ctxInfo.interface(),
RenderbufferStorageMultisample(GR_GL_RENDERBUFFER,
sampleCount,