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;
}
}
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,
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;
- *externalType = GR_GL_HALF_FLOAT;
} else {
- *internalFormat = GR_GL_ALPHA16F;
+ 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 {
+ *externalType = GR_GL_HALF_FLOAT_OES;
}
break;
controlPixelData[i + 2] = SK_HalfEpsilon;
controlPixelData[i + 3] = 0x6800; // 2^11
}
-
+
for (int origin = 0; origin < 2; ++origin) {
int glCtxTypeCnt = 1;
glCtxTypeCnt = GrContextFactory::kGLContextTypeCnt;
desc.fConfig = kAlpha_half_GrPixelConfig;
desc.fOrigin = 0 == origin ?
kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin;
-
+
GrContext* context = NULL;
GrContextFactory::GLContextType type =
static_cast<GrContextFactory::GLContextType>(glCtxType);
if (NULL == context){
continue;
}
-
+
SkAutoTUnref<GrTexture> 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);