blob: f6743cdbaf49452081328454a110f1ffc38ef0fa [file] [log] [blame]
/*
* 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> 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> drawList = std::make_unique<DrawList>();
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<TextureProxy> 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 = 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