summaryrefslogtreecommitdiff
path: root/chromium/third_party/skia/gm/ycbcrimage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/gm/ycbcrimage.cpp')
-rw-r--r--chromium/third_party/skia/gm/ycbcrimage.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/chromium/third_party/skia/gm/ycbcrimage.cpp b/chromium/third_party/skia/gm/ycbcrimage.cpp
new file mode 100644
index 00000000000..a508ea5e028
--- /dev/null
+++ b/chromium/third_party/skia/gm/ycbcrimage.cpp
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2020 Google LLC
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gm/gm.h"
+
+// This test only works with the Vulkan backend.
+#ifdef SK_VULKAN
+
+#include "include/core/SkCanvas.h"
+#include "include/core/SkImage.h"
+#include "include/core/SkPaint.h"
+#include "include/core/SkSize.h"
+#include "include/core/SkString.h"
+#include "include/gpu/GrContext.h"
+#include "src/gpu/GrContextPriv.h"
+#include "tools/gpu/vk/VkYcbcrSamplerHelper.h"
+
+static void release_ycbcrhelper(void* releaseContext) {
+ VkYcbcrSamplerHelper* ycbcrHelper = reinterpret_cast<VkYcbcrSamplerHelper*>(releaseContext);
+ delete ycbcrHelper;
+}
+
+namespace skiagm {
+
+// This GM exercises the native YCbCr image format on Vulkan
+class YCbCrImageGM : public GpuGM {
+public:
+ YCbCrImageGM() {
+ this->setBGColor(0xFFCCCCCC);
+ }
+
+protected:
+
+ SkString onShortName() override {
+ return SkString("ycbcrimage");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(2*kPad+kImageSize, 2*kPad+kImageSize);
+ }
+
+ DrawResult createYCbCrImage(GrContext* context, SkString* errorMsg) {
+ std::unique_ptr<VkYcbcrSamplerHelper> ycbcrHelper(new VkYcbcrSamplerHelper(context));
+
+ if (!ycbcrHelper->isYCbCrSupported()) {
+ *errorMsg = "YCbCr sampling not supported.";
+ return skiagm::DrawResult::kSkip;
+ }
+
+ if (!ycbcrHelper->createBackendTexture(kImageSize, kImageSize)) {
+ *errorMsg = "Failed to create I420 backend texture.";
+ return skiagm::DrawResult::kFail;
+ }
+
+ SkASSERT(!fYCbCrImage);
+ fYCbCrImage = SkImage::MakeFromTexture(context, ycbcrHelper->backendTexture(),
+ kTopLeft_GrSurfaceOrigin, kRGB_888x_SkColorType,
+ kPremul_SkAlphaType, nullptr,
+ release_ycbcrhelper, ycbcrHelper.get());
+ if (!fYCbCrImage) {
+ *errorMsg = "Failed to create I420 image.";
+ return DrawResult::kFail;
+ }
+
+ ycbcrHelper.release();
+ return DrawResult::kOk;
+ }
+
+ DrawResult onGpuSetup(GrContext* context, SkString* errorMsg) override {
+ if (!context || context->abandoned()) {
+ return DrawResult::kSkip;
+ }
+
+ SkASSERT(context->priv().asDirectContext());
+
+ if (context->backend() != GrBackendApi::kVulkan) {
+ *errorMsg = "This GM requires a Vulkan context.";
+ return DrawResult::kSkip;
+ }
+
+ DrawResult result = this->createYCbCrImage(context, errorMsg);
+ if (result != DrawResult::kOk) {
+ return result;
+ }
+
+ return DrawResult::kOk;
+ }
+
+ DrawResult onDraw(GrContext*, GrRenderTargetContext*, SkCanvas* canvas, SkString*) override {
+ SkASSERT(fYCbCrImage);
+
+ SkPaint paint;
+ paint.setFilterQuality(kLow_SkFilterQuality);
+
+ canvas->drawImage(fYCbCrImage, kPad, kPad, &paint);
+ return DrawResult::kOk;
+ }
+
+private:
+ static const int kImageSize = 112;
+ static const int kPad = 8;
+
+ sk_sp<SkImage> fYCbCrImage;
+
+ typedef GpuGM INHERITED;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+
+DEF_GM(return new YCbCrImageGM;)
+
+} // skiagm
+
+#endif // SK_VULKAN