mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
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:
parent
2668eb8089
commit
c1b52d8c3a
3 changed files with 47 additions and 22 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue