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

#include "GrBackendSurface.h"

#ifdef SK_VULKAN
#include "vk/GrVkTypes.h"
#include "vk/GrVkUtil.h"
#endif

GrBackendTexture::GrBackendTexture(int width,
                                   int height,
                                   const GrVkImageInfo* vkInfo)
        : fWidth(width)
        , fHeight(height)
        , fConfig(
#ifdef SK_VULKAN
                  GrVkFormatToPixelConfig(vkInfo->fFormat)
#else
                  kUnknown_GrPixelConfig
#endif
                  )
        , fBackend(kVulkan_GrBackend)
        , fVkInfo(vkInfo) {}

GrBackendTexture::GrBackendTexture(int width,
                                   int height,
                                   GrPixelConfig config,
                                   const GrGLTextureInfo* glInfo)
        : fWidth(width)
        , fHeight(height)
        , fConfig(config)
        , fBackend(kOpenGL_GrBackend)
        , fGLInfo(glInfo) {}

GrBackendTexture::GrBackendTexture(const GrBackendTextureDesc& desc, GrBackend backend)
        : fWidth(desc.fWidth)
        , fHeight(desc.fHeight)
        , fConfig(kVulkan_GrBackend == backend
#ifdef SK_VULKAN
                  ? GrVkFormatToPixelConfig(((GrVkImageInfo*)desc.fTextureHandle)->fFormat)
#else
                  ? kUnknown_GrPixelConfig
#endif
                  : desc.fConfig)
        , fBackend(backend)
        , fHandle(desc.fTextureHandle) {}

const GrVkImageInfo* GrBackendTexture::getVkImageInfo() const {
    if (kVulkan_GrBackend == fBackend) {
        return fVkInfo;
    }
    return nullptr;
}

const GrGLTextureInfo* GrBackendTexture::getGLTextureInfo() const {
    if (kOpenGL_GrBackend == fBackend) {
        return fGLInfo;
    }
    return nullptr;
}

////////////////////////////////////////////////////////////////////////////////////////////////////

GrBackendRenderTarget::GrBackendRenderTarget(int width,
                                             int height,
                                             int sampleCnt,
                                             int stencilBits,
                                             const GrVkImageInfo* vkInfo)
        : fWidth(width)
        , fHeight(height)
        , fSampleCnt(sampleCnt)
        , fStencilBits(stencilBits)
        , fConfig(
#ifdef SK_VULKAN
                  GrVkFormatToPixelConfig(vkInfo->fFormat)
#else
                  kUnknown_GrPixelConfig
#endif
                  )
        , fBackend(kVulkan_GrBackend)
        , fVkInfo(vkInfo) {}

GrBackendRenderTarget::GrBackendRenderTarget(int width,
                                             int height,
                                             int sampleCnt,
                                             int stencilBits,
                                             GrPixelConfig config,
                                             const GrGLTextureInfo* glInfo)
        : fWidth(width)
        , fHeight(height)
        , fSampleCnt(sampleCnt)
        , fStencilBits(stencilBits)
        , fConfig(config)
        , fBackend(kOpenGL_GrBackend)
        , fGLInfo(glInfo) {}

GrBackendRenderTarget::GrBackendRenderTarget(const GrBackendRenderTargetDesc& desc,
                                             GrBackend backend)
        : fWidth(desc.fWidth)
        , fHeight(desc.fHeight)
        , fSampleCnt(desc.fSampleCnt)
        , fStencilBits(desc.fStencilBits)
        , fConfig(kVulkan_GrBackend == backend
#ifdef SK_VULKAN
                  ? GrVkFormatToPixelConfig(((GrVkImageInfo*)desc.fRenderTargetHandle)->fFormat)
#else
                  ? kUnknown_GrPixelConfig
#endif
                  : desc.fConfig)
        , fBackend(backend)
        , fHandle(desc.fRenderTargetHandle) {}

const GrVkImageInfo* GrBackendRenderTarget::getVkImageInfo() const {
    if (kVulkan_GrBackend == fBackend) {
        return fVkInfo;
    }
    return nullptr;
}

const GrGLTextureInfo* GrBackendRenderTarget::getGLTextureInfo() const {
    if (kOpenGL_GrBackend == fBackend) {
        return fGLInfo;
    }
    return nullptr;
}

