diff options
Diffstat (limited to 'tests/ImageStorageTest.cpp')
-rw-r--r-- | tests/ImageStorageTest.cpp | 149 |
1 files changed, 0 insertions, 149 deletions
diff --git a/tests/ImageStorageTest.cpp b/tests/ImageStorageTest.cpp deleted file mode 100644 index 99949d07ce..0000000000 --- a/tests/ImageStorageTest.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2016 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "Test.h" - -#if SK_SUPPORT_GPU - -#include "GrFragmentProcessor.h" -#include "GrInvariantOutput.h" -#include "GrRenderTargetContext.h" -#include "GrTexture.h" -#include "glsl/GrGLSLFragmentProcessor.h" -#include "glsl/GrGLSLFragmentShaderBuilder.h" - -DEF_GPUTEST_FOR_RENDERING_CONTEXTS(ImageStorageLoad, reporter, ctxInfo) { - class TestFP : public GrFragmentProcessor { - public: - static sk_sp<GrFragmentProcessor> Make(sk_sp<GrTexture> texture) { - return sk_sp<GrFragmentProcessor>(new TestFP(std::move(texture))); - } - - const char* name() const override { return "Image Load Test FP"; } - - private: - TestFP(sk_sp<GrTexture> texture) : fImageStorageAccess(std::move(texture), kRead_GrIOType) { - this->initClassID<TestFP>(); - this->setWillReadFragmentPosition(); - this->addImageStorageAccess(&fImageStorageAccess); - } - - void onGetGLSLProcessorKey(const GrGLSLCaps&, GrProcessorKeyBuilder*) const override {} - - void onComputeInvariantOutput(GrInvariantOutput* inout) const override { - inout->setToUnknown(GrInvariantOutput::kWillNot_ReadInput); - } - - bool onIsEqual(const GrFragmentProcessor& that) const override { return true; } - - GrGLSLFragmentProcessor* onCreateGLSLInstance() const override { - class GLSLProcessor : public GrGLSLFragmentProcessor { - public: - GLSLProcessor() = default; - void emitCode(EmitArgs& args) override { - const TestFP& tfp = args.fFp.cast<TestFP>(); - GrGLSLFPFragmentBuilder* fb = args.fFragBuilder; - SkString imageLoadStr; - fb->codeAppendf("vec2 coord = %s.xy;", args.fFragBuilder->fragmentPosition()); - fb->appendImageStorageLoad(&imageLoadStr, args.fImageStorages[0], - "ivec2(coord)"); - if (GrPixelConfigIsSint(tfp.fImageStorageAccess.texture()->config())) { - // Map the signed bytes so that when then get read back as unorm values they - // will have their original bit pattern. - fb->codeAppendf("ivec4 ivals = %s;", imageLoadStr.c_str()); - // NV gives a linker error for this: - // fb->codeAppend("ivals += - // "mix(ivec4(0), ivec4(256), lessThan(ivals, ivec4(0)));"); - fb->codeAppend("if (ivals.r < 0) { ivals.r += 256; }"); - fb->codeAppend("if (ivals.g < 0) { ivals.g += 256; }"); - fb->codeAppend("if (ivals.b < 0) { ivals.b += 256; }"); - fb->codeAppend("if (ivals.a < 0) { ivals.a += 256; }"); - fb->codeAppendf("%s = (vec4(ivals) + vec4(0.5))/255;", args.fOutputColor); - } else { - fb->codeAppendf("%s = %s;", args.fOutputColor, imageLoadStr.c_str()); - } - } - }; - return new GLSLProcessor; - } - - ImageStorageAccess fImageStorageAccess; - }; - - static constexpr int kS = 256; - GrContext* context = ctxInfo.grContext(); - if (!context->caps()->shaderCaps()->imageLoadStoreSupport()) { - return; - } - - std::unique_ptr<uint32_t[]> data(new uint32_t[kS * kS]); - for (int j = 0; j < kS; ++j) { - for (int i = 0; i < kS; ++i) { - data[i + kS * j] = GrColorPackRGBA(i, j, 0, 0); - } - } - - std::unique_ptr<uint32_t[]> idata(new uint32_t[kS * kS]); - for (int j = 0; j < kS; ++j) { - for (int i = 0; i < kS; ++i) { - int8_t r = i - 128; - int8_t g = j - 128; - int8_t b = -128; - int8_t a = -128; - idata[i + kS * j] = ((uint8_t)a << 24) | ((uint8_t)b << 16) | - ((uint8_t)g << 8) | (uint8_t)r; - } - } - - // Currently image accesses always have "top left" semantics. - GrSurfaceDesc desc; - desc.fOrigin = kTopLeft_GrSurfaceOrigin; - desc.fWidth = kS; - desc.fHeight = kS; - struct { - GrPixelConfig fConfig; - std::unique_ptr<uint32_t[]> fData; - } tests[] = { - { - kRGBA_8888_GrPixelConfig, - std::move(data) - }, - { - kRGBA_8888_sint_GrPixelConfig, - std::move(idata) - }, - }; - for (const auto& test : tests) { - desc.fConfig = test.fConfig; - sk_sp<GrTexture> imageStorageTexture(context->textureProvider()->createTexture(desc, - SkBudgeted::kYes, test.fData.get(), 0)); - - sk_sp<GrRenderTargetContext> rtContext = - context->makeRenderTargetContext(SkBackingFit::kExact, kS, kS, kRGBA_8888_GrPixelConfig, - nullptr); - GrPaint paint; - paint.setPorterDuffXPFactory(SkBlendMode::kSrc); - paint.addColorFragmentProcessor(TestFP::Make(imageStorageTexture)); - rtContext->drawPaint(GrNoClip(), paint, SkMatrix::I()); - std::unique_ptr<uint32_t[]> readData(new uint32_t[kS * kS]); - SkImageInfo info = SkImageInfo::Make(kS, kS, kRGBA_8888_SkColorType, kPremul_SkAlphaType); - rtContext->readPixels(info, readData.get(), 0, 0, 0); - int failed = false; - for (int j = 0; j < kS && !failed; ++j) { - for (int i = 0; i < kS && !failed; ++i) { - uint32_t d = test.fData[j * kS + i]; - uint32_t rd = readData[j * kS + i]; - if (d != rd) { - failed = true; - ERRORF(reporter, "Expected 0x%08x, got 0x%08x at %d, %d.", d, rd, i, j); - } - } - } - } -} - -#endif |