From 1334c21eee8c5b0b216895934e7a8e1c08c6f510 Mon Sep 17 00:00:00 2001 From: jvanverth Date: Thu, 18 Dec 2014 05:44:55 -0800 Subject: [PATCH] One more pass at getting half float texture configs correct. Added in check for sized internal format. Made choice between RED and ALPHA orthogonal to HALF_FLOAT and HALF_FLOAT_OES. Enabled rendertarget support on ES 2.0. Review URL: https://codereview.chromium.org/805033002 --- src/gpu/gl/GrGLCaps.cpp | 19 +++++++++++++------ src/gpu/gl/GrGpuGL.cpp | 25 ++++++++++++++++--------- tests/FloatingPointTextureTest.cpp | 10 +++++----- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/gpu/gl/GrGLCaps.cpp b/src/gpu/gl/GrGLCaps.cpp index c1eb6e10e2..cfb9558c76 100644 --- a/src/gpu/gl/GrGLCaps.cpp +++ b/src/gpu/gl/GrGLCaps.cpp @@ -497,10 +497,17 @@ void GrGLCaps::initConfigRenderableTable(const GrGLContextInfo& ctxInfo) { if (kGL_GrGLStandard == standard) { fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = true; + } else if (ctxInfo.version() >= GR_GL_VER(3,0)) { + fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; + // for now we don't support floating point MSAA on ES + fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false; } else { - // in theory, check for "GL_EXT_color_buffer_half_float" - // for now we don't support half float alpha render target on ES - fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = false; + if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float") && fTextureRedSupport) { + fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = true; + } else { + fConfigRenderSupport[kAlpha_half_GrPixelConfig][kNo_MSAA] = false; + } + // for now we don't support floating point MSAA on ES fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false; } } @@ -649,10 +656,10 @@ void GrGLCaps::initConfigTexturableTable(const GrGLContextInfo& ctxInfo, const G bool hasHalfFPTextures = version >= GR_GL_VER(3, 1); if (!hasHalfFPTextures) { hasHalfFPTextures = ctxInfo.hasExtension("GL_ARB_texture_float") || - (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") && - ctxInfo.hasExtension("GL_OES_texture_half_float")); + (ctxInfo.hasExtension("GL_OES_texture_half_float_linear") && + ctxInfo.hasExtension("GL_OES_texture_half_float")); } - fConfigTextureSupport[kAlpha_half_GrPixelConfig] = hasHalfFPTextures && fTextureRedSupport; + fConfigTextureSupport[kAlpha_half_GrPixelConfig] = hasHalfFPTextures; } bool GrGLCaps::doReadPixelsSupported(const GrGLInterface* intf, diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp index 92b00c3f5c..5987c7000f 100644 --- a/src/gpu/gl/GrGpuGL.cpp +++ b/src/gpu/gl/GrGpuGL.cpp @@ -2386,18 +2386,25 @@ bool GrGLGpu::configToGLFormats(GrPixelConfig config, break; case kAlpha_half_GrPixelConfig: - if (kGLES_GrGLStandard == this->glStandard() && this->glVersion() < GR_GL_VER(3, 1)) { - *internalFormat = GR_GL_ALPHA; - *externalFormat = GR_GL_ALPHA; - *externalType = GR_GL_HALF_FLOAT_OES; - } else if (this->glCaps().textureRedSupport()) { - *internalFormat = GR_GL_R16F; + if (this->glCaps().textureRedSupport()) { + if (getSizedInternalFormat) { + *internalFormat = GR_GL_R16F; + } else { + *internalFormat = GR_GL_RED; + } *externalFormat = GR_GL_RED; + } else { + if (getSizedInternalFormat) { + *internalFormat = GR_GL_ALPHA16F; + } else { + *internalFormat = GR_GL_ALPHA; + } + *externalFormat = GR_GL_ALPHA; + } + if (kGL_GrGLStandard == this->glStandard() || this->glVersion() >= GR_GL_VER(3, 0)) { *externalType = GR_GL_HALF_FLOAT; } else { - *internalFormat = GR_GL_ALPHA16F; - *externalFormat = GR_GL_ALPHA; - *externalType = GR_GL_HALF_FLOAT; + *externalType = GR_GL_HALF_FLOAT_OES; } break; diff --git a/tests/FloatingPointTextureTest.cpp b/tests/FloatingPointTextureTest.cpp index 5cf1f0a449..346c737992 100644 --- a/tests/FloatingPointTextureTest.cpp +++ b/tests/FloatingPointTextureTest.cpp @@ -90,7 +90,7 @@ DEF_GPUTEST(HalfFloatTextureTest, reporter, factory) { controlPixelData[i + 2] = SK_HalfEpsilon; controlPixelData[i + 3] = 0x6800; // 2^11 } - + for (int origin = 0; origin < 2; ++origin) { int glCtxTypeCnt = 1; glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt; @@ -102,7 +102,7 @@ DEF_GPUTEST(HalfFloatTextureTest, reporter, factory) { desc.fConfig = kAlpha_half_GrPixelConfig; desc.fOrigin = 0 == origin ? kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin; - + GrContext* context = NULL; GrContextFactory::GLContextType type = static_cast(glCtxType); @@ -113,16 +113,16 @@ DEF_GPUTEST(HalfFloatTextureTest, reporter, factory) { if (NULL == context){ continue; } - + SkAutoTUnref fpTexture(context->createUncachedTexture(desc, NULL, 0)); - + // 16-bit floating point textures are NOT supported everywhere if (NULL == fpTexture) { continue; } - + // write square fpTexture->writePixels(0, 0, DEV_W, DEV_H, desc.fConfig, controlPixelData, 0); fpTexture->readPixels(0, 0, DEV_W, DEV_H, desc.fConfig, readBuffer, 0);