skia2/tests/VkClearTests.cpp
Brian Salomon 18c52a7b52 Revert "Revert "Revert "Redefine the meaning of sample counts in GPU backend."""
This reverts commit d0d7270fcc.

Revert "More sample count cleanup:"

This reverts commit d653cac70e.

Revert "Add new GrContext queries for imagability, surfacability, and max sample count of color types"

This reverts commit 85ae7159c9.


Need to understand NVPR perf changes before relanding

Change-Id: I0db075fb42438ef2a1f9885df184dce52892ac4b
Reviewed-on: https://skia-review.googlesource.com/102780
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
2018-02-02 12:19:52 +00:00

209 lines
9.8 KiB
C++

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
// This is a GPU-backend specific test. It relies on static intializers to work
#include "SkTypes.h"
#if SK_SUPPORT_GPU && defined(SK_VULKAN)
#include "GrContextFactory.h"
#include "GrTest.h"
#include "Test.h"
#include "vk/GrVkGpu.h"
using sk_gpu_test::GrContextFactory;
bool does_full_buffer_contain_correct_color(GrColor* buffer,
GrColor clearColor,
GrPixelConfig config,
int width,
int height) {
GrColor matchColor;
if (kRGBA_8888_GrPixelConfig == config) {
matchColor = clearColor;
} else if (kBGRA_8888_GrPixelConfig) {
// Hack to flip the R, B componets in the GrColor so that the comparrison will work below
matchColor = GrColorPackRGBA(GrColorUnpackB(clearColor),
GrColorUnpackG(clearColor),
GrColorUnpackR(clearColor),
GrColorUnpackA(clearColor));
} else {
// currently only supporting rgba_8888 and bgra_8888
return false;
}
for (int j = 0; j < height; ++j) {
for (int i = 0; i < width; ++i) {
if (buffer[j * width + i] != matchColor) {
return false;
}
}
}
return true;
}
void basic_clear_test(skiatest::Reporter* reporter, GrContext* context, GrPixelConfig config) {
#if 0
GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
SkAutoTMalloc<GrColor> buffer(25);
GrSurfaceDesc surfDesc;
surfDesc.fFlags = kRenderTarget_GrSurfaceFlag;
surfDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
surfDesc.fWidth = 5;
surfDesc.fHeight = 5;
surfDesc.fConfig = config;
surfDesc.fSampleCnt = 0;
GrTexture* tex = gpu->createTexture(surfDesc, SkBudgeted::kNo);
SkASSERT(tex);
SkASSERT(tex->asRenderTarget());
SkIRect rect = SkIRect::MakeWH(5, 5);
gpu->clear(rect, GrColor_TRANSPARENT_BLACK, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, 5, 5, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(buffer.get(),
GrColor_TRANSPARENT_BLACK,
config,
5,
5));
gpu->clear(rect, GrColor_WHITE, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, 5, 5, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(buffer.get(),
GrColor_WHITE,
config,
5,
5));
GrColor myColor = GrColorPackRGBA(0xFF, 0x7F, 0x40, 0x20);
gpu->clear(rect, myColor, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, 5, 5, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(buffer.get(),
myColor,
config,
5,
5));
#endif
}
void sub_clear_test(skiatest::Reporter* reporter, GrContext* context, GrPixelConfig config) {
#if 0
const int width = 10;
const int height = 10;
const int subWidth = width/2;
const int subHeight = height/2;
GrVkGpu* gpu = static_cast<GrVkGpu*>(context->getGpu());
SkAutoTMalloc<GrColor> buffer(width * height);
SkAutoTMalloc<GrColor> subBuffer(subWidth * subHeight);
GrSurfaceDesc surfDesc;
surfDesc.fFlags = kRenderTarget_GrSurfaceFlag;
surfDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
surfDesc.fWidth = width;
surfDesc.fHeight = height;
surfDesc.fConfig = config;
surfDesc.fSampleCnt = 0;
GrTexture* tex = gpu->createTexture(surfDesc, SkBudgeted::kNo);
SkASSERT(tex);
SkASSERT(tex->asRenderTarget());
SkIRect fullRect = SkIRect::MakeWH(10, 10);
gpu->clear(fullRect, GrColor_TRANSPARENT_BLACK, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, width, height, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(buffer.get(),
GrColor_TRANSPARENT_BLACK,
config,
width,
height));
SkIRect rect;
rect = SkIRect::MakeXYWH(0, 0, subWidth, subHeight);
gpu->clear(rect, GrColor_WHITE, tex->asRenderTarget());
rect = SkIRect::MakeXYWH(subWidth, 0, subWidth, subHeight);
gpu->clear(rect, GrColor_WHITE, tex->asRenderTarget());
rect = SkIRect::MakeXYWH(0, subHeight, subWidth, subHeight);
gpu->clear(rect, GrColor_WHITE, tex->asRenderTarget());
// Should fail since bottom right sub area has not been cleared to white
gpu->readPixels(tex, 0, 0, width, height, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, !does_full_buffer_contain_correct_color(buffer.get(),
GrColor_WHITE,
config,
width,
height));
rect = SkIRect::MakeXYWH(subWidth, subHeight, subWidth, subHeight);
gpu->clear(rect, GrColor_WHITE, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, width, height, config, (void*)buffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(buffer.get(),
GrColor_WHITE,
config,
width,
height));
// Try different colors and that each sub area has correct color
GrColor subColor1 = GrColorPackRGBA(0xFF, 0x00, 0x00, 0xFF);
GrColor subColor2 = GrColorPackRGBA(0x00, 0xFF, 0x00, 0xFF);
GrColor subColor3 = GrColorPackRGBA(0x00, 0x00, 0xFF, 0xFF);
GrColor subColor4 = GrColorPackRGBA(0xFF, 0xFF, 0x00, 0xFF);
rect = SkIRect::MakeXYWH(0, 0, subWidth, subHeight);
gpu->clear(rect, subColor1, tex->asRenderTarget());
rect = SkIRect::MakeXYWH(subWidth, 0, subWidth, subHeight);
gpu->clear(rect, subColor2, tex->asRenderTarget());
rect = SkIRect::MakeXYWH(0, subHeight, subWidth, subHeight);
gpu->clear(rect, subColor3, tex->asRenderTarget());
rect = SkIRect::MakeXYWH(subWidth, subHeight, subWidth, subHeight);
gpu->clear(rect, subColor4, tex->asRenderTarget());
gpu->readPixels(tex, 0, 0, subWidth, subHeight, config, (void*)subBuffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(subBuffer.get(),
subColor1,
config,
subWidth,
subHeight));
gpu->readPixels(tex, subWidth, 0, subWidth, subHeight, config, (void*)subBuffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(subBuffer.get(),
subColor2,
config,
subWidth,
subHeight));
gpu->readPixels(tex, 0, subHeight, subWidth, subHeight, config, (void*)subBuffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(subBuffer.get(),
subColor3,
config,
subWidth,
subHeight));
gpu->readPixels(tex, subWidth, subHeight, subWidth, subHeight,
config, (void*)subBuffer.get(), 0);
REPORTER_ASSERT(reporter, does_full_buffer_contain_correct_color(subBuffer.get(),
subColor4,
config,
subWidth,
subHeight));
#endif
}
DEF_GPUTEST_FOR_VULKAN_CONTEXT(VkClearTests, reporter, ctxInfo) {
basic_clear_test(reporter, ctxInfo.grContext(), kRGBA_8888_GrPixelConfig);
basic_clear_test(reporter, ctxInfo.grContext(), kBGRA_8888_GrPixelConfig);
sub_clear_test(reporter, ctxInfo.grContext(), kRGBA_8888_GrPixelConfig);
sub_clear_test(reporter, ctxInfo.grContext(), kBGRA_8888_GrPixelConfig);
}
#endif