d3d12: Report sample positions

Reviewed-by: Sil Vilerino <sivileri@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14624>
This commit is contained in:
Jesse Natalie 2022-01-13 12:37:10 -08:00 committed by Marge Bot
parent 173e373803
commit aef777c95d
1 changed files with 73 additions and 0 deletions

View File

@ -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);