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

Side by Side Diff: tests/PackedConfigsTextureTest.cpp

Issue 2238563002: Fix 4444 on Vulkan devices who don't support RGBA_4444 (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Read back in 8888 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
« src/gpu/GrGpu.cpp ('K') | « src/gpu/vk/GrVkUtil.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 /*
9 * This is a straightforward test of using packed pixel configs (4444, 565).
10 * This test will make sure that these RGBA_4444 and RGB_565 are always supporte d
11 * as valid texturing configs.
12 */
13
14 #include "Test.h"
15
16 #if SK_SUPPORT_GPU
17 #include "GrContext.h"
18 #include "GrTexture.h"
19
20 static const int DEV_W = 10, DEV_H = 10;
21 static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H);
22 static const uint8_t TOL = 0x4;
23
24 static void check_component(skiatest::Reporter* reporter, uint8_t control, uint8 _t test) {
25 uint8_t diff = 0;
26 if (control >= test) {
27 diff = control - test;
28 } else {
29 diff = test - control;
30 }
31 REPORTER_ASSERT(reporter, diff < TOL);
32 }
33
34 static uint8_t expand_value(uint8_t original, int sigBits) {
35 SkASSERT(sigBits >= 4);
36 uint8_t inSigBitShift = 8 - sigBits;
37 uint8_t duplBitShift = sigBits - inSigBitShift;
38 return (original << inSigBitShift) + (original >> duplBitShift);
39 }
40
41 static void check_4444(skiatest::Reporter* reporter,
42 const SkTDArray<uint16_t>& controlData,
43 const SkTDArray<uint32_t>& readBuffer) {
44 for (int j = 0; j < DEV_H; ++j) {
45 for (int i = 0; i < DEV_W; ++i) {
46 uint16_t control = controlData[i + j * DEV_H];
47 uint32_t test = readBuffer[i + j * DEV_H];
48
49 // Test alpha component
50 uint8_t ctrlComp = expand_value(control & 0xF, 4);
51 uint8_t testComp = GrColorUnpackA(test);
52 check_component(reporter, ctrlComp, testComp);
53
54 // Test blue component
55 ctrlComp = expand_value((control >> 4) & 0xF, 4);
56 testComp = GrColorUnpackB(test);
57 check_component(reporter, ctrlComp, testComp);
58
59 // Test green component
60 ctrlComp = expand_value((control >> 8) & 0xF, 4);
61 testComp = GrColorUnpackG(test);
62 check_component(reporter, ctrlComp, testComp);
63
64 // Test red component
65 ctrlComp = expand_value((control >> 12) & 0xF, 4);
66 testComp = GrColorUnpackR(test);
67 check_component(reporter, ctrlComp, testComp);
68 }
69 }
70 }
71
72 static void check_565(skiatest::Reporter* reporter,
73 const SkTDArray<uint16_t>& controlData,
74 const SkTDArray<GrColor>& readBuffer) {
75 for (int j = 0; j < DEV_H; ++j) {
76 for (int i = 0; i < DEV_W; ++i) {
77 uint16_t control = controlData[i + j * DEV_H];
78 GrColor test = readBuffer[i + j * DEV_H];
79 // Test blue component (5 bit control)
80 uint8_t ctrlComp = expand_value(control & 0x1F, 5);
81 uint8_t testComp = GrColorUnpackB(test);
82 check_component(reporter, ctrlComp, testComp);
83
84 // Test green component (6 bit control)
85 ctrlComp = expand_value((control >> 5) & 0x3F, 6);
86 testComp = GrColorUnpackG(test);
87 check_component(reporter, ctrlComp, testComp);
88
89 // Test red component (5 bit control)
90 ctrlComp = expand_value((control >> 11) & 0x1F, 5);
91 testComp = GrColorUnpackR(test);
92 check_component(reporter, ctrlComp, testComp);
93 }
94 }
95 }
96
97 template <typename T>
98 void runTest(skiatest::Reporter* reporter, GrContext* context,
99 T val1, T val2, int arraySize, GrPixelConfig config) {
100 SkTDArray<T> controlPixelData;
101 // We will read back into an 8888 buffer since 565/4444 read backes aren't s upported
102 SkTDArray<GrColor> readBuffer;
103 controlPixelData.setCount(arraySize);
104 readBuffer.setCount(arraySize);
105
106 for (int i = 0; i < arraySize; i += 2) {
107 controlPixelData[i] = val1;
108 controlPixelData[i + 1] = val2;
109 }
110
111 for (int origin = 0; origin < 2; ++origin) {
112 GrSurfaceDesc desc;
113 desc.fFlags = kNone_GrSurfaceFlags;
114 desc.fWidth = DEV_W;
115 desc.fHeight = DEV_H;
116 desc.fConfig = config;
117 desc.fOrigin = 0 == origin ?
118 kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin;
119 SkAutoTUnref<GrTexture> fpTexture(context->textureProvider()->createText ure(
120 desc, SkBudgeted::kNo, controlPixelData.begin(), 0));
121 SkASSERT(fpTexture);
122 fpTexture->readPixels(0, 0, DEV_W, DEV_H, kRGBA_8888_GrPixelConfig, read Buffer.begin(), 0);
123 if (kRGBA_4444_GrPixelConfig == config) {
124 check_4444(reporter, controlPixelData, readBuffer);
125 } else {
126 SkASSERT(kRGB_565_GrPixelConfig == config);
127 check_565(reporter, controlPixelData, readBuffer);
128 }
129 }
130 }
131
132 static const int CONTROL_ARRAY_SIZE = DEV_W * DEV_H;
133
134 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RGBA4444TextureTest, reporter, ctxInfo) {
135 runTest<uint16_t>(reporter, ctxInfo.grContext(), 0xFF00, 0xFA62,
136 CONTROL_ARRAY_SIZE, kRGBA_4444_GrPixelConfig);
137 }
138
139 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RGB565TextureTest, reporter, ctxInfo) {
140 runTest<uint16_t>(reporter, ctxInfo.grContext(), 0xFF00, 0xFA62,
141 CONTROL_ARRAY_SIZE, kRGB_565_GrPixelConfig);
142 }
143
144 #endif
OLDNEW
« src/gpu/GrGpu.cpp ('K') | « src/gpu/vk/GrVkUtil.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698