Skip to content

Commit dc90f95

Browse files
vkd3d: Hook up forced VRS 2x2 mode.
Signed-off-by: Hans-Kristian Arntzen <[email protected]>
1 parent be4d563 commit dc90f95

File tree

4 files changed

+51
-2
lines changed

4 files changed

+51
-2
lines changed

include/vkd3d_shader.h

+4
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ enum vkd3d_shader_meta_flags
7676
VKD3D_SHADER_META_FLAG_EMITS_TRIANGLES = 1 << 15,
7777
VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH = 1 << 16,
7878
VKD3D_SHADER_META_FLAG_EXPORTS_SAMPLE_MASK = 1 << 17,
79+
VKD3D_SHADER_META_FLAG_FORCE_VRS_2X2 = 1 << 18,
7980
};
8081

8182
struct vkd3d_shader_meta
@@ -429,6 +430,9 @@ enum vkd3d_shader_quirk
429430

430431
/* Range check every descriptor heap access with dynamic index and robustness check it. */
431432
VKD3D_SHADER_QUIRK_DESCRIPTOR_HEAP_ROBUSTNESS = (1 << 15),
433+
434+
/* Compile pipeline with static 2x2 VRS factors. For speed hacks. */
435+
VKD3D_SHADER_QUIRK_FORCE_VRS_2X2 = (1 << 16),
432436
};
433437

434438
struct vkd3d_shader_quirk_hash

libs/vkd3d-shader/dxil.c

+2
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,8 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
590590
quirks = vkd3d_shader_compile_arguments_select_quirks(compiler_args, hash);
591591
if (quirks & VKD3D_SHADER_QUIRK_FORCE_COMPUTE_BARRIER)
592592
spirv->meta.flags |= VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH;
593+
if (quirks & VKD3D_SHADER_QUIRK_FORCE_VRS_2X2)
594+
spirv->meta.flags |= VKD3D_SHADER_META_FLAG_FORCE_VRS_2X2;
593595

594596
dxil_spv_begin_thread_allocator_context();
595597

libs/vkd3d-shader/spirv.c

+2
Original file line numberDiff line numberDiff line change
@@ -11691,6 +11691,8 @@ int vkd3d_dxbc_compiler_generate_spirv(struct vkd3d_dxbc_compiler *compiler,
1169111691
vkd3d_shader_extract_feature_meta(spirv);
1169211692
if (compiler->quirks & VKD3D_SHADER_QUIRK_FORCE_COMPUTE_BARRIER)
1169311693
spirv->meta.flags |= VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH;
11694+
if (compiler->quirks & VKD3D_SHADER_QUIRK_FORCE_VRS_2X2)
11695+
spirv->meta.flags |= VKD3D_SHADER_META_FLAG_FORCE_VRS_2X2;
1169411696

1169511697
return VKD3D_OK;
1169611698
}

libs/vkd3d/state.c

