diff options
author | Jesse Natalie <jenatali@microsoft.com> | 2022-01-28 12:37:23 -0800 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-02-04 00:07:53 +0000 |
commit | 944832d3d72b2c081439fec99615a7b13231acc9 (patch) | |
tree | d99af83623f95191e0db9e86bede33a2b38e1637 | |
parent | 2529a0df89ca0bdbddcdc9e5b9665a4bdf8d1aa9 (diff) |
d3d12: Cache a modifyable copy of the nir options in d3d12_screen
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Reviewed-By: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14837>
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_blit.cpp | 4 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_compiler.cpp | 2 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp | 37 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_gs_variant.cpp | 5 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_screen.cpp | 4 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_screen.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp | 4 | ||||
-rw-r--r-- | src/gallium/winsys/d3d12/wgl/meson.build | 2 |
8 files changed, 33 insertions, 29 deletions
diff --git a/src/gallium/drivers/d3d12/d3d12_blit.cpp b/src/gallium/drivers/d3d12/d3d12_blit.cpp index c54ea547f97..51ea1e09c32 100644 --- a/src/gallium/drivers/d3d12/d3d12_blit.cpp +++ b/src/gallium/drivers/d3d12/d3d12_blit.cpp @@ -620,7 +620,7 @@ get_stencil_resolve_vs(struct d3d12_context *ctx) return ctx->stencil_resolve_vs; nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_VERTEX, - dxil_get_nir_compiler_options(), + &d3d12_screen(ctx->base.screen)->nir_options, "linear_blit_vs"); const struct glsl_type *vec4 = glsl_vec4_type(); @@ -651,7 +651,7 @@ get_stencil_resolve_fs(struct d3d12_context *ctx, bool no_flip) return ctx->stencil_resolve_fs_no_flip; nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_FRAGMENT, - dxil_get_nir_compiler_options(), + &d3d12_screen(ctx->base.screen)->nir_options, no_flip ? "stencil_resolve_fs_no_flip" : "stencil_resolve_fs"); nir_variable *stencil_out = nir_variable_create(b.shader, diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index bc4c19436c3..fa76d1c312c 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -104,7 +104,7 @@ d3d12_get_compiler_options(struct pipe_screen *screen, enum pipe_shader_type shader) { assert(ir == PIPE_SHADER_IR_NIR); - return dxil_get_nir_compiler_options(); + return &d3d12_screen(screen)->nir_options; } static uint32_t diff --git a/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp b/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp index 8c27c10db8b..61ab3554996 100644 --- a/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp @@ -24,19 +24,17 @@ #include "d3d12_compute_transforms.h" #include "d3d12_nir_passes.h" #include "d3d12_query.h" +#include "d3d12_screen.h" #include "nir.h" #include "nir_builder.h" -#include "nir_to_dxil.h" - #include "util/u_memory.h" nir_shader * -get_indirect_draw_base_vertex_transform(const d3d12_compute_transform_key *args) +get_indirect_draw_base_vertex_transform(const nir_shader_compiler_options *options, const d3d12_compute_transform_key *args) { - nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, - dxil_get_nir_compiler_options(), "TransformIndirectDrawBaseVertex"); + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, options, "TransformIndirectDrawBaseVertex"); if (args->base_vertex.dynamic_count) { nir_variable *count_ubo = nir_variable_create(b.shader, nir_var_mem_ubo, @@ -103,10 +101,9 @@ get_indirect_draw_base_vertex_transform(const d3d12_compute_transform_key *args) } static struct nir_shader * -get_fake_so_buffer_copy_back(const d3d12_compute_transform_key *key) +get_fake_so_buffer_copy_back(const nir_shader_compiler_options *options, const d3d12_compute_transform_key *key) { - nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, - dxil_get_nir_compiler_options(), "FakeSOBufferCopyBack"); + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, options, "FakeSOBufferCopyBack"); nir_variable *output_so_data_var = nir_variable_create(b.shader, nir_var_mem_ssbo, glsl_array_type(glsl_uint_type(), 0, 0), "output_data"); @@ -156,10 +153,9 @@ get_fake_so_buffer_copy_back(const d3d12_compute_transform_key *key) } static struct nir_shader * -get_fake_so_buffer_vertex_count() +get_fake_so_buffer_vertex_count(const nir_shader_compiler_options *options) { - nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, - dxil_get_nir_compiler_options(), "FakeSOBufferVertexCount"); + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, options, "FakeSOBufferVertexCount"); nir_variable_create(b.shader, nir_var_mem_ssbo, glsl_array_type(glsl_uint_type(), 0, 0), "fake_so"); nir_ssa_def *fake_buffer_filled_size = nir_load_ssbo(&b, 1, 32, nir_imm_int(&b, 0), nir_imm_int(&b, 0), (gl_access_qualifier)0, 4, 0); @@ -190,10 +186,9 @@ get_fake_so_buffer_vertex_count() } static struct nir_shader * -get_draw_auto() +get_draw_auto(const nir_shader_compiler_options *options) { - nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, - dxil_get_nir_compiler_options(), "DrawAuto"); + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, options, "DrawAuto"); nir_variable_create(b.shader, nir_var_mem_ssbo, glsl_array_type(glsl_uint_type(), 0, 0), "ssbo"); nir_ssa_def *buffer_filled_size = nir_load_ssbo(&b, 1, 32, nir_imm_int(&b, 0), nir_imm_int(&b, 0), (gl_access_qualifier)0, 4, 0); @@ -218,17 +213,17 @@ get_draw_auto() } static struct nir_shader * -create_compute_transform(const d3d12_compute_transform_key *key) +create_compute_transform(const nir_shader_compiler_options *options, const d3d12_compute_transform_key *key) { switch (key->type) { case d3d12_compute_transform_type::base_vertex: - return get_indirect_draw_base_vertex_transform(key); + return get_indirect_draw_base_vertex_transform(options, key); case d3d12_compute_transform_type::fake_so_buffer_copy_back: - return get_fake_so_buffer_copy_back(key); + return get_fake_so_buffer_copy_back(options, key); case d3d12_compute_transform_type::fake_so_buffer_vertex_count: - return get_fake_so_buffer_vertex_count(); + return get_fake_so_buffer_vertex_count(options); case d3d12_compute_transform_type::draw_auto: - return get_draw_auto(); + return get_draw_auto(options); default: unreachable("Invalid transform"); } @@ -248,9 +243,11 @@ d3d12_get_compute_transform(struct d3d12_context *ctx, const d3d12_compute_trans compute_transform *data = (compute_transform *)MALLOC(sizeof(compute_transform)); if (!data) return NULL; + + const nir_shader_compiler_options *options = &d3d12_screen(ctx->base.screen)->nir_options; memcpy(&data->key, key, sizeof(*key)); - nir_shader *s = create_compute_transform(key); + nir_shader *s = create_compute_transform(options, key); if (!s) { FREE(data); return NULL; diff --git a/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp b/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp index 97de8fa58bc..3b783e89479 100644 --- a/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp +++ b/src/gallium/drivers/d3d12/d3d12_gs_variant.cpp @@ -25,7 +25,6 @@ #include "d3d12_context.h" #include "d3d12_debug.h" #include "d3d12_screen.h" -#include "nir_to_dxil.h" #include "nir.h" #include "compiler/nir/nir_builder.h" @@ -62,7 +61,7 @@ d3d12_make_passthrough_gs(struct d3d12_context *ctx, struct d3d12_gs_variant_key struct pipe_shader_state templ; nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_GEOMETRY, - dxil_get_nir_compiler_options(), + &d3d12_screen(ctx->base.screen)->nir_options, "passthrough"); nir = b.shader; @@ -160,7 +159,7 @@ d3d12_begin_emit_primitives_gs(struct emit_primitives_context *emit_ctx, emit_ctx->ctx = ctx; emit_ctx->b = nir_builder_init_simple_shader(MESA_SHADER_GEOMETRY, - dxil_get_nir_compiler_options(), + &d3d12_screen(ctx->base.screen)->nir_options, "edgeflags"); nir_shader *nir = b->shader; diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp index bd28207bc66..9b0018eb94f 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.cpp +++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp @@ -42,6 +42,8 @@ #include "nir.h" #include "frontend/sw_winsys.h" +#include "nir_to_dxil.h" + #include <directx/d3d12sdklayers.h> #include <dxguids/dxguids.h> @@ -1212,6 +1214,8 @@ d3d12_init_screen(struct d3d12_screen *screen, struct sw_winsys *winsys, IUnknow screen->have_load_at_vertex = can_attribute_at_vertex(screen); screen->support_shader_images = can_shader_image_load_all_formats(screen); + + screen->nir_options = *dxil_get_nir_compiler_options(); return true; failed: diff --git a/src/gallium/drivers/d3d12/d3d12_screen.h b/src/gallium/drivers/d3d12/d3d12_screen.h index e80b8348a4a..28d5353dced 100644 --- a/src/gallium/drivers/d3d12/d3d12_screen.h +++ b/src/gallium/drivers/d3d12/d3d12_screen.h @@ -29,6 +29,8 @@ #include "util/slab.h" #include "d3d12_descriptor_pool.h" +#include "nir.h" + #ifndef _WIN32 #include <wsl/winadapter.h> #endif @@ -84,6 +86,8 @@ struct d3d12_screen { D3D12_FEATURE_DATA_D3D12_OPTIONS3 opts3; D3D12_FEATURE_DATA_D3D12_OPTIONS4 opts4; + nir_shader_compiler_options nir_options; + /* description */ uint32_t vendor_id; uint64_t memory_size_megabytes; diff --git a/src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp b/src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp index 1773ef488ff..81de812af22 100644 --- a/src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp +++ b/src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp @@ -26,7 +26,7 @@ #include "d3d12_context.h" #include "d3d12_compiler.h" #include "d3d12_nir_passes.h" -#include "nir_to_dxil.h" +#include "d3d12_screen.h" static uint32_t hash_tcs_variant_key(const void *key) @@ -61,7 +61,7 @@ d3d12_tcs_variant_cache_destroy(struct d3d12_context *ctx) static struct d3d12_shader_selector * create_tess_ctrl_shader_variant(struct d3d12_context *ctx, struct d3d12_tcs_variant_key *key) { - nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_TESS_CTRL, dxil_get_nir_compiler_options(), "passthrough"); + nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_TESS_CTRL, &d3d12_screen(ctx->base.screen)->nir_options, "passthrough"); nir_shader *nir = b.shader; nir_ssa_def *invocation_id = nir_load_invocation_id(&b); diff --git a/src/gallium/winsys/d3d12/wgl/meson.build b/src/gallium/winsys/d3d12/wgl/meson.build index 0a25f9844a9..15769b5b19a 100644 --- a/src/gallium/winsys/d3d12/wgl/meson.build +++ b/src/gallium/winsys/d3d12/wgl/meson.build @@ -24,7 +24,7 @@ libd3d12winsys = static_library( 'd3d12winsys', files('d3d12_wgl_framebuffer.cpp', 'd3d12_wgl_winsys.c'), include_directories : [inc_src, inc_wgl, inc_include, inc_gallium, inc_gallium_aux, inc_gallium_drivers], - dependencies : [dep_dxheaders], + dependencies : [dep_dxheaders, idep_nir_headers], gnu_symbol_visibility : 'hidden', ) |