blob: 2309541090300de58d292d878c0f7a7712e44c2d [file] [log] [blame]
Greg Daniel164a9f02016-02-22 09:56:40 -05001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrVkCaps_DEFINED
9#define GrVkCaps_DEFINED
10
11#include "GrCaps.h"
12#include "GrVkStencilAttachment.h"
Greg Daniel487132b2018-12-20 14:09:36 -050013#include "vk/GrVkTypes.h"
Greg Daniel164a9f02016-02-22 09:56:40 -050014
Brian Salomon94efbf52016-11-29 13:43:05 -050015class GrShaderCaps;
Greg Danielc0b03d82018-08-03 14:41:15 -040016class GrVkExtensions;
17struct GrVkInterface;
Greg Daniel164a9f02016-02-22 09:56:40 -050018
19/**
20 * Stores some capabilities of a Vk backend.
21 */
22class GrVkCaps : public GrCaps {
halcanary9d524f22016-03-29 09:03:52 -070023public:
Greg Daniel164a9f02016-02-22 09:56:40 -050024 typedef GrVkStencilAttachment::Format StencilFormat;
25
26 /**
27 * Creates a GrVkCaps that is set such that nothing is supported. The init function should
28 * be called to fill out the caps.
29 */
30 GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
Greg Daniela0651ac2018-08-08 09:23:18 -040031 VkPhysicalDevice device, const VkPhysicalDeviceFeatures2& features,
Greg Daniel41f0e282019-01-28 13:15:05 -050032 uint32_t instanceVersion, uint32_t physicalDeviceVersion,
33 const GrVkExtensions& extensions);
Greg Daniel164a9f02016-02-22 09:56:40 -050034
35 bool isConfigTexturable(GrPixelConfig config) const override {
egdaniel8f1dcaa2016-04-01 10:10:45 -070036 return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fOptimalFlags);
Greg Daniel164a9f02016-02-22 09:56:40 -050037 }
38
Greg Danielbb76ace2017-09-29 15:58:22 -040039 bool isConfigCopyable(GrPixelConfig config) const override {
40 return true;
41 }
42
Brian Salomonbdecacf2018-02-02 20:32:49 -050043 int getRenderTargetSampleCount(int requestedCount, GrPixelConfig config) const override;
44 int maxRenderTargetSampleCount(GrPixelConfig config) const override;
45
Brian Salomon19eaf2d2018-03-19 16:06:44 -040046 bool surfaceSupportsReadPixels(const GrSurface*) const override { return true; }
Brian Salomon5f33a8c2018-02-26 14:32:39 -050047
egdaniela95d46b2016-08-15 08:06:29 -070048 bool isConfigTexturableLinearly(GrPixelConfig config) const {
egdaniel8f1dcaa2016-04-01 10:10:45 -070049 return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fLinearFlags);
50 }
51
52 bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const {
egdaniel8f1dcaa2016-04-01 10:10:45 -070053 return !withMSAA && SkToBool(ConfigInfo::kRenderable_Flag &
54 fConfigTable[config].fLinearFlags);
55 }
56
57 bool configCanBeDstofBlit(GrPixelConfig config, bool linearTiled) const {
egdaniel8f1dcaa2016-04-01 10:10:45 -070058 const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
59 fConfigTable[config].fOptimalFlags;
60 return SkToBool(ConfigInfo::kBlitDst_Flag & flags);
61 }
62
63 bool configCanBeSrcofBlit(GrPixelConfig config, bool linearTiled) const {
egdaniel8f1dcaa2016-04-01 10:10:45 -070064 const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
65 fConfigTable[config].fOptimalFlags;
66 return SkToBool(ConfigInfo::kBlitSrc_Flag & flags);
Greg Daniel164a9f02016-02-22 09:56:40 -050067 }
68
Greg Daniel22bc8652017-03-22 15:45:43 -040069 // On Adreno vulkan, they do not respect the imageOffset parameter at least in
70 // copyImageToBuffer. This flag says that we must do the copy starting from the origin always.
egdaniel6fa0a912016-09-12 11:51:29 -070071 bool mustDoCopiesFromOrigin() const {
72 return fMustDoCopiesFromOrigin;
73 }
74
Greg Daniel22bc8652017-03-22 15:45:43 -040075 // Sometimes calls to QueueWaitIdle return before actually signalling the fences
76 // on the command buffers even though they have completed. This causes an assert to fire when
77 // destroying the command buffers. Therefore we add a sleep to make sure the fence signals.
Greg Daniel80a08dd2017-01-20 10:45:49 -050078 bool mustSleepOnTearDown() const {
79 return fMustSleepOnTearDown;
80 }
81
Greg Daniele3cd6912017-05-17 11:15:55 -040082 // Returns true if while adding commands to command buffers, we must make a new command buffer
83 // everytime we want to bind a new VkPipeline. This is true for both primary and secondary
84 // command buffers. This is to work around a driver bug specifically on AMD.
85 bool newCBOnPipelineChange() const {
86 return fNewCBOnPipelineChange;
Greg Daniel22bc8652017-03-22 15:45:43 -040087 }
88
Greg Danielddc0c602018-06-18 11:26:30 -040089 // Returns true if we should always make dedicated allocations for VkImages.
90 bool shouldAlwaysUseDedicatedImageMemory() const {
91 return fShouldAlwaysUseDedicatedImageMemory;
Greg Daniel8385a8a2018-02-26 13:29:37 -050092 }
93
Greg Daniel164a9f02016-02-22 09:56:40 -050094 /**
Ethan Nicholasf610bae2018-09-20 16:55:21 -040095 * Returns both a supported and most preferred stencil format to use in draws.
Greg Daniel164a9f02016-02-22 09:56:40 -050096 */
Ethan Nicholasf610bae2018-09-20 16:55:21 -040097 const StencilFormat& preferredStencilFormat() const {
98 return fPreferredStencilFormat;
Greg Daniel164a9f02016-02-22 09:56:40 -050099 }
100
Greg Danielc0b03d82018-08-03 14:41:15 -0400101 // Returns whether the device supports the ability to extend VkPhysicalDeviceProperties struct.
102 bool supportsPhysicalDeviceProperties2() const { return fSupportsPhysicalDeviceProperties2; }
103 // Returns whether the device supports the ability to extend VkMemoryRequirements struct.
104 bool supportsMemoryRequirements2() const { return fSupportsMemoryRequirements2; }
Greg Daniel637c06a2018-09-12 09:44:25 -0400105
106 // Returns whether the device supports the ability to extend the vkBindMemory call.
107 bool supportsBindMemory2() const { return fSupportsBindMemory2; }
108
Greg Danielc0b03d82018-08-03 14:41:15 -0400109 // Returns whether or not the device suports the various API maintenance fixes to Vulkan 1.0. In
110 // Vulkan 1.1 all these maintenance are part of the core spec.
111 bool supportsMaintenance1() const { return fSupportsMaintenance1; }
112 bool supportsMaintenance2() const { return fSupportsMaintenance2; }
113 bool supportsMaintenance3() const { return fSupportsMaintenance3; }
114
Greg Daniela9979d12018-08-27 15:56:46 -0400115 // Returns true if the device supports passing in a flag to say we are using dedicated GPU when
116 // allocating memory. For some devices this allows them to return more optimized memory knowning
117 // they will never need to suballocate amonst multiple objects.
118 bool supportsDedicatedAllocation() const { return fSupportsDedicatedAllocation; }
119
120 // Returns true if the device supports importing of external memory into Vulkan memory.
121 bool supportsExternalMemory() const { return fSupportsExternalMemory; }
122 // Returns true if the device supports importing Android hardware buffers into Vulkan memory.
123 bool supportsAndroidHWBExternalMemory() const { return fSupportsAndroidHWBExternalMemory; }
124
Greg Daniel7e000222018-12-03 10:08:21 -0500125 // Returns true if it supports ycbcr conversion for samplers
126 bool supportsYcbcrConversion() const { return fSupportsYcbcrConversion; }
127
Greg Daniel25af6712018-04-25 10:44:38 -0400128 /**
129 * Helpers used by canCopySurface. In all cases if the SampleCnt parameter is zero that means
130 * the surface is not a render target, otherwise it is the number of samples in the render
131 * target.
132 */
133 bool canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurfaceOrigin dstOrigin,
134 GrPixelConfig srcConfig, int srcSamplecnt, GrSurfaceOrigin srcOrigin) const;
135
136 bool canCopyAsBlit(GrPixelConfig dstConfig, int dstSampleCnt, bool dstIsLinear,
137 GrPixelConfig srcConfig, int srcSampleCnt, bool srcIsLinear) const;
138
139 bool canCopyAsResolve(GrPixelConfig dstConfig, int dstSampleCnt, GrSurfaceOrigin dstOrigin,
140 GrPixelConfig srcConfig, int srcSamplecnt,
141 GrSurfaceOrigin srcOrigin) const;
142
143 bool canCopyAsDraw(GrPixelConfig dstConfig, bool dstIsRenderable,
144 GrPixelConfig srcConfig, bool srcIsTextureable) const;
145
Brian Salomon2a4f9832018-03-03 22:43:43 -0500146 bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, GrSurfaceOrigin*,
Robert Phillipsbf25d432017-04-07 10:08:53 -0400147 bool* rectsMustMatch, bool* disallowSubrect) const override;
Brian Salomon467921e2017-03-06 16:17:12 -0500148
Brian Salomonf391d0f2018-12-14 09:18:50 -0500149 GrPixelConfig validateBackendRenderTarget(const GrBackendRenderTarget&,
150 SkColorType) const override;
Greg Danielf5d87582017-12-18 14:48:15 -0500151
Brian Salomonf391d0f2018-12-14 09:18:50 -0500152 GrPixelConfig getConfigFromBackendFormat(const GrBackendFormat&, SkColorType) const override;
153 GrPixelConfig getYUVAConfigFromBackendFormat(const GrBackendFormat&) const override;
Robert Phillipsfc711a22018-02-13 17:03:00 -0500154
Greg Daniel4065d452018-11-16 15:43:41 -0500155 GrBackendFormat getBackendFormatFromGrColorType(GrColorType ct,
156 GrSRGBEncoded srgbEncoded) const override;
157
Greg Danielfaa095e2017-12-19 13:15:02 -0500158private:
egdaniel6fa0a912016-09-12 11:51:29 -0700159 enum VkVendor {
Greg Danielc5cc2de2017-03-20 11:40:58 -0400160 kAMD_VkVendor = 4098,
Greg Daniel8385a8a2018-02-26 13:29:37 -0500161 kARM_VkVendor = 5045,
Greg Daniel80a08dd2017-01-20 10:45:49 -0500162 kImagination_VkVendor = 4112,
Greg Daniel8385a8a2018-02-26 13:29:37 -0500163 kIntel_VkVendor = 32902,
Greg Danielc5cc2de2017-03-20 11:40:58 -0400164 kNvidia_VkVendor = 4318,
165 kQualcomm_VkVendor = 20803,
egdaniel6fa0a912016-09-12 11:51:29 -0700166 };
167
Greg Daniel164a9f02016-02-22 09:56:40 -0500168 void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
Greg Daniel41f0e282019-01-28 13:15:05 -0500169 VkPhysicalDevice device, const VkPhysicalDeviceFeatures2&,
170 uint32_t physicalDeviceVersion, const GrVkExtensions&);
Greg Daniel313c6952018-08-08 09:24:08 -0400171 void initGrCaps(const GrVkInterface* vkInterface,
172 VkPhysicalDevice physDev,
173 const VkPhysicalDeviceProperties&,
jvanverthfd7bd452016-03-25 06:29:52 -0700174 const VkPhysicalDeviceMemoryProperties&,
Greg Daniel313c6952018-08-08 09:24:08 -0400175 const VkPhysicalDeviceFeatures2&,
176 const GrVkExtensions&);
Greg Daniela0651ac2018-08-08 09:23:18 -0400177 void initShaderCaps(const VkPhysicalDeviceProperties&, const VkPhysicalDeviceFeatures2&);
Greg Daniel164a9f02016-02-22 09:56:40 -0500178
Greg Daniel2bb6ecc2017-07-20 13:11:14 +0000179 void initConfigTable(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&);
egdaniel8f1dcaa2016-04-01 10:10:45 -0700180 void initStencilFormat(const GrVkInterface* iface, VkPhysicalDevice physDev);
Greg Daniel164a9f02016-02-22 09:56:40 -0500181
Greg Daniel7e000222018-12-03 10:08:21 -0500182 uint8_t getYcbcrKeyFromYcbcrInfo(const GrVkYcbcrConversionInfo& info);
183
Greg Daniel691f5e72018-02-28 14:21:34 -0500184 void applyDriverCorrectnessWorkarounds(const VkPhysicalDeviceProperties&);
185
Brian Salomonc67c31c2018-12-06 10:00:03 -0500186 bool onSurfaceSupportsWritePixels(const GrSurface*) const override;
187 bool onCanCopySurface(const GrSurfaceProxy* dst, const GrSurfaceProxy* src,
188 const SkIRect& srcRect, const SkIPoint& dstPoint) const override;
189
egdaniel8f1dcaa2016-04-01 10:10:45 -0700190 struct ConfigInfo {
191 ConfigInfo() : fOptimalFlags(0), fLinearFlags(0) {}
Greg Daniel164a9f02016-02-22 09:56:40 -0500192
Greg Daniel2bb6ecc2017-07-20 13:11:14 +0000193 void init(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&,
194 VkFormat);
egdaniel8f1dcaa2016-04-01 10:10:45 -0700195 static void InitConfigFlags(VkFormatFeatureFlags, uint16_t* flags);
Greg Daniel2bb6ecc2017-07-20 13:11:14 +0000196 void initSampleCounts(const GrVkInterface*, VkPhysicalDevice,
197 const VkPhysicalDeviceProperties&, VkFormat);
egdaniel8f1dcaa2016-04-01 10:10:45 -0700198
199 enum {
200 kTextureable_Flag = 0x1,
201 kRenderable_Flag = 0x2,
202 kBlitSrc_Flag = 0x4,
203 kBlitDst_Flag = 0x8,
204 };
205
206 uint16_t fOptimalFlags;
207 uint16_t fLinearFlags;
Greg Daniel81e7bf82017-07-19 14:47:42 -0400208
209 SkTDArray<int> fColorSampleCounts;
egdaniel8f1dcaa2016-04-01 10:10:45 -0700210 };
211 ConfigInfo fConfigTable[kGrPixelConfigCnt];
egdaniel3fe03272016-08-15 10:59:17 -0700212
Ethan Nicholasf610bae2018-09-20 16:55:21 -0400213 StencilFormat fPreferredStencilFormat;
Greg Daniel164a9f02016-02-22 09:56:40 -0500214
Greg Daniel7e000222018-12-03 10:08:21 -0500215 SkSTArray<1, GrVkYcbcrConversionInfo> fYcbcrInfos;
216
Greg Daniela9979d12018-08-27 15:56:46 -0400217 bool fMustDoCopiesFromOrigin = false;
Greg Daniela9979d12018-08-27 15:56:46 -0400218 bool fMustSleepOnTearDown = false;
219 bool fNewCBOnPipelineChange = false;
220 bool fShouldAlwaysUseDedicatedImageMemory = false;
Greg Daniel8385a8a2018-02-26 13:29:37 -0500221
Greg Daniela9979d12018-08-27 15:56:46 -0400222 bool fSupportsPhysicalDeviceProperties2 = false;
223 bool fSupportsMemoryRequirements2 = false;
Greg Daniel637c06a2018-09-12 09:44:25 -0400224 bool fSupportsBindMemory2 = false;
Greg Daniela9979d12018-08-27 15:56:46 -0400225 bool fSupportsMaintenance1 = false;
226 bool fSupportsMaintenance2 = false;
227 bool fSupportsMaintenance3 = false;
228
229 bool fSupportsDedicatedAllocation = false;
230 bool fSupportsExternalMemory = false;
231 bool fSupportsAndroidHWBExternalMemory = false;
Greg Danielc0b03d82018-08-03 14:41:15 -0400232
Greg Daniel7e000222018-12-03 10:08:21 -0500233 bool fSupportsYcbcrConversion = false;
234
Greg Daniel164a9f02016-02-22 09:56:40 -0500235 typedef GrCaps INHERITED;
236};
237
238#endif