/*
* 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 "GrVkTransferBuffer.h"
#include "GrVkGpu.h"
#include "SkTraceMemoryDump.h"


GrVkTransferBuffer* GrVkTransferBuffer::Create(GrVkGpu* gpu, size_t size, GrVkBuffer::Type type) {
    GrVkBuffer::Desc desc;
    desc.fDynamic = false;
    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(gpu);
    }
    return buffer;
}

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

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

    INHERITED::onRelease();
}

void GrVkTransferBuffer::onAbandon() {
    this->vkAbandon();
    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());
}
