xref: /aosp_15_r20/external/skia/src/gpu/graphite/render/CoverBoundsRenderStep.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/render/CoverBoundsRenderStep.h"
9*c8dee2aaSAndroid Build Coastguard Worker 
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkM44.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkVx.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkSLTypeShared.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/BufferWriter.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Attribute.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawOrder.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawParams.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawTypes.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawWriter.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Geometry.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Rect.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Shape.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/geom/Transform_graphite.h"
24*c8dee2aaSAndroid Build Coastguard Worker 
25*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
26*c8dee2aaSAndroid Build Coastguard Worker 
27*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
28*c8dee2aaSAndroid Build Coastguard Worker 
CoverBoundsRenderStep(const char * tag,DepthStencilSettings dsSettings)29*c8dee2aaSAndroid Build Coastguard Worker CoverBoundsRenderStep::CoverBoundsRenderStep(const char* tag, DepthStencilSettings dsSettings)
30*c8dee2aaSAndroid Build Coastguard Worker         : RenderStep("CoverBoundsRenderStep",
31*c8dee2aaSAndroid Build Coastguard Worker                      tag,
32*c8dee2aaSAndroid Build Coastguard Worker                      Flags::kPerformsShading,
33*c8dee2aaSAndroid Build Coastguard Worker                      /*uniforms=*/{},
34*c8dee2aaSAndroid Build Coastguard Worker                      PrimitiveType::kTriangleStrip,
35*c8dee2aaSAndroid Build Coastguard Worker                      dsSettings,
36*c8dee2aaSAndroid Build Coastguard Worker                      /*vertexAttrs=*/  {},
37*c8dee2aaSAndroid Build Coastguard Worker                      /*instanceAttrs=*/{{"bounds", VertexAttribType::kFloat4, SkSLType::kFloat4},
38*c8dee2aaSAndroid Build Coastguard Worker                                         {"depth", VertexAttribType::kFloat, SkSLType::kFloat},
39*c8dee2aaSAndroid Build Coastguard Worker                                         {"ssboIndices", VertexAttribType::kUInt2, SkSLType::kUInt2},
40*c8dee2aaSAndroid Build Coastguard Worker                                         {"mat0", VertexAttribType::kFloat3, SkSLType::kFloat3},
41*c8dee2aaSAndroid Build Coastguard Worker                                         {"mat1", VertexAttribType::kFloat3, SkSLType::kFloat3},
42*c8dee2aaSAndroid Build Coastguard Worker                                         {"mat2", VertexAttribType::kFloat3, SkSLType::kFloat3}}) {}
43*c8dee2aaSAndroid Build Coastguard Worker 
~CoverBoundsRenderStep()44*c8dee2aaSAndroid Build Coastguard Worker CoverBoundsRenderStep::~CoverBoundsRenderStep() {}
45*c8dee2aaSAndroid Build Coastguard Worker 
vertexSkSL() const46*c8dee2aaSAndroid Build Coastguard Worker std::string CoverBoundsRenderStep::vertexSkSL() const {
47*c8dee2aaSAndroid Build Coastguard Worker     // Returns the body of a vertex function, which must define a float4 devPosition variable and
48*c8dee2aaSAndroid Build Coastguard Worker     // must write to an already-defined float2 stepLocalCoords variable.
49*c8dee2aaSAndroid Build Coastguard Worker     return "float4 devPosition = cover_bounds_vertex_fn("
50*c8dee2aaSAndroid Build Coastguard Worker                                          "float2(sk_VertexID / 2, sk_VertexID % 2), "
51*c8dee2aaSAndroid Build Coastguard Worker                                          "bounds, depth, float3x3(mat0, mat1, mat2), "
52*c8dee2aaSAndroid Build Coastguard Worker                                          "stepLocalCoords);\n";
53*c8dee2aaSAndroid Build Coastguard Worker }
54*c8dee2aaSAndroid Build Coastguard Worker 
writeVertices(DrawWriter * writer,const DrawParams & params,skvx::uint2 ssboIndices) const55*c8dee2aaSAndroid Build Coastguard Worker void CoverBoundsRenderStep::writeVertices(DrawWriter* writer,
56*c8dee2aaSAndroid Build Coastguard Worker                                           const DrawParams& params,
57*c8dee2aaSAndroid Build Coastguard Worker                                           skvx::uint2 ssboIndices) const {
58*c8dee2aaSAndroid Build Coastguard Worker     // Each instance is 4 vertices, forming 2 triangles from a single triangle strip, so no indices
59*c8dee2aaSAndroid Build Coastguard Worker     // are needed. sk_VertexID is used to place vertex positions, so no vertex buffer is needed.
60*c8dee2aaSAndroid Build Coastguard Worker     DrawWriter::Instances instances{*writer, {}, {}, 4};
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     skvx::float4 bounds;
63*c8dee2aaSAndroid Build Coastguard Worker     if (params.geometry().isShape() && params.geometry().shape().inverted()) {
64*c8dee2aaSAndroid Build Coastguard Worker         // Normally all bounding boxes are sorted such that l<r and t<b. We upload an inverted
65*c8dee2aaSAndroid Build Coastguard Worker         // rectangle [r,b,l,t] when it's an inverse fill to encode that the bounds are already in
66*c8dee2aaSAndroid Build Coastguard Worker         // device space and then the VS will use the inverse of the transform to compute local
67*c8dee2aaSAndroid Build Coastguard Worker         // coordinates.
68*c8dee2aaSAndroid Build Coastguard Worker         bounds = skvx::shuffle</*R*/2, /*B*/3, /*L*/0, /*T*/1>(
69*c8dee2aaSAndroid Build Coastguard Worker                 skvx::cast<float>(skvx::int4::Load(&params.clip().scissor())));
70*c8dee2aaSAndroid Build Coastguard Worker     } else {
71*c8dee2aaSAndroid Build Coastguard Worker         bounds = params.geometry().bounds().ltrb();
72*c8dee2aaSAndroid Build Coastguard Worker     }
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     // Since the local coords always have Z=0, we can discard the 3rd row and column of the matrix.
75*c8dee2aaSAndroid Build Coastguard Worker     const SkM44& m = params.transform().matrix();
76*c8dee2aaSAndroid Build Coastguard Worker     instances.append(1) << bounds << params.order().depthAsFloat() << ssboIndices
77*c8dee2aaSAndroid Build Coastguard Worker                         << m.rc(0,0) << m.rc(1,0) << m.rc(3,0)
78*c8dee2aaSAndroid Build Coastguard Worker                         << m.rc(0,1) << m.rc(1,1) << m.rc(3,1)
79*c8dee2aaSAndroid Build Coastguard Worker                         << m.rc(0,3) << m.rc(1,3) << m.rc(3,3);
80*c8dee2aaSAndroid Build Coastguard Worker }
81*c8dee2aaSAndroid Build Coastguard Worker 
writeUniformsAndTextures(const DrawParams &,PipelineDataGatherer *) const82*c8dee2aaSAndroid Build Coastguard Worker void CoverBoundsRenderStep::writeUniformsAndTextures(const DrawParams&,
83*c8dee2aaSAndroid Build Coastguard Worker                                                      PipelineDataGatherer*) const {
84*c8dee2aaSAndroid Build Coastguard Worker     // All data is uploaded as instance attributes, so no uniforms are needed.
85*c8dee2aaSAndroid Build Coastguard Worker }
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::graphite
88