• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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"
13 #include "vulkan/vulkan.h"
14 
15 struct GrVkInterface;
16 class GrGLSLCaps;
17 
18 /**
19  * Stores some capabilities of a Vk backend.
20  */
21 class GrVkCaps : public GrCaps {
22 public:
23     typedef GrVkStencilAttachment::Format StencilFormat;
24 
25     /**
26      * Creates a GrVkCaps that is set such that nothing is supported. The init function should
27      * be called to fill out the caps.
28      */
29     GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
30              VkPhysicalDevice device);
31 
isConfigTexturable(GrPixelConfig config)32     bool isConfigTexturable(GrPixelConfig config) const override {
33         SkASSERT(kGrPixelConfigCnt > config);
34         return fConfigTextureSupport[config];
35     }
36 
isConfigRenderable(GrPixelConfig config,bool withMSAA)37     bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
38         SkASSERT(kGrPixelConfigCnt > config);
39         return fConfigRenderSupport[config][withMSAA];
40     }
41 
isConfigRenderableLinearly(GrPixelConfig config,bool withMSAA)42     bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const {
43         SkASSERT(kGrPixelConfigCnt > config);
44         return fConfigLinearRenderSupport[config][withMSAA];
45     }
46 
isConfigTexurableLinearly(GrPixelConfig config)47     bool isConfigTexurableLinearly(GrPixelConfig config) const {
48         SkASSERT(kGrPixelConfigCnt > config);
49         return fConfigLinearTextureSupport[config];
50     }
51 
52     /**
53      * Gets an array of legal stencil formats. These formats are not guaranteed to be supported by
54      * the driver but are legal VK_TEXTURE_FORMATs.
55      */
stencilFormats()56     const SkTArray<StencilFormat, true>& stencilFormats() const {
57         return fStencilFormats;
58     }
59 
60     /**
61      * Gets an array of legal stencil formats. These formats are not guaranteed to be supported by
62      * the driver but are legal VK_TEXTURE_FORMATs.
63      */
linearStencilFormats()64     const SkTArray<StencilFormat, true>& linearStencilFormats() const {
65         return fLinearStencilFormats;
66     }
67 
68     /**
69      * Returns the max number of sampled textures we can use in a program. This number is the max of
70      * max samplers and max sampled images. This number is technically the max sampled textures we
71      * can have per stage, but we'll use it for the whole program since for now we only do texture
72      * lookups in the fragment shader.
73      */
maxSampledTextures()74     int maxSampledTextures() const {
75         return fMaxSampledTextures;
76     }
77 
78 
glslCaps()79     GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); }
80 
81 private:
82     void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface,
83               VkPhysicalDevice device);
84     void initSampleCount(const VkPhysicalDeviceProperties& properties);
85     void initGLSLCaps(const GrVkInterface* interface, VkPhysicalDevice physDev);
86     void initConfigRenderableTable(const GrVkInterface* interface, VkPhysicalDevice physDev);
87     void initConfigTexturableTable(const GrVkInterface* interface, VkPhysicalDevice physDev);
88     void initStencilFormats(const GrVkInterface* interface, VkPhysicalDevice physDev);
89 
90 
91     bool fConfigTextureSupport[kGrPixelConfigCnt];
92     // For Vulkan we track whether a config is supported linearly (without need for swizzling)
93     bool fConfigLinearTextureSupport[kGrPixelConfigCnt];
94 
95     // The first entry for each config is without msaa and the second is with.
96     bool fConfigRenderSupport[kGrPixelConfigCnt][2];
97     // The first entry for each config is without msaa and the second is with.
98     bool fConfigLinearRenderSupport[kGrPixelConfigCnt][2];
99 
100     SkTArray<StencilFormat, true> fLinearStencilFormats;
101     SkTArray<StencilFormat, true> fStencilFormats;
102 
103     int fMaxSampledTextures;
104 
105     typedef GrCaps INHERITED;
106 };
107 
108 #endif
109