| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 | 
|  | 2 /* | 
|  | 3  * Copyright 2015 Google Inc. | 
|  | 4  * | 
|  | 5  * Use of this source code is governed by a BSD-style license that can be | 
|  | 6  * found in the LICENSE file. | 
|  | 7  */ | 
|  | 8 | 
|  | 9 // This is a GPU-backend specific test. It relies on static intializers to work | 
|  | 10 | 
|  | 11 #include "SkTypes.h" | 
|  | 12 | 
|  | 13 #if SK_SUPPORT_GPU && SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_VULKAN) | 
|  | 14 | 
|  | 15 #include "GrContextFactory.h" | 
|  | 16 #include "GrTest.h" | 
|  | 17 #include "Test.h" | 
|  | 18 #include "vk/GrVkGpu.h" | 
|  | 19 | 
|  | 20 | 
|  | 21 void fill_pixel_data(int width, int height, GrColor* data) { | 
|  | 22 | 
|  | 23     // build red-green gradient | 
|  | 24     for (int j = 0; j < height; ++j) { | 
|  | 25         for (int i = 0; i < width; ++i) { | 
|  | 26             unsigned int red = (unsigned int)(256.f*(i / (float)width)); | 
|  | 27             unsigned int green = (unsigned int)(256.f*(j / (float)height)); | 
|  | 28             data[i + j*width] = GrColorPackRGBA(red - (red>>8), green - (green>>
     8), 0xff, 0xff); | 
|  | 29         } | 
|  | 30     } | 
|  | 31 } | 
|  | 32 | 
|  | 33 bool does_full_buffer_contain_correct_color(GrColor* srcBuffer, | 
|  | 34                                             GrColor* dstBuffer, | 
|  | 35                                             GrPixelConfig config, | 
|  | 36                                             int width, | 
|  | 37                                             int height) { | 
|  | 38     GrColor* srcPtr = srcBuffer; | 
|  | 39     GrColor* dstPtr = dstBuffer; | 
|  | 40     for (int j = 0; j < height; ++j) { | 
|  | 41         for (int i = 0; i < width; ++i) { | 
|  | 42             if (srcPtr[i] != dstPtr[i]) { | 
|  | 43                 return false; | 
|  | 44             } | 
|  | 45         } | 
|  | 46         srcPtr += width; | 
|  | 47         dstPtr += width; | 
|  | 48     } | 
|  | 49     return true; | 
|  | 50 } | 
|  | 51 | 
|  | 52 void basic_texture_test(skiatest::Reporter* reporter, GrContext* context, GrPixe
     lConfig config, | 
|  | 53                         bool renderTarget, bool linearTiling) { | 
|  | 54     GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu()); | 
|  | 55     gpu->discard(NULL); | 
|  | 56 | 
|  | 57     const int kWidth = 16; | 
|  | 58     const int kHeight = 16; | 
|  | 59     SkAutoTMalloc<GrColor> srcBuffer(kWidth*kHeight); | 
|  | 60     SkAutoTMalloc<GrColor> dstBuffer(kWidth*kHeight); | 
|  | 61 | 
|  | 62     fill_pixel_data(kWidth, kHeight, srcBuffer.get()); | 
|  | 63 | 
|  | 64     const GrVkCaps* caps = reinterpret_cast<const GrVkCaps*>(context->caps()); | 
|  | 65 | 
|  | 66     bool canCreate = true; | 
|  | 67     // the expectation is that the given config is texturable/renderable with op
     timal tiling | 
|  | 68     // but may not be with linear tiling | 
|  | 69     if (linearTiling) { | 
|  | 70         if (!caps->isConfigTexurableLinearly(config) || | 
|  | 71             (renderTarget && !caps->isConfigRenderableLinearly(config, false))) 
     { | 
|  | 72             canCreate = false; | 
|  | 73         } | 
|  | 74     } | 
|  | 75 | 
|  | 76     GrSurfaceDesc surfDesc; | 
|  | 77     surfDesc.fFlags = renderTarget ? kRenderTarget_GrSurfaceFlag : kNone_GrSurfa
     ceFlags; | 
|  | 78     if (linearTiling) { | 
|  | 79         surfDesc.fFlags |= kZeroCopy_GrSurfaceFlag; | 
|  | 80     } | 
|  | 81     surfDesc.fOrigin = kTopLeft_GrSurfaceOrigin; | 
|  | 82     surfDesc.fWidth = kWidth; | 
|  | 83     surfDesc.fHeight = kHeight; | 
|  | 84     surfDesc.fConfig = config; | 
|  | 85     surfDesc.fSampleCnt = 0; | 
|  | 86     GrTexture* tex0 = gpu->createTexture(surfDesc, false, srcBuffer, 0); | 
|  | 87     if (tex0) { | 
|  | 88         REPORTER_ASSERT(reporter, canCreate); | 
|  | 89         gpu->readPixels(tex0, 0, 0, kWidth, kHeight, config, dstBuffer, 0); | 
|  | 90         REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuff
     er, | 
|  | 91                                                                          dstBuff
     er, | 
|  | 92                                                                          config, | 
|  | 93                                                                          kWidth, | 
|  | 94                                                                          kHeight
     )); | 
