Index: src/gpu/vk/GrVkCaps.cpp |
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp |
index d8ac8757e5c378315dd14b45f58a764634e47c2c..ca9cf359acd98ed85a59c77dad79afd821cc224f 100644 |
--- a/src/gpu/vk/GrVkCaps.cpp |
+++ b/src/gpu/vk/GrVkCaps.cpp |
@@ -50,23 +50,22 @@ GrVkCaps::GrVkCaps(const GrContextOptions& contextOptions, const GrVkInterface* |
void GrVkCaps::init(const GrContextOptions& contextOptions, const GrVkInterface* vkInterface, |
VkPhysicalDevice physDev) { |
- this->initGLSLCaps(vkInterface, physDev); |
- this->initConfigTexturableTable(vkInterface, physDev); |
- this->initConfigRenderableTable(vkInterface, physDev); |
- this->initStencilFormats(vkInterface, physDev); |
- |
VkPhysicalDeviceProperties properties; |
GR_VK_CALL(vkInterface, GetPhysicalDeviceProperties(physDev, &properties)); |
- // We could actually querey and get a max size for each config, however maxImageDimension2D will |
- // give the minimum max size across all configs. So for simplicity we will use that for now. |
- fMaxRenderTargetSize = properties.limits.maxImageDimension2D; |
- fMaxTextureSize = properties.limits.maxImageDimension2D; |
+ VkPhysicalDeviceFeatures features; |
+ GR_VK_CALL(vkInterface, GetPhysicalDeviceFeatures(physDev, &features)); |
+ |
+ VkPhysicalDeviceMemoryProperties memoryProperties; |
+ GR_VK_CALL(vkInterface, GetPhysicalDeviceMemoryProperties(physDev, &memoryProperties)); |
+ |
+ this->initGrCaps(properties, features, memoryProperties); |
+ this->initGLSLCaps(features); |
+ this->initConfigTexturableTable(vkInterface, physDev); |
+ this->initConfigRenderableTable(vkInterface, physDev); |
+ this->initStencilFormats(vkInterface, physDev); |
- this->initSampleCount(properties); |
- fMaxSampledTextures = SkTMin(properties.limits.maxPerStageDescriptorSampledImages, |
- properties.limits.maxPerStageDescriptorSamplers); |
this->applyOptionsOverrides(contextOptions); |
// need to friend GrVkCaps in GrGLSLCaps.h |
@@ -105,10 +104,32 @@ void GrVkCaps::initSampleCount(const VkPhysicalDeviceProperties& properties) { |
fMaxStencilSampleCount = get_max_sample_count(stencilSamples); |
} |
-void GrVkCaps::initGLSLCaps(const GrVkInterface* interface, VkPhysicalDevice physDev) { |
+void GrVkCaps::initGrCaps(const VkPhysicalDeviceProperties& properties, |
+ const VkPhysicalDeviceFeatures& features, |
+ const VkPhysicalDeviceMemoryProperties& memoryProperites) { |
+ // We could actually query and get a max size for each config, however maxImageDimension2D will |
+ // give the minimum max size across all configs. So for simplicity we will use that for now. |
+ fMaxRenderTargetSize = properties.limits.maxImageDimension2D; |
+ fMaxTextureSize = properties.limits.maxImageDimension2D; |
+ |
+ this->initSampleCount(properties); |
+ |
+ fMaxSampledTextures = SkTMin(properties.limits.maxPerStageDescriptorSampledImages, |
+ properties.limits.maxPerStageDescriptorSamplers); |
+ |
+ // Assuming since we will always map in the end to upload the data we might as well just map |
+ // from the get go. There is no hard data to suggest this is faster or slower. |
+ fGeometryBufferMapThreshold = 0; |
+ |
+ fMapBufferFlags = kCanMap_MapFlag | kSubset_MapFlag; |
+ |
+ fStencilWrapOpsSupport = true; |
+ fOversizedStencilSupport = true; |
+} |
+ |
+void GrVkCaps::initGLSLCaps(const VkPhysicalDeviceFeatures& features) { |
GrGLSLCaps* glslCaps = static_cast<GrGLSLCaps*>(fShaderCaps.get()); |
- // TODO: actually figure out a correct version here |
- glslCaps->fVersionDeclString = "#version 140\n"; |
+ glslCaps->fVersionDeclString = "#version 310 es\n"; |
// fConfigOutputSwizzle will default to RGBA so we only need to set it for alpha only config. |
for (int i = 0; i < kGrPixelConfigCnt; ++i) { |
@@ -121,7 +142,19 @@ void GrVkCaps::initGLSLCaps(const GrVkInterface* interface, VkPhysicalDevice phy |
} |
} |
+ // Vulkan is based off ES 3.0 so the following should all be supported |
+ glslCaps->fUsesPrecisionModifiers = true; |
+ glslCaps->fFlatInterpolationSupport = true; |
+ |
+ // GrShaderCaps |
+ |
glslCaps->fShaderDerivativeSupport = true; |
+ glslCaps->fGeometryShaderSupport = features.geometryShader == VK_TRUE; |
+#if 0 |
+ // For now disabling dual source blending till we get it hooked up in the rest of system |
+ glslCaps->fDualSourceBlendingSupport = features.dualSrcBlend; |
+#endif |
+ glslCaps->fIntegerSupport = true; |
} |
static void format_supported_for_feature(const GrVkInterface* interface, |