/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/

#include "include/core/SkTraceMemoryDump.h"
#include "src/gpu/vk/GrVkGpu.h"
#include "src/gpu/vk/GrVkTransferBuffer.h"

sk_sp<GrVkTransferBuffer> GrVkTransferBuffer::Make(GrVkGpu* gpu, size_t size,
                                                   GrVkBuffer::Type type) {
    GrVkBuffer::Desc desc;
    desc.fDynamic = true;
    SkASSERT(GrVkBuffer::kCopyRead_Type == type || GrVkBuffer::kCopyWrite_Type == type);
    desc.fType = type;
    desc.fSizeInBytes = size;

    const GrVkBuffer::Resource* bufferResource = GrVkBuffer::Create(gpu, desc);
    if (!bufferResource) {
        return nullptr;
    }

    GrVkTransferBuffer* buffer = new GrVkTransferBuffer(gpu, desc, bufferResource);
    if (!buffer) {
        bufferResource->unref();
    }
    return sk_sp<GrVkTransferBuffer>(buffer);
}

GrVkTransferBuffer::GrVkTransferBuffer(GrVkGpu* gpu, const GrVkBuffer::Desc& desc,
                                       const GrVkBuffer::Resource* bufferResource)
        : INHERITED(gpu, desc.fSizeInBytes,
                    kCopyRead_Type == desc.fType ? GrGpuBufferType::kXferCpuToGpu
                                                 : GrGpuBufferType::kXferGpuToCpu,
                    kStream_GrAccessPattern)
        , GrVkBuffer(desc, bufferResource) {
    this->registerWithCache(SkBudgeted::kYes);
}

void GrVkTransferBuffer::onRelease() {
    if (!this->wasDestroyed()) {
        this->vkRelease();
    }
    INHERITED::onRelease();
}

void GrVkTransferBuffer::onAbandon() {
    if (!this->wasDestroyed()) {
        this->vkRelease();
    }
    INHERITED::onAbandon();
}

void GrVkTransferBuffer::setMemoryBacking(SkTraceMemoryDump* traceMemoryDump,
                                          const SkString& dumpName) const {
    SkString buffer_id;
    buffer_id.appendU64((uint64_t)this->buffer());
    traceMemoryDump->setMemoryBacking(dumpName.c_str(), "vk_buffer",
                                      buffer_id.c_str());
}
