/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "tests/Test.h" #include "src/gpu/graphite/ContextPriv.h" #include "src/gpu/graphite/DrawList.h" #include "src/gpu/graphite/DrawPass.h" #include "src/gpu/graphite/RecorderPriv.h" #include "src/gpu/graphite/RendererProvider.h" namespace skgpu::graphite { // Tests that creating a draw pass that fails a dst copy doesn't result in a segfault. DEF_GRAPHITE_TEST_FOR_ALL_CONTEXTS(DrawPassTestFailedDstCopy, reporter, context, CtsEnforcement::kNextRelease) { const Caps* caps = context->priv().caps(); std::unique_ptr recorder = context->makeRecorder(); // Define a paint that requires a dst copy. SkPaint paint; PaintParams paintParams{paint, nullptr, nullptr, DstReadRequirement::kTextureCopy, false}; // Define a draw that uses the paint, but is larger than the max texture size. In this case the // dst copy will fail. const SkIRect drawSize = SkIRect::MakeWH(caps->maxTextureSize() + 1, 1); std::unique_ptr drawList = std::make_unique(); drawList->recordDraw(recorder->priv().rendererProvider()->analyticRRect(), Transform::Identity(), Geometry(Shape(SkRect::Make(drawSize))), Clip(Rect::Infinite(), Rect::Infinite(), drawSize, nullptr), DrawOrder(DrawOrder::kClearDepth.next()), &paintParams, nullptr); // Attempt to make a draw pass with the draw. static constexpr SkISize targetSize = SkISize::Make(1, 1); static constexpr SkColorType targetColorType = kN32_SkColorType; static constexpr SkAlphaType targetAlphaType = kPremul_SkAlphaType; const SkImageInfo targetInfo = SkImageInfo::Make(targetSize, targetColorType, targetAlphaType); sk_sp target = TextureProxy::Make( caps, recorder->priv().resourceProvider(), targetSize, caps->getDefaultSampledTextureInfo( targetColorType, Mipmapped::kNo, recorder->priv().isProtected(), Renderable::kYes), "DrawPassTestTargetProxy", Budgeted::kYes); std::unique_ptr drawPass = DrawPass::Make(recorder.get(), std::move(drawList), target, targetInfo, {LoadOp::kClear, StoreOp::kStore}, {0.0f, 0.0f, 0.0f, 0.0f}, /*dstCopy=*/nullptr, /*dstCopyOffset=*/{0,0}); // Make sure creating the draw pass failed. REPORTER_ASSERT(reporter, !drawPass); } } // namespace skgpu::graphite