1/* 2 * Copyright 2015 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// This is a GPU-backend specific test. It relies on static intializers to work 9 10#include "SkTypes.h" 11 12#if SK_SUPPORT_GPU && defined(SK_VULKAN) 13 14#include "GrContextFactory.h" 15#include "GrContextPriv.h" 16#include "GrProxyProvider.h" 17#include "GrSurfaceProxy.h" 18#include "GrTest.h" 19#include "SkGr.h" 20#include "Test.h" 21#include "vk/GrVkGpu.h" 22 23using sk_gpu_test::GrContextFactory; 24 25void fill_pixel_data(int width, int height, GrColor* data) { 26 27 // build red-green gradient 28 for (int j = 0; j < height; ++j) { 29 for (int i = 0; i < width; ++i) { 30 unsigned int red = (unsigned int)(256.f*(i / (float)width)); 31 unsigned int green = (unsigned int)(256.f*(j / (float)height)); 32 data[i + j*width] = GrColorPackRGBA(red - (red>>8), green - (green>>8), 0xff, 0xff); 33 } 34 } 35} 36 37bool does_full_buffer_contain_correct_color(GrColor* srcBuffer, 38 GrColor* dstBuffer, 39 int width, 40 int height) { 41 GrColor* srcPtr = srcBuffer; 42 GrColor* dstPtr = dstBuffer; 43 for (int j = 0; j < height; ++j) { 44 for (int i = 0; i < width; ++i) { 45 if (srcPtr[i] != dstPtr[i]) { 46 return false; 47 } 48 } 49 srcPtr += width; 50 dstPtr += width; 51 } 52 return true; 53} 54 55void basic_texture_test(skiatest::Reporter* reporter, GrContext* context, GrPixelConfig config, 56 bool renderTarget) { 57 GrProxyProvider* proxyProvider = context->contextPriv().proxyProvider(); 58 59 const int kWidth = 16; 60 const int kHeight = 16; 61 SkAutoTMalloc<GrColor> srcBuffer(kWidth*kHeight); 62 SkAutoTMalloc<GrColor> dstBuffer(kWidth*kHeight); 63 64 fill_pixel_data(kWidth, kHeight, srcBuffer.get()); 65 66 GrSurfaceDesc surfDesc; 67 surfDesc.fFlags = renderTarget ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfaceFlags; 68 surfDesc.fOrigin = kTopLeft_GrSurfaceOrigin; 69 surfDesc.fWidth = kWidth; 70 surfDesc.fHeight = kHeight; 71 surfDesc.fConfig = config; 72 surfDesc.fSampleCnt = 1; 73 74 SkColorType ct; 75 SkAssertResult(GrPixelConfigToColorType(config, &ct)); 76 77 sk_sp<GrTextureProxy> proxy = proxyProvider->createTextureProxy(surfDesc, SkBudgeted::kNo, 78 srcBuffer, 0); 79 REPORTER_ASSERT(reporter, proxy); 80 if (proxy) { 81 sk_sp<GrSurfaceContext> sContext = context->contextPriv().makeWrappedSurfaceContext(proxy); 82 83 SkImageInfo dstInfo = SkImageInfo::Make(kWidth, kHeight, ct, kOpaque_SkAlphaType); 84 85 bool result = sContext->readPixels(dstInfo, dstBuffer, 0, 0, 0); 86 REPORTER_ASSERT(reporter, result); 87 REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuffer, 88 dstBuffer, 89 kWidth, 90 kHeight)); 91 92 dstInfo = SkImageInfo::Make(10, 2, ct, kOpaque_SkAlphaType); 93 result = sContext->writePixels(dstInfo, srcBuffer, 0, 2, 10); 94 REPORTER_ASSERT(reporter, result); 95 96 memset(dstBuffer, 0, kWidth*kHeight*sizeof(GrColor)); 97 98 result = sContext->readPixels(dstInfo, dstBuffer, 0, 2, 10); 99 REPORTER_ASSERT(reporter, result); 100 101 REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuffer, 102 dstBuffer, 103 10, 104 2)); 105 } 106 107 surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; 108 109 proxy = proxyProvider->createTextureProxy(surfDesc, SkBudgeted::kNo, srcBuffer, 0); 110 REPORTER_ASSERT(reporter, proxy); 111 if (proxy) { 112 sk_sp<GrSurfaceContext> sContext = context->contextPriv().makeWrappedSurfaceContext(proxy); 113 114 SkImageInfo dstInfo = SkImageInfo::Make(kWidth, kHeight, ct, kOpaque_SkAlphaType); 115 116 bool result = sContext->readPixels(dstInfo, dstBuffer, 0, 0, 0); 117 REPORTER_ASSERT(reporter, result); 118 REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuffer, 119 dstBuffer, 120 kWidth, 121 kHeight)); 122 123 dstInfo = SkImageInfo::Make(4, 5, ct, kOpaque_SkAlphaType); 124 result = sContext->writePixels(dstInfo, srcBuffer, 0, 5, 4); 125 REPORTER_ASSERT(reporter, result); 126 127 memset(dstBuffer, 0, kWidth*kHeight*sizeof(GrColor)); 128 129 result = sContext->readPixels(dstInfo, dstBuffer, 0, 5, 4); 130 REPORTER_ASSERT(reporter, result); 131 132 REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuffer, 133 dstBuffer, 134 4, 135 5)); 136 137 } 138} 139 140DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkUploadPixelsTests, reporter, ctxInfo) { 141 // RGBA 142 basic_texture_test(reporter, ctxInfo.grContext(), kRGBA_8888_GrPixelConfig, false); 143 basic_texture_test(reporter, ctxInfo.grContext(), kRGBA_8888_GrPixelConfig, true); 144 145 // BGRA 146 basic_texture_test(reporter, ctxInfo.grContext(), kBGRA_8888_GrPixelConfig, false); 147 basic_texture_test(reporter, ctxInfo.grContext(), kBGRA_8888_GrPixelConfig, true); 148} 149 150#endif 151