/*
 * Copyright 2024 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_precompile_Precompile_DEFINED
#define skgpu_graphite_precompile_Precompile_DEFINED

#include "include/core/SkColorSpace.h"
#include "include/core/SkColorType.h"
#include "include/core/SkSpan.h"
#include "include/gpu/graphite/GraphiteTypes.h"

namespace skgpu::graphite {

class PaintOptions;
class PrecompileContext;

/**
 *  Describes the required properties of a RenderPass that will be combined with the
 *  other portions of the Precompilation API (i.e., paintOptions and drawTypes) to yield
 *  a pipeline.
 */
struct SK_API RenderPassProperties {
    bool operator==(const RenderPassProperties& other) const {
        return fDSFlags == other.fDSFlags &&
               fDstCT == other.fDstCT &&
               fRequiresMSAA == other.fRequiresMSAA &&
               SkColorSpace::Equals(fDstCS.get(), other.fDstCS.get());
    }
    bool operator!= (const RenderPassProperties& other) const { return !(*this == other); }

    DepthStencilFlags   fDSFlags      = DepthStencilFlags::kNone;
    SkColorType         fDstCT        = kRGBA_8888_SkColorType;
    sk_sp<SkColorSpace> fDstCS        = nullptr;
    bool                fRequiresMSAA = false;
};

/**
 * Precompilation allows clients to create pipelines ahead of time based on what they expect
 * to draw. This can reduce performance hitches, due to inline compilation, during the actual
 * drawing. Graphite will always be able to perform an inline compilation if some SkPaint
 * combination was omitted from precompilation.
 *
 *   @param precompileContext    thread-safe helper holding required portions of the Context
 *   @param paintOptions         captures a set of SkPaints that will be drawn
 *   @param drawTypes            communicates which primitives those paints will be drawn with
 *   @param renderPassProperties describes the RenderPasses needed for the desired Pipelines
 */
void SK_API Precompile(PrecompileContext* precompileContext,
                       const PaintOptions& paintOptions,
                       DrawTypeFlags drawTypes,
                       SkSpan<const RenderPassProperties> renderPassProperties);

} // namespace skgpu::graphite

#endif // skgpu_graphite_precompile_Precompile_DEFINED
