/*
 * Copyright 2025 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_SerializationUtils_DEFINED
#define skgpu_graphite_precompile_SerializationUtils_DEFINED

#include "include/core/SkRefCnt.h"

class SkData;

namespace skgpu::graphite {

class Caps;
class GraphicsPipelineDesc;
struct RenderPassDesc;
class ShaderCodeDictionary;

// These are the top-level entry points to serialize Pipeline data for the Android-style
// Precompilation API
[[nodiscard]] sk_sp<SkData> PipelineDescToData(const Caps*,
                                               ShaderCodeDictionary*,
                                               const GraphicsPipelineDesc&,
                                               const RenderPassDesc&);

[[nodiscard]] bool DataToPipelineDesc(const Caps*,
                                      ShaderCodeDictionary*,
                                      const SkData*,
                                      GraphicsPipelineDesc* pipelineDesc,
                                      RenderPassDesc* renderPassDesc);

[[nodiscard]] bool DataContainsExternalFormat(const Caps*,
                                              const ShaderCodeDictionary*,
                                              const SkData*,
                                              bool* containsExtFormat);

#if defined(GPU_TEST_UTILS)
void DumpPipelineDesc(const char* label,
                      ShaderCodeDictionary*,
                      const GraphicsPipelineDesc&,
                      const RenderPassDesc&);

[[nodiscard]] bool ComparePipelineDescs(const GraphicsPipelineDesc& a1, const RenderPassDesc& b1,
                                        const GraphicsPipelineDesc& a2, const RenderPassDesc& b2);
#endif

} // skgpu::graphite

#endif // skgpu_graphite_precompile_SerializationUtils_DEFINED
