Module: Mesa Branch: main Commit: 9fe88dd9b9f3bd075369fbc60689a835f20201a5 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9fe88dd9b9f3bd075369fbc60689a835f20201a5
Author: Jesse Natalie <[email protected]> Date: Thu Nov 9 09:01:25 2023 -0800 d3d12: Support enhanced layouts for VS inputs Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26156> --- src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt | 4 --- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 15 ++++++--- src/gallium/drivers/d3d12/d3d12_context.cpp | 1 - src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp | 36 ++++++++++++++++++++-- src/microsoft/compiler/dxil_signature.c | 3 ++ 5 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt index 05029511140..129c8699a03 100644 --- a/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt +++ b/src/gallium/drivers/d3d12/ci/d3d12-quick_gl.txt @@ -32,8 +32,6 @@ spec@!opengl [email protected] line cull-back pv-last,Fail spec@!opengl [email protected] line cull-front pv-last,Fail spec@!opengl [email protected] pv-last,Fail spec@arb_draw_indirect@arb_draw_indirect-api-errors,Crash -spec@arb_explicit_attrib_location@overlapping-locations-input-attribs api,Crash -spec@arb_explicit_attrib_location@overlapping-locations-input-attribs shader,Crash spec@arb_framebuffer_object@fbo-blit-scaled-linear,Fail spec@arb_get_program_binary@restore-sso-program,Fail spec@arb_point_sprite@arb_point_sprite-mipmap,Fail @@ -138,8 +136,6 @@ spec@arb_texture_stencil8@texwrap formats@GL_STENCIL_INDEX8,Fail spec@arb_texture_stencil8@texwrap formats@GL_STENCIL_INDEX8- NPOT,Fail spec@arb_texture_stencil8@texwrap formats@GL_STENCIL_INDEX8- swizzled,Fail spec@arb_transform_feedback_instanced@draw-auto instanced,Fail -spec@arb_vertex_attrib_64bit@arb_vertex_attrib_64bit-overlapping-locations api,Crash -spec@arb_vertex_attrib_64bit@arb_vertex_attrib_64bit-overlapping-locations shader,Crash spec@arb_vertex_program@arb_vertex_program-matrix-property-bindings,Fail spec@ext_framebuffer_blit@fbo-blit-check-limits,Fail spec@ext_framebuffer_multisample@accuracy 16 srgb depthstencil,Fail diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 9f142c5852b..a9fc609477c 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -1554,13 +1554,20 @@ d3d12_create_shader(struct d3d12_context *ctx, NIR_PASS_V(nir, dxil_nir_split_clip_cull_distance); NIR_PASS_V(nir, d3d12_split_needed_varyings); - if (nir->info.stage != MESA_SHADER_VERTEX) + if (nir->info.stage != MESA_SHADER_VERTEX) { nir->info.inputs_read = - dxil_reassign_driver_locations(nir, nir_var_shader_in, - prev ? prev->current->nir->info.outputs_written : 0); - else + dxil_reassign_driver_locations(nir, nir_var_shader_in, + prev ? prev->current->nir->info.outputs_written : 0); + } else { nir->info.inputs_read = dxil_sort_by_driver_location(nir, nir_var_shader_in); + uint32_t driver_loc = 0; + nir_foreach_variable_with_modes(var, nir, nir_var_shader_in) { + var->data.driver_location = driver_loc; + driver_loc += glsl_count_attribute_slots(var->type, false); + } + } + if (nir->info.stage != MESA_SHADER_FRAGMENT) { nir->info.outputs_written = dxil_reassign_driver_locations(nir, nir_var_shader_out, diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index 3f351e7629c..0006153415b 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -139,7 +139,6 @@ d3d12_create_vertex_elements_state(struct pipe_context *pctx, unsigned max_vb = 0; for (unsigned i = 0; i < num_elements; ++i) { cso->elements[i].SemanticName = "TEXCOORD"; - cso->elements[i].SemanticIndex = i; enum pipe_format format_helper = d3d12_emulated_vtx_format((enum pipe_format)elements[i].src_format); diff --git a/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp b/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp index 0085b3a0dea..b20ba5e69fa 100644 --- a/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp +++ b/src/gallium/drivers/d3d12/d3d12_pipeline_state.cpp @@ -130,6 +130,8 @@ fill_so_declaration(const struct pipe_stream_output_info *info, if (skip_components > 0) { entries[*num_entries].Stream = output->stream; entries[*num_entries].SemanticName = NULL; + entries[*num_entries].SemanticIndex = 0; + entries[*num_entries].StartComponent = 0; entries[*num_entries].ComponentCount = skip_components; entries[*num_entries].OutputSlot = buffer; (*num_entries)++; @@ -224,6 +226,34 @@ d3d12_rtv_format(struct d3d12_context *ctx, unsigned index) return fmt; } +static void +copy_input_attribs(const D3D12_INPUT_ELEMENT_DESC *ves_elements, D3D12_INPUT_ELEMENT_DESC *ia_elements, + D3D12_INPUT_LAYOUT_DESC *ia_desc, nir_shader *vs) +{ + uint32_t vert_input_count = 0; + int32_t ves_element_count = -1; + int var_loc = -1; + nir_foreach_shader_in_variable(var, vs) { + assert(vert_input_count < D3D12_VS_INPUT_REGISTER_COUNT); + + if (var->data.location != var_loc) + ves_element_count++; + var_loc = var->data.location; + + for (uint32_t i = 0; i < glsl_count_attribute_slots(var->type, false); ++i) { + ia_elements[vert_input_count] = ves_elements[ves_element_count++]; + ia_elements[vert_input_count].SemanticIndex = vert_input_count; + var->data.driver_location = vert_input_count++; + } + --ves_element_count; + } + + if (vert_input_count > 0) { + ia_desc->pInputElementDescs = ia_elements; + ia_desc->NumElements = vert_input_count; + } +} + static ID3D12PipelineState * create_gfx_pipeline_state(struct d3d12_context *ctx) { @@ -231,8 +261,9 @@ create_gfx_pipeline_state(struct d3d12_context *ctx) struct d3d12_gfx_pipeline_state *state = &ctx->gfx_pipeline_state; enum mesa_prim reduced_prim = state->prim_type == MESA_PRIM_PATCHES ? MESA_PRIM_PATCHES : u_reduced_prim(state->prim_type); - D3D12_SO_DECLARATION_ENTRY entries[PIPE_MAX_SO_OUTPUTS] = {}; - UINT strides[PIPE_MAX_SO_OUTPUTS] = { 0 }; + D3D12_SO_DECLARATION_ENTRY entries[PIPE_MAX_SO_OUTPUTS]; + UINT strides[PIPE_MAX_VERTEX_STREAMS] = { 0 }; + D3D12_INPUT_ELEMENT_DESC input_attribs[PIPE_MAX_ATTRIBS * 4]; UINT num_entries = 0, num_strides = 0; CD3DX12_PIPELINE_STATE_STREAM3 pso_desc; @@ -304,6 +335,7 @@ create_gfx_pipeline_state(struct d3d12_context *ctx) D3D12_INPUT_LAYOUT_DESC& input_layout = (D3D12_INPUT_LAYOUT_DESC&)pso_desc.InputLayout; input_layout.pInputElementDescs = state->ves->elements; input_layout.NumElements = state->ves->num_elements; + copy_input_attribs(state->ves->elements, input_attribs, &input_layout, state->stages[PIPE_SHADER_VERTEX]->nir); pso_desc.IBStripCutValue = state->ib_strip_cut_value; diff --git a/src/microsoft/compiler/dxil_signature.c b/src/microsoft/compiler/dxil_signature.c index 6735afd4ac3..ad6ba6ac183 100644 --- a/src/microsoft/compiler/dxil_signature.c +++ b/src/microsoft/compiler/dxil_signature.c @@ -575,6 +575,9 @@ get_input_signature_group(struct dxil_module *mod, /* Note: Specifically search for a variable that has space for these additional components */ nir_foreach_variable_with_modes(test_var, s, modes) { if (var->data.location == test_var->data.location) { + /* Variables should be sorted such that we're only looking for an already-emitted variable */ + if (test_var == var) + break; base_var = test_var; if (test_var->data.location_frac == 0 && glsl_get_component_slots(
