OLD | NEW |
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. |
11 #if SK_SUPPORT_GPU && !defined(SK_BUILD_FOR_ANDROID) | 11 #if SK_SUPPORT_GPU && !defined(SK_BUILD_FOR_ANDROID) |
12 | 12 |
13 #include "GrContextFactory.h" | 13 #include "GrContext.h" |
14 #include "SkGpuDevice.h" | 14 #include "SkGpuDevice.h" |
15 | 15 |
16 static const int X_SIZE = 12; | 16 static const int X_SIZE = 12; |
17 static const int Y_SIZE = 12; | 17 static const int Y_SIZE = 12; |
18 | 18 |
19 DEF_GPUTEST(ReadWriteAlpha, reporter, factory) { | 19 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ReadWriteAlpha, reporter, context) { |
20 for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { | 20 unsigned char textureData[X_SIZE][Y_SIZE]; |
21 GrContextFactory::GLContextType glType = static_cast<GrContextFactory::G
LContextType>(type); | 21 |
22 if (!GrContextFactory::IsRenderingGLContext(glType)) { | 22 memset(textureData, 0, X_SIZE * Y_SIZE); |
23 continue; | 23 |
| 24 GrSurfaceDesc desc; |
| 25 |
| 26 // let Skia know we will be using this texture as a render target |
| 27 desc.fFlags = kRenderTarget_GrSurfaceFlag; |
| 28 // it is a single channel texture |
| 29 desc.fConfig = kAlpha_8_GrPixelConfig; |
| 30 desc.fWidth = X_SIZE; |
| 31 desc.fHeight = Y_SIZE; |
| 32 |
| 33 // We are initializing the texture with zeros here |
| 34 GrTexture* texture = context->textureProvider()->createTexture(desc, false,
textureData, 0); |
| 35 if (!texture) { |
| 36 return; |
| 37 } |
| 38 |
| 39 SkAutoTUnref<GrTexture> au(texture); |
| 40 |
| 41 // create a distinctive texture |
| 42 for (int y = 0; y < Y_SIZE; ++y) { |
| 43 for (int x = 0; x < X_SIZE; ++x) { |
| 44 textureData[x][y] = x*Y_SIZE+y; |
24 } | 45 } |
25 GrContext* context = factory->get(glType); | 46 } |
26 if (nullptr == context) { | |
27 continue; | |
28 } | |
29 | 47 |
30 unsigned char textureData[X_SIZE][Y_SIZE]; | 48 // upload the texture |
| 49 texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, |
| 50 textureData, 0); |
31 | 51 |
32 memset(textureData, 0, X_SIZE * Y_SIZE); | 52 unsigned char readback[X_SIZE][Y_SIZE]; |
33 | 53 |
34 GrSurfaceDesc desc; | 54 // clear readback to something non-zero so we can detect readback failures |
| 55 memset(readback, 0x1, X_SIZE * Y_SIZE); |
35 | 56 |
36 // let Skia know we will be using this texture as a render target | 57 // read the texture back |
37 desc.fFlags = kRenderTarget_GrSurfaceFlag; | 58 texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, |
38 // it is a single channel texture | 59 readback, 0); |
39 desc.fConfig = kAlpha_8_GrPixelConfig; | |
40 desc.fWidth = X_SIZE; | |
41 desc.fHeight = Y_SIZE; | |
42 | 60 |
43 // We are initializing the texture with zeros here | 61 // make sure the original & read back versions match |
44 GrTexture* texture = context->textureProvider()->createTexture(desc, fal
se, textureData, 0); | 62 bool match = true; |
45 if (!texture) { | |
46 return; | |
47 } | |
48 | 63 |
49 SkAutoTUnref<GrTexture> au(texture); | 64 for (int y = 0; y < Y_SIZE; ++y) { |
50 | 65 for (int x = 0; x < X_SIZE; ++x) { |
51 // create a distinctive texture | 66 if (textureData[x][y] != readback[x][y]) { |
52 for (int y = 0; y < Y_SIZE; ++y) { | 67 match = false; |
53 for (int x = 0; x < X_SIZE; ++x) { | |
54 textureData[x][y] = x*Y_SIZE+y; | |
55 } | 68 } |
56 } | 69 } |
| 70 } |
57 | 71 |
58 // upload the texture | 72 REPORTER_ASSERT(reporter, match); |
59 texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, | |
60 textureData, 0); | |
61 | 73 |
62 unsigned char readback[X_SIZE][Y_SIZE]; | 74 // Now try writing on the single channel texture |
| 75 SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); |
| 76 SkAutoTUnref<SkBaseDevice> device(SkGpuDevice::Create(texture->asRenderTarge
t(), &props, |
| 77 SkGpuDevice::kUninit_I
nitContents)); |
| 78 SkCanvas canvas(device); |
63 | 79 |
64 // clear readback to something non-zero so we can detect readback failur
es | 80 SkPaint paint; |
65 memset(readback, 0x1, X_SIZE * Y_SIZE); | |
66 | 81 |
67 // read the texture back | 82 const SkRect rect = SkRect::MakeLTRB(-10, -10, X_SIZE + 10, Y_SIZE + 10); |
68 texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, | |
69 readback, 0); | |
70 | 83 |
71 // make sure the original & read back versions match | 84 paint.setColor(SK_ColorWHITE); |
72 bool match = true; | |
73 | 85 |
74 for (int y = 0; y < Y_SIZE; ++y) { | 86 canvas.drawRect(rect, paint); |
75 for (int x = 0; x < X_SIZE; ++x) { | 87 |
76 if (textureData[x][y] != readback[x][y]) { | 88 texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, |
77 match = false; | 89 readback, 0); |
78 } | 90 |
| 91 match = true; |
| 92 |
| 93 for (int y = 0; y < Y_SIZE; ++y) { |
| 94 for (int x = 0; x < X_SIZE; ++x) { |
| 95 if (0xFF != readback[x][y]) { |
| 96 match = false; |
79 } | 97 } |
80 } | 98 } |
| 99 } |
81 | 100 |
82 REPORTER_ASSERT(reporter, match); | 101 REPORTER_ASSERT(reporter, match); |
83 | |
84 // Now try writing on the single channel texture | |
85 SkSurfaceProps props(SkSurfaceProps::kLegacyFontHost_InitType); | |
86 SkAutoTUnref<SkBaseDevice> device(SkGpuDevice::Create(texture->asRenderT
arget(), &props, | |
87 SkGpuDevice::kUnin
it_InitContents)); | |
88 SkCanvas canvas(device); | |
89 | |
90 SkPaint paint; | |
91 | |
92 const SkRect rect = SkRect::MakeLTRB(-10, -10, X_SIZE + 10, Y_SIZE + 10)
; | |
93 | |
94 paint.setColor(SK_ColorWHITE); | |
95 | |
96 canvas.drawRect(rect, paint); | |
97 | |
98 texture->readPixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, | |
99 readback, 0); | |
100 | |
101 match = true; | |
102 | |
103 for (int y = 0; y < Y_SIZE; ++y) { | |
104 for (int x = 0; x < X_SIZE; ++x) { | |
105 if (0xFF != readback[x][y]) { | |
106 match = false; | |
107 } | |
108 } | |
109 } | |
110 | |
111 REPORTER_ASSERT(reporter, match); | |
112 } | |
113 } | 102 } |
114 | 103 |
115 #endif | 104 #endif |
OLD | NEW |