From aef777c95ddd75f596c6d18ab51dab085705e289 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Thu, 13 Jan 2022 12:37:10 -0800 Subject: [PATCH] d3d12: Report sample positions Reviewed-by: Sil Vilerino Part-of: --- src/gallium/drivers/d3d12/d3d12_context.cpp | 73 +++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp index 95ec07abae6..43ba31794ef 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context.cpp @@ -2151,6 +2151,77 @@ d3d12_memory_barrier(struct pipe_context *pctx, unsigned flags) } } +static void +d3d12_get_sample_position(struct pipe_context *pctx, unsigned sample_count, unsigned sample_index, + float *positions) +{ + /* Sample patterns transcribed from + * https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_standard_multisample_quality_levels + */ + static const int sample_pattern_1sample[2] = { 0, 0 }; + static const int sample_pattern_2samples[2][2] = { + { 4, 4 }, + { -4, -4 }, + }; + static const int sample_pattern_4samples[4][2] = { + { -2, -6 }, + { 6, -2 }, + { -6, 2 }, + { 2, 6 }, + }; + static const int sample_pattern_8samples[8][2] = { + { 1, -3 }, + { -1, 3 }, + { 5, 1 }, + { -3, -5 }, + { -5, 5 }, + { -7, -1 }, + { 3, 7 }, + { 7, -7 }, + }; + static const int sample_pattern_16samples[16][2] = { + { 1, 1 }, + { -1, -3 }, + { -3, 2 }, + { 4, -1 }, + { -5, -2 }, + { 2, 5 }, + { 5, 3 }, + { 3, -5 }, + { -2, 6 }, + { 0, -7 }, + { -4, -6 }, + { -6, 4 }, + { -8, 0 }, + { 7, -4 }, + { 6, 7 }, + { -7, -8 }, + }; + const int *samples; + switch (sample_count) { + case 1: + default: + samples = sample_pattern_1sample; + break; + case 2: + samples = sample_pattern_2samples[sample_index]; + break; + case 4: + samples = sample_pattern_4samples[sample_index]; + break; + case 8: + samples = sample_pattern_8samples[sample_index]; + break; + case 16: + samples = sample_pattern_16samples[sample_index]; + break; + } + + /* GL coords go from 0 -> 1, D3D from -0.5 -> 0.5 */ + for (unsigned i = 0; i < 2; ++i) + positions[i] = (float)(samples[i] + 8) / 16.0f; +} + struct pipe_context * d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) { @@ -2235,6 +2306,8 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.memory_barrier = d3d12_memory_barrier; + ctx->base.get_sample_position = d3d12_get_sample_position; + ctx->gfx_pipeline_state.sample_mask = ~0; d3d12_context_surface_init(&ctx->base);