1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef GrVkCaps_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define GrVkCaps_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/vk/VulkanTypes.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTo.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/vk/SkiaVulkan.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProgramDesc.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSamplerState.h" 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 26*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 27*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list> 28*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 29*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker class GrProgramInfo; 32*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTarget; 33*c8dee2aaSAndroid Build Coastguard Worker class GrRenderTargetProxy; 34*c8dee2aaSAndroid Build Coastguard Worker class GrSurface; 35*c8dee2aaSAndroid Build Coastguard Worker class GrSurfaceProxy; 36*c8dee2aaSAndroid Build Coastguard Worker class GrVkRenderTarget; 37*c8dee2aaSAndroid Build Coastguard Worker enum class SkTextureCompressionType; 38*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions; 39*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker namespace GrTest { 42*c8dee2aaSAndroid Build Coastguard Worker struct TestFormatColorTypeCombination; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu { 46*c8dee2aaSAndroid Build Coastguard Worker class KeyBuilder; 47*c8dee2aaSAndroid Build Coastguard Worker class VulkanExtensions; 48*c8dee2aaSAndroid Build Coastguard Worker enum class Protected : bool; 49*c8dee2aaSAndroid Build Coastguard Worker struct VulkanInterface; 50*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker /** 53*c8dee2aaSAndroid Build Coastguard Worker * Stores some capabilities of a Vk backend. 54*c8dee2aaSAndroid Build Coastguard Worker */ 55*c8dee2aaSAndroid Build Coastguard Worker class GrVkCaps : public GrCaps { 56*c8dee2aaSAndroid Build Coastguard Worker public: 57*c8dee2aaSAndroid Build Coastguard Worker /** 58*c8dee2aaSAndroid Build Coastguard Worker * Creates a GrVkCaps that is set such that nothing is supported. The init function should 59*c8dee2aaSAndroid Build Coastguard Worker * be called to fill out the caps. 60*c8dee2aaSAndroid Build Coastguard Worker */ 61*c8dee2aaSAndroid Build Coastguard Worker GrVkCaps(const GrContextOptions&, 62*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 63*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 64*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2&, 65*c8dee2aaSAndroid Build Coastguard Worker uint32_t instanceVersion, 66*c8dee2aaSAndroid Build Coastguard Worker uint32_t physicalDeviceVersion, 67*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions&, 68*c8dee2aaSAndroid Build Coastguard Worker skgpu::Protected); 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker bool isFormatSRGB(const GrBackendFormat&) const override; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker bool isFormatTexturable(const GrBackendFormat&, GrTextureType) const override; 73*c8dee2aaSAndroid Build Coastguard Worker bool isVkFormatTexturable(VkFormat) const; 74*c8dee2aaSAndroid Build Coastguard Worker isFormatCopyable(const GrBackendFormat &)75*c8dee2aaSAndroid Build Coastguard Worker bool isFormatCopyable(const GrBackendFormat&) const override { return true; } 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker bool isFormatAsColorTypeRenderable(GrColorType ct, 78*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& format, 79*c8dee2aaSAndroid Build Coastguard Worker int sampleCount = 1) const override; 80*c8dee2aaSAndroid Build Coastguard Worker bool isFormatRenderable(const GrBackendFormat& format, int sampleCount) const override; 81*c8dee2aaSAndroid Build Coastguard Worker bool isFormatRenderable(VkFormat, int sampleCount) const; 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker int getRenderTargetSampleCount(int requestedCount, const GrBackendFormat&) const override; 84*c8dee2aaSAndroid Build Coastguard Worker int getRenderTargetSampleCount(int requestedCount, VkFormat) const; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker int maxRenderTargetSampleCount(const GrBackendFormat&) const override; 87*c8dee2aaSAndroid Build Coastguard Worker int maxRenderTargetSampleCount(VkFormat format) const; 88*c8dee2aaSAndroid Build Coastguard Worker 89*c8dee2aaSAndroid Build Coastguard Worker SupportedWrite supportedWritePixelsColorType(GrColorType surfaceColorType, 90*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat& surfaceFormat, 91*c8dee2aaSAndroid Build Coastguard Worker GrColorType srcColorType) const override; 92*c8dee2aaSAndroid Build Coastguard Worker 93*c8dee2aaSAndroid Build Coastguard Worker SurfaceReadPixelsSupport surfaceSupportsReadPixels(const GrSurface*) const override; 94*c8dee2aaSAndroid Build Coastguard Worker isVkFormatTexturableLinearly(VkFormat format)95*c8dee2aaSAndroid Build Coastguard Worker bool isVkFormatTexturableLinearly(VkFormat format) const { 96*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(FormatInfo::kTexturable_Flag & this->getFormatInfo(format).fLinearFlags); 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker formatCanBeDstofBlit(VkFormat format,bool linearTiled)99*c8dee2aaSAndroid Build Coastguard Worker bool formatCanBeDstofBlit(VkFormat format, bool linearTiled) const { 100*c8dee2aaSAndroid Build Coastguard Worker const FormatInfo& info = this->getFormatInfo(format); 101*c8dee2aaSAndroid Build Coastguard Worker const uint16_t& flags = linearTiled ? info.fLinearFlags : info.fOptimalFlags; 102*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(FormatInfo::kBlitDst_Flag & flags); 103*c8dee2aaSAndroid Build Coastguard Worker } 104*c8dee2aaSAndroid Build Coastguard Worker formatCanBeSrcofBlit(VkFormat format,bool linearTiled)105*c8dee2aaSAndroid Build Coastguard Worker bool formatCanBeSrcofBlit(VkFormat format, bool linearTiled) const { 106*c8dee2aaSAndroid Build Coastguard Worker const FormatInfo& info = this->getFormatInfo(format); 107*c8dee2aaSAndroid Build Coastguard Worker const uint16_t& flags = linearTiled ? info.fLinearFlags : info.fOptimalFlags; 108*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(FormatInfo::kBlitSrc_Flag & flags); 109*c8dee2aaSAndroid Build Coastguard Worker } 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker // Gets the GrColorType that should be used to transfer data in/out of a transfer buffer to 112*c8dee2aaSAndroid Build Coastguard Worker // write/read data when using a VkFormat with a specified color type. 113*c8dee2aaSAndroid Build Coastguard Worker GrColorType transferColorType(VkFormat, GrColorType surfaceColorType) const; 114*c8dee2aaSAndroid Build Coastguard Worker 115*c8dee2aaSAndroid Build Coastguard Worker // On some GPUs (Windows Nvidia and Imagination) calls to QueueWaitIdle return before actually 116*c8dee2aaSAndroid Build Coastguard Worker // signalling the fences on the command buffers even though they have completed. This causes 117*c8dee2aaSAndroid Build Coastguard Worker // issues when then deleting the command buffers. Therefore we additionally will call 118*c8dee2aaSAndroid Build Coastguard Worker // vkWaitForFences on each outstanding command buffer to make sure the driver signals the fence. mustSyncCommandBuffersWithQueue()119*c8dee2aaSAndroid Build Coastguard Worker bool mustSyncCommandBuffersWithQueue() const { return fMustSyncCommandBuffersWithQueue; } 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker // Returns true if we should always make dedicated allocations for VkImages. shouldAlwaysUseDedicatedImageMemory()122*c8dee2aaSAndroid Build Coastguard Worker bool shouldAlwaysUseDedicatedImageMemory() const { 123*c8dee2aaSAndroid Build Coastguard Worker return fShouldAlwaysUseDedicatedImageMemory; 124*c8dee2aaSAndroid Build Coastguard Worker } 125*c8dee2aaSAndroid Build Coastguard Worker 126*c8dee2aaSAndroid Build Coastguard Worker // Always use a transfer buffer instead of vkCmdUpdateBuffer to upload data to a VkBuffer. avoidUpdateBuffers()127*c8dee2aaSAndroid Build Coastguard Worker bool avoidUpdateBuffers() const { return fAvoidUpdateBuffers; } 128*c8dee2aaSAndroid Build Coastguard Worker 129*c8dee2aaSAndroid Build Coastguard Worker /** 130*c8dee2aaSAndroid Build Coastguard Worker * Returns both a supported and most preferred stencil format to use in draws. 131*c8dee2aaSAndroid Build Coastguard Worker */ preferredStencilFormat()132*c8dee2aaSAndroid Build Coastguard Worker VkFormat preferredStencilFormat() const { return fPreferredStencilFormat; } 133*c8dee2aaSAndroid Build Coastguard Worker 134*c8dee2aaSAndroid Build Coastguard Worker // Returns total number of bits used by stencil + depth + padding GetStencilFormatTotalBitCount(VkFormat format)135*c8dee2aaSAndroid Build Coastguard Worker static int GetStencilFormatTotalBitCount(VkFormat format) { 136*c8dee2aaSAndroid Build Coastguard Worker switch (format) { 137*c8dee2aaSAndroid Build Coastguard Worker case VK_FORMAT_S8_UINT: 138*c8dee2aaSAndroid Build Coastguard Worker return 8; 139*c8dee2aaSAndroid Build Coastguard Worker case VK_FORMAT_D24_UNORM_S8_UINT: 140*c8dee2aaSAndroid Build Coastguard Worker return 32; 141*c8dee2aaSAndroid Build Coastguard Worker case VK_FORMAT_D32_SFLOAT_S8_UINT: 142*c8dee2aaSAndroid Build Coastguard Worker // can optionally have 24 unused bits at the end so we assume the total bits is 64. 143*c8dee2aaSAndroid Build Coastguard Worker return 64; 144*c8dee2aaSAndroid Build Coastguard Worker default: 145*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(false); 146*c8dee2aaSAndroid Build Coastguard Worker return 0; 147*c8dee2aaSAndroid Build Coastguard Worker } 148*c8dee2aaSAndroid Build Coastguard Worker } 149*c8dee2aaSAndroid Build Coastguard Worker 150*c8dee2aaSAndroid Build Coastguard Worker // Returns whether the device supports VK_KHR_Swapchain. Internally Skia never uses any of the 151*c8dee2aaSAndroid Build Coastguard Worker // swapchain functions, but we may need to transition to and from the 152*c8dee2aaSAndroid Build Coastguard Worker // VK_IMAGE_LAYOUT_PRESENT_SRC_KHR image layout, so we must know whether that layout is 153*c8dee2aaSAndroid Build Coastguard Worker // supported. supportsSwapchain()154*c8dee2aaSAndroid Build Coastguard Worker bool supportsSwapchain() const { return fSupportsSwapchain; } 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker // Returns whether the device supports the ability to extend VkPhysicalDeviceProperties struct. supportsPhysicalDeviceProperties2()157*c8dee2aaSAndroid Build Coastguard Worker bool supportsPhysicalDeviceProperties2() const { return fSupportsPhysicalDeviceProperties2; } 158*c8dee2aaSAndroid Build Coastguard Worker // Returns whether the device supports the ability to extend VkMemoryRequirements struct. supportsMemoryRequirements2()159*c8dee2aaSAndroid Build Coastguard Worker bool supportsMemoryRequirements2() const { return fSupportsMemoryRequirements2; } 160*c8dee2aaSAndroid Build Coastguard Worker 161*c8dee2aaSAndroid Build Coastguard Worker // Returns whether the device supports the ability to extend the vkBindMemory call. supportsBindMemory2()162*c8dee2aaSAndroid Build Coastguard Worker bool supportsBindMemory2() const { return fSupportsBindMemory2; } 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker // Returns whether or not the device suports the various API maintenance fixes to Vulkan 1.0. In 165*c8dee2aaSAndroid Build Coastguard Worker // Vulkan 1.1 all these maintenance are part of the core spec. supportsMaintenance1()166*c8dee2aaSAndroid Build Coastguard Worker bool supportsMaintenance1() const { return fSupportsMaintenance1; } supportsMaintenance2()167*c8dee2aaSAndroid Build Coastguard Worker bool supportsMaintenance2() const { return fSupportsMaintenance2; } supportsMaintenance3()168*c8dee2aaSAndroid Build Coastguard Worker bool supportsMaintenance3() const { return fSupportsMaintenance3; } 169*c8dee2aaSAndroid Build Coastguard Worker 170*c8dee2aaSAndroid Build Coastguard Worker // Returns true if the device supports passing in a flag to say we are using dedicated GPU when 171*c8dee2aaSAndroid Build Coastguard Worker // allocating memory. For some devices this allows them to return more optimized memory knowning 172*c8dee2aaSAndroid Build Coastguard Worker // they will never need to suballocate amonst multiple objects. supportsDedicatedAllocation()173*c8dee2aaSAndroid Build Coastguard Worker bool supportsDedicatedAllocation() const { return fSupportsDedicatedAllocation; } 174*c8dee2aaSAndroid Build Coastguard Worker 175*c8dee2aaSAndroid Build Coastguard Worker // Returns true if the device supports importing of external memory into Vulkan memory. supportsExternalMemory()176*c8dee2aaSAndroid Build Coastguard Worker bool supportsExternalMemory() const { return fSupportsExternalMemory; } 177*c8dee2aaSAndroid Build Coastguard Worker // Returns true if the device supports importing Android hardware buffers into Vulkan memory. supportsAndroidHWBExternalMemory()178*c8dee2aaSAndroid Build Coastguard Worker bool supportsAndroidHWBExternalMemory() const { return fSupportsAndroidHWBExternalMemory; } 179*c8dee2aaSAndroid Build Coastguard Worker 180*c8dee2aaSAndroid Build Coastguard Worker // Returns true if it supports ycbcr conversion for samplers supportsYcbcrConversion()181*c8dee2aaSAndroid Build Coastguard Worker bool supportsYcbcrConversion() const { return fSupportsYcbcrConversion; } 182*c8dee2aaSAndroid Build Coastguard Worker 183*c8dee2aaSAndroid Build Coastguard Worker // Returns the number of descriptor slots used by immutable ycbcr VkImages. 184*c8dee2aaSAndroid Build Coastguard Worker // 185*c8dee2aaSAndroid Build Coastguard Worker // TODO: We should update this to return a count for a specific format or external format. We 186*c8dee2aaSAndroid Build Coastguard Worker // can use vkGetPhysicalDeviceImageFormatProperties2 with a 187*c8dee2aaSAndroid Build Coastguard Worker // VkSamplerYcbcrConversionImageFormatProperties to query this. However, right now that call 188*c8dee2aaSAndroid Build Coastguard Worker // does not support external android formats which is where the majority of ycbcr images are 189*c8dee2aaSAndroid Build Coastguard Worker // coming from. So for now we stay safe and always return 3 here which is the max value that the 190*c8dee2aaSAndroid Build Coastguard Worker // count could be for any format. ycbcrCombinedImageSamplerDescriptorCount()191*c8dee2aaSAndroid Build Coastguard Worker uint32_t ycbcrCombinedImageSamplerDescriptorCount() const { 192*c8dee2aaSAndroid Build Coastguard Worker return 3; 193*c8dee2aaSAndroid Build Coastguard Worker } 194*c8dee2aaSAndroid Build Coastguard Worker 195*c8dee2aaSAndroid Build Coastguard Worker // Returns true if the VK_EXT_image_drm_format_modifier is enabled. supportsDRMFormatModifiers()196*c8dee2aaSAndroid Build Coastguard Worker bool supportsDRMFormatModifiers() const { return fSupportsDRMFormatModifiers; } 197*c8dee2aaSAndroid Build Coastguard Worker supportsDeviceFaultInfo()198*c8dee2aaSAndroid Build Coastguard Worker bool supportsDeviceFaultInfo() const { return fSupportsDeviceFaultInfo; } 199*c8dee2aaSAndroid Build Coastguard Worker supportsFrameBoundary()200*c8dee2aaSAndroid Build Coastguard Worker bool supportsFrameBoundary() const { return fSupportsFrameBoundary; } 201*c8dee2aaSAndroid Build Coastguard Worker 202*c8dee2aaSAndroid Build Coastguard Worker // Returns whether we prefer to record draws directly into a primary command buffer. preferPrimaryOverSecondaryCommandBuffers()203*c8dee2aaSAndroid Build Coastguard Worker bool preferPrimaryOverSecondaryCommandBuffers() const { 204*c8dee2aaSAndroid Build Coastguard Worker return fPreferPrimaryOverSecondaryCommandBuffers; 205*c8dee2aaSAndroid Build Coastguard Worker } 206*c8dee2aaSAndroid Build Coastguard Worker maxPerPoolCachedSecondaryCommandBuffers()207*c8dee2aaSAndroid Build Coastguard Worker int maxPerPoolCachedSecondaryCommandBuffers() const { 208*c8dee2aaSAndroid Build Coastguard Worker return fMaxPerPoolCachedSecondaryCommandBuffers; 209*c8dee2aaSAndroid Build Coastguard Worker } 210*c8dee2aaSAndroid Build Coastguard Worker maxInputAttachmentDescriptors()211*c8dee2aaSAndroid Build Coastguard Worker uint32_t maxInputAttachmentDescriptors() const { return fMaxInputAttachmentDescriptors; } 212*c8dee2aaSAndroid Build Coastguard Worker maxSamplerAnisotropy()213*c8dee2aaSAndroid Build Coastguard Worker float maxSamplerAnisotropy() const { return fMaxSamplerAnisotropy; } 214*c8dee2aaSAndroid Build Coastguard Worker mustInvalidatePrimaryCmdBufferStateAfterClearAttachments()215*c8dee2aaSAndroid Build Coastguard Worker bool mustInvalidatePrimaryCmdBufferStateAfterClearAttachments() const { 216*c8dee2aaSAndroid Build Coastguard Worker return fMustInvalidatePrimaryCmdBufferStateAfterClearAttachments; 217*c8dee2aaSAndroid Build Coastguard Worker } 218*c8dee2aaSAndroid Build Coastguard Worker 219*c8dee2aaSAndroid Build Coastguard Worker // Returns whether a pure GPU accessible buffer is more performant to read than a buffer that is 220*c8dee2aaSAndroid Build Coastguard Worker // also host visible. If so then in some cases we may prefer the cost of doing a copy to the 221*c8dee2aaSAndroid Build Coastguard Worker // buffer. This typically would only be the case for buffers that are written once and read 222*c8dee2aaSAndroid Build Coastguard Worker // many times on the gpu. gpuOnlyBuffersMorePerformant()223*c8dee2aaSAndroid Build Coastguard Worker bool gpuOnlyBuffersMorePerformant() const { return fGpuOnlyBuffersMorePerformant; } 224*c8dee2aaSAndroid Build Coastguard Worker 225*c8dee2aaSAndroid Build Coastguard Worker // For our CPU write and GPU read buffers (vertex, uniform, etc.), should we keep these buffers 226*c8dee2aaSAndroid Build Coastguard Worker // persistently mapped. In general the answer will be yes. The main case we don't do this is 227*c8dee2aaSAndroid Build Coastguard Worker // when using special memory that is DEVICE_LOCAL and HOST_VISIBLE on discrete GPUs. shouldPersistentlyMapCpuToGpuBuffers()228*c8dee2aaSAndroid Build Coastguard Worker bool shouldPersistentlyMapCpuToGpuBuffers() const { 229*c8dee2aaSAndroid Build Coastguard Worker return fShouldPersistentlyMapCpuToGpuBuffers; 230*c8dee2aaSAndroid Build Coastguard Worker } 231*c8dee2aaSAndroid Build Coastguard Worker 232*c8dee2aaSAndroid Build Coastguard Worker // The max draw count that can be passed into indirect draw calls. maxDrawIndirectDrawCount()233*c8dee2aaSAndroid Build Coastguard Worker uint32_t maxDrawIndirectDrawCount() const { return fMaxDrawIndirectDrawCount; } 234*c8dee2aaSAndroid Build Coastguard Worker 235*c8dee2aaSAndroid Build Coastguard Worker /** 236*c8dee2aaSAndroid Build Coastguard Worker * Helpers used by canCopySurface. In all cases if the SampleCnt parameter is zero that means 237*c8dee2aaSAndroid Build Coastguard Worker * the surface is not a render target, otherwise it is the number of samples in the render 238*c8dee2aaSAndroid Build Coastguard Worker * target. 239*c8dee2aaSAndroid Build Coastguard Worker */ 240*c8dee2aaSAndroid Build Coastguard Worker bool canCopyImage(VkFormat dstFormat, 241*c8dee2aaSAndroid Build Coastguard Worker int dstSampleCnt, 242*c8dee2aaSAndroid Build Coastguard Worker bool dstHasYcbcr, 243*c8dee2aaSAndroid Build Coastguard Worker VkFormat srcFormat, 244*c8dee2aaSAndroid Build Coastguard Worker int srcSamplecnt, 245*c8dee2aaSAndroid Build Coastguard Worker bool srcHasYcbcr) const; 246*c8dee2aaSAndroid Build Coastguard Worker 247*c8dee2aaSAndroid Build Coastguard Worker bool canCopyAsBlit(VkFormat dstConfig, 248*c8dee2aaSAndroid Build Coastguard Worker int dstSampleCnt, 249*c8dee2aaSAndroid Build Coastguard Worker bool dstIsLinear, 250*c8dee2aaSAndroid Build Coastguard Worker bool dstHasYcbcr, 251*c8dee2aaSAndroid Build Coastguard Worker VkFormat srcConfig, 252*c8dee2aaSAndroid Build Coastguard Worker int srcSampleCnt, 253*c8dee2aaSAndroid Build Coastguard Worker bool srcIsLinear, 254*c8dee2aaSAndroid Build Coastguard Worker bool srcHasYcbcr) const; 255*c8dee2aaSAndroid Build Coastguard Worker 256*c8dee2aaSAndroid Build Coastguard Worker bool canCopyAsResolve(VkFormat dstConfig, 257*c8dee2aaSAndroid Build Coastguard Worker int dstSampleCnt, 258*c8dee2aaSAndroid Build Coastguard Worker bool dstHasYcbcr, 259*c8dee2aaSAndroid Build Coastguard Worker VkFormat srcConfig, 260*c8dee2aaSAndroid Build Coastguard Worker int srcSamplecnt, 261*c8dee2aaSAndroid Build Coastguard Worker bool srcHasYcbcr) const; 262*c8dee2aaSAndroid Build Coastguard Worker getBackendFormatFromCompressionType(SkTextureCompressionType)263*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat getBackendFormatFromCompressionType(SkTextureCompressionType) const override; 264*c8dee2aaSAndroid Build Coastguard Worker 265*c8dee2aaSAndroid Build Coastguard Worker VkFormat getFormatFromColorType(GrColorType colorType) const { 266*c8dee2aaSAndroid Build Coastguard Worker int idx = static_cast<int>(colorType); 267*c8dee2aaSAndroid Build Coastguard Worker return fColorTypeToFormatTable[idx]; 268*c8dee2aaSAndroid Build Coastguard Worker } 269*c8dee2aaSAndroid Build Coastguard Worker 270*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle getWriteSwizzle(const GrBackendFormat&, GrColorType) const override; 271*c8dee2aaSAndroid Build Coastguard Worker 272*c8dee2aaSAndroid Build Coastguard Worker uint64_t computeFormatKey(const GrBackendFormat&) const override; 273*c8dee2aaSAndroid Build Coastguard Worker 274*c8dee2aaSAndroid Build Coastguard Worker int getFragmentUniformBinding() const; 275*c8dee2aaSAndroid Build Coastguard Worker int getFragmentUniformSet() const; 276*c8dee2aaSAndroid Build Coastguard Worker 277*c8dee2aaSAndroid Build Coastguard Worker void addExtraSamplerKey(skgpu::KeyBuilder*, 278*c8dee2aaSAndroid Build Coastguard Worker GrSamplerState, 279*c8dee2aaSAndroid Build Coastguard Worker const GrBackendFormat&) const override; 280*c8dee2aaSAndroid Build Coastguard Worker 281*c8dee2aaSAndroid Build Coastguard Worker GrProgramDesc makeDesc(GrRenderTarget*, 282*c8dee2aaSAndroid Build Coastguard Worker const GrProgramInfo&, 283*c8dee2aaSAndroid Build Coastguard Worker ProgramDescOverrideFlags) const override; 284*c8dee2aaSAndroid Build Coastguard Worker 285*c8dee2aaSAndroid Build Coastguard Worker GrInternalSurfaceFlags getExtraSurfaceFlagsForDeferredRT() const override; 286*c8dee2aaSAndroid Build Coastguard Worker 287*c8dee2aaSAndroid Build Coastguard Worker VkShaderStageFlags getPushConstantStageFlags() const; 288*c8dee2aaSAndroid Build Coastguard Worker mustLoadFullImageWithDiscardableMSAA()289*c8dee2aaSAndroid Build Coastguard Worker bool mustLoadFullImageWithDiscardableMSAA() const { 290*c8dee2aaSAndroid Build Coastguard Worker return fMustLoadFullImageWithDiscardableMSAA; 291*c8dee2aaSAndroid Build Coastguard Worker } supportsDiscardableMSAAForDMSAA()292*c8dee2aaSAndroid Build Coastguard Worker bool supportsDiscardableMSAAForDMSAA() const { return fSupportsDiscardableMSAAForDMSAA; } 293*c8dee2aaSAndroid Build Coastguard Worker bool renderTargetSupportsDiscardableMSAA(const GrVkRenderTarget*) const; 294*c8dee2aaSAndroid Build Coastguard Worker bool programInfoWillUseDiscardableMSAA(const GrProgramInfo&) const; 295*c8dee2aaSAndroid Build Coastguard Worker dmsaaResolveCanBeUsedAsTextureInSameRenderPass()296*c8dee2aaSAndroid Build Coastguard Worker bool dmsaaResolveCanBeUsedAsTextureInSameRenderPass() const override { return false; } 297*c8dee2aaSAndroid Build Coastguard Worker supportsMemorylessAttachments()298*c8dee2aaSAndroid Build Coastguard Worker bool supportsMemorylessAttachments() const { return fSupportsMemorylessAttachments; } 299*c8dee2aaSAndroid Build Coastguard Worker 300*c8dee2aaSAndroid Build Coastguard Worker #if defined(GPU_TEST_UTILS) 301*c8dee2aaSAndroid Build Coastguard Worker std::vector<GrTest::TestFormatColorTypeCombination> getTestingCombinations() const override; 302*c8dee2aaSAndroid Build Coastguard Worker #endif 303*c8dee2aaSAndroid Build Coastguard Worker 304*c8dee2aaSAndroid Build Coastguard Worker private: 305*c8dee2aaSAndroid Build Coastguard Worker enum VkVendor { 306*c8dee2aaSAndroid Build Coastguard Worker kAMD_VkVendor = 4098, 307*c8dee2aaSAndroid Build Coastguard Worker kARM_VkVendor = 5045, 308*c8dee2aaSAndroid Build Coastguard Worker kGoogle_VkVendor = 0x1AE0, 309*c8dee2aaSAndroid Build Coastguard Worker kImagination_VkVendor = 4112, 310*c8dee2aaSAndroid Build Coastguard Worker kIntel_VkVendor = 32902, 311*c8dee2aaSAndroid Build Coastguard Worker kNvidia_VkVendor = 4318, 312*c8dee2aaSAndroid Build Coastguard Worker kQualcomm_VkVendor = 20803, 313*c8dee2aaSAndroid Build Coastguard Worker }; 314*c8dee2aaSAndroid Build Coastguard Worker 315*c8dee2aaSAndroid Build Coastguard Worker enum class IntelGPUType { 316*c8dee2aaSAndroid Build Coastguard Worker // 9th gen 317*c8dee2aaSAndroid Build Coastguard Worker kSkyLake, 318*c8dee2aaSAndroid Build Coastguard Worker 319*c8dee2aaSAndroid Build Coastguard Worker // 11th gen 320*c8dee2aaSAndroid Build Coastguard Worker kIceLake, 321*c8dee2aaSAndroid Build Coastguard Worker 322*c8dee2aaSAndroid Build Coastguard Worker // 12th gen 323*c8dee2aaSAndroid Build Coastguard Worker kRocketLake, 324*c8dee2aaSAndroid Build Coastguard Worker kTigerLake, 325*c8dee2aaSAndroid Build Coastguard Worker kAlderLake, 326*c8dee2aaSAndroid Build Coastguard Worker 327*c8dee2aaSAndroid Build Coastguard Worker kOther 328*c8dee2aaSAndroid Build Coastguard Worker }; 329*c8dee2aaSAndroid Build Coastguard Worker 330*c8dee2aaSAndroid Build Coastguard Worker enum DeviceID { 331*c8dee2aaSAndroid Build Coastguard Worker kSwiftshader_DeviceID = 0xC0DE, // As listed in Swiftshader code this may be a placeholder 332*c8dee2aaSAndroid Build Coastguard Worker // value but works for now. 333*c8dee2aaSAndroid Build Coastguard Worker }; 334*c8dee2aaSAndroid Build Coastguard Worker 335*c8dee2aaSAndroid Build Coastguard Worker static IntelGPUType GetIntelGPUType(uint32_t deviceID); GetIntelGen(IntelGPUType type)336*c8dee2aaSAndroid Build Coastguard Worker static int GetIntelGen(IntelGPUType type) { 337*c8dee2aaSAndroid Build Coastguard Worker switch (type) { 338*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kSkyLake: 339*c8dee2aaSAndroid Build Coastguard Worker return 9; 340*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kIceLake: 341*c8dee2aaSAndroid Build Coastguard Worker return 11; 342*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kRocketLake: // fall through 343*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kTigerLake: // fall through 344*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kAlderLake: 345*c8dee2aaSAndroid Build Coastguard Worker return 12; 346*c8dee2aaSAndroid Build Coastguard Worker case IntelGPUType::kOther: 347*c8dee2aaSAndroid Build Coastguard Worker // For now all our workaround checks are in the form of "if gen > some_value". So 348*c8dee2aaSAndroid Build Coastguard Worker // we can return 0 for kOther which means we won't put in the new workaround for 349*c8dee2aaSAndroid Build Coastguard Worker // older gens which is fine. If we stay on top of adding support for new gen 350*c8dee2aaSAndroid Build Coastguard Worker // intel devices we shouldn't hit cases where we'd need to change this pattern. 351*c8dee2aaSAndroid Build Coastguard Worker return 0; 352*c8dee2aaSAndroid Build Coastguard Worker } 353*c8dee2aaSAndroid Build Coastguard Worker SkUNREACHABLE; 354*c8dee2aaSAndroid Build Coastguard Worker } 355*c8dee2aaSAndroid Build Coastguard Worker 356*c8dee2aaSAndroid Build Coastguard Worker void init(const GrContextOptions&, 357*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 358*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 359*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2&, 360*c8dee2aaSAndroid Build Coastguard Worker uint32_t physicalDeviceVersion, 361*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions&, 362*c8dee2aaSAndroid Build Coastguard Worker GrProtected); 363*c8dee2aaSAndroid Build Coastguard Worker void initGrCaps(const skgpu::VulkanInterface* vkInterface, 364*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice physDev, 365*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 366*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceMemoryProperties&, 367*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2&, 368*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions&); 369*c8dee2aaSAndroid Build Coastguard Worker void initShaderCaps(const VkPhysicalDeviceProperties&, const VkPhysicalDeviceFeatures2&); 370*c8dee2aaSAndroid Build Coastguard Worker 371*c8dee2aaSAndroid Build Coastguard Worker void initFormatTable(const GrContextOptions&, 372*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 373*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 374*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 375*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2&, 376*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions&); 377*c8dee2aaSAndroid Build Coastguard Worker void initStencilFormat(const skgpu::VulkanInterface* iface, VkPhysicalDevice physDev); 378*c8dee2aaSAndroid Build Coastguard Worker 379*c8dee2aaSAndroid Build Coastguard Worker void applyDriverCorrectnessWorkarounds(const VkPhysicalDeviceProperties&); 380*c8dee2aaSAndroid Build Coastguard Worker 381*c8dee2aaSAndroid Build Coastguard Worker bool onSurfaceSupportsWritePixels(const GrSurface*) const override; 382*c8dee2aaSAndroid Build Coastguard Worker bool onCanCopySurface(const GrSurfaceProxy* dst, const SkIRect& dstRect, 383*c8dee2aaSAndroid Build Coastguard Worker const GrSurfaceProxy* src, const SkIRect& srcRect) const override; 384*c8dee2aaSAndroid Build Coastguard Worker GrBackendFormat onGetDefaultBackendFormat(GrColorType) const override; 385*c8dee2aaSAndroid Build Coastguard Worker 386*c8dee2aaSAndroid Build Coastguard Worker bool onAreColorTypeAndFormatCompatible(GrColorType, const GrBackendFormat&) const override; 387*c8dee2aaSAndroid Build Coastguard Worker 388*c8dee2aaSAndroid Build Coastguard Worker SupportedRead onSupportedReadPixelsColorType(GrColorType, const GrBackendFormat&, 389*c8dee2aaSAndroid Build Coastguard Worker GrColorType) const override; 390*c8dee2aaSAndroid Build Coastguard Worker 391*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle onGetReadSwizzle(const GrBackendFormat&, GrColorType) const override; 392*c8dee2aaSAndroid Build Coastguard Worker 393*c8dee2aaSAndroid Build Coastguard Worker GrDstSampleFlags onGetDstSampleFlagsForProxy(const GrRenderTargetProxy*) const override; 394*c8dee2aaSAndroid Build Coastguard Worker 395*c8dee2aaSAndroid Build Coastguard Worker bool onSupportsDynamicMSAA(const GrRenderTargetProxy*) const override; 396*c8dee2aaSAndroid Build Coastguard Worker 397*c8dee2aaSAndroid Build Coastguard Worker // ColorTypeInfo for a specific format 398*c8dee2aaSAndroid Build Coastguard Worker struct ColorTypeInfo { 399*c8dee2aaSAndroid Build Coastguard Worker GrColorType fColorType = GrColorType::kUnknown; 400*c8dee2aaSAndroid Build Coastguard Worker GrColorType fTransferColorType = GrColorType::kUnknown; 401*c8dee2aaSAndroid Build Coastguard Worker enum { 402*c8dee2aaSAndroid Build Coastguard Worker kUploadData_Flag = 0x1, 403*c8dee2aaSAndroid Build Coastguard Worker // Does Ganesh itself support rendering to this colorType & format pair. Renderability 404*c8dee2aaSAndroid Build Coastguard Worker // still additionally depends on if the format itself is renderable. 405*c8dee2aaSAndroid Build Coastguard Worker kRenderable_Flag = 0x2, 406*c8dee2aaSAndroid Build Coastguard Worker // Indicates that this colorType is supported only if we are wrapping a texture with 407*c8dee2aaSAndroid Build Coastguard Worker // the given format and colorType. We do not allow creation with this pair. 408*c8dee2aaSAndroid Build Coastguard Worker kWrappedOnly_Flag = 0x4, 409*c8dee2aaSAndroid Build Coastguard Worker }; 410*c8dee2aaSAndroid Build Coastguard Worker uint32_t fFlags = 0; 411*c8dee2aaSAndroid Build Coastguard Worker 412*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle fReadSwizzle; 413*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle fWriteSwizzle; 414*c8dee2aaSAndroid Build Coastguard Worker }; 415*c8dee2aaSAndroid Build Coastguard Worker 416*c8dee2aaSAndroid Build Coastguard Worker struct FormatInfo { colorTypeFlagsFormatInfo417*c8dee2aaSAndroid Build Coastguard Worker uint32_t colorTypeFlags(GrColorType colorType) const { 418*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fColorTypeInfoCount; ++i) { 419*c8dee2aaSAndroid Build Coastguard Worker if (fColorTypeInfos[i].fColorType == colorType) { 420*c8dee2aaSAndroid Build Coastguard Worker return fColorTypeInfos[i].fFlags; 421*c8dee2aaSAndroid Build Coastguard Worker } 422*c8dee2aaSAndroid Build Coastguard Worker } 423*c8dee2aaSAndroid Build Coastguard Worker return 0; 424*c8dee2aaSAndroid Build Coastguard Worker } 425*c8dee2aaSAndroid Build Coastguard Worker 426*c8dee2aaSAndroid Build Coastguard Worker void init(const GrContextOptions&, 427*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 428*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 429*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 430*c8dee2aaSAndroid Build Coastguard Worker VkFormat); 431*c8dee2aaSAndroid Build Coastguard Worker static void InitFormatFlags(VkFormatFeatureFlags, uint16_t* flags); 432*c8dee2aaSAndroid Build Coastguard Worker void initSampleCounts(const GrContextOptions&, 433*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 434*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 435*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 436*c8dee2aaSAndroid Build Coastguard Worker VkFormat); 437*c8dee2aaSAndroid Build Coastguard Worker 438*c8dee2aaSAndroid Build Coastguard Worker enum { 439*c8dee2aaSAndroid Build Coastguard Worker kTexturable_Flag = 0x1, 440*c8dee2aaSAndroid Build Coastguard Worker kRenderable_Flag = 0x2, 441*c8dee2aaSAndroid Build Coastguard Worker kBlitSrc_Flag = 0x4, 442*c8dee2aaSAndroid Build Coastguard Worker kBlitDst_Flag = 0x8, 443*c8dee2aaSAndroid Build Coastguard Worker }; 444*c8dee2aaSAndroid Build Coastguard Worker 445*c8dee2aaSAndroid Build Coastguard Worker uint16_t fOptimalFlags = 0; 446*c8dee2aaSAndroid Build Coastguard Worker uint16_t fLinearFlags = 0; 447*c8dee2aaSAndroid Build Coastguard Worker 448*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<int> fColorSampleCounts; 449*c8dee2aaSAndroid Build Coastguard Worker 450*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos; 451*c8dee2aaSAndroid Build Coastguard Worker int fColorTypeInfoCount = 0; 452*c8dee2aaSAndroid Build Coastguard Worker }; 453*c8dee2aaSAndroid Build Coastguard Worker static const size_t kNumVkFormats = 25; 454*c8dee2aaSAndroid Build Coastguard Worker FormatInfo fFormatTable[kNumVkFormats]; 455*c8dee2aaSAndroid Build Coastguard Worker 456*c8dee2aaSAndroid Build Coastguard Worker FormatInfo& getFormatInfo(VkFormat); 457*c8dee2aaSAndroid Build Coastguard Worker const FormatInfo& getFormatInfo(VkFormat) const; 458*c8dee2aaSAndroid Build Coastguard Worker 459*c8dee2aaSAndroid Build Coastguard Worker VkFormat fColorTypeToFormatTable[kGrColorTypeCnt]; 460*c8dee2aaSAndroid Build Coastguard Worker void setColorType(GrColorType, std::initializer_list<VkFormat> formats); 461*c8dee2aaSAndroid Build Coastguard Worker 462*c8dee2aaSAndroid Build Coastguard Worker VkFormat fPreferredStencilFormat; 463*c8dee2aaSAndroid Build Coastguard Worker 464*c8dee2aaSAndroid Build Coastguard Worker skia_private::STArray<1, skgpu::VulkanYcbcrConversionInfo> fYcbcrInfos; 465*c8dee2aaSAndroid Build Coastguard Worker 466*c8dee2aaSAndroid Build Coastguard Worker bool fMustSyncCommandBuffersWithQueue = false; 467*c8dee2aaSAndroid Build Coastguard Worker bool fShouldAlwaysUseDedicatedImageMemory = false; 468*c8dee2aaSAndroid Build Coastguard Worker 469*c8dee2aaSAndroid Build Coastguard Worker bool fAvoidUpdateBuffers = false; 470*c8dee2aaSAndroid Build Coastguard Worker 471*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsSwapchain = false; 472*c8dee2aaSAndroid Build Coastguard Worker 473*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsPhysicalDeviceProperties2 = false; 474*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMemoryRequirements2 = false; 475*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsBindMemory2 = false; 476*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMaintenance1 = false; 477*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMaintenance2 = false; 478*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMaintenance3 = false; 479*c8dee2aaSAndroid Build Coastguard Worker 480*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsDedicatedAllocation = false; 481*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsExternalMemory = false; 482*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsAndroidHWBExternalMemory = false; 483*c8dee2aaSAndroid Build Coastguard Worker 484*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsYcbcrConversion = false; 485*c8dee2aaSAndroid Build Coastguard Worker 486*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsDRMFormatModifiers = false; 487*c8dee2aaSAndroid Build Coastguard Worker 488*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsDeviceFaultInfo = false; 489*c8dee2aaSAndroid Build Coastguard Worker 490*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsFrameBoundary = false; 491*c8dee2aaSAndroid Build Coastguard Worker 492*c8dee2aaSAndroid Build Coastguard Worker bool fPreferPrimaryOverSecondaryCommandBuffers = true; 493*c8dee2aaSAndroid Build Coastguard Worker bool fMustInvalidatePrimaryCmdBufferStateAfterClearAttachments = false; 494*c8dee2aaSAndroid Build Coastguard Worker 495*c8dee2aaSAndroid Build Coastguard Worker bool fGpuOnlyBuffersMorePerformant = false; 496*c8dee2aaSAndroid Build Coastguard Worker bool fShouldPersistentlyMapCpuToGpuBuffers = true; 497*c8dee2aaSAndroid Build Coastguard Worker 498*c8dee2aaSAndroid Build Coastguard Worker // We default this to 100 since we already cap the max render tasks at 100 before doing a 499*c8dee2aaSAndroid Build Coastguard Worker // submission in the GrDrawingManager, so we shouldn't be going over 100 secondary command 500*c8dee2aaSAndroid Build Coastguard Worker // buffers per primary anyways. 501*c8dee2aaSAndroid Build Coastguard Worker int fMaxPerPoolCachedSecondaryCommandBuffers = 100; 502*c8dee2aaSAndroid Build Coastguard Worker 503*c8dee2aaSAndroid Build Coastguard Worker uint32_t fMaxInputAttachmentDescriptors = 0; 504*c8dee2aaSAndroid Build Coastguard Worker 505*c8dee2aaSAndroid Build Coastguard Worker float fMaxSamplerAnisotropy = 1.f; 506*c8dee2aaSAndroid Build Coastguard Worker 507*c8dee2aaSAndroid Build Coastguard Worker bool fMustLoadFullImageWithDiscardableMSAA = false; 508*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsDiscardableMSAAForDMSAA = true; 509*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMemorylessAttachments = false; 510*c8dee2aaSAndroid Build Coastguard Worker 511*c8dee2aaSAndroid Build Coastguard Worker uint32_t fMaxDrawIndirectDrawCount = 0; 512*c8dee2aaSAndroid Build Coastguard Worker 513*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = GrCaps; 514*c8dee2aaSAndroid Build Coastguard Worker }; 515*c8dee2aaSAndroid Build Coastguard Worker 516*c8dee2aaSAndroid Build Coastguard Worker #endif 517