diff options
author | Mike Blumenkrantz <[email protected]> | 2020-06-01 15:01:47 -0400 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-06-17 20:42:01 +0000 |
commit | e8ad52f7b0c603d28518b9b288a8d9d5862d2053 (patch) | |
tree | 9fc24874a7384a0ca68a487f2b3ee3ba6d5b623e /src/gallium | |
parent | e5e657768c3eae23e80cef8073a6f33497ba2512 (diff) |
zink: enable xfb extension in screen creation
switch around the feature enabling as well since extensions need the related
feature to also be enabled in order to function
fixes mesa/mesa#2868
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5163>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/zink/zink_screen.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 71b7345dc88..6e5f969fcdc 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -139,6 +139,12 @@ zink_get_param(struct pipe_screen *pscreen, enum pipe_cap param) case PIPE_CAP_INDEP_BLEND_FUNC: return 1; + case PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS: + return screen->have_EXT_transform_feedback ? screen->tf_props.maxTransformFeedbackBuffers : 0; + case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME: + case PIPE_CAP_STREAM_OUTPUT_INTERLEAVE_BUFFERS: + return 1; + case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS: return screen->props.limits.maxImageArrayLayers; @@ -753,7 +759,7 @@ static struct pipe_screen * zink_internal_create_screen(struct sw_winsys *winsys, int fd) { struct zink_screen *screen = CALLOC_STRUCT(zink_screen); - bool have_cond_render_ext = false; + bool have_tf_ext = false, have_cond_render_ext = false; if (!screen) return NULL; @@ -789,15 +795,24 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd) if (!strcmp(extensions[i].extensionName, VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME)) have_cond_render_ext = true; + if (!strcmp(extensions[i].extensionName, + VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) + have_tf_ext = true; } FREE(extensions); } } VkPhysicalDeviceFeatures2 feats = {}; + VkPhysicalDeviceTransformFeedbackFeaturesEXT tf_feats = {}; VkPhysicalDeviceConditionalRenderingFeaturesEXT cond_render_feats = {}; feats.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + if (have_tf_ext) { + tf_feats.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT; + tf_feats.pNext = feats.pNext; + feats.pNext = &tf_feats; + } if (have_cond_render_ext) { cond_render_feats.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT; cond_render_feats.pNext = feats.pNext; @@ -805,11 +820,18 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd) } vkGetPhysicalDeviceFeatures2(screen->pdev, &feats); memcpy(&screen->feats, &feats.features, sizeof(screen->feats)); + if (have_tf_ext && tf_feats.transformFeedback) + screen->have_EXT_transform_feedback = true; if (have_cond_render_ext && cond_render_feats.conditionalRendering) screen->have_EXT_conditional_rendering = true; VkPhysicalDeviceProperties2 props = {}; props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; + if (screen->have_EXT_transform_feedback) { + screen->tf_props.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT; + screen->tf_props.pNext = NULL; + props.pNext = &screen->tf_props; + } vkGetPhysicalDeviceProperties2(screen->pdev, &props); memcpy(&screen->props, &props.properties, sizeof(screen->props)); @@ -833,7 +855,7 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd) * this requires us to pass the whole VkPhysicalDeviceFeatures2 struct */ dci.pNext = &feats; - const char *extensions[4] = { + const char *extensions[5] = { VK_KHR_MAINTENANCE1_EXTENSION_NAME, }; num_extensions = 1; @@ -851,6 +873,8 @@ zink_internal_create_screen(struct sw_winsys *winsys, int fd) if (screen->have_EXT_conditional_rendering) extensions[num_extensions++] = VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME; + if (screen->have_EXT_transform_feedback) + extensions[num_extensions++] = VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME; assert(num_extensions <= ARRAY_SIZE(extensions)); dci.ppEnabledExtensionNames = extensions; |