d3d12: Move compute transform state save/restore to compute_transforms.cpp

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14787>
This commit is contained in:
Jesse Natalie 2022-01-26 14:31:48 -08:00
parent 2668eb8089
commit c1b52d8c3a
3 changed files with 47 additions and 22 deletions

View 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);
}

View 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

View 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;