/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef GrVkCaps_DEFINED #define GrVkCaps_DEFINED #include "GrCaps.h" #include "GrVkStencilAttachment.h" #include "vulkan/vulkan.h" struct GrVkInterface; class GrGLSLCaps; /** * Stores some capabilities of a Vk backend. */ class GrVkCaps : public GrCaps { public: typedef GrVkStencilAttachment::Format StencilFormat; /** * Creates a GrVkCaps that is set such that nothing is supported. The init function should * be called to fill out the caps. */ GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface, VkPhysicalDevice device); bool isConfigTexturable(GrPixelConfig config) const override { SkASSERT(kGrPixelConfigCnt > config); return fConfigTextureSupport[config]; } bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override { SkASSERT(kGrPixelConfigCnt > config); return fConfigRenderSupport[config][withMSAA]; } bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const { SkASSERT(kGrPixelConfigCnt > config); return fConfigLinearRenderSupport[config][withMSAA]; } bool isConfigTexurableLinearly(GrPixelConfig config) const { SkASSERT(kGrPixelConfigCnt > config); return fConfigLinearTextureSupport[config]; } /** * Gets an array of legal stencil formats. These formats are not guaranteed to be supported by * the driver but are legal VK_TEXTURE_FORMATs. */ const SkTArray& stencilFormats() const { return fStencilFormats; } /** * Gets an array of legal stencil formats. These formats are not guaranteed to be supported by * the driver but are legal VK_TEXTURE_FORMATs. */ const SkTArray& linearStencilFormats() const { return fLinearStencilFormats; } /** * Returns the max number of sampled textures we can use in a program. This number is the max of * max samplers and max sampled images. This number is technically the max sampled textures we * can have per stage, but we'll use it for the whole program since for now we only do texture * lookups in the fragment shader. */ int maxSampledTextures() const { return fMaxSampledTextures; } GrGLSLCaps* glslCaps() const { return reinterpret_cast(fShaderCaps.get()); } private: void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface, VkPhysicalDevice device); void initSampleCount(const VkPhysicalDeviceProperties& properties); void initGLSLCaps(const GrVkInterface* interface, VkPhysicalDevice physDev); void initConfigRenderableTable(const GrVkInterface* interface, VkPhysicalDevice physDev); void initConfigTexturableTable(const GrVkInterface* interface, VkPhysicalDevice physDev); void initStencilFormats(const GrVkInterface* interface, VkPhysicalDevice physDev); bool fConfigTextureSupport[kGrPixelConfigCnt]; // For Vulkan we track whether a config is supported linearly (without need for swizzling) bool fConfigLinearTextureSupport[kGrPixelConfigCnt]; // The first entry for each config is without msaa and the second is with. bool fConfigRenderSupport[kGrPixelConfigCnt][2]; // The first entry for each config is without msaa and the second is with. bool fConfigLinearRenderSupport[kGrPixelConfigCnt][2]; SkTArray fLinearStencilFormats; SkTArray fStencilFormats; int fMaxSampledTextures; typedef GrCaps INHERITED; }; #endif