From 2b3730d27137b22c80d30205cbc468aea1da2199 Mon Sep 17 00:00:00 2001 From: George Ouzounoudis Date: Sat, 26 Nov 2022 18:32:22 +0200 Subject: [PATCH] nvk: Support transform feedback geometry streams We just need to set the correct limits and features. The meaningful change here is the selected stream for rasterization which is configured through the graphics pipeline. Part-of: --- src/nouveau/vulkan/nvk_graphics_pipeline.c | 2 +- src/nouveau/vulkan/nvk_physical_device.c | 6 +++--- src/nouveau/vulkan/nvk_shader.c | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index 04f0ce2c91b..f7e9662acc7 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -42,7 +42,7 @@ emit_pipeline_rs_state(struct nv_push *p, .geometry_guardband_z = GEOMETRY_GUARDBAND_Z_SAME_AS_XY_GUARDBAND, }); - assert(rs->rasterization_stream == 0); + P_IMMD(p, NV9097, SET_RASTER_INPUT, rs->rasterization_stream); assert(rs->line.mode == VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT); } diff --git a/src/nouveau/vulkan/nvk_physical_device.c b/src/nouveau/vulkan/nvk_physical_device.c index 92aff5e83b8..6c4035d3af6 100644 --- a/src/nouveau/vulkan/nvk_physical_device.c +++ b/src/nouveau/vulkan/nvk_physical_device.c @@ -230,7 +230,7 @@ nvk_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, } case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT: { VkPhysicalDeviceTransformFeedbackPropertiesEXT *p = (void *)ext; - p->maxTransformFeedbackStreams = 0; + p->maxTransformFeedbackStreams = 4; p->maxTransformFeedbackBuffers = 4; p->maxTransformFeedbackBufferSize = UINT32_MAX; p->maxTransformFeedbackStreamDataSize = 2048; @@ -238,7 +238,7 @@ nvk_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice, p->maxTransformFeedbackBufferDataStride = 2048; p->transformFeedbackQueries = false; p->transformFeedbackStreamsLinesTriangles = false; - p->transformFeedbackRasterizationStreamSelect = false; + p->transformFeedbackRasterizationStreamSelect = true; p->transformFeedbackDraw = true; break; } @@ -483,7 +483,7 @@ nvk_get_device_features(const struct nv_device_info *dev, /* VK_EXT_transform_feedback */ .transformFeedback = dev->cls_eng3d >= TURING_A, - .geometryStreams = false, + .geometryStreams = dev->cls_eng3d >= TURING_A, /* VK_EXT_vertex_attribute_divisor */ .vertexAttributeInstanceRateDivisor = true, diff --git a/src/nouveau/vulkan/nvk_shader.c b/src/nouveau/vulkan/nvk_shader.c index 1c682bda1f0..6cb77c3e8c9 100644 --- a/src/nouveau/vulkan/nvk_shader.c +++ b/src/nouveau/vulkan/nvk_shader.c @@ -69,6 +69,7 @@ nvk_physical_device_spirv_options(const struct nvk_physical_device *pdevice, .image_write_without_format = true, .physical_storage_buffer_address = true, .transform_feedback = true, + .geometry_streams = true, }, .ssbo_addr_format = nvk_buffer_addr_format(rs->storage_buffers), .phys_ssbo_addr_format = nir_address_format_64bit_global,