1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 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 skgpu_graphite_VulkanCaps_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_VulkanCaps_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanInterface.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/vk/VulkanUtilsPriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 17*c8dee2aaSAndroid Build Coastguard Worker struct ContextOptions; 18*c8dee2aaSAndroid Build Coastguard Worker struct VulkanTextureInfo; 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class VulkanCaps final : public Caps { 21*c8dee2aaSAndroid Build Coastguard Worker public: 22*c8dee2aaSAndroid Build Coastguard Worker VulkanCaps(const ContextOptions&, 23*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 24*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 25*c8dee2aaSAndroid Build Coastguard Worker uint32_t physicalDeviceVersion, 26*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2*, 27*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions*, 28*c8dee2aaSAndroid Build Coastguard Worker Protected); 29*c8dee2aaSAndroid Build Coastguard Worker ~VulkanCaps() override; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getDefaultSampledTextureInfo(SkColorType, 32*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped, 33*c8dee2aaSAndroid Build Coastguard Worker Protected, 34*c8dee2aaSAndroid Build Coastguard Worker Renderable) const override; 35*c8dee2aaSAndroid Build Coastguard Worker 36*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getTextureInfoForSampledCopy(const TextureInfo& textureInfo, 37*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped) const override; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getDefaultCompressedTextureInfo(SkTextureCompressionType, 40*c8dee2aaSAndroid Build Coastguard Worker Mipmapped mipmapped, 41*c8dee2aaSAndroid Build Coastguard Worker Protected) const override; 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getDefaultMSAATextureInfo(const TextureInfo& singleSampledInfo, 44*c8dee2aaSAndroid Build Coastguard Worker Discardable discardable) const override; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getDefaultDepthStencilTextureInfo(SkEnumBitMask<DepthStencilFlags>, 47*c8dee2aaSAndroid Build Coastguard Worker uint32_t sampleCount, 48*c8dee2aaSAndroid Build Coastguard Worker Protected) const override; 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker TextureInfo getDefaultStorageTextureInfo(SkColorType) const override; 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker ImmutableSamplerInfo getImmutableSamplerInfo(const TextureProxy* proxy) const override; 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker UniqueKey makeGraphicsPipelineKey(const GraphicsPipelineDesc&, 55*c8dee2aaSAndroid Build Coastguard Worker const RenderPassDesc&) const override; makeComputePipelineKey(const ComputePipelineDesc &)56*c8dee2aaSAndroid Build Coastguard Worker UniqueKey makeComputePipelineKey(const ComputePipelineDesc&) const override { return {}; } 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker GraphiteResourceKey makeSamplerKey(const SamplerDesc&) const override; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker uint32_t channelMask(const TextureInfo&) const override; 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker bool isTexturable(const VulkanTextureInfo&) const; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable(const TextureInfo&) const override; 65*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable(const VulkanTextureInfo&) const; 66*c8dee2aaSAndroid Build Coastguard Worker bool isStorage(const TextureInfo&) const override; 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker void buildKeyForTexture(SkISize dimensions, 69*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo&, 70*c8dee2aaSAndroid Build Coastguard Worker ResourceType, 71*c8dee2aaSAndroid Build Coastguard Worker Shareable, 72*c8dee2aaSAndroid Build Coastguard Worker GraphiteResourceKey*) const override; 73*c8dee2aaSAndroid Build Coastguard Worker shouldAlwaysUseDedicatedImageMemory()74*c8dee2aaSAndroid Build Coastguard Worker bool shouldAlwaysUseDedicatedImageMemory() const { 75*c8dee2aaSAndroid Build Coastguard Worker return fShouldAlwaysUseDedicatedImageMemory; 76*c8dee2aaSAndroid Build Coastguard Worker } 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker // Returns whether a pure GPU accessible buffer is more performant to read than a buffer that is 79*c8dee2aaSAndroid Build Coastguard Worker // also host visible. If so then in some cases we may prefer the cost of doing a copy to the 80*c8dee2aaSAndroid Build Coastguard Worker // buffer. This typically would only be the case for buffers that are written once and read 81*c8dee2aaSAndroid Build Coastguard Worker // many times on the gpu. gpuOnlyBuffersMorePerformant()82*c8dee2aaSAndroid Build Coastguard Worker bool gpuOnlyBuffersMorePerformant() const { return fGpuOnlyBuffersMorePerformant; } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker // For our CPU write and GPU read buffers (vertex, uniform, etc.), we should keep these buffers 85*c8dee2aaSAndroid Build Coastguard Worker // persistently mapped. In general, the answer will be yes. The main case where we don't do this 86*c8dee2aaSAndroid Build Coastguard Worker // is when using special memory that is DEVICE_LOCAL and HOST_VISIBLE on discrete GPUs. shouldPersistentlyMapCpuToGpuBuffers()87*c8dee2aaSAndroid Build Coastguard Worker bool shouldPersistentlyMapCpuToGpuBuffers() const { 88*c8dee2aaSAndroid Build Coastguard Worker return fShouldPersistentlyMapCpuToGpuBuffers; 89*c8dee2aaSAndroid Build Coastguard Worker } 90*c8dee2aaSAndroid Build Coastguard Worker supportsYcbcrConversion()91*c8dee2aaSAndroid Build Coastguard Worker bool supportsYcbcrConversion() const { return fSupportsYcbcrConversion; } 92*c8dee2aaSAndroid Build Coastguard Worker supportsDeviceFaultInfo()93*c8dee2aaSAndroid Build Coastguard Worker bool supportsDeviceFaultInfo() const { return fSupportsDeviceFaultInfo; } 94*c8dee2aaSAndroid Build Coastguard Worker maxVertexAttributes()95*c8dee2aaSAndroid Build Coastguard Worker uint32_t maxVertexAttributes() const { 96*c8dee2aaSAndroid Build Coastguard Worker return fMaxVertexAttributes; 97*c8dee2aaSAndroid Build Coastguard Worker } maxUniformBufferRange()98*c8dee2aaSAndroid Build Coastguard Worker uint64_t maxUniformBufferRange() const { return fMaxUniformBufferRange; } 99*c8dee2aaSAndroid Build Coastguard Worker maxStorageBufferRange()100*c8dee2aaSAndroid Build Coastguard Worker uint64_t maxStorageBufferRange() const { return fMaxStorageBufferRange; } 101*c8dee2aaSAndroid Build Coastguard Worker physicalDeviceMemoryProperties2()102*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceMemoryProperties2& physicalDeviceMemoryProperties2() const { 103*c8dee2aaSAndroid Build Coastguard Worker return fPhysicalDeviceMemoryProperties2; 104*c8dee2aaSAndroid Build Coastguard Worker } 105*c8dee2aaSAndroid Build Coastguard Worker 106*c8dee2aaSAndroid Build Coastguard Worker bool isTransferSrc(const VulkanTextureInfo&) const; 107*c8dee2aaSAndroid Build Coastguard Worker bool isTransferDst(const VulkanTextureInfo&) const; 108*c8dee2aaSAndroid Build Coastguard Worker mustLoadFullImageForMSAA()109*c8dee2aaSAndroid Build Coastguard Worker bool mustLoadFullImageForMSAA() const { return fMustLoadFullImageForMSAA; } 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker private: 112*c8dee2aaSAndroid Build Coastguard Worker enum VkVendor { 113*c8dee2aaSAndroid Build Coastguard Worker kAMD_VkVendor = 4098, 114*c8dee2aaSAndroid Build Coastguard Worker kARM_VkVendor = 5045, 115*c8dee2aaSAndroid Build Coastguard Worker kImagination_VkVendor = 4112, 116*c8dee2aaSAndroid Build Coastguard Worker kIntel_VkVendor = 32902, 117*c8dee2aaSAndroid Build Coastguard Worker kNvidia_VkVendor = 4318, 118*c8dee2aaSAndroid Build Coastguard Worker kQualcomm_VkVendor = 20803, 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker 121*c8dee2aaSAndroid Build Coastguard Worker void init(const ContextOptions&, 122*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanInterface*, 123*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 124*c8dee2aaSAndroid Build Coastguard Worker uint32_t physicalDeviceVersion, 125*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceFeatures2*, 126*c8dee2aaSAndroid Build Coastguard Worker const skgpu::VulkanExtensions*, 127*c8dee2aaSAndroid Build Coastguard Worker Protected); 128*c8dee2aaSAndroid Build Coastguard Worker 129*c8dee2aaSAndroid Build Coastguard Worker void applyDriverCorrectnessWorkarounds(const VkPhysicalDeviceProperties&); 130*c8dee2aaSAndroid Build Coastguard Worker 131*c8dee2aaSAndroid Build Coastguard Worker void initFormatTable(const skgpu::VulkanInterface*, 132*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 133*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&); 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker void initDepthStencilFormatTable(const skgpu::VulkanInterface*, 136*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 137*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&); 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker const ColorTypeInfo* getColorTypeInfo(SkColorType, const TextureInfo&) const override; 140*c8dee2aaSAndroid Build Coastguard Worker 141*c8dee2aaSAndroid Build Coastguard Worker bool onIsTexturable(const TextureInfo&) const override; 142*c8dee2aaSAndroid Build Coastguard Worker 143*c8dee2aaSAndroid Build Coastguard Worker bool supportsWritePixels(const TextureInfo&) const override; 144*c8dee2aaSAndroid Build Coastguard Worker bool supportsReadPixels(const TextureInfo&) const override; 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker std::pair<SkColorType, bool /*isRGBFormat*/> supportedWritePixelsColorType( 147*c8dee2aaSAndroid Build Coastguard Worker SkColorType dstColorType, 148*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo& dstTextureInfo, 149*c8dee2aaSAndroid Build Coastguard Worker SkColorType srcColorType) const override; 150*c8dee2aaSAndroid Build Coastguard Worker std::pair<SkColorType, bool /*isRGBFormat*/> supportedReadPixelsColorType( 151*c8dee2aaSAndroid Build Coastguard Worker SkColorType srcColorType, 152*c8dee2aaSAndroid Build Coastguard Worker const TextureInfo& srcTextureInfo, 153*c8dee2aaSAndroid Build Coastguard Worker SkColorType dstColorType) const override; 154*c8dee2aaSAndroid Build Coastguard Worker 155*c8dee2aaSAndroid Build Coastguard Worker // Struct that determines and stores which sample count quantities a VkFormat supports. 156*c8dee2aaSAndroid Build Coastguard Worker struct SupportedSampleCounts { 157*c8dee2aaSAndroid Build Coastguard Worker void initSampleCounts(const skgpu::VulkanInterface*, 158*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 159*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 160*c8dee2aaSAndroid Build Coastguard Worker VkFormat, 161*c8dee2aaSAndroid Build Coastguard Worker VkImageUsageFlags); 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker bool isSampleCountSupported(int requestedCount) const; 164*c8dee2aaSAndroid Build Coastguard Worker 165*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<int> fSampleCounts; 166*c8dee2aaSAndroid Build Coastguard Worker }; 167*c8dee2aaSAndroid Build Coastguard Worker 168*c8dee2aaSAndroid Build Coastguard Worker // Struct that determines and stores useful information about VkFormats. 169*c8dee2aaSAndroid Build Coastguard Worker struct FormatInfo { colorTypeFlagsFormatInfo170*c8dee2aaSAndroid Build Coastguard Worker uint32_t colorTypeFlags(SkColorType colorType) const { 171*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fColorTypeInfoCount; ++i) { 172*c8dee2aaSAndroid Build Coastguard Worker if (fColorTypeInfos[i].fColorType == colorType) { 173*c8dee2aaSAndroid Build Coastguard Worker return fColorTypeInfos[i].fFlags; 174*c8dee2aaSAndroid Build Coastguard Worker } 175*c8dee2aaSAndroid Build Coastguard Worker } 176*c8dee2aaSAndroid Build Coastguard Worker return 0; 177*c8dee2aaSAndroid Build Coastguard Worker } 178*c8dee2aaSAndroid Build Coastguard Worker 179*c8dee2aaSAndroid Build Coastguard Worker void init(const skgpu::VulkanInterface*, 180*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 181*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 182*c8dee2aaSAndroid Build Coastguard Worker VkFormat); 183*c8dee2aaSAndroid Build Coastguard Worker 184*c8dee2aaSAndroid Build Coastguard Worker bool isTexturable(VkImageTiling) const; 185*c8dee2aaSAndroid Build Coastguard Worker bool isRenderable(VkImageTiling, uint32_t sampleCount) const; 186*c8dee2aaSAndroid Build Coastguard Worker bool isStorage(VkImageTiling) const; 187*c8dee2aaSAndroid Build Coastguard Worker bool isTransferSrc(VkImageTiling) const; 188*c8dee2aaSAndroid Build Coastguard Worker bool isTransferDst(VkImageTiling) const; 189*c8dee2aaSAndroid Build Coastguard Worker 190*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<ColorTypeInfo[]> fColorTypeInfos; 191*c8dee2aaSAndroid Build Coastguard Worker int fColorTypeInfoCount = 0; 192*c8dee2aaSAndroid Build Coastguard Worker 193*c8dee2aaSAndroid Build Coastguard Worker VkFormatProperties fFormatProperties; 194*c8dee2aaSAndroid Build Coastguard Worker SupportedSampleCounts fSupportedSampleCounts; 195*c8dee2aaSAndroid Build Coastguard Worker 196*c8dee2aaSAndroid Build Coastguard Worker // Indicates that a format is only supported if we are wrapping a texture with it. 197*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(bool fIsWrappedOnly = false;) 198*c8dee2aaSAndroid Build Coastguard Worker }; 199*c8dee2aaSAndroid Build Coastguard Worker 200*c8dee2aaSAndroid Build Coastguard Worker // Map SkColorType to VkFormat. 201*c8dee2aaSAndroid Build Coastguard Worker VkFormat fColorTypeToFormatTable[kSkColorTypeCnt]; 202*c8dee2aaSAndroid Build Coastguard Worker void setColorType(SkColorType, std::initializer_list<VkFormat> formats); 203*c8dee2aaSAndroid Build Coastguard Worker VkFormat getFormatFromColorType(SkColorType) const; 204*c8dee2aaSAndroid Build Coastguard Worker 205*c8dee2aaSAndroid Build Coastguard Worker // Map VkFormat to FormatInfo. 206*c8dee2aaSAndroid Build Coastguard Worker static const size_t kNumVkFormats = 22; 207*c8dee2aaSAndroid Build Coastguard Worker FormatInfo fFormatTable[kNumVkFormats]; 208*c8dee2aaSAndroid Build Coastguard Worker 209*c8dee2aaSAndroid Build Coastguard Worker FormatInfo& getFormatInfo(VkFormat); 210*c8dee2aaSAndroid Build Coastguard Worker const FormatInfo& getFormatInfo(VkFormat) const; 211*c8dee2aaSAndroid Build Coastguard Worker 212*c8dee2aaSAndroid Build Coastguard Worker // A more lightweight equivalent to FormatInfo for depth/stencil VkFormats. 213*c8dee2aaSAndroid Build Coastguard Worker struct DepthStencilFormatInfo { 214*c8dee2aaSAndroid Build Coastguard Worker void init(const skgpu::VulkanInterface*, 215*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDevice, 216*c8dee2aaSAndroid Build Coastguard Worker const VkPhysicalDeviceProperties&, 217*c8dee2aaSAndroid Build Coastguard Worker VkFormat); 218*c8dee2aaSAndroid Build Coastguard Worker bool isDepthStencilSupported(VkFormatFeatureFlags) const; 219*c8dee2aaSAndroid Build Coastguard Worker 220*c8dee2aaSAndroid Build Coastguard Worker VkFormatProperties fFormatProperties; 221*c8dee2aaSAndroid Build Coastguard Worker SupportedSampleCounts fSupportedSampleCounts; 222*c8dee2aaSAndroid Build Coastguard Worker }; 223*c8dee2aaSAndroid Build Coastguard Worker 224*c8dee2aaSAndroid Build Coastguard Worker // Map DepthStencilFlags to VkFormat. 225*c8dee2aaSAndroid Build Coastguard Worker static const size_t kNumDepthStencilFlags = 4; 226*c8dee2aaSAndroid Build Coastguard Worker VkFormat fDepthStencilFlagsToFormatTable[kNumDepthStencilFlags]; 227*c8dee2aaSAndroid Build Coastguard Worker VkFormat getFormatFromDepthStencilFlags(const SkEnumBitMask<DepthStencilFlags>& flags) const; 228*c8dee2aaSAndroid Build Coastguard Worker 229*c8dee2aaSAndroid Build Coastguard Worker // Map depth/stencil VkFormats to DepthStencilFormatInfo. 230*c8dee2aaSAndroid Build Coastguard Worker static const size_t kNumDepthStencilVkFormats = 5; 231*c8dee2aaSAndroid Build Coastguard Worker DepthStencilFormatInfo fDepthStencilFormatTable[kNumDepthStencilVkFormats]; 232*c8dee2aaSAndroid Build Coastguard Worker 233*c8dee2aaSAndroid Build Coastguard Worker DepthStencilFormatInfo& getDepthStencilFormatInfo(VkFormat); 234*c8dee2aaSAndroid Build Coastguard Worker const DepthStencilFormatInfo& getDepthStencilFormatInfo(VkFormat) const; 235*c8dee2aaSAndroid Build Coastguard Worker 236*c8dee2aaSAndroid Build Coastguard Worker uint32_t fMaxVertexAttributes; 237*c8dee2aaSAndroid Build Coastguard Worker uint64_t fMaxUniformBufferRange; 238*c8dee2aaSAndroid Build Coastguard Worker uint64_t fMaxStorageBufferRange; 239*c8dee2aaSAndroid Build Coastguard Worker VkPhysicalDeviceMemoryProperties2 fPhysicalDeviceMemoryProperties2; 240*c8dee2aaSAndroid Build Coastguard Worker 241*c8dee2aaSAndroid Build Coastguard Worker // ColorTypeInfo struct for use w/ external formats. 242*c8dee2aaSAndroid Build Coastguard Worker const ColorTypeInfo fExternalFormatColorTypeInfo = {SkColorType::kRGBA_8888_SkColorType, 243*c8dee2aaSAndroid Build Coastguard Worker SkColorType::kRGBA_8888_SkColorType, 244*c8dee2aaSAndroid Build Coastguard Worker /*flags=*/0, 245*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle::RGBA(), 246*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle::RGBA()}; 247*c8dee2aaSAndroid Build Coastguard Worker 248*c8dee2aaSAndroid Build Coastguard Worker // Various bools to define whether certain Vulkan features are supported. 249*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsMemorylessAttachments = false; 250*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsYcbcrConversion = false; 251*c8dee2aaSAndroid Build Coastguard Worker bool fShouldAlwaysUseDedicatedImageMemory = false; 252*c8dee2aaSAndroid Build Coastguard Worker bool fGpuOnlyBuffersMorePerformant = false; 253*c8dee2aaSAndroid Build Coastguard Worker bool fShouldPersistentlyMapCpuToGpuBuffers = true; 254*c8dee2aaSAndroid Build Coastguard Worker bool fSupportsDeviceFaultInfo = false; 255*c8dee2aaSAndroid Build Coastguard Worker 256*c8dee2aaSAndroid Build Coastguard Worker // Flags to enable workarounds for driver bugs 257*c8dee2aaSAndroid Build Coastguard Worker bool fMustLoadFullImageForMSAA = false; 258*c8dee2aaSAndroid Build Coastguard Worker }; 259*c8dee2aaSAndroid Build Coastguard Worker 260*c8dee2aaSAndroid Build Coastguard Worker } // namespace skgpu::graphite 261*c8dee2aaSAndroid Build Coastguard Worker 262*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_VulkanCaps_DEFINED 263