/*
 * 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_UniformManager_DEFINED
#define skgpu_UniformManager_DEFINED

#include "experimental/graphite/src/DrawTypes.h"
#include "experimental/graphite/src/Uniform.h"
#include "include/core/SkSpan.h"

namespace skgpu {

enum class Layout {
    kStd140,
    kStd430,
    kMetal, /** This is our own self-imposed layout we use for Metal. */
};

class UniformManager {
public:
    UniformManager(Layout layout);

    /*
     * Use the uniform 'definitions' to write the data in 'srcs' into 'dst' (if it is non-null).
     * If non-null, 'offsets' is filled in with the offset of each uniform w/in 'dst'. The
     * number of bytes that was written (or would've been written) to 'dst' is returned.
     * In practice one should call:
     *   auto bytes = writeUniforms(definitions, nullptr, nullptr, nullptr);
     *   // allocate dst and offsets memory
     *   writeUniforms(definitions, src, offsets, dst);
     */
    uint32_t writeUniforms(SkSpan<const Uniform> definitions,
                           const void** srcs,
                           uint32_t* offsets,
                           void *dst);

private:
    SLType getUniformTypeForLayout(SLType type);

    Layout fLayout;
};

} // namespace skgpu

#endif // skgpu_UniformManager_DEFINED