|  | 95 | 
|  | 96         tex0->writePixels(2, 10, 10, 2, config, srcBuffer); | 
|  | 97         memset(dstBuffer, 0, kWidth*kHeight*sizeof(GrColor)); | 
|  | 98         gpu->readPixels(tex0, 2, 10, 10, 2, config, dstBuffer, 0); | 
|  | 99         REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuff
     er, | 
|  | 100                                                                          dstBuff
     er, | 
|  | 101                                                                          config, | 
|  | 102                                                                          10, | 
|  | 103                                                                          2)); | 
|  | 104 | 
|  | 105         tex0->unref(); | 
|  | 106     } else { | 
|  | 107         REPORTER_ASSERT(reporter, !canCreate); | 
|  | 108     } | 
|  | 109 | 
|  | 110     surfDesc.fOrigin = kBottomLeft_GrSurfaceOrigin; | 
|  | 111     GrTexture* tex1 = gpu->createTexture(surfDesc, false, srcBuffer, 0); | 
|  | 112     if (tex1) { | 
|  | 113         REPORTER_ASSERT(reporter, canCreate); | 
|  | 114         gpu->readPixels(tex1, 0, 0, kWidth, kHeight, config, dstBuffer, 0); | 
|  | 115         REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuff
     er, | 
|  | 116                                                                          dstBuff
     er, | 
|  | 117                                                                          config, | 
|  | 118                                                                          kWidth, | 
|  | 119                                                                          kHeight
     )); | 
|  | 120 | 
|  | 121         tex1->writePixels(5, 4, 4, 5, config, srcBuffer); | 
|  | 122         memset(dstBuffer, 0, kWidth*kHeight*sizeof(GrColor)); | 
|  | 123         gpu->readPixels(tex1, 5, 4, 4, 5, config, dstBuffer, 0); | 
|  | 124         REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuff
     er, | 
|  | 125                                                                          dstBuff
     er, | 
|  | 126                                                                          config, | 
|  | 127                                                                          4, | 
|  | 128                                                                          5)); | 
|  | 129 | 
|  | 130         tex1->unref(); | 
|  | 131     } else { | 
|  | 132         REPORTER_ASSERT(reporter, !canCreate); | 
|  | 133     } | 
|  | 134 } | 
|  | 135 | 
|  | 136 DEF_GPUTEST(VkUploadPixelsTests, reporter, factory) { | 
|  | 137     GrContextOptions opts; | 
|  | 138     opts.fSuppressPrints = true; | 
|  | 139     GrContextFactory debugFactory(opts); | 
|  | 140     for (int type = 0; type < GrContextFactory::kLastGLContextType; ++type) { | 
|  | 141         if (static_cast<GrContextFactory::GLContextType>(type) != | 
|  | 142             GrContextFactory::kNative_GLContextType) { | 
|  | 143             continue; | 
|  | 144         } | 
|  | 145         GrContext* context = debugFactory.get(static_cast<GrContextFactory::GLCo
     ntextType>(type)); | 
|  | 146         if (context) { | 
|  | 147             basic_texture_test(reporter, context, kRGBA_8888_GrPixelConfig, fals
     e, false); | 
|  | 148             basic_texture_test(reporter, context, kRGBA_8888_GrPixelConfig, true
     , false); | 
|  | 149             basic_texture_test(reporter, context, kRGBA_8888_GrPixelConfig, fals
     e, true); | 
|  | 150             basic_texture_test(reporter, context, kRGBA_8888_GrPixelConfig, true
     , true); | 
|  | 151             basic_texture_test(reporter, context, kBGRA_8888_GrPixelConfig, fals
     e, false); | 
|  | 152             basic_texture_test(reporter, context, kBGRA_8888_GrPixelConfig, true
     , false); | 
|  | 153             basic_texture_test(reporter, context, kBGRA_8888_GrPixelConfig, fals
     e, true); | 
|  | 154             basic_texture_test(reporter, context, kBGRA_8888_GrPixelConfig, true
     , true); | 
|  | 155         } | 
|  | 156 | 
|  | 157     } | 
|  | 158 } | 
|  | 159 | 
|  | 160 #endif | 
| OLD | NEW | 
|---|