+43-2
Original file line numberDiff line numberDiff line change
@@ -3942,10 +3942,12 @@ uint32_t d3d12_graphics_pipeline_state_get_dynamic_state_flags(struct d3d12_pipe
39423942
if (d3d12_device_supports_variable_shading_rate_tier_1(state->device) && graphics->rt_count)
39433943
{
39443944
/* If sample rate shading or ROVs are used, force default VRS state. Do this by not enabling the dynamic state.
3945-
* This forces default static pipeline state to be used instead, which is what we want. */
3945+
* This forces default static pipeline state to be used instead, which is what we want.
3946+
* For force VRS 2x2, we want to remove the dynamic shading rate, and use static pipeline struct instead. */
39463947
const uint32_t disable_flags =
39473948
VKD3D_SHADER_META_FLAG_USES_SAMPLE_RATE_SHADING |
3948-
VKD3D_SHADER_META_FLAG_USES_RASTERIZER_ORDERED_VIEWS;
3949+
VKD3D_SHADER_META_FLAG_USES_RASTERIZER_ORDERED_VIEWS |
3950+
VKD3D_SHADER_META_FLAG_FORCE_VRS_2X2;
39493951
bool allow_vrs_combiners = true;
39503952

39513953
for (i = 0; allow_vrs_combiners && i < graphics->stage_count; i++)
@@ -5275,12 +5277,26 @@ static void d3d12_pipeline_state_log_graphics_state(const struct d3d12_pipeline_
52755277
ERR("Dynamic state: %#x (explicit: %#x)\n", graphics->pipeline_dynamic_states, graphics->explicit_dynamic_states);
52765278
}
52775279

5280+
static bool d3d12_pipeline_state_forces_vrs_2x2(struct d3d12_pipeline_state *state)
5281+
{
5282+
struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
5283+
bool use_vrs_2x2 = false;
5284+
uint32_t i;
5285+
5286+
if (d3d12_device_supports_variable_shading_rate_tier_1(state->device) && graphics->rt_count)
5287+
for (i = 0; i < graphics->stage_count && !use_vrs_2x2; i++)
5288+
use_vrs_2x2 = !!(graphics->code[i].meta.flags & VKD3D_SHADER_META_FLAG_FORCE_VRS_2X2);
5289+
5290+
return use_vrs_2x2;
5291+
}
5292+
52785293
static VkResult d3d12_pipeline_state_link_pipeline_variant(struct d3d12_pipeline_state *state,
52795294
const struct vkd3d_pipeline_key *key, const struct vkd3d_format *dsv_format, VkPipelineCache vk_cache,
52805295
uint32_t dynamic_state_flags, VkPipeline *vk_pipeline)
52815296
{
52825297
const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs;
52835298
struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
5299+
VkPipelineFragmentShadingRateStateCreateInfoKHR shading_rate_info;
52845300
struct vkd3d_fragment_output_pipeline_desc fragment_output_desc;
52855301
struct vkd3d_vertex_input_pipeline_desc vertex_input_desc;
52865302
VkPipelineLibraryCreateInfoKHR library_info;
@@ -5315,6 +5331,18 @@ static VkResult d3d12_pipeline_state_link_pipeline_variant(struct d3d12_pipeline
53155331
create_info.layout = graphics->pipeline_layout;
53165332
create_info.basePipelineIndex = -1;
53175333

5334+
if (d3d12_pipeline_state_forces_vrs_2x2(state))
5335+
{
5336+
memset(&shading_rate_info, 0, sizeof(shading_rate_info));
5337+
shading_rate_info.sType = VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR;
5338+
shading_rate_info.combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
5339+
shading_rate_info.combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
5340+
shading_rate_info.fragmentSize.width = 2;
5341+
shading_rate_info.fragmentSize.height = 2;
5342+
5343+
vk_prepend_struct(&create_info, &shading_rate_info);
5344+
}
5345+
53185346
if (d3d12_device_uses_descriptor_buffers(state->device))
53195347
create_info.flags |= VK_PIPELINE_CREATE_DESCRIPTOR_BUFFER_BIT_EXT;
53205348

@@ -5344,6 +5372,7 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
53445372
{
53455373
const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs;
53465374
VkDynamicState dynamic_state_buffer[ARRAY_SIZE(vkd3d_dynamic_state_list)];
5375+
VkPipelineFragmentShadingRateStateCreateInfoKHR shading_rate_info;
53475376
struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
53485377
VkPipelineCreationFeedbackEXT feedbacks[VKD3D_MAX_SHADER_STAGES];
53495378
struct vkd3d_fragment_output_pipeline_desc fragment_output_desc;
@@ -5512,6 +5541,18 @@ VkPipeline d3d12_pipeline_state_create_pipeline_variant(struct d3d12_pipeline_st
55125541
else
55135542
feedback_info.pipelineStageCreationFeedbackCount = 0;
55145543

5544+
if (d3d12_pipeline_state_forces_vrs_2x2(state))
5545+
{
5546+
memset(&shading_rate_info, 0, sizeof(shading_rate_info));
5547+
shading_rate_info.sType = VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR;
5548+
shading_rate_info.combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
5549+
shading_rate_info.combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
5550+
shading_rate_info.fragmentSize.width = 2;
5551+
shading_rate_info.fragmentSize.height = 2;
5552+
5553+
vk_prepend_struct(&pipeline_desc, &shading_rate_info);
5554+
}
5555+
55155556
vr = VK_CALL(vkCreateGraphicsPipelines(device->vk_device, vk_cache, 1, &pipeline_desc, NULL, &vk_pipeline));
55165557

55175558
if (vkd3d_config_flags & VKD3D_CONFIG_FLAG_PIPELINE_LIBRARY_LOG)

0 commit comments

Comments
 (0)