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