Index: src/gpu/gl/GrGpuGL.cpp |
=================================================================== |
--- src/gpu/gl/GrGpuGL.cpp (revision 8359) |
+++ src/gpu/gl/GrGpuGL.cpp (working copy) |
@@ -153,9 +153,10 @@ |
GrAssert(ctx.isInitialized()); |
+ fCaps.reset(SkRef(ctx.info().caps())); |
+ |
fillInConfigRenderableTable(); |
- fPrintedCaps = false; |
GrGLClearErr(fGLContext.interface()); |
@@ -174,10 +175,9 @@ |
GrPrintf("------ RENDERER %s\n", renderer); |
GrPrintf("------ VERSION %s\n", version); |
GrPrintf("------ EXTENSIONS\n %s \n", ext); |
+ ctx.info().caps()->print(); |
} |
- this->initCaps(); |
- |
fProgramCache = SkNEW_ARGS(ProgramCache, (this->glContext())); |
GrAssert(this->glCaps().maxVertexAttributes() >= GrDrawState::kVertexAttribCnt); |
@@ -209,92 +209,6 @@ |
/////////////////////////////////////////////////////////////////////////////// |
-void GrGpuGL::initCaps() { |
- GrGLint maxTextureUnits; |
- // check FS and fixed-function texture unit limits |
- // we only use textures in the fragment stage currently. |
- // checks are > to make sure we have a spare unit. |
- const GrGLInterface* gl = this->glInterface(); |
- GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); |
- GrAssert(maxTextureUnits > GrDrawState::kNumStages); |
- |
- CapsInternals* caps = this->capsInternals(); |
- |
- GrGLint numFormats; |
- GR_GL_GetIntegerv(gl, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats); |
- SkAutoSTMalloc<10, GrGLint> formats(numFormats); |
- GR_GL_GetIntegerv(gl, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats); |
- for (int i = 0; i < numFormats; ++i) { |
- if (formats[i] == GR_GL_PALETTE8_RGBA8) { |
- caps->f8BitPaletteSupport = true; |
- break; |
- } |
- } |
- |
- if (kDesktop_GrGLBinding == this->glBinding()) { |
- // we could also look for GL_ATI_separate_stencil extension or |
- // GL_EXT_stencil_two_side but they use different function signatures |
- // than GL2.0+ (and than each other). |
- caps->fTwoSidedStencilSupport = (this->glVersion() >= GR_GL_VER(2,0)); |
- // supported on GL 1.4 and higher or by extension |
- caps->fStencilWrapOpsSupport = (this->glVersion() >= GR_GL_VER(1,4)) || |
- this->hasExtension("GL_EXT_stencil_wrap"); |
- } else { |
- // ES 2 has two sided stencil and stencil wrap |
- caps->fTwoSidedStencilSupport = true; |
- caps->fStencilWrapOpsSupport = true; |
- } |
- |
- if (kDesktop_GrGLBinding == this->glBinding()) { |
- caps->fBufferLockSupport = true; // we require VBO support and the desktop VBO |
- // extension includes glMapBuffer. |
- } else { |
- caps->fBufferLockSupport = this->hasExtension("GL_OES_mapbuffer"); |
- } |
- |
- if (kDesktop_GrGLBinding == this->glBinding()) { |
- if (this->glVersion() >= GR_GL_VER(2,0) || |
- this->hasExtension("GL_ARB_texture_non_power_of_two")) { |
- caps->fNPOTTextureTileSupport = true; |
- } else { |
- caps->fNPOTTextureTileSupport = false; |
- } |
- } else { |
- // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only |
- caps->fNPOTTextureTileSupport = this->hasExtension("GL_OES_texture_npot"); |
- } |
- |
- caps->fHWAALineSupport = (kDesktop_GrGLBinding == this->glBinding()); |
- |
- GR_GL_GetIntegerv(gl, GR_GL_MAX_TEXTURE_SIZE, &caps->fMaxTextureSize); |
- GR_GL_GetIntegerv(gl, GR_GL_MAX_RENDERBUFFER_SIZE, &caps->fMaxRenderTargetSize); |
- // Our render targets are always created with textures as the color |
- // attachment, hence this min: |
- caps->fMaxRenderTargetSize = GrMin(caps->fMaxTextureSize, caps->fMaxRenderTargetSize); |
- |
- caps->fFSAASupport = GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType(); |
- caps->fPathStencilingSupport = GR_GL_USE_NV_PATH_RENDERING && |
- this->hasExtension("GL_NV_path_rendering"); |
- |
- // Enable supported shader-related caps |
- if (kDesktop_GrGLBinding == this->glBinding()) { |
- caps->fDualSourceBlendingSupport = this->glVersion() >= GR_GL_VER(3,3) || |
- this->hasExtension("GL_ARB_blend_func_extended"); |
- caps->fShaderDerivativeSupport = true; |
- // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS |
- caps->fGeometryShaderSupport = this->glVersion() >= GR_GL_VER(3,2) && |
- this->glslGeneration() >= k150_GrGLSLGeneration; |
- } else { |
- caps->fShaderDerivativeSupport = this->hasExtension("GL_OES_standard_derivatives"); |
- } |
- |
- if (GrGLCaps::kImaginationES_MSFBOType == this->glCaps().msFBOType()) { |
- GR_GL_GetIntegerv(this->glInterface(), GR_GL_MAX_SAMPLES_IMG, &caps->fMaxSampleCount); |
- } else if (GrGLCaps::kNone_MSFBOType != this->glCaps().msFBOType()) { |
- GR_GL_GetIntegerv(this->glInterface(), GR_GL_MAX_SAMPLES, &caps->fMaxSampleCount); |
- } |
-} |
- |
void GrGpuGL::fillInConfigRenderableTable() { |
// OpenGL < 3.0 |
@@ -399,11 +313,6 @@ |
} |
void GrGpuGL::onResetContext() { |
- if (gPrintStartupSpew && !fPrintedCaps) { |
- fPrintedCaps = true; |
- this->getCaps().print(); |
- this->glCaps().print(); |
- } |
// we don't use the zb at all |
GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
@@ -463,7 +372,7 @@ |
fHWBoundRenderTarget = NULL; |
fHWPathStencilMatrixState.invalidate(); |
- if (fCaps.pathStencilingSupport()) { |
+ if (this->caps()->pathStencilingSupport()) { |
// we don't use the model view matrix. |
GL_CALL(MatrixMode(GR_GL_MODELVIEW)); |
GL_CALL(LoadIdentity()); |
@@ -511,7 +420,7 @@ |
return NULL; |
} |
- int maxSize = this->getCaps().maxTextureSize(); |
+ int maxSize = this->caps()->maxTextureSize(); |
if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
return NULL; |
} |
@@ -836,12 +745,12 @@ |
GrGLenum format, |
int width, int height) { |
CLEAR_ERROR_BEFORE_ALLOC(ctx.interface()); |
- GrAssert(GrGLCaps::kNone_MSFBOType != ctx.info().caps().msFBOType()); |
+ GrAssert(GrGLCaps::kNone_MSFBOType != ctx.info().caps()->msFBOType()); |
bool created = false; |
if (GrGLCaps::kNVDesktop_CoverageAAType == |
- ctx.info().caps().coverageAAType()) { |
+ ctx.info().caps()->coverageAAType()) { |
const GrGLCaps::MSAACoverageMode& mode = |
- ctx.info().caps().getMSAACoverageMode(sampleCount); |
+ ctx.info().caps()->getMSAACoverageMode(sampleCount); |
GL_ALLOC_CALL(ctx.interface(), |
RenderbufferStorageMultisampleCoverage(GR_GL_RENDERBUFFER, |
mode.fCoverageSampleCnt, |
@@ -924,7 +833,7 @@ |
if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
goto FAILED; |
} |
- fGLContext.info().caps().markConfigAsValidColorAttachment(desc->fConfig); |
+ fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fConfig); |
} |
} |
GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, desc->fTexFBOID)); |
@@ -945,7 +854,7 @@ |
if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
goto FAILED; |
} |
- fGLContext.info().caps().markConfigAsValidColorAttachment(desc->fConfig); |
+ fGLContext.info().caps()->markConfigAsValidColorAttachment(desc->fConfig); |
} |
return true; |
@@ -990,7 +899,7 @@ |
return return_null_texture(); |
} |
// If the sample count exceeds the max then we clamp it. |
- glTexDesc.fSampleCnt = GrMin(desc.fSampleCnt, this->getCaps().maxSampleCount()); |
+ glTexDesc.fSampleCnt = GrMin(desc.fSampleCnt, this->caps()->maxSampleCount()); |
glTexDesc.fFlags = desc.fFlags; |
glTexDesc.fWidth = desc.fWidth; |
@@ -1006,8 +915,6 @@ |
bool renderTarget = 0 != (desc.fFlags & kRenderTarget_GrTextureFlagBit); |
- const Caps& caps = this->getCaps(); |
- |
glTexDesc.fOrigin = resolve_origin(desc.fOrigin, renderTarget); |
glRTDesc.fOrigin = glTexDesc.fOrigin; |
@@ -1019,8 +926,8 @@ |
} |
if (renderTarget) { |
- if (glTexDesc.fWidth > caps.maxRenderTargetSize() || |
- glTexDesc.fHeight > caps.maxRenderTargetSize()) { |
+ int maxRTSize = this->caps()->maxRenderTargetSize(); |
+ if (glTexDesc.fWidth > maxRTSize || glTexDesc.fHeight > maxRTSize) { |
return return_null_texture(); |
} |
} |
@@ -1234,7 +1141,7 @@ |
} |
return false; |
} else { |
- fGLContext.info().caps().markColorConfigAndStencilFormatAsVerified( |
+ fGLContext.info().caps()->markColorConfigAndStencilFormatAsVerified( |
rt->config(), |
glsb->format()); |
} |
@@ -1312,7 +1219,7 @@ |
} |
GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) { |
- GrAssert(fCaps.pathStencilingSupport()); |
+ GrAssert(this->caps()->pathStencilingSupport()); |
return SkNEW_ARGS(GrGLPath, (this, inPath)); |
} |
@@ -1735,7 +1642,7 @@ |
} |
void GrGpuGL::onGpuStencilPath(const GrPath* path, SkPath::FillType fill) { |
- GrAssert(fCaps.pathStencilingSupport()); |
+ GrAssert(this->caps()->pathStencilingSupport()); |
GrGLuint id = static_cast<const GrGLPath*>(path)->pathID(); |
GrDrawState* drawState = this->drawState(); |
@@ -1918,7 +1825,7 @@ |
} |
} |
if (!fStencilSettings.isDisabled()) { |
- if (this->getCaps().twoSidedStencilSupport()) { |
+ if (this->caps()->twoSidedStencilSupport()) { |
set_gl_stencil(this->glInterface(), |
fStencilSettings, |
GR_GL_FRONT, |
@@ -2268,7 +2175,7 @@ |
*externalType = GR_GL_UNSIGNED_SHORT_4_4_4_4; |
break; |
case kIndex_8_GrPixelConfig: |
- if (this->getCaps().eightBitPaletteSupport()) { |
+ if (this->caps()->eightBitPaletteSupport()) { |
*internalFormat = GR_GL_PALETTE8_RGBA8; |
// glCompressedTexImage doesn't take external params |
*externalFormat = GR_GL_PALETTE8_RGBA8; |