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

#ifndef GrVkTransferBuffer_DEFINED
#define GrVkTransferBuffer_DEFINED

#include "GrVkVulkan.h"

#include "GrBuffer.h"
#include "GrVkBuffer.h"

class GrVkGpu;

class GrVkTransferBuffer : public GrBuffer, public GrVkBuffer {

public:
    static GrVkTransferBuffer* Create(GrVkGpu* gpu, size_t size, GrVkBuffer::Type type);

protected:
    void onAbandon() override;
    void onRelease() override;

private:
    GrVkTransferBuffer(GrVkGpu* gpu, const GrVkBuffer::Desc& desc,
                       const GrVkBuffer::Resource* resource);
    void setMemoryBacking(SkTraceMemoryDump* traceMemoryDump,
                          const SkString& dumpName) const override;

    void onMap() override {
        if (!this->wasDestroyed()) {
            this->GrBuffer::fMapPtr = this->vkMap(this->getVkGpu());
        }
    }

    void onUnmap() override {
        if (!this->wasDestroyed()) {
            this->vkUnmap(this->getVkGpu());
        }
    }

    bool onUpdateData(const void* src, size_t srcSizeInBytes) override {
        SK_ABORT("Not implemented for transfer buffers.");
        return false;
    }

    GrVkGpu* getVkGpu() const {
        SkASSERT(!this->wasDestroyed());
        return reinterpret_cast<GrVkGpu*>(this->getGpu());
    }

    typedef GrBuffer INHERITED;
};

#endif
