diff options
author | Timothy Liang <timliang@google.com> | 2018-07-13 13:24:05 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-07-13 18:38:14 +0000 |
commit | 36848f6b30ddaca461c98e13b9976b2c449ca547 (patch) | |
tree | ed1626f12d90a0f8f154c2b89fb938f64c8ed499 /tests | |
parent | 81d151103faca621cfe62c9dfbec842ec9f337c4 (diff) |
implemented metal gpu backend texture upload testing
Bug: skia:
Change-Id: Ia3af58a0710f7f9792b37682a3cc45dd14282b71
Reviewed-on: https://skia-review.googlesource.com/140248
Commit-Queue: Timothy Liang <timliang@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/GrTestingBackendTextureUploadTest.cpp | 81 | ||||
-rw-r--r-- | tests/Test.h | 4 | ||||
-rw-r--r-- | tests/TestUtils.cpp | 29 | ||||
-rw-r--r-- | tests/TestUtils.h | 8 | ||||
-rw-r--r-- | tests/VkUploadPixelsTests.cpp | 31 |
5 files changed, 123 insertions, 30 deletions
diff --git a/tests/GrTestingBackendTextureUploadTest.cpp b/tests/GrTestingBackendTextureUploadTest.cpp new file mode 100644 index 0000000000..1bdd455d67 --- /dev/null +++ b/tests/GrTestingBackendTextureUploadTest.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkTypes.h" + +#include "GrGpu.h" +#include "GrContextPriv.h" +#include "GrTexture.h" +#include "SkConvertPixels.h" +#include "Test.h" +#include "TestUtils.h" + +void testing_only_texture_test(skiatest::Reporter* reporter, GrContext* context, GrColorType ct, + bool renderTarget, bool doDataUpload, GrMipMapped mipMapped) { + const int kWidth = 16; + const int kHeight = 16; + SkAutoTMalloc<GrColor> srcBuffer; + if (doDataUpload) { + srcBuffer.reset(kWidth * kHeight); + fill_pixel_data(kWidth, kHeight, srcBuffer.get()); + } + SkAutoTMalloc<GrColor> dstBuffer(kWidth * kHeight); + + GrGpu* gpu = context->contextPriv().getGpu(); + + GrPixelConfig config = GrColorTypeToPixelConfig(ct, GrSRGBEncoded::kNo); + if (!gpu->caps()->isConfigTexturable(config)) { + return; + } + + GrBackendTexture backendTex = gpu->createTestingOnlyBackendTexture(srcBuffer, + kWidth, + kHeight, + config, + renderTarget, + mipMapped); + sk_sp<GrTexture> wrappedTex; + if (renderTarget) { + wrappedTex = gpu->wrapRenderableBackendTexture(backendTex, 1, + GrWrapOwnership::kAdopt_GrWrapOwnership); + } else { + wrappedTex = gpu->wrapBackendTexture(backendTex, + GrWrapOwnership::kAdopt_GrWrapOwnership); + } + REPORTER_ASSERT(reporter, wrappedTex); + + int rowBytes = GrColorTypeBytesPerPixel(ct) * kWidth; + bool result = gpu->readPixels(wrappedTex.get(), 0, 0, kWidth, + kHeight, ct, dstBuffer, rowBytes); + + if (!doDataUpload) { + // createTestingOnlyBackendTexture will fill the texture with 0's if no data is provided, so + // we set the expected result likewise. + srcBuffer.reset(kWidth * kHeight); + memset(srcBuffer, 0, kWidth * kHeight * sizeof(GrColor)); + } + REPORTER_ASSERT(reporter, result); + REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(srcBuffer, dstBuffer, + kWidth, kHeight)); +} + +DEF_GPUTEST_FOR_RENDERING_CONTEXTS(GrTestingBackendTextureUploadTest, reporter, ctxInfo) { + for (auto colorType: {GrColorType::kRGBA_8888, GrColorType::kBGRA_8888}) { + for (bool renderable: {true, false}) { + for (bool doDataUpload: {true, false}) { + testing_only_texture_test(reporter, ctxInfo.grContext(), colorType, + renderable, doDataUpload, GrMipMapped::kNo); + + if (!doDataUpload) { + testing_only_texture_test(reporter, ctxInfo.grContext(), colorType, + renderable, doDataUpload, GrMipMapped::kYes); + } + } + } + } +} + diff --git a/tests/Test.h b/tests/Test.h index 97604a2c72..a4c931b330 100644 --- a/tests/Test.h +++ b/tests/Test.h @@ -129,6 +129,7 @@ typedef bool GrContextTypeFilterFn(GrContextFactoryContextType); extern bool IsGLContextType(GrContextFactoryContextType); extern bool IsVulkanContextType(GrContextFactoryContextType); +extern bool IsMetalContextType(GrContextFactoryContextType); extern bool IsRenderingGLContextType(GrContextFactoryContextType); extern bool IsNullGLContextType(GrContextFactoryContextType); void RunWithGPUTestContexts(GrContextTestFn*, GrContextTypeFilterFn*, Reporter*, @@ -213,6 +214,9 @@ private: #define DEF_GPUTEST_FOR_VULKAN_CONTEXT(name, reporter, context_info) \ DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsVulkanContextType, \ reporter, context_info, nullptr) +#define DEF_GPUTEST_FOR_METAL_CONTEXT(name, reporter, context_info) \ + DEF_GPUTEST_FOR_CONTEXTS(name, &skiatest::IsMetalContextType, \ + reporter, context_info, nullptr) #define REQUIRE_PDF_DOCUMENT(TEST_NAME, REPORTER) \ do { \ diff --git a/tests/TestUtils.cpp b/tests/TestUtils.cpp index 44a78c51fb..8b611c2064 100644 --- a/tests/TestUtils.cpp +++ b/tests/TestUtils.cpp @@ -113,3 +113,32 @@ void test_copy_to_surface(skiatest::Reporter* reporter, GrProxyProvider* proxyPr } } } + +void fill_pixel_data(int width, int height, GrColor* data) { + for (int j = 0; j < height; ++j) { + for (int i = 0; i < width; ++i) { + unsigned int red = (unsigned int)(256.f * (i / (float)width)); + unsigned int green = (unsigned int)(256.f * (j / (float)height)); + data[i + j * width] = GrColorPackRGBA(red - (red >> 8), green - (green >> 8), + 0xff, 0xff); + } + } +} + +bool does_full_buffer_contain_correct_color(GrColor* srcBuffer, + GrColor* dstBuffer, + int width, + int height) { + GrColor* srcPtr = srcBuffer; + GrColor* dstPtr = dstBuffer; + for (int j = 0; j < height; ++j) { + for (int i = 0; i < width; ++i) { + if (srcPtr[i] != dstPtr[i]) { + return false; + } + } + srcPtr += width; + dstPtr += width; + } + return true; +} diff --git a/tests/TestUtils.h b/tests/TestUtils.h index 1fe96bff7c..e89193195b 100644 --- a/tests/TestUtils.h +++ b/tests/TestUtils.h @@ -9,6 +9,7 @@ class GrSurfaceContext; class GrSurfaceProxy; +typedef uint32_t GrColor; // Ensure that reading back from 'srcContext' as RGBA 8888 matches 'expectedPixelValues void test_read_pixels(skiatest::Reporter*, @@ -29,3 +30,10 @@ void test_copy_from_surface(skiatest::Reporter*, GrContext*, // Ensure that RGBA 8888 pixels can be copied into 'dstContext' void test_copy_to_surface(skiatest::Reporter*, GrProxyProvider*, GrSurfaceContext* dstContext, const char* testName); + +// Fills data with a red-green gradient +void fill_pixel_data(int width, int height, GrColor* data); + +// Checks srcBuffer and dstBuffer contain the same colors +bool does_full_buffer_contain_correct_color(GrColor* srcBuffer, GrColor* dstBuffer, int width, + int height); diff --git a/tests/VkUploadPixelsTests.cpp b/tests/VkUploadPixelsTests.cpp index bd87d19cd1..b13de41571 100644 --- a/tests/VkUploadPixelsTests.cpp +++ b/tests/VkUploadPixelsTests.cpp @@ -18,40 +18,11 @@ #include "ProxyUtils.h" #include "SkGr.h" #include "Test.h" +#include "TestUtils.h" #include "vk/GrVkGpu.h" using sk_gpu_test::GrContextFactory; -void fill_pixel_data(int width, int height, GrColor* data) { - - // build red-green gradient - for (int j = 0; j < height; ++j) { - for (int i = 0; i < width; ++i) { - unsigned int red = (unsigned int)(256.f*(i / (float)width)); - unsigned int green = (unsigned int)(256.f*(j / (float)height)); - data[i + j*width] = GrColorPackRGBA(red - (red>>8), green - (green>>8), 0xff, 0xff); - } - } -} - -bool does_full_buffer_contain_correct_color(GrColor* srcBuffer, - GrColor* dstBuffer, - int width, - int height) { - GrColor* srcPtr = srcBuffer; - GrColor* dstPtr = dstBuffer; - for (int j = 0; j < height; ++j) { - for (int i = 0; i < width; ++i) { - if (srcPtr[i] != dstPtr[i]) { - return false; - } - } - srcPtr += width; - dstPtr += width; - } - return true; -} - void basic_texture_test(skiatest::Reporter* reporter, GrContext* context, SkColorType ct, bool renderTarget) { const int kWidth = 16; |