#include "src/gpu/ganesh/ops/FillRectOp.h"
#include "include/core/SkColor.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkString.h"
#include "include/gpu/ganesh/GrRecordingContext.h"
#include "include/private/SkColorData.h"
#include "include/private/base/SkAssert.h"
#include "include/private/base/SkDebug.h"
#include "include/private/gpu/ganesh/GrTypesPriv.h"
#include "src/base/SkArenaAlloc.h"
#include "src/core/SkTraceEvent.h"
#include "src/gpu/ganesh/GrAppliedClip.h"
#include "src/gpu/ganesh/GrBuffer.h"
#include "src/gpu/ganesh/GrGeometryProcessor.h"
#include "src/gpu/ganesh/GrMeshDrawTarget.h"
#include "src/gpu/ganesh/GrOpFlushState.h"
#include "src/gpu/ganesh/GrOpsTypes.h"
#include "src/gpu/ganesh/GrPaint.h"
#include "src/gpu/ganesh/GrProcessorAnalysis.h"
#include "src/gpu/ganesh/GrProcessorSet.h"
#include "src/gpu/ganesh/GrProgramInfo.h"
#include "src/gpu/ganesh/GrRecordingContextPriv.h"
#include "src/gpu/ganesh/SurfaceDrawContext.h"
#include "src/gpu/ganesh/geometry/GrQuad.h"
#include "src/gpu/ganesh/geometry/GrQuadBuffer.h"
#include "src/gpu/ganesh/geometry/GrQuadUtils.h"
#include "src/gpu/ganesh/ops/GrMeshDrawOp.h"
#include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelperWithStencil.h"
#include "src/gpu/ganesh/ops/QuadPerEdgeAA.h"
#if defined(GPU_TEST_UTILS)
#include "src/base/SkRandom.h"
#include "src/gpu/ganesh/GrDrawOpTest.h"
#include "src/gpu/ganesh/GrTestUtils.h"
#endif
#include <algorithm>
#include <cstring>
#include <memory>
#include <utility>
class GrCaps;
class GrDstProxyView;
class GrSurfaceProxyView;
enum class GrXferBarrierFlags;
namespace {
VertexSpec;
ColorType;
Subset;
#if defined(GPU_TEST_UTILS)
SkString dump_quad_info(int index, const GrQuad* deviceQuad,
const GrQuad* localQuad, const SkPMColor4f& color,
GrQuadAAFlags aaFlags) {
GrQuad safeLocal = localQuad ? *localQuad : GrQuad();
SkString str;
str.appendf("%d: Color: [%.2f, %.2f, %.2f, %.2f], Edge AA: l%u_t%u_r%u_b%u, \n"
" device quad: [(%.2f, %2.f, %.2f), (%.2f, %.2f, %.2f), (%.2f, %.2f, %.2f), "
"(%.2f, %.2f, %.2f)],\n"
" local quad: [(%.2f, %2.f, %.2f), (%.2f, %.2f, %.2f), (%.2f, %.2f, %.2f), "
"(%.2f, %.2f, %.2f)]\n",
index, color.fR, color.fG, color.fB, color.fA,
(uint32_t) (aaFlags & GrQuadAAFlags::kLeft),
(uint32_t) (aaFlags & GrQuadAAFlags::kTop),
(uint32_t) (aaFlags & GrQuadAAFlags::kRight),
(uint32_t) (aaFlags & GrQuadAAFlags::kBottom),
deviceQuad->x(0), deviceQuad->y(0), deviceQuad->w(0),
deviceQuad->x(1), deviceQuad->y(1), deviceQuad->w(1),
deviceQuad->x(2), deviceQuad->y(2), deviceQuad->w(2),
deviceQuad->x(3), deviceQuad->y(3), deviceQuad->w(3),
safeLocal.x(0), safeLocal.y(0), safeLocal.w(0),
safeLocal.x(1), safeLocal.y(1), safeLocal.w(1),
safeLocal.x(2), safeLocal.y(2), safeLocal.w(2),
safeLocal.x(3), safeLocal.y(3), safeLocal.w(3));
return str;
}
#endif
class FillRectOpImpl final : public GrMeshDrawOp { … };
}
namespace skgpu::ganesh {
GrOp::Owner FillRectOp::Make(GrRecordingContext* context,
GrPaint&& paint,
GrAAType aaType,
DrawQuad* quad,
const GrUserStencilSettings* stencil,
InputFlags inputFlags) { … }
GrOp::Owner FillRectOp::MakeNonAARect(GrRecordingContext* context,
GrPaint&& paint,
const SkMatrix& view,
const SkRect& rect,
const GrUserStencilSettings* stencil) { … }
GrOp::Owner FillRectOp::MakeOp(GrRecordingContext* context,
GrPaint&& paint,
GrAAType aaType,
const SkMatrix& viewMatrix,
const GrQuadSetEntry quads[],
int cnt,
const GrUserStencilSettings* stencilSettings,
int* numConsumed) { … }
void FillRectOp::AddFillRectOps(skgpu::ganesh::SurfaceDrawContext* sdc,
const GrClip* clip,
GrRecordingContext* context,
GrPaint&& paint,
GrAAType aaType,
const SkMatrix& viewMatrix,
const GrQuadSetEntry quads[],
int cnt,
const GrUserStencilSettings* stencilSettings) { … }
}
#if defined(GPU_TEST_UTILS)
uint32_t skgpu::ganesh::FillRectOp::ClassID() { return FillRectOpImpl::ClassID(); }
GR_DRAW_OP_TEST_DEFINE(FillRectOp) {
SkMatrix viewMatrix = GrTest::TestMatrixInvertible(random);
SkRect rect = GrTest::TestRect(random);
GrAAType aaType = GrAAType::kNone;
if (random->nextBool()) {
aaType = (numSamples > 1) ? GrAAType::kMSAA : GrAAType::kCoverage;
}
const GrUserStencilSettings* stencil = random->nextBool() ? nullptr
: GrGetRandomStencil(random, context);
GrQuadAAFlags aaFlags = GrQuadAAFlags::kNone;
aaFlags |= random->nextBool() ? GrQuadAAFlags::kLeft : GrQuadAAFlags::kNone;
aaFlags |= random->nextBool() ? GrQuadAAFlags::kTop : GrQuadAAFlags::kNone;
aaFlags |= random->nextBool() ? GrQuadAAFlags::kRight : GrQuadAAFlags::kNone;
aaFlags |= random->nextBool() ? GrQuadAAFlags::kBottom : GrQuadAAFlags::kNone;
if (random->nextBool()) {
if (random->nextBool()) {
SkMatrix localMatrix = GrTest::TestMatrixInvertible(random);
DrawQuad quad = {GrQuad::MakeFromRect(rect, viewMatrix),
GrQuad::MakeFromRect(rect, localMatrix), aaFlags};
return skgpu::ganesh::FillRectOp::Make(
context, std::move(paint), aaType, &quad, stencil);
} else {
SkRect localRect = GrTest::TestRect(random);
DrawQuad quad = {GrQuad::MakeFromRect(rect, viewMatrix),
GrQuad(localRect), aaFlags};
return skgpu::ganesh::FillRectOp::Make(
context, std::move(paint), aaType, &quad, stencil);
}
} else {
DrawQuad quad = {GrQuad::MakeFromRect(rect, viewMatrix), GrQuad(rect), aaFlags};
return skgpu::ganesh::FillRectOp::Make(context, std::move(paint), aaType, &quad, stencil);
}
}
#endif