#include "d3d12_compute_transforms.h"
#include "d3d12_nir_passes.h"
+#include "d3d12_query.h"
#include "nir.h"
#include "nir_builder.h"
{
_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);
+}
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
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;
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;
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;