nvk: Disable indirect draw/dispatch and query copy MMEs for now
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Tue, 31 Jan 2023 02:12:06 +0000 (20:12 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:03 +0000 (21:32 +0000)
These all rely on mme_tu104_read_fifoed() which isn't available before
Turing.  They're also really register-expensive and we can't compile
them without paring things down a bit.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/vulkan/nvk_cmd_dispatch.c
src/nouveau/vulkan/nvk_cmd_draw.c
src/nouveau/vulkan/nvk_query_pool.c

index 0341c1e..582443e 100644 (file)
@@ -278,6 +278,9 @@ mme_store_global_vec3(struct mme_builder *b,
 void
 nvk_mme_dispatch_indirect(struct nvk_device *dev, struct mme_builder *b)
 {
+   if (dev->ctx->eng3d.cls < TURING_A)
+      return;
+
    struct mme_value local_size = mme_load(b);
    struct mme_value64 dispatch_addr = mme_load_addr64(b);
    struct mme_value64 root_desc_addr = mme_load_addr64(b);
@@ -312,6 +315,9 @@ nvk_CmdDispatchIndirect(VkCommandBuffer commandBuffer,
    VK_FROM_HANDLE(nvk_buffer, buffer, _buffer);
    struct nvk_descriptor_state *desc = &cmd->state.cs.descriptors;
 
+   /* TODO: Indirect dispatch pre-Turing */
+   assert(nvk_cmd_buffer_device(cmd)->ctx->eng3d.cls >= TURING_A);
+
    desc->root.cs.base_group[0] = 0;
    desc->root.cs.base_group[1] = 0;
    desc->root.cs.base_group[2] = 0;
index 6f13f14..d6fd852 100644 (file)
@@ -1674,6 +1674,9 @@ nvk_CmdDrawIndexed(VkCommandBuffer commandBuffer,
 void
 nvk_mme_draw_indirect(struct nvk_device *dev, struct mme_builder *b)
 {
+   if (dev->ctx->eng3d.cls < TURING_A)
+      return;
+
    struct mme_value begin = mme_load(b);
    struct mme_value64 draw_addr = mme_load_addr64(b);
    struct mme_value draw_count = mme_load(b);
@@ -1702,6 +1705,9 @@ nvk_CmdDrawIndirect(VkCommandBuffer commandBuffer,
    const struct vk_dynamic_graphics_state *dyn =
       &cmd->vk.dynamic_graphics_state;
 
+   /* TODO: Indirect draw pre-Turing */
+   assert(nvk_cmd_buffer_3d_cls(cmd) >= TURING_A);
+
    nvk_flush_gfx_state(cmd);
 
    uint32_t begin;
@@ -1726,6 +1732,9 @@ nvk_CmdDrawIndirect(VkCommandBuffer commandBuffer,
 void
 nvk_mme_draw_indexed_indirect(struct nvk_device *dev, struct mme_builder *b)
 {
+   if (dev->ctx->eng3d.cls < TURING_A)
+      return;
+
    struct mme_value begin = mme_load(b);
    struct mme_value64 draw_addr = mme_load_addr64(b);
    struct mme_value draw_count = mme_load(b);
@@ -1754,6 +1763,9 @@ nvk_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer,
    const struct vk_dynamic_graphics_state *dyn =
       &cmd->vk.dynamic_graphics_state;
 
+   /* TODO: Indirect draw pre-Turing */
+   assert(nvk_cmd_buffer_3d_cls(cmd) >= TURING_A);
+
    nvk_flush_gfx_state(cmd);
 
    uint32_t begin;
index 3bda1ad..f466f6d 100644 (file)
@@ -9,6 +9,7 @@
 #include "util/os_time.h"
 
 #include "nouveau_bo.h"
+#include "nouveau_context.h"
 
 #include "nvk_cl906f.h"
 #include "nvk_cl9097.h"
@@ -535,6 +536,9 @@ nvk_GetQueryPoolResults(VkDevice device,
 void
 nvk_mme_copy_queries(struct nvk_device *dev, struct mme_builder *b)
 {
+   if (dev->ctx->eng3d.cls < TURING_A)
+      return;
+
    struct mme_value64 dst_addr = mme_load_addr64(b);
    struct mme_value64 dst_stride = mme_load_addr64(b);
    struct mme_value64 avail_addr = mme_load_addr64(b);
@@ -638,6 +642,9 @@ nvk_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer,
    VK_FROM_HANDLE(nvk_query_pool, pool, queryPool);
    VK_FROM_HANDLE(nvk_buffer, dst_buffer, dstBuffer);
 
+   /* TODO: vkCmdCopyQueryPoolResults() with a compute shader */
+   assert(nvk_cmd_buffer_device(cmd)->ctx->eng3d.cls >= TURING_A);
+
    nvk_cmd_buffer_ref_bo(cmd, pool->bo);
 
    if (flags & VK_QUERY_RESULT_WAIT_BIT) {