summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Natalie <jenatali@microsoft.com>2022-01-28 12:37:23 -0800
committerMarge Bot <emma+marge@anholt.net>2022-02-04 00:07:53 +0000
commit944832d3d72b2c081439fec99615a7b13231acc9 (patch)
treed99af83623f95191e0db9e86bede33a2b38e1637
parent2529a0df89ca0bdbddcdc9e5b9665a4bdf8d1aa9 (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.cpp4
-rw-r--r--src/gallium/drivers/d3d12/d3d12_compiler.cpp2
-rw-r--r--src/gallium/drivers/d3d12/d3d12_compute_transforms.cpp37
-rw-r--r--src/gallium/drivers/d3d12/d3d12_gs_variant.cpp5
-rw-r--r--src/gallium/drivers/d3d12/d3d12_screen.cpp4
-rw-r--r--src/gallium/drivers/d3d12/d3d12_screen.h4
-rw-r--r--src/gallium/drivers/d3d12/d3d12_tcs_variant.cpp4
-rw-r--r--src/gallium/winsys/d3d12/wgl/meson.build2
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',
)