| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2015 Google Inc. | 2  * Copyright 2015 Google Inc. | 
| 3  * | 3  * | 
| 4  * Use of this source code is governed by a BSD-style license that can be | 4  * Use of this source code is governed by a BSD-style license that can be | 
| 5  * found in the LICENSE file. | 5  * found in the LICENSE file. | 
| 6  */ | 6  */ | 
| 7 | 7 | 
| 8 #include "Test.h" | 8 #include "Test.h" | 
| 9 #if SK_SUPPORT_GPU | 9 #if SK_SUPPORT_GPU | 
| 10 #include "SkCanvas.h" | 10 #include "SkCanvas.h" | 
| 11 | 11 | 
| 12 #include "SkSurface.h" | 12 #include "SkSurface.h" | 
| 13 #include "GrContextFactory.h" | 13 #include "GrContextFactory.h" | 
| 14 #include "GrCaps.h" | 14 #include "GrCaps.h" | 
|  | 15 #include "GrDrawContext.h" | 
| 15 | 16 | 
| 16 // using anonymous namespace because these functions are used as template params
     . | 17 // using anonymous namespace because these functions are used as template params
     . | 
| 17 namespace { | 18 namespace { | 
| 18 /** convert 0..1 srgb value to 0..1 linear */ | 19 /** convert 0..1 srgb value to 0..1 linear */ | 
| 19 float srgb_to_linear(float srgb) { | 20 float srgb_to_linear(float srgb) { | 
| 20     if (srgb <= 0.04045f) { | 21     if (srgb <= 0.04045f) { | 
| 21         return srgb / 12.92f; | 22         return srgb / 12.92f; | 
| 22     } else { | 23     } else { | 
| 23         return powf((srgb + 0.055f) / 1.055f, 2.4f); | 24         return powf((srgb + 0.055f) / 1.055f, 2.4f); | 
| 24     } | 25     } | 
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 130 | 131 | 
| 131             if (!checker(orig, read, error)) { | 132             if (!checker(orig, read, error)) { | 
| 132                 ERRORF(reporter, "Expected 0x%08x, read back as 0x%08x in %s at 
     %d, %d).", | 133                 ERRORF(reporter, "Expected 0x%08x, read back as 0x%08x in %s at 
     %d, %d).", | 
| 133                        orig, read, subtestName, i, j); | 134                        orig, read, subtestName, i, j); | 
| 134                 return; | 135                 return; | 
| 135             } | 136             } | 
| 136         } | 137         } | 
| 137     } | 138     } | 
| 138 } | 139 } | 
| 139 | 140 | 
|  | 141 #include "GrDrawTarget.h" | 
|  | 142 | 
| 140 // TODO: Add tests for copySurface between srgb/linear textures. Add tests for u
     npremul/premul | 143 // TODO: Add tests for copySurface between srgb/linear textures. Add tests for u
     npremul/premul | 
