| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/private/chromium/GrSurfaceCharacterization.h" |
| |
| #include "include/core/SkColorSpace.h" |
| #include "include/private/gpu/ganesh/GrTypesPriv.h" |
| #include "src/gpu/ganesh/GrCaps.h" |
| #include "src/gpu/ganesh/GrContextThreadSafeProxyPriv.h" |
| |
| #ifdef SK_DEBUG |
| void GrSurfaceCharacterization::validate() const { |
| const GrCaps* caps = fContextInfo->priv().caps(); |
| |
| GrColorType grCT = SkColorTypeToGrColorType(this->colorType()); |
| SkASSERT(fSampleCnt && caps->isFormatAsColorTypeRenderable(grCT, fBackendFormat, fSampleCnt)); |
| |
| SkASSERT(caps->areColorTypeAndFormatCompatible(grCT, fBackendFormat)); |
| |
| SkASSERT(skgpu::Mipmapped::kNo == fIsMipmapped || Textureable::kYes == fIsTextureable); |
| SkASSERT(Textureable::kNo == fIsTextureable || UsesGLFBO0::kNo == fUsesGLFBO0); |
| auto backend = fBackendFormat.backend(); |
| SkASSERT(UsesGLFBO0::kNo == fUsesGLFBO0 || backend == GrBackendApi::kOpenGL); |
| SkASSERT((VulkanSecondaryCBCompatible::kNo == fVulkanSecondaryCBCompatible && |
| VkRTSupportsInputAttachment::kNo == fVkRTSupportsInputAttachment) || |
| backend == GrBackendApi::kVulkan); |
| SkASSERT(VulkanSecondaryCBCompatible::kNo == fVulkanSecondaryCBCompatible || |
| VkRTSupportsInputAttachment::kNo == fVkRTSupportsInputAttachment); |
| SkASSERT(Textureable::kNo == fIsTextureable || |
| VulkanSecondaryCBCompatible::kNo == fVulkanSecondaryCBCompatible); |
| } |
| #endif |
| |
| |
| bool GrSurfaceCharacterization::operator==(const GrSurfaceCharacterization& other) const { |
| if (!this->isValid() || !other.isValid()) { |
| return false; |
| } |
| |
| if (fContextInfo != other.fContextInfo) { |
| return false; |
| } |
| |
| return fCacheMaxResourceBytes == other.fCacheMaxResourceBytes && |
| fOrigin == other.fOrigin && |
| fImageInfo == other.fImageInfo && |
| fBackendFormat == other.fBackendFormat && |
| fSampleCnt == other.fSampleCnt && |
| fIsTextureable == other.fIsTextureable && |
| fIsMipmapped == other.fIsMipmapped && |
| fUsesGLFBO0 == other.fUsesGLFBO0 && |
| fVulkanSecondaryCBCompatible == other.fVulkanSecondaryCBCompatible && |
| fIsProtected == other.fIsProtected && |
| fSurfaceProps == other.fSurfaceProps; |
| } |
| |
| GrSurfaceCharacterization GrSurfaceCharacterization::createResized(int width, int height) const { |
| const GrCaps* caps = fContextInfo->priv().caps(); |
| if (!caps) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| if (width <= 0 || height <= 0 || width > caps->maxRenderTargetSize() || |
| height > caps->maxRenderTargetSize()) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| return GrSurfaceCharacterization(fContextInfo, |
| fCacheMaxResourceBytes, |
| fImageInfo.makeWH(width, height), |
| fBackendFormat, |
| fOrigin, |
| fSampleCnt, |
| fIsTextureable, |
| fIsMipmapped, |
| fUsesGLFBO0, |
| fVkRTSupportsInputAttachment, |
| fVulkanSecondaryCBCompatible, |
| fIsProtected, |
| fSurfaceProps); |
| } |
| |
| GrSurfaceCharacterization GrSurfaceCharacterization::createColorSpace( |
| sk_sp<SkColorSpace> cs) const { |
| if (!this->isValid()) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| return GrSurfaceCharacterization(fContextInfo, |
| fCacheMaxResourceBytes, |
| fImageInfo.makeColorSpace(std::move(cs)), |
| fBackendFormat, |
| fOrigin, |
| fSampleCnt, |
| fIsTextureable, |
| fIsMipmapped, |
| fUsesGLFBO0, |
| fVkRTSupportsInputAttachment, |
| fVulkanSecondaryCBCompatible, |
| fIsProtected, |
| fSurfaceProps); |
| } |
| |
| GrSurfaceCharacterization GrSurfaceCharacterization::createBackendFormat( |
| SkColorType colorType, |
| const GrBackendFormat& backendFormat) const { |
| if (!this->isValid()) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| SkImageInfo newII = fImageInfo.makeColorType(colorType); |
| |
| return GrSurfaceCharacterization(fContextInfo, |
| fCacheMaxResourceBytes, |
| newII, |
| backendFormat, |
| fOrigin, |
| fSampleCnt, |
| fIsTextureable, |
| fIsMipmapped, |
| fUsesGLFBO0, |
| fVkRTSupportsInputAttachment, |
| fVulkanSecondaryCBCompatible, |
| fIsProtected, |
| fSurfaceProps); |
| } |
| |
| GrSurfaceCharacterization GrSurfaceCharacterization::createFBO0(bool usesGLFBO0) const { |
| if (!this->isValid()) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| // We can't create an FBO0 characterization that is textureable or has any non-gl specific flags |
| if (fIsTextureable == Textureable::kYes || |
| fVkRTSupportsInputAttachment == VkRTSupportsInputAttachment::kYes || |
| fVulkanSecondaryCBCompatible == VulkanSecondaryCBCompatible::kYes) { |
| return GrSurfaceCharacterization(); |
| } |
| |
| return GrSurfaceCharacterization(fContextInfo, |
| fCacheMaxResourceBytes, |
| fImageInfo, |
| fBackendFormat, |
| fOrigin, |
| fSampleCnt, |
| fIsTextureable, |
| fIsMipmapped, |
| usesGLFBO0 ? UsesGLFBO0::kYes : UsesGLFBO0::kNo, |
| fVkRTSupportsInputAttachment, |
| fVulkanSecondaryCBCompatible, |
| fIsProtected, |
| fSurfaceProps); |
| } |