fConfigRenderSupport[kRGBA_float_GrPixelConfig][kNo_MSAA] = false;
}
// for now we don't support floating point MSAA on ES
- fConfigRenderSupport[kAlpha_half_GrPixelConfig][kYes_MSAA] = false;
+ fConfigRenderSupport[kRGBA_float_GrPixelConfig][kYes_MSAA] = false;
}
}
}
}
+ if (this->isConfigTexturable(kRGBA_half_GrPixelConfig)) {
+ if (kGL_GrGLStandard == standard) {
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = true;
+ } else if (ctxInfo.version() >= GR_GL_VER(3, 0)) {
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
+ // for now we don't support floating point MSAA on ES
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false;
+ } else {
+ if (ctxInfo.hasExtension("GL_EXT_color_buffer_half_float")) {
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = true;
+ } else {
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kNo_MSAA] = false;
+ }
+ // for now we don't support floating point MSAA on ES
+ fConfigRenderSupport[kRGBA_half_GrPixelConfig][kYes_MSAA] = false;
+ }
+ }
+
// If we don't support MSAA then undo any places above where we set a config as renderable with
// msaa.
if (kNone_MSFBOType == fMSFBOType) {
ctxInfo.hasExtension("GL_OES_texture_half_float"));
}
fConfigTextureSupport[kAlpha_half_GrPixelConfig] = hasHalfFPTextures;
+ fConfigTextureSupport[kRGBA_half_GrPixelConfig] = hasHalfFPTextures;
}
bool GrGLCaps::doReadPixelsSupported(const GrGLInterface* intf,
#include "SkHalf.h"
static const int DEV_W = 100, DEV_H = 100;
-static const int FP_CONTROL_ARRAY_SIZE = DEV_W * DEV_H * 4/*RGBA*/;
-static const float kMaxIntegerRepresentableInSPFloatingPoint = 16777216; // 2 ^ 24
-
static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H);
-DEF_GPUTEST(FloatingPointTextureTest, reporter, factory) {
- SkTDArray<float> controlPixelData, readBuffer;
- controlPixelData.setCount(FP_CONTROL_ARRAY_SIZE);
- readBuffer.setCount(FP_CONTROL_ARRAY_SIZE);
-
- for (int i = 0; i < FP_CONTROL_ARRAY_SIZE; i += 4) {
- controlPixelData[i + 0] = FLT_MIN;
- controlPixelData[i + 1] = FLT_MAX;
- controlPixelData[i + 2] = FLT_EPSILON;
- controlPixelData[i + 3] = kMaxIntegerRepresentableInSPFloatingPoint;
+template <typename T>
+void runFPTest(skiatest::Reporter* reporter, GrContextFactory* factory,
+ T min, T max, T epsilon, T maxInt, int arraySize, GrPixelConfig config) {
+ SkTDArray<T> controlPixelData, readBuffer;
+ controlPixelData.setCount(arraySize);
+ readBuffer.setCount(arraySize);
+
+ for (int i = 0; i < arraySize; i += 4) {
+ controlPixelData[i + 0] = min;
+ controlPixelData[i + 1] = max;
+ controlPixelData[i + 2] = epsilon;
+ controlPixelData[i + 3] = maxInt;
}
for (int origin = 0; origin < 2; ++origin) {
for (int glCtxType = 0; glCtxType < GrContextFactory::kGLContextTypeCnt; ++glCtxType) {
GrSurfaceDesc desc;
- desc.fFlags = kRenderTarget_GrSurfaceFlag;
- desc.fWidth = DEV_W;
+ desc.fFlags = kRenderTarget_GrSurfaceFlag;
+ desc.fWidth = DEV_W;
desc.fHeight = DEV_H;
- desc.fConfig = kRGBA_float_GrPixelConfig;
+ desc.fConfig = config;
desc.fOrigin = 0 == origin ?
- kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin;
+ kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin;
GrContextFactory::GLContextType type =
static_cast<GrContextFactory::GLContextType>(glCtxType);
continue;
}
GrContext* context = factory->get(type);
- if (NULL == context){
+ if (NULL == context) {
continue;
}
}
fpTexture->readPixels(0, 0, DEV_W, DEV_H, desc.fConfig, readBuffer.begin(), 0);
REPORTER_ASSERT(reporter,
- 0 == memcmp(readBuffer.begin(), controlPixelData.begin(), readBuffer.bytes()));
+ 0 == memcmp(readBuffer.begin(), controlPixelData.begin(), readBuffer.bytes()));
}
}
}
-static const int HALF_CONTROL_ARRAY_SIZE = DEV_W * DEV_H * 1 /*alpha-only*/;
+static const int FP_CONTROL_ARRAY_SIZE = DEV_W * DEV_H * 4/*RGBA*/;
+static const float kMaxIntegerRepresentableInSPFloatingPoint = 16777216; // 2 ^ 24
-DEF_GPUTEST(HalfFloatTextureTest, reporter, factory) {
- SkTDArray<SkHalf> controlPixelData, readBuffer;
- controlPixelData.setCount(HALF_CONTROL_ARRAY_SIZE);
- readBuffer.setCount(HALF_CONTROL_ARRAY_SIZE);
+DEF_GPUTEST(FloatingPointTextureTest, reporter, factory) {
+ runFPTest<float>(reporter, factory, FLT_MIN, FLT_MAX, FLT_EPSILON,
+ kMaxIntegerRepresentableInSPFloatingPoint,
+ FP_CONTROL_ARRAY_SIZE, kRGBA_float_GrPixelConfig);
+}
- for (int i = 0; i < HALF_CONTROL_ARRAY_SIZE; i += 4) {
- controlPixelData[i + 0] = SK_HalfMin;
- controlPixelData[i + 1] = SK_HalfMax;
- controlPixelData[i + 2] = SK_HalfEpsilon;
- controlPixelData[i + 3] = 0x6800; // 2^11
- }
+static const int HALF_ALPHA_CONTROL_ARRAY_SIZE = DEV_W * DEV_H * 1 /*alpha-only*/;
+static const SkHalf kMaxIntegerRepresentableInHalfFloatingPoint = 0x6800; // 2 ^ 11
- for (int origin = 0; origin < 2; ++origin) {
- for (int glCtxType = 0; glCtxType < GrContextFactory::kGLContextTypeCnt; ++glCtxType) {
- GrSurfaceDesc desc;
- desc.fFlags = kRenderTarget_GrSurfaceFlag;
- desc.fWidth = DEV_W;
- desc.fHeight = DEV_H;
- desc.fConfig = kAlpha_half_GrPixelConfig;
- desc.fOrigin = 0 == origin ?
- kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin;
+DEF_GPUTEST(HalfFloatAlphaTextureTest, reporter, factory) {
+ runFPTest<SkHalf>(reporter, factory, SK_HalfMin, SK_HalfMax, SK_HalfEpsilon,
+ kMaxIntegerRepresentableInHalfFloatingPoint,
+ HALF_ALPHA_CONTROL_ARRAY_SIZE, kAlpha_half_GrPixelConfig);
+}
- GrContextFactory::GLContextType type =
- static_cast<GrContextFactory::GLContextType>(glCtxType);
- if (!GrContextFactory::IsRenderingGLContext(type)) {
- continue;
- }
- GrContext* context = factory->get(type);
- if (NULL == context){
- continue;
- }
+static const int HALF_RGBA_CONTROL_ARRAY_SIZE = DEV_W * DEV_H * 4 /*RGBA*/;
- SkAutoTUnref<GrTexture> fpTexture(context->textureProvider()->createTexture(
- desc, false, controlPixelData.begin(), 0));
- // 16-bit floating point textures are NOT supported everywhere
- if (NULL == fpTexture) {
- continue;
- }
- fpTexture->readPixels(0, 0, DEV_W, DEV_H, desc.fConfig, readBuffer.begin(), 0);
- REPORTER_ASSERT(reporter,
- 0 == memcmp(readBuffer.begin(), controlPixelData.begin(), readBuffer.bytes()));
- }
- }
+DEF_GPUTEST(HalfFloatRGBATextureTest, reporter, factory) {
+ runFPTest<SkHalf>(reporter, factory, SK_HalfMin, SK_HalfMax, SK_HalfEpsilon,
+ kMaxIntegerRepresentableInHalfFloatingPoint,
+ HALF_RGBA_CONTROL_ARRAY_SIZE, kRGBA_half_GrPixelConfig);
}
#endif