| 141 // conversion during read/write along with srgb/linear conversions. | 144 // conversion during read/write along with srgb/linear conversions. | 
| 142 DEF_GPUTEST(SRGBReadWritePixels, reporter, factory) { | 145 DEF_GPUTEST(SRGBReadWritePixels, reporter, factory) { | 
| 143 #if defined(GOOGLE3) | 146 #if defined(GOOGLE3) | 
| 144     // Stack frame size is limited in GOOGLE3. | 147     // Stack frame size is limited in GOOGLE3. | 
| 145     static const int kW = 63; | 148     static const int kW = 63; | 
| 146     static const int kH = 63; | 149     static const int kH = 63; | 
| 147 #else | 150 #else | 
| 148     static const int kW = 255; | 151     static const int kW = 255; | 
| 149     static const int kH = 255; | 152     static const int kH = 255; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 168         desc.fWidth = kW; | 171         desc.fWidth = kW; | 
| 169         desc.fHeight = kH; | 172         desc.fHeight = kH; | 
| 170         desc.fConfig = kSRGBA_8888_GrPixelConfig; | 173         desc.fConfig = kSRGBA_8888_GrPixelConfig; | 
| 171         if (context->caps()->isConfigRenderable(desc.fConfig, false) && | 174         if (context->caps()->isConfigRenderable(desc.fConfig, false) && | 
| 172             context->caps()->isConfigTexturable(desc.fConfig)) { | 175             context->caps()->isConfigTexturable(desc.fConfig)) { | 
| 173             SkAutoTUnref<GrTexture> tex(context->textureProvider()->createTextur
     e(desc, false)); | 176             SkAutoTUnref<GrTexture> tex(context->textureProvider()->createTextur
     e(desc, false)); | 
| 174             if (!tex) { | 177             if (!tex) { | 
| 175                 ERRORF(reporter, "Could not create SRGBA texture."); | 178                 ERRORF(reporter, "Could not create SRGBA texture."); | 
| 176                 continue; | 179                 continue; | 
| 177             } | 180             } | 
|  | 181             SkAutoTUnref<GrDrawContext> dc(context->drawContext(tex->asRenderTar
     get())); | 
|  | 182             if (!dc) { | 
|  | 183                 ERRORF(reporter, "Could not create SRGBA texture."); | 
|  | 184                 continue; | 
|  | 185             } | 
| 178 | 186 | 
| 179             float error = context->caps()->shaderCaps()->floatPrecisionVaries() 
     ? 1.2f  : 0.5f; | 187             float error = context->caps()->shaderCaps()->floatPrecisionVaries() 
     ? 1.2f  : 0.5f; | 
| 180 | 188 | 
| 181             // Write srgba data and read as srgba and then as rgba | 189             // Write srgba data and read as srgba and then as rgba | 
| 182             if (tex->writePixels(0, 0, kW, kH, kSRGBA_8888_GrPixelConfig, origDa
     ta)) { | 190             if (tex->writePixels(dc, 0, 0, kW, kH, kSRGBA_8888_GrPixelConfig, or
     igData)) { | 
| 183                 // For the all-srgba case, we allow a small error only for devic
     es that have | 191                 // For the all-srgba case, we allow a small error only for devic
     es that have | 
| 184                 // precision variation because the srgba data gets converted to 
     linear and back in | 192                 // precision variation because the srgba data gets converted to 
     linear and back in | 
| 185                 // the shader. | 193                 // the shader. | 
| 186                 float smallError = context->caps()->shaderCaps()->floatPrecision
     Varies() ? 1.f : | 194                 float smallError = context->caps()->shaderCaps()->floatPrecision
     Varies() ? 1.f : | 
| 187                                                                                 
                0.0f; | 195                                                                                 
                0.0f; | 
| 188                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 196                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 
| 189                                       check_srgb_to_linear_to_srgb_conversion, s
     mallError, | 197                                       check_srgb_to_linear_to_srgb_conversion, s
     mallError, | 
| 190                                       "write/read srgba to srgba texture"); | 198                                       "write/read srgba to srgba texture"); | 
| 191                 read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixe
     lConfig, | 199                 read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixe
     lConfig, | 
| 192                                       check_srgb_to_linear_conversion, error, | 200                                       check_srgb_to_linear_conversion, error, | 
| 193                                       "write srgba/read rgba with srgba texture"
     ); | 201                                       "write srgba/read rgba with srgba texture"
     ); | 
| 194             } else { | 202             } else { | 
| 195                 ERRORF(reporter, "Could not write srgba data to srgba texture.")
     ; | 203                 ERRORF(reporter, "Could not write srgba data to srgba texture.")
     ; | 
| 196             } | 204             } | 
| 197 | 205 | 
| 198             // Now verify that we can write linear data | 206             // Now verify that we can write linear data | 
| 199             if (tex->writePixels(0, 0, kW, kH, kRGBA_8888_GrPixelConfig, origDat
     a)) { | 207             if (tex->writePixels(dc, 0, 0, kW, kH, kRGBA_8888_GrPixelConfig, ori
     gData)) { | 
| 200                 // We allow more error on GPUs with lower precision shader varia
     bles. | 208                 // We allow more error on GPUs with lower precision shader varia
     bles. | 
| 201                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 209                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 
| 202                                       check_linear_to_srgb_conversion, error, | 210                                       check_linear_to_srgb_conversion, error, | 
| 203                                       "write rgba/read srgba with srgba texture"
     ); | 211                                       "write rgba/read srgba with srgba texture"
     ); | 
| 204                 read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixe
     lConfig, | 212                 read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixe
     lConfig, | 
