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

#include "src/gpu/ganesh/GrManagedResource.h"

#import <Metal/Metal.h>

/**
 * Wraps a MTLRenderPipelineState object
 */
class GrMtlRenderPipeline : public GrManagedResource {
public:
    static sk_sp<GrMtlRenderPipeline> Make(id<MTLRenderPipelineState> pso) {
        return sk_sp<GrMtlRenderPipeline>(new GrMtlRenderPipeline(pso));
    }
#ifdef SK_TRACE_MANAGED_RESOURCES
    /** output a human-readable dump of this resource's information
     */
    void dumpInfo() const override {
        SkDebugf("GrMtlRenderPipeline: %p (%ld refs)\n", fPipelineState,
                 CFGetRetainCount((CFTypeRef)fPipelineState));
    }
#endif

    void freeGPUData() const override {
        fPipelineState = nil;
    }

    id<MTLRenderPipelineState> mtlPipelineState() const { return fPipelineState; }

private:
    GrMtlRenderPipeline(id<MTLRenderPipelineState> pso)
        : GrManagedResource()
        , fPipelineState(pso) {
    }

    mutable id<MTLRenderPipelineState> fPipelineState;
};

#endif
