1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrVkCaps_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrVkCaps_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrCaps.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkStencilAttachment.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "vk/GrVkDefines.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrVkInterface;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrShaderCaps;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/**
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Stores some capabilities of a Vk backend.
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkCaps : public GrCaps {
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GrVkStencilAttachment::Format StencilFormat;
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Creates a GrVkCaps that is set such that nothing is supported. The init function should
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * be called to fill out the caps.
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot             VkPhysicalDevice device, uint32_t featureFlags, uint32_t extensionFlags);
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int getSampleCount(int requestedCount, GrPixelConfig config) const override;
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isConfigTexturable(GrPixelConfig config) const override {
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fOptimalFlags);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override;
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isConfigCopyable(GrPixelConfig config) const override {
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return true;
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isConfigTexturableLinearly(GrPixelConfig config) const {
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fLinearFlags);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const {
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return !withMSAA && SkToBool(ConfigInfo::kRenderable_Flag &
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     fConfigTable[config].fLinearFlags);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool configCanBeDstofBlit(GrPixelConfig config, bool linearTiled) const {
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                              fConfigTable[config].fOptimalFlags;
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(ConfigInfo::kBlitDst_Flag & flags);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool configCanBeSrcofBlit(GrPixelConfig config, bool linearTiled) const {
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                              fConfigTable[config].fOptimalFlags;
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkToBool(ConfigInfo::kBlitSrc_Flag & flags);
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Tells of if we can pass in straight GLSL string into vkCreateShaderModule
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool canUseGLSLForShaderModule() const {
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fCanUseGLSLForShaderModule;
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // On Adreno vulkan, they do not respect the imageOffset parameter at least in
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // copyImageToBuffer. This flag says that we must do the copy starting from the origin always.
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool mustDoCopiesFromOrigin() const {
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fMustDoCopiesFromOrigin;
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // On Nvidia there is a current bug where we must the current command buffer before copy
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // operations or else the copy will not happen. This includes copies, blits, resolves, and copy
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // as draws.
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool mustSubmitCommandsBeforeCopyOp() const {
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fMustSubmitCommandsBeforeCopyOp;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Sometimes calls to QueueWaitIdle return before actually signalling the fences
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // on the command buffers even though they have completed. This causes an assert to fire when
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // destroying the command buffers. Therefore we add a sleep to make sure the fence signals.
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool mustSleepOnTearDown() const {
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fMustSleepOnTearDown;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // Returns true if while adding commands to command buffers, we must make a new command buffer
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // everytime we want to bind a new VkPipeline. This is true for both primary and secondary
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // command buffers. This is to work around a driver bug specifically on AMD.
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool newCBOnPipelineChange() const {
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fNewCBOnPipelineChange;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // On certain Intel devices/drivers (IntelHD405) there is a bug if we try to flush non-coherent
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // memory and pass in VK_WHOLE_SIZE. This returns whether or not it is safe to use VK_WHOLE_SIZE
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // or not.
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool canUseWholeSizeOnFlushMappedMemory() const {
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fCanUseWholeSizeOnFlushMappedMemory;
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /**
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Returns both a supported and most prefered stencil format to use in draws.
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const StencilFormat& preferedStencilFormat() const {
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fPreferedStencilFormat;
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc,
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            bool* rectsMustMatch, bool* disallowSubrect) const override;
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool validateBackendTexture(const GrBackendTexture&, SkColorType,
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                GrPixelConfig*) const override;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool validateBackendRenderTarget(const GrBackendRenderTarget&, SkColorType,
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                     GrPixelConfig*) const override;
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    enum VkVendor {
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kAMD_VkVendor = 4098,
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kARM_VkVendor = 5045,
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kImagination_VkVendor = 4112,
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kIntel_VkVendor = 32902,
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kNvidia_VkVendor = 4318,
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        kQualcomm_VkVendor = 20803,
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot              VkPhysicalDevice device, uint32_t featureFlags, uint32_t extensionFlags);
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void initGrCaps(const VkPhysicalDeviceProperties&,
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    const VkPhysicalDeviceMemoryProperties&,
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                    uint32_t featureFlags);
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void initShaderCaps(const VkPhysicalDeviceProperties&, uint32_t featureFlags);
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void initConfigTable(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&);
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void initStencilFormat(const GrVkInterface* iface, VkPhysicalDevice physDev);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void applyDriverCorrectnessWorkarounds(const VkPhysicalDeviceProperties&);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct ConfigInfo {
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        ConfigInfo() : fOptimalFlags(0), fLinearFlags(0) {}
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void init(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&,
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                  VkFormat);
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        static void InitConfigFlags(VkFormatFeatureFlags, uint16_t* flags);
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        void initSampleCounts(const GrVkInterface*, VkPhysicalDevice,
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                              const VkPhysicalDeviceProperties&, VkFormat);
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        enum {
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kTextureable_Flag = 0x1,
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kRenderable_Flag  = 0x2,
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kBlitSrc_Flag     = 0x4,
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            kBlitDst_Flag     = 0x8,
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        };
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        uint16_t fOptimalFlags;
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        uint16_t fLinearFlags;
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkTDArray<int> fColorSampleCounts;
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ConfigInfo fConfigTable[kGrPixelConfigCnt];
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    StencilFormat fPreferedStencilFormat;
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fCanUseGLSLForShaderModule;
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fMustDoCopiesFromOrigin;
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fMustSubmitCommandsBeforeCopyOp;
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fMustSleepOnTearDown;
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fNewCBOnPipelineChange;
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool fCanUseWholeSizeOnFlushMappedMemory;
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef GrCaps INHERITED;
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
182