Home | History | Annotate | Download | only in vk
      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 
     32     bool isConfigTexturable(GrPixelConfig config) const override {
     33         SkASSERT(kGrPixelConfigCnt > config);
     34         return fConfigTextureSupport[config];
     35     }
     36 
     37     bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
     38         SkASSERT(kGrPixelConfigCnt > config);
     39         return fConfigRenderSupport[config][withMSAA];
     40     }
     41 
     42     bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const {
     43         SkASSERT(kGrPixelConfigCnt > config);
     44         return fConfigLinearRenderSupport[config][withMSAA];
     45     }
     46 
     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      */
     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      */
     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      */
     74     int maxSampledTextures() const {
     75         return fMaxSampledTextures;
     76     }
     77 
     78 
     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