Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: tests/ReadWriteAlphaTest.cpp

Issue 2187573002: Reduce usage of MakeRenderTargetDirect (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Clean up Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tests/ReadPixelsTest.cpp ('k') | tests/SurfaceTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 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 9
10 // This test is specific to the GPU backend. 10 // This test is specific to the GPU backend.
(...skipping 23 matching lines...) Expand all
34 } 34 }
35 } 35 }
36 36
37 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ReadWriteAlpha, reporter, ctxInfo) { 37 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ReadWriteAlpha, reporter, ctxInfo) {
38 unsigned char alphaData[X_SIZE * Y_SIZE]; 38 unsigned char alphaData[X_SIZE * Y_SIZE];
39 39
40 static const int kClearValue = 0x2; 40 static const int kClearValue = 0x2;
41 41
42 bool match; 42 bool match;
43 static const size_t kRowBytes[] = {0, X_SIZE, X_SIZE + 1, 2 * X_SIZE - 1}; 43 static const size_t kRowBytes[] = {0, X_SIZE, X_SIZE + 1, 2 * X_SIZE - 1};
44 for (int rt = 0; rt < 2; ++rt) { 44 {
45 GrSurfaceDesc desc; 45 GrSurfaceDesc desc;
46 // let Skia know we will be using this texture as a render target 46 desc.fFlags = kNone_GrSurfaceFlags;
47 desc.fFlags = rt ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlag s; 47 desc.fConfig = kAlpha_8_GrPixelConfig; // it is a single channel t exture
48 // it is a single channel texture
49 desc.fConfig = kAlpha_8_GrPixelConfig;
50 desc.fWidth = X_SIZE; 48 desc.fWidth = X_SIZE;
51 desc.fHeight = Y_SIZE; 49 desc.fHeight = Y_SIZE;
52 50
53 // We are initializing the texture with zeros here 51 // We are initializing the texture with zeros here
54 memset(alphaData, 0, X_SIZE * Y_SIZE); 52 memset(alphaData, 0, X_SIZE * Y_SIZE);
55 SkAutoTUnref<GrTexture> texture( 53 SkAutoTUnref<GrTexture> texture(
56 ctxInfo.grContext()->textureProvider()->createTexture(desc, SkBudget ed::kNo, alphaData, 54 ctxInfo.grContext()->textureProvider()->createTexture(desc, SkBudget ed::kNo, alphaData,
57 0)); 55 0));
58 if (!texture) { 56 if (!texture) {
59 if (!rt) { 57 ERRORF(reporter, "Could not create alpha texture.");
60 ERRORF(reporter, "Could not create alpha texture."); 58 return;
61 }
62 continue;
63 } 59 }
64 60
61 const SkImageInfo ii = SkImageInfo::MakeA8(X_SIZE, Y_SIZE);
62 sk_sp<SkSurface> surf(SkSurface::MakeRenderTarget(ctxInfo.grContext(),
63 SkBudgeted::kNo, ii));
64
65 // create a distinctive texture 65 // create a distinctive texture
66 for (int y = 0; y < Y_SIZE; ++y) { 66 for (int y = 0; y < Y_SIZE; ++y) {
67 for (int x = 0; x < X_SIZE; ++x) { 67 for (int x = 0; x < X_SIZE; ++x) {
68 alphaData[y * X_SIZE + x] = y*X_SIZE+x; 68 alphaData[y * X_SIZE + x] = y*X_SIZE+x;
69 } 69 }
70 } 70 }
71 71
72 for (auto rowBytes : kRowBytes) { 72 for (auto rowBytes : kRowBytes) {
73 // upload the texture (do per-rowbytes iteration because we may over write below). 73 // upload the texture (do per-rowbytes iteration because we may over write below).
74 bool result = texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, 74 bool result = texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig,
75 alphaData, 0); 75 alphaData, 0);
76 REPORTER_ASSERT_MESSAGE(reporter, result, "Initial A8 writePixels fa iled"); 76 REPORTER_ASSERT_MESSAGE(reporter, result, "Initial A8 writePixels fa iled");
77 77
78 size_t nonZeroRowBytes = rowBytes ? rowBytes : X_SIZE; 78 size_t nonZeroRowBytes = rowBytes ? rowBytes : X_SIZE;
79 SkAutoTDeleteArray<uint8_t> readback(new uint8_t[nonZeroRowBytes * Y _SIZE]); 79 SkAutoTDeleteArray<uint8_t> readback(new uint8_t[nonZeroRowBytes * Y _SIZE]);
80 // clear readback to something non-zero so we can detect readback fa ilures 80 // clear readback to something non-zero so we can detect readback fa ilures
81 memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE); 81 memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE);
82 82
83 // read the texture back 83 // read the texture back
84 result = texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.f Config, 84 result = texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.f Config,
85 readback.get(), rowBytes); 85 readback.get(), rowBytes);
86 REPORTER_ASSERT_MESSAGE(reporter, result, "Initial A8 readPixels fai led"); 86 REPORTER_ASSERT_MESSAGE(reporter, result, "Initial A8 readPixels fai led");
87 87
88 // make sure the original & read back versions match 88 // make sure the original & read back versions match
89 SkString msg; 89 SkString msg;
90 msg.printf("rt:%d, rb:%d A8", rt, SkToU32(rowBytes)); 90 msg.printf("rb:%d A8", SkToU32(rowBytes));
91 validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), nonZer oRowBytes, 91 validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), nonZer oRowBytes,
92 alphaData, msg); 92 alphaData, msg);
93 93
94 // Now try writing on the single channel texture (if we could create as a RT). 94 // Now try writing to a single channel surface (if we could create o ne).
95 if (texture->asRenderTarget()) { 95 if (surf) {
96 sk_sp<SkSurface> surf(SkSurface::MakeRenderTargetDirect(texture- >asRenderTarget(),
97 nullptr) );
98 SkCanvas* canvas = surf->getCanvas(); 96 SkCanvas* canvas = surf->getCanvas();
99 97
100 SkPaint paint; 98 SkPaint paint;
101 99
102 const SkRect rect = SkRect::MakeLTRB(-10, -10, X_SIZE + 10, Y_SI ZE + 10); 100 const SkRect rect = SkRect::MakeLTRB(-10, -10, X_SIZE + 10, Y_SI ZE + 10);
103 101
104 paint.setColor(SK_ColorWHITE); 102 paint.setColor(SK_ColorWHITE);
105 103
106 canvas->drawRect(rect, paint); 104 canvas->drawRect(rect, paint);
107 105
108 memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE); 106 memset(readback.get(), kClearValue, nonZeroRowBytes * Y_SIZE);
109 result = texture->readPixels(0, 0, desc.fWidth, desc.fHeight, 107 result = surf->readPixels(ii, readback.get(), nonZeroRowBytes, 0 , 0);
110 desc.fConfig, readback.get(), rowBy tes);
111 REPORTER_ASSERT_MESSAGE(reporter, result, "A8 readPixels after c lear failed"); 108 REPORTER_ASSERT_MESSAGE(reporter, result, "A8 readPixels after c lear failed");
112 109
113 match = true; 110 match = true;
114 for (int y = 0; y < Y_SIZE && match; ++y) { 111 for (int y = 0; y < Y_SIZE && match; ++y) {
115 for (int x = 0; x < X_SIZE && match; ++x) { 112 for (int x = 0; x < X_SIZE && match; ++x) {
116 uint8_t rbValue = readback.get()[y * nonZeroRowBytes + x ]; 113 uint8_t rbValue = readback.get()[y * nonZeroRowBytes + x ];
117 if (0xFF != rbValue) { 114 if (0xFF != rbValue) {
118 ERRORF(reporter, 115 ERRORF(reporter,
119 "Failed alpha readback after clear. Expected: 0xFF, Got: 0x%02x" 116 "Failed alpha readback after clear. Expected: 0xFF, Got: 0x%02x"
120 " at (%d,%d), rb:%d", rbValue, x, y, SkToU32( rowBytes)); 117 " at (%d,%d), rb:%d", rbValue, x, y, SkToU32( rowBytes));
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 SkString msg; 180 SkString msg;
184 msg.printf("rt:%d, rb:%d 8888", rt, SkToU32(rowBytes)); 181 msg.printf("rt:%d, rb:%d 8888", rt, SkToU32(rowBytes));
185 validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), no nZeroRowBytes, 182 validate_alpha_data(reporter, X_SIZE, Y_SIZE, readback.get(), no nZeroRowBytes,
186 alphaData, msg); 183 alphaData, msg);
187 } 184 }
188 } 185 }
189 } 186 }
190 } 187 }
191 188
192 #endif 189 #endif
OLDNEW
« no previous file with comments | « tests/ReadPixelsTest.cpp ('k') | tests/SurfaceTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698