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 supported 11 * as valid texturing configs. 12 */ 13 14 #include "Test.h" 15 16 #if SK_SUPPORT_GPU 17 #include "GrContext.h" 18 #include "GrResourceProvider.h" 19 #include "GrTexture.h" 20 21 static const int DEV_W = 10, DEV_H = 10; 22 static const SkIRect DEV_RECT = SkIRect::MakeWH(DEV_W, DEV_H); 23 static const uint8_t TOL = 0x4; 24 25 static void check_component(skiatest::Reporter* reporter, uint8_t control, uint8_t test) { 26 uint8_t diff = 0; 27 if (control >= test) { 28 diff = control - test; 29 } else { 30 diff = test - control; 31 } 32 REPORTER_ASSERT(reporter, diff < TOL); 33 } 34 35 static uint8_t expand_value(uint8_t original, int sigBits) { 36 SkASSERT(sigBits >= 4); 37 uint8_t inSigBitShift = 8 - sigBits; 38 uint8_t duplBitShift = sigBits - inSigBitShift; 39 return (original << inSigBitShift) + (original >> duplBitShift); 40 } 41 42 static void check_4444(skiatest::Reporter* reporter, 43 const SkTDArray<uint16_t>& controlData, 44 const SkTDArray<uint32_t>& readBuffer) { 45 for (int j = 0; j < DEV_H; ++j) { 46 for (int i = 0; i < DEV_W; ++i) { 47 uint16_t control = controlData[i + j * DEV_H]; 48 uint32_t test = readBuffer[i + j * DEV_H]; 49 50 // Test alpha component 51 uint8_t ctrlComp = expand_value(control & 0xF, 4); 52 uint8_t testComp = GrColorUnpackA(test); 53 check_component(reporter, ctrlComp, testComp); 54 55 // Test blue component 56 ctrlComp = expand_value((control >> 4) & 0xF, 4); 57 testComp = GrColorUnpackB(test); 58 check_component(reporter, ctrlComp, testComp); 59 60 // Test green component 61 ctrlComp = expand_value((control >> 8) & 0xF, 4); 62 testComp = GrColorUnpackG(test); 63 check_component(reporter, ctrlComp, testComp); 64 65 // Test red component 66 ctrlComp = expand_value((control >> 12) & 0xF, 4); 67 testComp = GrColorUnpackR(test); 68 check_component(reporter, ctrlComp, testComp); 69 } 70 } 71 } 72 73 static void check_565(skiatest::Reporter* reporter, 74 const SkTDArray<uint16_t>& controlData, 75 const SkTDArray<GrColor>& readBuffer) { 76 for (int j = 0; j < DEV_H; ++j) { 77 for (int i = 0; i < DEV_W; ++i) { 78 uint16_t control = controlData[i + j * DEV_H]; 79 GrColor test = readBuffer[i + j * DEV_H]; 80 // Test blue component (5 bit control) 81 uint8_t ctrlComp = expand_value(control & 0x1F, 5); 82 uint8_t testComp = GrColorUnpackB(test); 83 check_component(reporter, ctrlComp, testComp); 84 85 // Test green component (6 bit control) 86 ctrlComp = expand_value((control >> 5) & 0x3F, 6); 87 testComp = GrColorUnpackG(test); 88 check_component(reporter, ctrlComp, testComp); 89 90 // Test red component (5 bit control) 91 ctrlComp = expand_value((control >> 11) & 0x1F, 5); 92 testComp = GrColorUnpackR(test); 93 check_component(reporter, ctrlComp, testComp); 94 } 95 } 96 } 97 98 template <typename T> 99 void runTest(skiatest::Reporter* reporter, GrContext* context, 100 T val1, T val2, int arraySize, GrPixelConfig config) { 101 SkTDArray<T> controlPixelData; 102 // We will read back into an 8888 buffer since 565/4444 read backes aren't supported 103 SkTDArray<GrColor> readBuffer; 104 controlPixelData.setCount(arraySize); 105 readBuffer.setCount(arraySize); 106 107 for (int i = 0; i < arraySize; i += 2) { 108 controlPixelData[i] = val1; 109 controlPixelData[i + 1] = val2; 110 } 111 112 for (int origin = 0; origin < 2; ++origin) { 113 GrSurfaceDesc desc; 114 desc.fFlags = kNone_GrSurfaceFlags; 115 desc.fWidth = DEV_W; 116 desc.fHeight = DEV_H; 117 desc.fConfig = config; 118 desc.fOrigin = 0 == origin ? 119 kTopLeft_GrSurfaceOrigin : kBottomLeft_GrSurfaceOrigin; 120 sk_sp<GrTexture> fpTexture(context->resourceProvider()->createTexture( 121 desc, SkBudgeted::kNo, controlPixelData.begin(), 0)); 122 SkASSERT(fpTexture); 123 fpTexture->readPixels(0, 0, DEV_W, DEV_H, kRGBA_8888_GrPixelConfig, readBuffer.begin(), 0); 124 if (kRGBA_4444_GrPixelConfig == config) { 125 check_4444(reporter, controlPixelData, readBuffer); 126 } else { 127 SkASSERT(kRGB_565_GrPixelConfig == config); 128 check_565(reporter, controlPixelData, readBuffer); 129 } 130 } 131 } 132 133 static const int CONTROL_ARRAY_SIZE = DEV_W * DEV_H; 134 135 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RGBA4444TextureTest, reporter, ctxInfo) { 136 runTest<uint16_t>(reporter, ctxInfo.grContext(), 0xFF00, 0xFA62, 137 CONTROL_ARRAY_SIZE, kRGBA_4444_GrPixelConfig); 138 } 139 140 DEF_GPUTEST_FOR_RENDERING_CONTEXTS(RGB565TextureTest, reporter, ctxInfo) { 141 runTest<uint16_t>(reporter, ctxInfo.grContext(), 0xFF00, 0xFA62, 142 CONTROL_ARRAY_SIZE, kRGB_565_GrPixelConfig); 143 } 144 145 #endif 146