blob: 970ab726fca458313ab9d9f2098c958b1b55bdf1 [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_graphite_ContextUtils_DEFINED
#define skgpu_graphite_ContextUtils_DEFINED
#include "src/core/SkSLTypeShared.h"
#include "src/gpu/graphite/Uniform.h"
#include <cstdint>
#include <optional>
#include <string>
class SkColorInfo;
class SkM44;
enum class SkBlendMode;
struct SkIRect;
namespace skgpu {
enum class BackendApi : unsigned int;
namespace graphite {
class Caps;
class ComputeStep;
enum class Coverage;
class Geometry;
class PaintParams;
class PaintParamsKeyBuilder;
class PipelineDataGatherer;
class Recorder;
struct RenderPassDesc;
class RenderStep;
struct ResourceBindingRequirements;
class ShaderCodeDictionary;
class UniformManager;
class UniquePaintParamsID;
enum class Layout : uint8_t;
UniquePaintParamsID ExtractPaintData(Recorder*,
PipelineDataGatherer* gatherer,
PaintParamsKeyBuilder* builder,
const Layout layout,
const SkM44& local2Dev,
const PaintParams&,
const Geometry& geometry,
const SkColorInfo& targetColorInfo);
// Intrinsic uniforms used by every program created in Graphite.
//
// `viewport` should hold the actual viewport set as backend state (defining the NDC -> pixel
// transform). The viewport's dimensions are used to define the SkDevice->NDC transform applied in
// the vertex shader, but this assumes that the (0,0) device coordinate maps to the corner of the
// top-left of the NDC cube. The viewport's origin is used in the fragment shader to reconstruct
// the logical fragment coordinate from the target's current frag coord (which are not relative to
// active viewport).
//
// It is assumed that `dstReadBounds` is in the same coordinate space as the `viewport` (e.g.
// final backing target's pixel coords) and that its width and height match the dimensions of the
// texture to be sampled for dst reads.
static constexpr Uniform kIntrinsicUniforms[] = { {"viewport", SkSLType::kFloat4},
{"dstReadBounds", SkSLType::kFloat4} };
void CollectIntrinsicUniforms(const Caps* caps,
SkIRect viewport,
SkIRect dstReadBounds,
UniformManager*);
// Returns whether or not hardware blending can be used. If not, we must perform a dst read within
// the shader.
bool CanUseHardwareBlending(const Caps*, std::optional<SkBlendMode>, Coverage);
std::string GetPipelineLabel(const ShaderCodeDictionary*,
const RenderPassDesc& renderPassDesc,
const RenderStep* renderStep,
UniquePaintParamsID paintID);
// TODO(b/396420770): Right now, BuildComputeSkSL must consider the backend in order to make certain
// decisions. It would be ideal if we could make this more backend-agnostic, perhaps by having a
// compute-specific equivalent to ResourceBindingRequirements.
std::string BuildComputeSkSL(const Caps*, const ComputeStep*, BackendApi);
std::string EmitSamplerLayout(const ResourceBindingRequirements&, int* binding);
} // namespace graphite
} // namespace skgpu
#endif // skgpu_graphite_ContextUtils_DEFINED