OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkBlurMask.h" | 8 #include "SkBlurMask.h" |
9 #include "SkBlurMaskFilter.h" | 9 #include "SkBlurMaskFilter.h" |
10 #include "SkBlurDrawLooper.h" | 10 #include "SkBlurDrawLooper.h" |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 | 266 |
267 SkBitmap bitmap; | 267 SkBitmap bitmap; |
268 bitmap.allocN32Pixels(resultCount, 30); | 268 bitmap.allocN32Pixels(resultCount, 30); |
269 SkCanvas canvas(bitmap); | 269 SkCanvas canvas(bitmap); |
270 | 270 |
271 blur_path(&canvas, path, gaussianSigma); | 271 blur_path(&canvas, path, gaussianSigma); |
272 readback(&canvas, result, resultCount); | 272 readback(&canvas, result, resultCount); |
273 } | 273 } |
274 | 274 |
275 #if SK_SUPPORT_GPU | 275 #if SK_SUPPORT_GPU |
276 #if 0 | |
277 // temporary disable; see below for explanation | |
278 static bool gpu_blur_path(GrContextFactory* factory, const SkPath& path, | 276 static bool gpu_blur_path(GrContextFactory* factory, const SkPath& path, |
279 SkScalar gaussianSigma, | 277 SkScalar gaussianSigma, |
280 int* result, int resultCount) { | 278 int* result, int resultCount) { |
281 | 279 |
282 GrContext* grContext = factory->get(GrContextFactory::kNative_GLContextType)
; | 280 GrContext* grContext = factory->get(GrContextFactory::kNative_GLContextType)
; |
283 if (NULL == grContext) { | 281 if (NULL == grContext) { |
284 return false; | 282 return false; |
285 } | 283 } |
286 | 284 |
287 GrTextureDesc desc; | 285 GrTextureDesc desc; |
288 desc.fConfig = kSkia8888_GrPixelConfig; | 286 desc.fConfig = kSkia8888_GrPixelConfig; |
289 desc.fFlags = kRenderTarget_GrTextureFlagBit; | 287 desc.fFlags = kRenderTarget_GrTextureFlagBit; |
290 desc.fWidth = resultCount; | 288 desc.fWidth = resultCount; |
291 desc.fHeight = 30; | 289 desc.fHeight = 30; |
292 desc.fSampleCnt = 0; | 290 desc.fSampleCnt = 0; |
293 | 291 |
294 SkAutoTUnref<GrTexture> texture(grContext->createUncachedTexture(desc, NULL,
0)); | 292 SkAutoTUnref<GrTexture> texture(grContext->createUncachedTexture(desc, NULL,
0)); |
295 SkAutoTUnref<SkGpuDevice> device(SkNEW_ARGS(SkGpuDevice, (grContext, texture
.get()))); | 293 SkAutoTUnref<SkGpuDevice> device(SkNEW_ARGS(SkGpuDevice, (grContext, texture
.get()))); |
296 SkCanvas canvas(device.get()); | 294 SkCanvas canvas(device.get()); |
297 | 295 |
298 blur_path(&canvas, path, gaussianSigma); | 296 blur_path(&canvas, path, gaussianSigma); |
299 readback(&canvas, result, resultCount); | 297 readback(&canvas, result, resultCount); |
300 return true; | 298 return true; |
301 } | 299 } |
302 #endif | 300 #endif |
303 #endif | |
304 | 301 |
305 #if WRITE_CSV | 302 #if WRITE_CSV |
306 static void write_as_csv(const char* label, SkScalar scale, int* data, int count
) { | 303 static void write_as_csv(const char* label, SkScalar scale, int* data, int count
) { |
307 SkDebugf("%s_%.2f,", label, scale); | 304 SkDebugf("%s_%.2f,", label, scale); |
308 for (int i = 0; i < count-1; ++i) { | 305 for (int i = 0; i < count-1; ++i) { |
309 SkDebugf("%d,", data[i]); | 306 SkDebugf("%d,", data[i]); |
310 } | 307 } |
311 SkDebugf("%d\n", data[count-1]); | 308 SkDebugf("%d\n", data[count-1]); |
312 } | 309 } |
313 #endif | 310 #endif |
(...skipping 25 matching lines...) Expand all Loading... |
339 { 100.3f, 0.3f }, | 336 { 100.3f, 0.3f }, |
340 { 100.3f, 100.3f }, | 337 { 100.3f, 100.3f }, |
341 { 0.3f, 100.3f }, | 338 { 0.3f, 100.3f }, |
342 { 2.3f, 50.3f } // a little divet to throw off the rect special case | 339 { 2.3f, 50.3f } // a little divet to throw off the rect special case |
343 }; | 340 }; |
344 SkPath polyPath; | 341 SkPath polyPath; |
345 polyPath.addPoly(polyPts, SK_ARRAY_COUNT(polyPts), true); | 342 polyPath.addPoly(polyPts, SK_ARRAY_COUNT(polyPts), true); |
346 | 343 |
347 int rectSpecialCaseResult[kSize]; | 344 int rectSpecialCaseResult[kSize]; |
348 int generalCaseResult[kSize]; | 345 int generalCaseResult[kSize]; |
| 346 #if SK_SUPPORT_GPU |
| 347 int gpuResult[kSize]; |
| 348 #endif |
349 int groundTruthResult[kSize]; | 349 int groundTruthResult[kSize]; |
350 int bruteForce1DResult[kSize]; | 350 int bruteForce1DResult[kSize]; |
351 | 351 |
352 SkScalar sigma = 10.0f; | 352 SkScalar sigma = 10.0f; |
353 | 353 |
354 for (int i = 0; i < 4; ++i, sigma /= 10) { | 354 for (int i = 0; i < 4; ++i, sigma /= 10) { |
355 | 355 |
356 cpu_blur_path(rectPath, sigma, rectSpecialCaseResult, kSize); | 356 cpu_blur_path(rectPath, sigma, rectSpecialCaseResult, kSize); |
357 cpu_blur_path(polyPath, sigma, generalCaseResult, kSize); | 357 cpu_blur_path(polyPath, sigma, generalCaseResult, kSize); |
358 | 358 #if SK_SUPPORT_GPU |
| 359 bool haveGPUResult = gpu_blur_path(factory, rectPath, sigma, gpuResult,
kSize); |
| 360 #endif |
359 ground_truth_2d(100, 100, sigma, groundTruthResult, kSize); | 361 ground_truth_2d(100, 100, sigma, groundTruthResult, kSize); |
360 brute_force_1d(-50.0f, 50.0f, sigma, bruteForce1DResult, kSize); | 362 brute_force_1d(-50.0f, 50.0f, sigma, bruteForce1DResult, kSize); |
361 | 363 |
362 REPORTER_ASSERT(reporter, match(rectSpecialCaseResult, bruteForce1DResul
t, kSize, 5)); | 364 REPORTER_ASSERT(reporter, match(rectSpecialCaseResult, bruteForce1DResul
t, kSize, 5)); |
363 REPORTER_ASSERT(reporter, match(generalCaseResult, bruteForce1DResult, k
Size, 15)); | 365 REPORTER_ASSERT(reporter, match(generalCaseResult, bruteForce1DResult, k
Size, 15)); |
364 #if SK_SUPPORT_GPU | 366 #if SK_SUPPORT_GPU |
365 #if 0 | |
366 int gpuResult[kSize]; | |
367 bool haveGPUResult = gpu_blur_path(factory, rectPath, sigma, gpuResult,
kSize); | |
368 // Disabling this test for now -- I don't think it's a legit comparison. | |
369 // Will continue to investigate this. | |
370 if (haveGPUResult) { | 367 if (haveGPUResult) { |
371 // 1 works everywhere but: Ubuntu13 & Nexus4 | 368 // 1 works everywhere but: Ubuntu13 & Nexus4 |
372 REPORTER_ASSERT(reporter, match(gpuResult, bruteForce1DResult, kSize
, 10)); | 369 REPORTER_ASSERT(reporter, match(gpuResult, bruteForce1DResult, kSize
, 10)); |
373 } | 370 } |
374 #endif | 371 #endif |
375 #endif | |
376 REPORTER_ASSERT(reporter, match(groundTruthResult, bruteForce1DResult, k
Size, 1)); | 372 REPORTER_ASSERT(reporter, match(groundTruthResult, bruteForce1DResult, k
Size, 1)); |
377 | 373 |
378 #if WRITE_CSV | 374 #if WRITE_CSV |
379 write_as_csv("RectSpecialCase", sigma, rectSpecialCaseResult, kSize); | 375 write_as_csv("RectSpecialCase", sigma, rectSpecialCaseResult, kSize); |
380 write_as_csv("GeneralCase", sigma, generalCaseResult, kSize); | 376 write_as_csv("GeneralCase", sigma, generalCaseResult, kSize); |
381 #if SK_SUPPORT_GPU | 377 #if SK_SUPPORT_GPU |
382 write_as_csv("GPU", sigma, gpuResult, kSize); | 378 write_as_csv("GPU", sigma, gpuResult, kSize); |
383 #endif | 379 #endif |
384 write_as_csv("GroundTruth2D", sigma, groundTruthResult, kSize); | 380 write_as_csv("GroundTruth2D", sigma, groundTruthResult, kSize); |
385 write_as_csv("BruteForce1D", sigma, bruteForce1DResult, kSize); | 381 write_as_csv("BruteForce1D", sigma, bruteForce1DResult, kSize); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
564 } | 560 } |
565 } | 561 } |
566 | 562 |
567 ////////////////////////////////////////////////////////////////////////////////
/////////// | 563 ////////////////////////////////////////////////////////////////////////////////
/////////// |
568 | 564 |
569 DEF_GPUTEST(Blur, reporter, factory) { | 565 DEF_GPUTEST(Blur, reporter, factory) { |
570 test_blur_drawing(reporter); | 566 test_blur_drawing(reporter); |
571 test_sigma_range(reporter, factory); | 567 test_sigma_range(reporter, factory); |
572 test_asABlur(reporter); | 568 test_asABlur(reporter); |
573 } | 569 } |
OLD | NEW |