blob: 97b4d64706df3d2386e16eb62fb95b900405e5ed [file] [log] [blame]
/*
* 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"
#include "gl/GrGLUtil.h"
#ifdef SK_VULKAN
#include "vk/GrVkTypes.h"
#include "vk/GrVkUtil.h"
#endif
GrBackendFormat::GrBackendFormat(GrGLenum format, GrGLenum target)
: fBackend(kOpenGL_GrBackend)
, fValid(true) {
fGL.fTarget = target;
fGL.fFormat = format;
}
const GrGLenum* GrBackendFormat::getGLFormat() const {
if (this->isValid() && kOpenGL_GrBackend == fBackend) {
return &fGL.fFormat;
}
return nullptr;
}
const GrGLenum* GrBackendFormat::getGLTarget() const {
if (this->isValid() && kOpenGL_GrBackend == fBackend) {
return &fGL.fTarget;
}
return nullptr;
}
#ifdef SK_VULKAN
GrBackendFormat::GrBackendFormat(VkFormat vkFormat)
: fBackend(kVulkan_GrBackend)
, fValid(true)
, fVkFormat(vkFormat) {
}
const VkFormat* GrBackendFormat::getVkFormat() const {
if (this->isValid() && kVulkan_GrBackend == fBackend) {
return &fVkFormat;
}
return nullptr;
}
#endif
GrBackendFormat::GrBackendFormat(GrPixelConfig config)
: fBackend(kMock_GrBackend)
, fValid(true)
, fMockFormat(config) {
}
const GrPixelConfig* GrBackendFormat::getMockFormat() const {
if (this->isValid() && kMock_GrBackend == fBackend) {
return &fMockFormat;
}
return nullptr;
}
#ifdef SK_VULKAN
GrBackendTexture::GrBackendTexture(int width,
int height,
const GrVkImageInfo& vkInfo)
: fWidth(width)
, fHeight(height)
, fConfig(GrVkFormatToPixelConfig(vkInfo.fFormat))
, fMipMapped(GrMipMapped(vkInfo.fLevelCount > 1))
, fBackend(kVulkan_GrBackend)
, fVkInfo(vkInfo) {}
#endif
#if GR_TEST_UTILS
GrBackendTexture::GrBackendTexture(int width,
int height,
GrPixelConfig config,
const GrGLTextureInfo& glInfo)
: GrBackendTexture(width, height, config, GrMipMapped::kNo, glInfo) {}
GrBackendTexture::GrBackendTexture(int width,
int height,
GrPixelConfig config,
GrMipMapped mipMapped,
const GrGLTextureInfo& glInfo)
: fWidth(width)
, fHeight(height)
, fConfig(config)
, fMipMapped(mipMapped)
, fBackend(kOpenGL_GrBackend)
, fGLInfo(glInfo) {}
#endif
GrBackendTexture::GrBackendTexture(int width,
int height,
GrMipMapped mipMapped,
const GrGLTextureInfo& glInfo)
: fWidth(width)
, fHeight(height)
, fConfig(GrGLSizedFormatToPixelConfig(glInfo.fFormat))
, fMipMapped(mipMapped)
, fBackend(kOpenGL_GrBackend)
, fGLInfo(glInfo) {}
GrBackendTexture::GrBackendTexture(int width,
int height,
GrMipMapped mipMapped,
const GrMockTextureInfo& mockInfo)
: fWidth(width)
, fHeight(height)
, fConfig(mockInfo.fConfig)
, fMipMapped(mipMapped)
, fBackend(kMock_GrBackend)
, fMockInfo(mockInfo) {}
#ifdef SK_VULKAN
const GrVkImageInfo* GrBackendTexture::getVkImageInfo() const {
if (this->isValid() && kVulkan_GrBackend == fBackend) {
return &fVkInfo;
}
return nullptr;
}
#endif
const GrGLTextureInfo* GrBackendTexture::getGLTextureInfo() const {
if (this->isValid() && kOpenGL_GrBackend == fBackend) {
return &fGLInfo;
}
return nullptr;
}
const GrMockTextureInfo* GrBackendTexture::getMockTextureInfo() const {
if (this->isValid() && kMock_GrBackend == fBackend) {
return &fMockInfo;
}
return nullptr;
}
GrBackendFormat GrBackendTexture::format() const {
switch (this->backend()) {
#ifdef SK_VULKAN
case kVulkan_GrBackend: {
const GrVkImageInfo* vkInfo = this->getVkImageInfo();
SkASSERT(vkInfo);
return GrBackendFormat::MakeVk(vkInfo->fFormat);
}
#endif
case kOpenGL_GrBackend: {
const GrGLTextureInfo* glInfo = this->getGLTextureInfo();
SkASSERT(glInfo);
return GrBackendFormat::MakeGL(glInfo->fFormat, glInfo->fTarget);
}
case kMock_GrBackend: {
const GrMockTextureInfo* mockInfo = this->getMockTextureInfo();
SkASSERT(mockInfo);
return GrBackendFormat::MakeMock(mockInfo->fConfig);
}
default:
return GrBackendFormat();
}
}
#if GR_TEST_UTILS
bool GrBackendTexture::TestingOnly_Equals(const GrBackendTexture& t0, const GrBackendTexture& t1) {
if (!t0.isValid() || !t1.isValid()) {
return false; // two invalid backend textures are not considered equal
}
if (t0.fWidth != t1.fWidth ||
t0.fHeight != t1.fHeight ||
t0.fConfig != t1.fConfig ||
t0.fMipMapped != t1.fMipMapped ||
t0.fBackend != t1.fBackend) {
return false;
}
switch (t0.fBackend) {
case kOpenGL_GrBackend:
return t0.fGLInfo == t1.fGLInfo;
case kMock_GrBackend:
return t0.fMockInfo == t1.fMockInfo;
case kVulkan_GrBackend:
#ifdef SK_VULKAN
return t0.fVkInfo == t1.fVkInfo;
#else
// fall through
#endif
case kMetal_GrBackend: // fall through
default:
return false;
}
SkASSERT(0);
return false;
}
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
#ifdef SK_VULKAN
GrBackendRenderTarget::GrBackendRenderTarget(int width,
int height,
int sampleCnt,
int stencilBits,
const GrVkImageInfo& vkInfo)
: GrBackendRenderTarget(width, height, sampleCnt, vkInfo) {
// This is a deprecated constructor that takes a bogus stencil bits.
SkASSERT(0 == stencilBits);
}
GrBackendRenderTarget::GrBackendRenderTarget(int width,
int height,
int sampleCnt,
const GrVkImageInfo& vkInfo)
: fWidth(width)
, fHeight(height)
, fSampleCnt(SkTMax(1, sampleCnt))
, fStencilBits(0) // We always create stencil buffers internally for vulkan
, fConfig(GrVkFormatToPixelConfig(vkInfo.fFormat))
, fBackend(kVulkan_GrBackend)
, fVkInfo(vkInfo) {}
#endif
#if GR_TEST_UTILS
GrBackendRenderTarget::GrBackendRenderTarget(int width,
int height,
int sampleCnt,
int stencilBits,
GrPixelConfig config,
const GrGLFramebufferInfo& glInfo)
: fWidth(width)
, fHeight(height)
, fSampleCnt(SkTMax(1, sampleCnt))
, fStencilBits(stencilBits)
, fConfig(config)
, fBackend(kOpenGL_GrBackend)
, fGLInfo(glInfo) {}
#endif
GrBackendRenderTarget::GrBackendRenderTarget(int width,
int height,
int sampleCnt,
int stencilBits,
const GrGLFramebufferInfo& glInfo)
: fWidth(width)
, fHeight(height)
, fSampleCnt(SkTMax(1, sampleCnt))
, fStencilBits(stencilBits)
, fConfig(GrGLSizedFormatToPixelConfig(glInfo.fFormat))
, fBackend(kOpenGL_GrBackend)
, fGLInfo(glInfo) {}
GrBackendRenderTarget::GrBackendRenderTarget(int width,
int height,
int sampleCnt,
int stencilBits,
const GrMockRenderTargetInfo& mockInfo)
: fWidth(width)
, fHeight(height)
, fSampleCnt(SkTMax(1, sampleCnt))
, fStencilBits(stencilBits)
, fConfig(mockInfo.fConfig)
, fMockInfo(mockInfo) {}
#ifdef SK_VULKAN
const GrVkImageInfo* GrBackendRenderTarget::getVkImageInfo() const {
if (kVulkan_GrBackend == fBackend) {
return &fVkInfo;
}
return nullptr;
}
#endif
const GrGLFramebufferInfo* GrBackendRenderTarget::getGLFramebufferInfo() const {
if (kOpenGL_GrBackend == fBackend) {
return &fGLInfo;
}
return nullptr;
}
const GrMockRenderTargetInfo* GrBackendRenderTarget::getMockRenderTargetInfo() const {
if (kMock_GrBackend == fBackend) {
return &fMockInfo;
}
return nullptr;
}
#if GR_TEST_UTILS
bool GrBackendRenderTarget::TestingOnly_Equals(const GrBackendRenderTarget& r0,
const GrBackendRenderTarget& r1) {
if (!r0.isValid() || !r1.isValid()) {
return false; // two invalid backend rendertargets are not considered equal
}
if (r0.fWidth != r1.fWidth ||
r0.fHeight != r1.fHeight ||
r0.fSampleCnt != r1.fSampleCnt ||
r0.fStencilBits != r1.fStencilBits ||
r0.fConfig != r1.fConfig ||
r0.fBackend != r1.fBackend) {
return false;
}
switch (r0.fBackend) {
case kOpenGL_GrBackend:
return r0.fGLInfo == r1.fGLInfo;
case kMock_GrBackend:
return r0.fMockInfo == r1.fMockInfo;
case kVulkan_GrBackend:
#ifdef SK_VULKAN
return r0.fVkInfo == r1.fVkInfo;
#else
// fall through
#endif
case kMetal_GrBackend: // fall through
default:
return false;
}
SkASSERT(0);
return false;
}
#endif