| 205                                       check_linear_to_srgb_to_linear_conversion,
      error, | 213                                       check_linear_to_srgb_to_linear_conversion,
      error, | 
| 206                                       "write/read rgba with srgba texture"); | 214                                       "write/read rgba with srgba texture"); | 
| 207             } else { | 215             } else { | 
| 208                 ERRORF(reporter, "Could not write rgba data to srgba texture."); | 216                 ERRORF(reporter, "Could not write rgba data to srgba texture."); | 
| 209             } | 217             } | 
| 210 | 218 | 
| 211             desc.fConfig = kRGBA_8888_GrPixelConfig; | 219             desc.fConfig = kRGBA_8888_GrPixelConfig; | 
| 212             tex.reset(context->textureProvider()->createTexture(desc, false)); | 220             tex.reset(context->textureProvider()->createTexture(desc, false)); | 
| 213             if (!tex) { | 221             if (!tex) { | 
| 214                 ERRORF(reporter, "Could not create RGBA texture."); | 222                 ERRORF(reporter, "Could not create RGBA texture."); | 
| 215                 continue; | 223                 continue; | 
| 216             } | 224             } | 
|  | 225             dc.reset(context->drawContext(tex->asRenderTarget())); | 
|  | 226             if (!dc) { | 
|  | 227                 ERRORF(reporter, "Could not create SRGBA texture."); | 
|  | 228                 continue; | 
|  | 229             } | 
| 217 | 230 | 
| 218             // Write srgba data to a rgba texture and read back as srgba and rgb
     a | 231             // Write srgba data to a rgba texture and read back as srgba and rgb
     a | 
| 219             if (tex->writePixels(0, 0, kW, kH, kSRGBA_8888_GrPixelConfig, origDa
     ta)) { | 232             if (tex->writePixels(dc, 0, 0, kW, kH, kSRGBA_8888_GrPixelConfig, or
     igData)) { | 
| 220                read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPixe
     lConfig, | 233                read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPixe
     lConfig, | 
| 221                                       check_srgb_to_linear_to_srgb_conversion, e
     rror, | 234                                       check_srgb_to_linear_to_srgb_conversion, e
     rror, | 
| 222                                       "write/read srgba to rgba texture"); | 235                                       "write/read srgba to rgba texture"); | 
| 223                read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixel
     Config, | 236                read_and_check_pixels(reporter, tex, origData, kRGBA_8888_GrPixel
     Config, | 
| 224                                      check_srgb_to_linear_conversion, error, | 237                                      check_srgb_to_linear_conversion, error, | 
| 225                                      "write srgba/read rgba to rgba texture"); | 238                                      "write srgba/read rgba to rgba texture"); | 
| 226             } else { | 239             } else { | 
| 227                 ERRORF(reporter, "Could not write srgba data to rgba texture."); | 240                 ERRORF(reporter, "Could not write srgba data to rgba texture."); | 
| 228             } | 241             } | 
| 229 | 242 | 
| 230             // Write rgba data to a rgba texture and read back as srgba | 243             // Write rgba data to a rgba texture and read back as srgba | 
| 231             if (tex->writePixels(0, 0, kW, kH, kRGBA_8888_GrPixelConfig, origDat
     a)) { | 244             if (tex->writePixels(dc, 0, 0, kW, kH, kRGBA_8888_GrPixelConfig, ori
     gData)) { | 
| 232                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 245                 read_and_check_pixels(reporter, tex, origData, kSRGBA_8888_GrPix
     elConfig, | 
| 233                                       check_linear_to_srgb_conversion, 1.2f, | 246                                       check_linear_to_srgb_conversion, 1.2f, | 
| 234                                       "write rgba/read srgba to rgba texture"); | 247                                       "write rgba/read srgba to rgba texture"); | 
| 235             } else { | 248             } else { | 
| 236                 ERRORF(reporter, "Could not write rgba data to rgba texture."); | 249                 ERRORF(reporter, "Could not write rgba data to rgba texture."); | 
| 237             } | 250             } | 
| 238 } | 251 } | 
| 239     } | 252     } | 
| 240 } | 253 } | 
| 241 #endif | 254 #endif | 
| OLD | NEW | 
|---|