| Index: src/gpu/vk/GrVkCaps.h
|
| diff --git a/src/gpu/vk/GrVkCaps.h b/src/gpu/vk/GrVkCaps.h
|
| index 5834b151fdef20d93da394d6991eb98dce0c2193..50f5c8fa87a1edbe6f04df4a2b411255852b6331 100644
|
| --- a/src/gpu/vk/GrVkCaps.h
|
| +++ b/src/gpu/vk/GrVkCaps.h
|
| @@ -31,42 +31,48 @@ public:
|
|
|
| bool isConfigTexturable(GrPixelConfig config) const override {
|
| SkASSERT(kGrPixelConfigCnt > config);
|
| - return fConfigTextureSupport[config];
|
| + return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fOptimalFlags);
|
| }
|
|
|
| bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override {
|
| SkASSERT(kGrPixelConfigCnt > config);
|
| - return fConfigRenderSupport[config][withMSAA];
|
| + return SkToBool(ConfigInfo::kRenderable_Flag & fConfigTable[config].fOptimalFlags);
|
| + }
|
| +
|
| + bool isConfigTexurableLinearly(GrPixelConfig config) const {
|
| + SkASSERT(kGrPixelConfigCnt > config);
|
| + return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fLinearFlags);
|
| }
|
|
|
| bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const {
|
| SkASSERT(kGrPixelConfigCnt > config);
|
| - return fConfigLinearRenderSupport[config][withMSAA];
|
| + return !withMSAA && SkToBool(ConfigInfo::kRenderable_Flag &
|
| + fConfigTable[config].fLinearFlags);
|
| }
|
|
|
| - bool isConfigTexurableLinearly(GrPixelConfig config) const {
|
| + bool configCanBeDstofBlit(GrPixelConfig config, bool linearTiled) const {
|
| SkASSERT(kGrPixelConfigCnt > config);
|
| - return fConfigLinearTextureSupport[config];
|
| + const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
|
| + fConfigTable[config].fOptimalFlags;
|
| + return SkToBool(ConfigInfo::kBlitDst_Flag & flags);
|
| }
|
|
|
| - bool canUseGLSLForShaderModule() const {
|
| - return fCanUseGLSLForShaderModule;
|
| + bool configCanBeSrcofBlit(GrPixelConfig config, bool linearTiled) const {
|
| + SkASSERT(kGrPixelConfigCnt > config);
|
| + const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags :
|
| + fConfigTable[config].fOptimalFlags;
|
| + return SkToBool(ConfigInfo::kBlitSrc_Flag & flags);
|
| }
|
|
|
| - /**
|
| - * 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<StencilFormat, true>& stencilFormats() const {
|
| - return fStencilFormats;
|
| + bool canUseGLSLForShaderModule() const {
|
| + return fCanUseGLSLForShaderModule;
|
| }
|
|
|
| /**
|
| - * Gets an array of legal stencil formats. These formats are not guaranteed to be supported by
|
| - * the driver but are legal VK_TEXTURE_FORMATs.
|
| + * Returns both a supported and most prefered stencil format to use in draws.
|
| */
|
| - const SkTArray<StencilFormat, true>& linearStencilFormats() const {
|
| - return fLinearStencilFormats;
|
| + const StencilFormat& preferedStencilFormat() const {
|
| + return fPreferedStencilFormat;
|
| }
|
|
|
| GrGLSLCaps* glslCaps() const { return reinterpret_cast<GrGLSLCaps*>(fShaderCaps.get()); }
|
| @@ -79,22 +85,30 @@ private:
|
| uint32_t featureFlags);
|
| void initGLSLCaps(const VkPhysicalDeviceProperties&, uint32_t featureFlags);
|
| void initSampleCount(const VkPhysicalDeviceProperties& properties);
|
| - void initConfigRenderableTable(const GrVkInterface* iface, VkPhysicalDevice physDev);
|
| - void initConfigTexturableTable(const GrVkInterface* iface, VkPhysicalDevice physDev);
|
| - void initStencilFormats(const GrVkInterface* iface, VkPhysicalDevice physDev);
|
|
|
|
|
| - bool fConfigTextureSupport[kGrPixelConfigCnt];
|
| - // For Vulkan we track whether a config is supported linearly (without need for swizzling)
|
| - bool fConfigLinearTextureSupport[kGrPixelConfigCnt];
|
| + void initConfigTable(const GrVkInterface*, VkPhysicalDevice);
|
| + void initStencilFormat(const GrVkInterface* iface, VkPhysicalDevice physDev);
|
| +
|
| + struct ConfigInfo {
|
| + ConfigInfo() : fOptimalFlags(0), fLinearFlags(0) {}
|
| +
|
| + void init(const GrVkInterface*, VkPhysicalDevice, VkFormat);
|
| + static void InitConfigFlags(VkFormatFeatureFlags, uint16_t* flags);
|
|
|
| - // 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];
|
| + enum {
|
| + kTextureable_Flag = 0x1,
|
| + kRenderable_Flag = 0x2,
|
| + kBlitSrc_Flag = 0x4,
|
| + kBlitDst_Flag = 0x8,
|
| + };
|
|
|
| - SkTArray<StencilFormat, true> fLinearStencilFormats;
|
| - SkTArray<StencilFormat, true> fStencilFormats;
|
| + uint16_t fOptimalFlags;
|
| + uint16_t fLinearFlags;
|
| + };
|
| + ConfigInfo fConfigTable[kGrPixelConfigCnt];
|
| +
|
| + StencilFormat fPreferedStencilFormat;
|
|
|
| // Tells of if we can pass in straight GLSL string into vkCreateShaderModule
|
| bool fCanUseGLSLForShaderModule;
|
|
|