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

#include "src/gpu/dawn/GrDawnStencilAttachment.h"

#include "src/gpu/dawn/GrDawnGpu.h"
#include "src/gpu/dawn/GrDawnUtil.h"

#define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X)

GrDawnStencilAttachment::GrDawnStencilAttachment(GrDawnGpu* gpu,
                                                 int width,
                                                 int height,
                                                 int bits,
                                                 int samples,
                                                 dawn::Texture texture,
                                                 dawn::TextureView view)
    : INHERITED(gpu, width, height, bits, samples)
    , fTexture(texture)
    , fView(view) {
    this->registerWithCache(SkBudgeted::kYes);
}

GrDawnStencilAttachment* GrDawnStencilAttachment::Create(GrDawnGpu* gpu,
                                                         int width,
                                                         int height,
                                                         int sampleCnt) {
    dawn::TextureDescriptor desc;
    desc.usage = dawn::TextureUsageBit::OutputAttachment;
    desc.size.width = width;
    desc.size.height = height;
    desc.size.depth = 1;
    desc.format = dawn::TextureFormat::Depth24PlusStencil8;
    dawn::Texture texture = gpu->device().CreateTexture(&desc);
    if (!texture) {
        return nullptr;
    }
    dawn::TextureView view = texture.CreateDefaultView();
    if (!view) {
        return nullptr;
    }
    return new GrDawnStencilAttachment(gpu, width, height, 8, sampleCnt, texture, view);
}

GrDawnStencilAttachment::~GrDawnStencilAttachment() {
}

size_t GrDawnStencilAttachment::onGpuMemorySize() const {
    uint64_t size = this->width();
    size *= this->height();
    size *= 32;
    size *= SkTMax(1,this->numSamples());
    return static_cast<size_t>(size / 8);
}

void GrDawnStencilAttachment::onRelease() {
    GrStencilAttachment::onRelease();
}

void GrDawnStencilAttachment::onAbandon() {
    GrStencilAttachment::onAbandon();
}

GrDawnGpu* GrDawnStencilAttachment::getDawnGpu() const {
    SkASSERT(!this->wasDestroyed());
    return static_cast<GrDawnGpu*>(this->getGpu());
}
