d3d12: Move compute transform state save/restore to compute_transforms.cpp
authorJesse Natalie <jenatali@microsoft.com>
Wed, 26 Jan 2022 22:31:48 +0000 (14:31 -0800)
committerJesse Natalie <jenatali@microsoft.com>
Mon, 31 Jan 2022 21:31:22 +0000 (13:31 -0800)
Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14787>

src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp
src/gallium/drivers/d3d12/d3d12_compute_transforms.h
src/gallium/drivers/d3d12/d3d12_draw.cpp

index 42cce4f..35e678c 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "d3d12_compute_transforms.h"
 #include "d3d12_nir_passes.h"
+#include "d3d12_query.h"
 
 #include "nir.h"
 #include "nir_builder.h"
@@ -303,3 +304,33 @@ d3d12_compute_transform_cache_destroy(struct d3d12_context *ctx)
 {
    _mesa_hash_table_destroy(ctx->compute_transform_cache, delete_entry);
 }
+
+void
+d3d12_save_compute_transform_state(struct d3d12_context *ctx, d3d12_compute_transform_save_restore *save)
+{
+   if (ctx->current_predication)
+      ctx->cmdlist->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
+
+   memset(save, 0, sizeof(*save));
+   save->cs = ctx->compute_state;
+
+   pipe_resource_reference(&save->cbuf0.buffer, ctx->cbufs[PIPE_SHADER_COMPUTE][0].buffer);
+   save->cbuf0 = ctx->cbufs[PIPE_SHADER_COMPUTE][0];
+
+   for (unsigned i = 0; i < ARRAY_SIZE(save->ssbos); ++i) {
+      pipe_resource_reference(&save->ssbos[i].buffer, ctx->ssbo_views[PIPE_SHADER_COMPUTE][i].buffer);
+      save->ssbos[i] = ctx->ssbo_views[PIPE_SHADER_COMPUTE][i];
+   }
+}
+
+void
+d3d12_restore_compute_transform_state(struct d3d12_context *ctx, d3d12_compute_transform_save_restore *save)
+{
+   ctx->base.bind_compute_state(&ctx->base, save->cs);
+
+   ctx->base.set_constant_buffer(&ctx->base, PIPE_SHADER_COMPUTE, 0, true, &save->cbuf0);
+   ctx->base.set_shader_buffers(&ctx->base, PIPE_SHADER_COMPUTE, 0, ARRAY_SIZE(save->ssbos), save->ssbos, (1u << ARRAY_SIZE(save->ssbos)) - 1);
+
+   if (ctx->current_predication)
+      d3d12_enable_predication(ctx);
+}
index 5f712ba..d8daa7d 100644 (file)
@@ -79,4 +79,17 @@ d3d12_compute_transform_cache_init(struct d3d12_context *ctx);
 void
 d3d12_compute_transform_cache_destroy(struct d3d12_context *ctx);
 
+struct d3d12_compute_transform_save_restore
+{
+   struct d3d12_shader_selector *cs;
+   struct pipe_constant_buffer cbuf0;
+   struct pipe_shader_buffer ssbos[2];
+};
+
+void
+d3d12_save_compute_transform_state(struct d3d12_context *ctx, d3d12_compute_transform_save_restore *save);
+
+void
+d3d12_restore_compute_transform_state(struct d3d12_context *ctx, d3d12_compute_transform_save_restore *save);
+
 #endif
index e85a832..cdfa619 100644 (file)
@@ -757,22 +757,12 @@ update_draw_indirect_with_sysvals(struct d3d12_context *ctx,
    if (!any)
       return false;
 
-   if (ctx->current_predication)
-      ctx->cmdlist->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
+   d3d12_compute_transform_save_restore save;
+   d3d12_save_compute_transform_state(ctx, &save);
 
    auto indirect_in = *indirect_inout;
    *indirect_inout = indirect_out;
 
-   d3d12_shader_selector *save_cs = ctx->compute_state;
-
-   pipe_constant_buffer save_cs_cbuf0 = {};
-
-   pipe_shader_buffer save_cs_ssbos[2] = {};
-   for (unsigned i = 0; i < 2; ++i) {
-      pipe_resource_reference(&save_cs_ssbos[i].buffer, ctx->ssbo_views[PIPE_SHADER_COMPUTE][i].buffer);
-      save_cs_ssbos[i] = ctx->ssbo_views[PIPE_SHADER_COMPUTE][i];
-   }
-
    d3d12_compute_transform_key key;
    memset(&key, 0, sizeof(key));
    key.type = d3d12_compute_transform_type::base_vertex;
@@ -785,9 +775,6 @@ update_draw_indirect_with_sysvals(struct d3d12_context *ctx,
    ctx->transform_state_vars[2] = drawid;
 
    if (indirect_in->indirect_draw_count) {
-      pipe_resource_reference(&save_cs_cbuf0.buffer, ctx->cbufs[PIPE_SHADER_COMPUTE][0].buffer);
-      save_cs_cbuf0 = ctx->cbufs[PIPE_SHADER_COMPUTE][0];
-
       pipe_constant_buffer draw_count_cbuf;
       draw_count_cbuf.buffer = indirect_in->indirect_draw_count;
       draw_count_cbuf.buffer_offset = indirect_in->indirect_draw_count_offset;
@@ -821,13 +808,7 @@ update_draw_indirect_with_sysvals(struct d3d12_context *ctx,
    grid.grid[1] = grid.grid[2] = 1;
    ctx->base.launch_grid(&ctx->base, &grid);
 
-   ctx->base.bind_compute_state(&ctx->base, save_cs);
-   if (save_cs_cbuf0.buffer)
-      ctx->base.set_constant_buffer(&ctx->base, PIPE_SHADER_COMPUTE, 0, true, &save_cs_cbuf0);
-   ctx->base.set_shader_buffers(&ctx->base, PIPE_SHADER_COMPUTE, 0, 2, save_cs_ssbos, 3);
-
-   if (ctx->current_predication)
-      d3d12_enable_predication(ctx);
+   d3d12_restore_compute_transform_state(ctx, &save);
 
    *indirect_out = *indirect_in;
    indirect_out->buffer = new_cs_ssbos[1].buffer;