| 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 |