| Index: src/gpu/gl/GrGLCaps.cpp
|
| ===================================================================
|
| --- src/gpu/gl/GrGLCaps.cpp (revision 8359)
|
| +++ src/gpu/gl/GrGLCaps.cpp (working copy)
|
| @@ -15,6 +15,8 @@
|
| }
|
|
|
| void GrGLCaps::reset() {
|
| + INHERITED::reset();
|
| +
|
| fVerifiedColorConfigs.reset();
|
| fStencilFormats.reset();
|
| fStencilVerifiedColorConfigs.reset();
|
| @@ -46,6 +48,7 @@
|
| }
|
|
|
| GrGLCaps& GrGLCaps::operator = (const GrGLCaps& caps) {
|
| + INHERITED::operator=(caps);
|
| fVerifiedColorConfigs = caps.fVerifiedColorConfigs;
|
| fStencilFormats = caps.fStencilFormats;
|
| fStencilVerifiedColorConfigs = caps.fStencilVerifiedColorConfigs;
|
| @@ -85,6 +88,10 @@
|
| GrGLBinding binding = ctxInfo.binding();
|
| GrGLVersion version = ctxInfo.version();
|
|
|
| + /**************************************************************************
|
| + * Caps specific to GrGLCaps
|
| + **************************************************************************/
|
| +
|
| if (kES2_GrGLBinding == binding) {
|
| GR_GL_GetIntegerv(gli, GR_GL_MAX_FRAGMENT_UNIFORM_VECTORS,
|
| &fMaxFragmentUniformVectors);
|
| @@ -194,6 +201,89 @@
|
|
|
| this->initFSAASupport(ctxInfo, gli);
|
| this->initStencilFormats(ctxInfo);
|
| +
|
| + /**************************************************************************
|
| + * GrDrawTarget::Caps fields
|
| + **************************************************************************/
|
| + 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.
|
| + GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
|
| + GrAssert(maxTextureUnits > GrDrawState::kNumStages);
|
| +
|
| + GrGLint numFormats;
|
| + GR_GL_GetIntegerv(gli, GR_GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numFormats);
|
| + SkAutoSTMalloc<10, GrGLint> formats(numFormats);
|
| + GR_GL_GetIntegerv(gli, GR_GL_COMPRESSED_TEXTURE_FORMATS, formats);
|
| + for (int i = 0; i < numFormats; ++i) {
|
| + if (formats[i] == GR_GL_PALETTE8_RGBA8) {
|
| + f8BitPaletteSupport = true;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + if (kDesktop_GrGLBinding == binding) {
|
| + // 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).
|
| + fTwoSidedStencilSupport = (ctxInfo.version() >= GR_GL_VER(2,0));
|
| + // supported on GL 1.4 and higher or by extension
|
| + fStencilWrapOpsSupport = (ctxInfo.version() >= GR_GL_VER(1,4)) ||
|
| + ctxInfo.hasExtension("GL_EXT_stencil_wrap");
|
| + } else {
|
| + // ES 2 has two sided stencil and stencil wrap
|
| + fTwoSidedStencilSupport = true;
|
| + fStencilWrapOpsSupport = true;
|
| + }
|
| +
|
| + if (kDesktop_GrGLBinding == binding) {
|
| + fBufferLockSupport = true; // we require VBO support and the desktop VBO extension includes
|
| + // glMapBuffer.
|
| + } else {
|
| + fBufferLockSupport = ctxInfo.hasExtension("GL_OES_mapbuffer");
|
| + }
|
| +
|
| + if (kDesktop_GrGLBinding == binding) {
|
| + if (ctxInfo.version() >= GR_GL_VER(2,0) ||
|
| + ctxInfo.hasExtension("GL_ARB_texture_non_power_of_two")) {
|
| + fNPOTTextureTileSupport = true;
|
| + } else {
|
| + fNPOTTextureTileSupport = false;
|
| + }
|
| + } else {
|
| + // Unextended ES2 supports NPOT textures with clamp_to_edge and non-mip filters only
|
| + fNPOTTextureTileSupport = ctxInfo.hasExtension("GL_OES_texture_npot");
|
| + }
|
| +
|
| + fHWAALineSupport = (kDesktop_GrGLBinding == binding);
|
| +
|
| + GR_GL_GetIntegerv(gli, GR_GL_MAX_TEXTURE_SIZE, &fMaxTextureSize);
|
| + GR_GL_GetIntegerv(gli, GR_GL_MAX_RENDERBUFFER_SIZE, &fMaxRenderTargetSize);
|
| + // Our render targets are always created with textures as the color
|
| + // attachment, hence this min:
|
| + fMaxRenderTargetSize = GrMin(fMaxTextureSize, fMaxRenderTargetSize);
|
| +
|
| + fPathStencilingSupport = GR_GL_USE_NV_PATH_RENDERING &&
|
| + ctxInfo.hasExtension("GL_NV_path_rendering");
|
| +
|
| + // Enable supported shader-related caps
|
| + if (kDesktop_GrGLBinding == binding) {
|
| + fDualSourceBlendingSupport = ctxInfo.version() >= GR_GL_VER(3,3) ||
|
| + ctxInfo.hasExtension("GL_ARB_blend_func_extended");
|
| + fShaderDerivativeSupport = true;
|
| + // we don't support GL_ARB_geometry_shader4, just GL 3.2+ GS
|
| + fGeometryShaderSupport = ctxInfo.version() >= GR_GL_VER(3,2) &&
|
| + ctxInfo.glslGeneration() >= k150_GrGLSLGeneration;
|
| + } else {
|
| + fShaderDerivativeSupport = ctxInfo.hasExtension("GL_OES_standard_derivatives");
|
| + }
|
| +
|
| + if (GrGLCaps::kImaginationES_MSFBOType == fMSFBOType) {
|
| + GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES_IMG, &fMaxSampleCount);
|
| + } else if (GrGLCaps::kNone_MSFBOType != fMSFBOType) {
|
| + GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES, &fMaxSampleCount);
|
| + }
|
| }
|
|
|
| bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf,
|
| @@ -411,6 +501,10 @@
|
| }
|
|
|
| void GrGLCaps::print() const {
|
| +
|
| + INHERITED::print();
|
| +
|
| + GrPrintf("--- GL-Specific ---\n");
|
| for (int i = 0; i < fStencilFormats.count(); ++i) {
|
| GrPrintf("Stencil Format %d, stencil bits: %02d, total bits: %02d\n",
|
| i,
|
| @@ -432,20 +526,25 @@
|
| };
|
| GrPrintf("MSAA Type: %s\n", gMSFBOExtStr[fMSFBOType]);
|
| GrPrintf("Max FS Uniform Vectors: %d\n", fMaxFragmentUniformVectors);
|
| - GrPrintf("Support RGBA8 Render Buffer: %s\n",
|
| - (fRGBA8RenderbufferSupport ? "YES": "NO"));
|
| - GrPrintf("BGRA is an internal format: %s\n",
|
| - (fBGRAIsInternalFormat ? "YES": "NO"));
|
| - GrPrintf("Support texture swizzle: %s\n",
|
| - (fTextureSwizzleSupport ? "YES": "NO"));
|
| - GrPrintf("Unpack Row length support: %s\n",
|
| - (fUnpackRowLengthSupport ? "YES": "NO"));
|
| - GrPrintf("Unpack Flip Y support: %s\n",
|
| - (fUnpackFlipYSupport ? "YES": "NO"));
|
| - GrPrintf("Pack Row length support: %s\n",
|
| - (fPackRowLengthSupport ? "YES": "NO"));
|
| - GrPrintf("Pack Flip Y support: %s\n",
|
| - (fPackFlipYSupport ? "YES": "NO"));
|
| + GrPrintf("Max Vertex Attributes: %d\n", fMaxVertexAttributes);
|
| + GrPrintf("Support RGBA8 Render Buffer: %s\n", (fRGBA8RenderbufferSupport ? "YES": "NO"));
|
| + GrPrintf("BGRA support: %s\n", (fBGRAFormatSupport ? "YES": "NO"));
|
| + GrPrintf("BGRA is an internal format: %s\n", (fBGRAIsInternalFormat ? "YES": "NO"));
|
| + GrPrintf("Support texture swizzle: %s\n", (fTextureSwizzleSupport ? "YES": "NO"));
|
| + GrPrintf("Unpack Row length support: %s\n", (fUnpackRowLengthSupport ? "YES": "NO"));
|
| + GrPrintf("Unpack Flip Y support: %s\n", (fUnpackFlipYSupport ? "YES": "NO"));
|
| + GrPrintf("Pack Row length support: %s\n", (fPackRowLengthSupport ? "YES": "NO"));
|
| + GrPrintf("Pack Flip Y support: %s\n", (fPackFlipYSupport ? "YES": "NO"));
|
| +
|
| + GrPrintf("Texture Usage support: %s\n", (fTextureUsageSupport ? "YES": "NO"));
|
| + GrPrintf("Texture Storage support: %s\n", (fTexStorageSupport ? "YES": "NO"));
|
| + GrPrintf("GL_R support: %s\n", (fTextureRedSupport ? "YES": "NO"));
|
| + GrPrintf("GL_ARB_imaging support: %s\n", (fImagingSupport ? "YES": "NO"));
|
| GrPrintf("Two Format Limit: %s\n", (fTwoFormatLimit ? "YES": "NO"));
|
| - GrPrintf("Fragment coord conventions support: %s\n", (fFragCoordsConventionSupport ? "YES": "NO"));
|
| + GrPrintf("Fragment coord conventions support: %s\n",
|
| + (fFragCoordsConventionSupport ? "YES": "NO"));
|
| + GrPrintf("Vertex array object support: %s\n", (fVertexArrayObjectSupport ? "YES": "NO"));
|
| + GrPrintf("Use non-VBO for dynamic data: %s\n",
|
| + (fUseNonVBOVertexAndIndexDynamicData ? "YES" : "NO"));
|
| + GrPrintf("Core Profile: %s\n", (fIsCoreProfile ? "YES" : "NO"));
|
| }
|
|
|