From 7388051d745590d7759e7ed49c233caec6bea0f7 Mon Sep 17 00:00:00 2001 From: "commit-bot@chromium.org" Date: Mon, 14 Oct 2013 15:33:45 +0000 Subject: [PATCH] Move renderable config list to GrDrawTargetCaps R=robertphillips@google.com Author: bsalomon@google.com Review URL: https://codereview.chromium.org/26342006 git-svn-id: http://skia.googlecode.com/svn/trunk@11756 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/gpu/GrContext.cpp | 2 +- src/gpu/GrDrawTarget.cpp | 29 ++++++++++++++++ src/gpu/GrDrawTargetCaps.h | 11 ++++++ src/gpu/GrGpu.cpp | 4 --- src/gpu/GrGpu.h | 12 ------- src/gpu/gl/GrGLCaps.cpp | 61 ++++++++++++++++++++++++++++++++++ src/gpu/gl/GrGLCaps.h | 5 +-- src/gpu/gl/GrGpuGL.cpp | 68 ++------------------------------------ src/gpu/gl/GrGpuGL.h | 2 -- 9 files changed, 108 insertions(+), 86 deletions(-) diff --git a/src/gpu/GrContext.cpp b/src/gpu/GrContext.cpp index 91e8286eb5..66a86f3269 100644 --- a/src/gpu/GrContext.cpp +++ b/src/gpu/GrContext.cpp @@ -1689,7 +1689,7 @@ GrPathRenderer* GrContext::getPathRenderer(const SkPath& path, //////////////////////////////////////////////////////////////////////////////// bool GrContext::isConfigRenderable(GrPixelConfig config) const { - return fGpu->isConfigRenderable(config); + return fGpu->caps()->isConfigRenderable(config); } static inline intptr_t setOrClear(intptr_t bits, int shift, intptr_t pred) { diff --git a/src/gpu/GrDrawTarget.cpp b/src/gpu/GrDrawTarget.cpp index fa2223d4c4..fc3014e398 100644 --- a/src/gpu/GrDrawTarget.cpp +++ b/src/gpu/GrDrawTarget.cpp @@ -981,6 +981,8 @@ void GrDrawTargetCaps::reset() { fMaxRenderTargetSize = 0; fMaxTextureSize = 0; fMaxSampleCount = 0; + + memset(fConfigRenderSupport, 0, sizeof(fConfigRenderSupport)); } GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { @@ -1001,6 +1003,8 @@ GrDrawTargetCaps& GrDrawTargetCaps::operator=(const GrDrawTargetCaps& other) { fMaxTextureSize = other.fMaxTextureSize; fMaxSampleCount = other.fMaxSampleCount; + memcpy(fConfigRenderSupport, other.fConfigRenderSupport, sizeof(fConfigRenderSupport)); + return *this; } @@ -1021,4 +1025,29 @@ void GrDrawTargetCaps::print() const { GrPrintf("Max Texture Size : %d\n", fMaxTextureSize); GrPrintf("Max Render Target Size : %d\n", fMaxRenderTargetSize); GrPrintf("Max Sample Count : %d\n", fMaxSampleCount); + + static const char* kConfigNames[] = { + "Unknown", // kUnknown_GrPixelConfig + "Alpha8", // kAlpha_8_GrPixelConfig, + "Index8", // kIndex_8_GrPixelConfig, + "RGB565", // kRGB_565_GrPixelConfig, + "RGBA444", // kRGBA_4444_GrPixelConfig, + "RGBA8888", // kRGBA_8888_GrPixelConfig, + "BGRA8888", // kBGRA_8888_GrPixelConfig, + }; + GR_STATIC_ASSERT(0 == kUnknown_GrPixelConfig); + GR_STATIC_ASSERT(1 == kAlpha_8_GrPixelConfig); + GR_STATIC_ASSERT(2 == kIndex_8_GrPixelConfig); + GR_STATIC_ASSERT(3 == kRGB_565_GrPixelConfig); + GR_STATIC_ASSERT(4 == kRGBA_4444_GrPixelConfig); + GR_STATIC_ASSERT(5 == kRGBA_8888_GrPixelConfig); + GR_STATIC_ASSERT(6 == kBGRA_8888_GrPixelConfig); + GR_STATIC_ASSERT(SK_ARRAY_COUNT(kConfigNames) == kGrPixelConfigCnt); + + SkASSERT(!fConfigRenderSupport[kUnknown_GrPixelConfig]); + for (size_t i = 0; i < SK_ARRAY_COUNT(kConfigNames); ++i) { + if (i != kUnknown_GrPixelConfig) { + GrPrintf("%s is renderable: %s\n", kConfigNames[i], gNY[fConfigRenderSupport[i]]); + } + } } diff --git a/src/gpu/GrDrawTargetCaps.h b/src/gpu/GrDrawTargetCaps.h index 111b35bf74..11347e3cb6 100644 --- a/src/gpu/GrDrawTargetCaps.h +++ b/src/gpu/GrDrawTargetCaps.h @@ -7,6 +7,7 @@ */ #include "SkRefCnt.h" +#include "GrTypes.h" #ifndef GrDrawTargetCaps_DEFINED #define GrDrawTargetCaps_DEFINED @@ -43,6 +44,14 @@ public: // Will be 0 if MSAA is not supported int maxSampleCount() const { return fMaxSampleCount; } + /** + * Can the provided configuration act as a render target? + */ + bool isConfigRenderable(GrPixelConfig config) const { + SkASSERT(kGrPixelConfigCnt > config); + return fConfigRenderSupport[config]; + } + protected: bool f8BitPaletteSupport : 1; bool fNPOTTextureTileSupport : 1; @@ -61,6 +70,8 @@ protected: int fMaxTextureSize; int fMaxSampleCount; + bool fConfigRenderSupport[kGrPixelConfigCnt]; + typedef SkRefCnt INHERITED; }; diff --git a/src/gpu/GrGpu.cpp b/src/gpu/GrGpu.cpp index 7677b7c436..186091f20c 100644 --- a/src/gpu/GrGpu.cpp +++ b/src/gpu/GrGpu.cpp @@ -47,10 +47,6 @@ GrGpu::GrGpu(GrContext* context) poolState.fPoolIndexBuffer = (GrIndexBuffer*)DEBUG_INVAL_BUFFER; poolState.fPoolStartIndex = DEBUG_INVAL_START_IDX; #endif - - for (int i = 0; i < kGrPixelConfigCnt; ++i) { - fConfigRenderSupport[i] = false; - }; } GrGpu::~GrGpu() { diff --git a/src/gpu/GrGpu.h b/src/gpu/GrGpu.h index b449f9eb17..48caf7c410 100644 --- a/src/gpu/GrGpu.h +++ b/src/gpu/GrGpu.h @@ -290,14 +290,6 @@ public: return fResetTimestamp; } - /** - * Can the provided configuration act as a color render target? - */ - bool isConfigRenderable(GrPixelConfig config) const { - SkASSERT(kGrPixelConfigCnt > config); - return fConfigRenderSupport[config]; - } - /** * These methods are called by the clip manager's setupClipping function * which (called as part of GrGpu's implementation of onDraw and @@ -401,10 +393,6 @@ protected: // The final stencil settings to use as determined by the clip manager. GrStencilSettings fStencilSettings; - // Derived classes need access to this so they can fill it out in their - // constructors - bool fConfigRenderSupport[kGrPixelConfigCnt]; - // Helpers for setting up geometry state void finalizeReservedVertices(); void finalizeReservedIndices(); diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index 17a4743b67..eb0b245d0b 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -334,6 +334,67 @@ void GrGLCaps::init(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli) { } else if (GrGLCaps::kNone_MSFBOType != fMSFBOType) { GR_GL_GetIntegerv(gli, GR_GL_MAX_SAMPLES, &fMaxSampleCount); } + + this->initConfigRenderableTable(ctxInfo); +} + +void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { + + // OpenGL < 3.0 + // no support for render targets unless the GL_ARB_framebuffer_object + // extension is supported (in which case we get ALPHA, RED, RG, RGB, + // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we + // probably don't get R8 in this case. + + // OpenGL 3.0 + // base color renderable: ALPHA, RED, RG, RGB, and RGBA + // sized derivatives: ALPHA8, R8, RGBA4, RGBA8 + + // >= OpenGL 3.1 + // base color renderable: RED, RG, RGB, and RGBA + // sized derivatives: R8, RGBA4, RGBA8 + // if the GL_ARB_compatibility extension is supported then we get back + // support for GL_ALPHA and ALPHA8 + + // GL_EXT_bgra adds BGRA render targets to any version + + // ES 2.0 + // color renderable: RGBA4, RGB5_A1, RGB565 + // GL_EXT_texture_rg adds support for R8 as a color render target + // GL_OES_rgb8_rgba8 and/or GL_ARM_rgba8 adds support for RGBA8 + // GL_EXT_texture_format_BGRA8888 and/or GL_APPLE_texture_format_BGRA8888 added BGRA support + + // ES 3.0 + // Same as ES 2.0 except R8 and RGBA8 are supported without extensions (the functions called + // below already account for this). + + if (kDesktop_GrGLBinding == ctxInfo.binding()) { + // Post 3.0 we will get R8 + // Prior to 3.0 we will get ALPHA8 (with GL_ARB_framebuffer_object) + if (ctxInfo.version() >= GR_GL_VER(3,0) || + ctxInfo.hasExtension("GL_ARB_framebuffer_object")) { + fConfigRenderSupport[kAlpha_8_GrPixelConfig] = true; + } + } else { + // On ES we can only hope for R8 + fConfigRenderSupport[kAlpha_8_GrPixelConfig] = fTextureRedSupport; + } + + if (kDesktop_GrGLBinding != ctxInfo.binding()) { + // only available in ES + fConfigRenderSupport[kRGB_565_GrPixelConfig] = true; + } + + // we no longer support 444 as a render target + fConfigRenderSupport[kRGBA_4444_GrPixelConfig] = false; + + if (this->fRGBA8RenderbufferSupport) { + fConfigRenderSupport[kRGBA_8888_GrPixelConfig] = true; + } + + if (this->fBGRAFormatSupport) { + fConfigRenderSupport[kBGRA_8888_GrPixelConfig] = true; + } } bool GrGLCaps::readPixelsSupported(const GrGLInterface* intf, diff --git a/src/gpu/gl/GrGLCaps.h b/src/gpu/gl/GrGLCaps.h index 1eaae2287b..548e7f7ba4 100644 --- a/src/gpu/gl/GrGLCaps.h +++ b/src/gpu/gl/GrGLCaps.h @@ -286,8 +286,9 @@ private: } }; - void initFSAASupport(const GrGLContextInfo& ctxInfo, const GrGLInterface* gli); - void initStencilFormats(const GrGLContextInfo& ctxInfo); + void initFSAASupport(const GrGLContextInfo&, const GrGLInterface*); + void initStencilFormats(const GrGLContextInfo&); + void initConfigRenderableTable(const GrGLContextInfo&); // tracks configs that have been verified to pass the FBO completeness when // used as a color attachment diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index d313167a82..cdf9be9547 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -127,9 +127,6 @@ GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) fHWBoundTextures.reset(ctx.info().caps()->maxFragmentTextureUnits()); fHWTexGenSettings.reset(ctx.info().caps()->maxFixedFunctionTextureCoords()); - fillInConfigRenderableTable(); - - GrGLClearErr(fGLContext.interface()); if (gPrintStartupSpew) { @@ -177,65 +174,6 @@ GrGpuGL::~GrGpuGL() { /////////////////////////////////////////////////////////////////////////////// -void GrGpuGL::fillInConfigRenderableTable() { - - // OpenGL < 3.0 - // no support for render targets unless the GL_ARB_framebuffer_object - // extension is supported (in which case we get ALPHA, RED, RG, RGB, - // RGBA (ALPHA8, RGBA4, RGBA8) for OpenGL > 1.1). Note that we - // probably don't get R8 in this case. - - // OpenGL 3.0 - // base color renderable: ALPHA, RED, RG, RGB, and RGBA - // sized derivatives: ALPHA8, R8, RGBA4, RGBA8 - - // >= OpenGL 3.1 - // base color renderable: RED, RG, RGB, and RGBA - // sized derivatives: R8, RGBA4, RGBA8 - // if the GL_ARB_compatibility extension is supported then we get back - // support for GL_ALPHA and ALPHA8 - - // GL_EXT_bgra adds BGRA render targets to any version - - // ES 2.0 - // color renderable: RGBA4, RGB5_A1, RGB565 - // GL_EXT_texture_rg adds support for R8 as a color render target - // GL_OES_rgb8_rgba8 and/or GL_ARM_rgba8 adds support for RGBA8 - // GL_EXT_texture_format_BGRA8888 and/or GL_APPLE_texture_format_BGRA8888 added BGRA support - - // ES 3.0 - // Same as ES 2.0 except R8 and RGBA8 are supported without extensions (the functions called - // below already account for this). - - if (kDesktop_GrGLBinding == this->glBinding()) { - // Post 3.0 we will get R8 - // Prior to 3.0 we will get ALPHA8 (with GL_ARB_framebuffer_object) - if (this->glVersion() >= GR_GL_VER(3,0) || - this->hasExtension("GL_ARB_framebuffer_object")) { - fConfigRenderSupport[kAlpha_8_GrPixelConfig] = true; - } - } else { - // On ES we can only hope for R8 - fConfigRenderSupport[kAlpha_8_GrPixelConfig] = - this->glCaps().textureRedSupport(); - } - - if (kDesktop_GrGLBinding != this->glBinding()) { - // only available in ES - fConfigRenderSupport[kRGB_565_GrPixelConfig] = true; - } - - // we no longer support 444 as a render target - fConfigRenderSupport[kRGBA_4444_GrPixelConfig] = false; - - if (this->glCaps().rgba8RenderbufferSupport()) { - fConfigRenderSupport[kRGBA_8888_GrPixelConfig] = true; - } - - if (this->glCaps().bgraFormatSupport()) { - fConfigRenderSupport[kBGRA_8888_GrPixelConfig] = true; - } -} GrPixelConfig GrGpuGL::preferredReadPixelsConfig(GrPixelConfig readConfig, GrPixelConfig surfaceConfig) const { @@ -2460,8 +2398,8 @@ inline bool can_blit_framebuffer(const GrSurface* dst, const GrSurface* src, const GrGpuGL* gpu, bool* wouldNeedTempFBO = NULL) { - if (gpu->isConfigRenderable(dst->config()) && - gpu->isConfigRenderable(src->config()) && + if (gpu->glCaps().isConfigRenderable(dst->config()) && + gpu->glCaps().isConfigRenderable(src->config()) && gpu->glCaps().usesMSAARenderBuffers()) { // ES3 doesn't allow framebuffer blits when the src has MSAA and the configs don't match // or the rects are not the same (not just the same size but have the same edges). @@ -2501,7 +2439,7 @@ inline bool can_copy_texsubimage(const GrSurface* dst, if (NULL != srcRT && srcRT->renderFBOID() != srcRT->textureFBOID()) { return false; } - if (gpu->isConfigRenderable(src->config()) && NULL != dst->asTexture() && + if (gpu->glCaps().isConfigRenderable(src->config()) && NULL != dst->asTexture() && dst->origin() == src->origin() && kIndex_8_GrPixelConfig != src->config()) { if (NULL != wouldNeedTempFBO) { *wouldNeedTempFBO = NULL == src->asRenderTarget(); diff --git a/src/gpu/gl/GrGpuGL.h b/src/gpu/gl/GrGpuGL.h index 17699efc7f..aa3f0172f5 100644 --- a/src/gpu/gl/GrGpuGL.h +++ b/src/gpu/gl/GrGpuGL.h @@ -261,8 +261,6 @@ private: GrGLuint texID, GrGLRenderTarget::Desc* desc); - void fillInConfigRenderableTable(); - GrGLContext fGLContext; // GL program-related state