1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrVkCaps_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrVkCaps_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrCaps.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrVkStencilAttachment.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "vk/GrVkDefines.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstruct GrVkInterface; 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrShaderCaps; 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/** 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Stores some capabilities of a Vk backend. 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrVkCaps : public GrCaps { 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GrVkStencilAttachment::Format StencilFormat; 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Creates a GrVkCaps that is set such that nothing is supported. The init function should 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * be called to fill out the caps. 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface, 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot VkPhysicalDevice device, uint32_t featureFlags, uint32_t extensionFlags); 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int getSampleCount(int requestedCount, GrPixelConfig config) const override; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isConfigTexturable(GrPixelConfig config) const override { 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fOptimalFlags); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isConfigRenderable(GrPixelConfig config, bool withMSAA) const override; 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isConfigCopyable(GrPixelConfig config) const override { 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isConfigTexturableLinearly(GrPixelConfig config) const { 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkToBool(ConfigInfo::kTextureable_Flag & fConfigTable[config].fLinearFlags); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool isConfigRenderableLinearly(GrPixelConfig config, bool withMSAA) const { 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return !withMSAA && SkToBool(ConfigInfo::kRenderable_Flag & 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConfigTable[config].fLinearFlags); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool configCanBeDstofBlit(GrPixelConfig config, bool linearTiled) const { 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags : 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConfigTable[config].fOptimalFlags; 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkToBool(ConfigInfo::kBlitDst_Flag & flags); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool configCanBeSrcofBlit(GrPixelConfig config, bool linearTiled) const { 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint16_t& flags = linearTiled ? fConfigTable[config].fLinearFlags : 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fConfigTable[config].fOptimalFlags; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkToBool(ConfigInfo::kBlitSrc_Flag & flags); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Tells of if we can pass in straight GLSL string into vkCreateShaderModule 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool canUseGLSLForShaderModule() const { 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fCanUseGLSLForShaderModule; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // On Adreno vulkan, they do not respect the imageOffset parameter at least in 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // copyImageToBuffer. This flag says that we must do the copy starting from the origin always. 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool mustDoCopiesFromOrigin() const { 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fMustDoCopiesFromOrigin; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // On Nvidia there is a current bug where we must the current command buffer before copy 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // operations or else the copy will not happen. This includes copies, blits, resolves, and copy 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // as draws. 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool mustSubmitCommandsBeforeCopyOp() const { 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fMustSubmitCommandsBeforeCopyOp; 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Sometimes calls to QueueWaitIdle return before actually signalling the fences 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // on the command buffers even though they have completed. This causes an assert to fire when 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // destroying the command buffers. Therefore we add a sleep to make sure the fence signals. 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool mustSleepOnTearDown() const { 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fMustSleepOnTearDown; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Returns true if while adding commands to command buffers, we must make a new command buffer 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // everytime we want to bind a new VkPipeline. This is true for both primary and secondary 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // command buffers. This is to work around a driver bug specifically on AMD. 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool newCBOnPipelineChange() const { 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fNewCBOnPipelineChange; 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // On certain Intel devices/drivers (IntelHD405) there is a bug if we try to flush non-coherent 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // memory and pass in VK_WHOLE_SIZE. This returns whether or not it is safe to use VK_WHOLE_SIZE 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // or not. 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool canUseWholeSizeOnFlushMappedMemory() const { 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fCanUseWholeSizeOnFlushMappedMemory; 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Returns both a supported and most prefered stencil format to use in draws. 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const StencilFormat& preferedStencilFormat() const { 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return fPreferedStencilFormat; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc* desc, 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool* rectsMustMatch, bool* disallowSubrect) const override; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool validateBackendTexture(const GrBackendTexture&, SkColorType, 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrPixelConfig*) const override; 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool validateBackendRenderTarget(const GrBackendRenderTarget&, SkColorType, 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrPixelConfig*) const override; 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum VkVendor { 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kAMD_VkVendor = 4098, 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kARM_VkVendor = 5045, 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kImagination_VkVendor = 4112, 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kIntel_VkVendor = 32902, 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNvidia_VkVendor = 4318, 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kQualcomm_VkVendor = 20803, 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface, 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot VkPhysicalDevice device, uint32_t featureFlags, uint32_t extensionFlags); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void initGrCaps(const VkPhysicalDeviceProperties&, 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const VkPhysicalDeviceMemoryProperties&, 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint32_t featureFlags); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void initShaderCaps(const VkPhysicalDeviceProperties&, uint32_t featureFlags); 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void initConfigTable(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&); 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void initStencilFormat(const GrVkInterface* iface, VkPhysicalDevice physDev); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void applyDriverCorrectnessWorkarounds(const VkPhysicalDeviceProperties&); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct ConfigInfo { 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConfigInfo() : fOptimalFlags(0), fLinearFlags(0) {} 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void init(const GrVkInterface*, VkPhysicalDevice, const VkPhysicalDeviceProperties&, 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot VkFormat); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static void InitConfigFlags(VkFormatFeatureFlags, uint16_t* flags); 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void initSampleCounts(const GrVkInterface*, VkPhysicalDevice, 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const VkPhysicalDeviceProperties&, VkFormat); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum { 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kTextureable_Flag = 0x1, 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kRenderable_Flag = 0x2, 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBlitSrc_Flag = 0x4, 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kBlitDst_Flag = 0x8, 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint16_t fOptimalFlags; 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot uint16_t fLinearFlags; 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTDArray<int> fColorSampleCounts; 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ConfigInfo fConfigTable[kGrPixelConfigCnt]; 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot StencilFormat fPreferedStencilFormat; 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fCanUseGLSLForShaderModule; 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fMustDoCopiesFromOrigin; 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fMustSubmitCommandsBeforeCopyOp; 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fMustSleepOnTearDown; 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fNewCBOnPipelineChange; 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool fCanUseWholeSizeOnFlushMappedMemory; 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GrCaps INHERITED; 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 182