From 801408077a8998defa2467003a2a5334e8324e54 Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 12 Nov 2020 19:15:50 -0500 Subject: [PATCH] Use SV_POSITION instead to compute pixel coordinates instead of fiddling with the polygon. This should fix the image being offset by 1 pixel. --- .../CompiledShaders/ScaleQuadP_D3D11.cpp | 165 +++++++++--------- .../GpDisplayDriverD3D11.cpp | 10 +- GpDisplayDriver_D3D11/GpDisplayDriverD3D11.h | 3 +- ShaderSrc/ScaleQuadP.hlsl | 8 +- 4 files changed, 95 insertions(+), 91 deletions(-) diff --git a/GpDisplayDriver_D3D11/CompiledShaders/ScaleQuadP_D3D11.cpp b/GpDisplayDriver_D3D11/CompiledShaders/ScaleQuadP_D3D11.cpp index 30af17e..655c4e0 100644 --- a/GpDisplayDriver_D3D11/CompiledShaders/ScaleQuadP_D3D11.cpp +++ b/GpDisplayDriver_D3D11/CompiledShaders/ScaleQuadP_D3D11.cpp @@ -1,10 +1,10 @@ static unsigned char gs_shaderData[] = { - 68, 88, 66, 67, 232, 177, 184, 42, 191, 44, 237, 186, 185, 1, 42, - 67, 157, 207, 200, 70, 1, 0, 0, 0, 116, 5, 0, 0, 5, 0, - 0, 0, 52, 0, 0, 0, 52, 1, 0, 0, 140, 1, 0, 0, 192, - 1, 0, 0, 248, 4, 0, 0, 82, 68, 69, 70, 248, 0, 0, 0, + 68, 88, 66, 67, 36, 129, 233, 7, 7, 186, 125, 28, 230, 207, 54, + 71, 251, 69, 112, 99, 1, 0, 0, 0, 144, 5, 0, 0, 5, 0, + 0, 0, 52, 0, 0, 0, 60, 1, 0, 0, 148, 1, 0, 0, 200, + 1, 0, 0, 20, 5, 0, 0, 82, 68, 69, 70, 0, 1, 0, 0, 1, 0, 0, 0, 132, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, - 0, 0, 4, 255, 255, 0, 137, 0, 0, 208, 0, 0, 0, 92, 0, + 0, 0, 4, 255, 255, 0, 137, 0, 0, 216, 0, 0, 0, 92, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 255, 255, 255, 255, 0, 0, 0, 0, 1, 0, 0, 0, 9, 0, 0, 0, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -14,85 +14,86 @@ static unsigned char gs_shaderData[] = { 101, 108, 67, 111, 110, 115, 116, 97, 110, 116, 115, 0, 107, 0, 0, 0, 1, 0, 0, 0, 156, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 16, - 0, 0, 0, 2, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, - 100, 120, 100, 121, 95, 85, 110, 117, 115, 101, 100, 0, 1, 0, 3, - 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 105, - 99, 114, 111, 115, 111, 102, 116, 32, 40, 82, 41, 32, 72, 76, 83, - 76, 32, 83, 104, 97, 100, 101, 114, 32, 67, 111, 109, 112, 105, 108, - 101, 114, 32, 49, 48, 46, 49, 0, 73, 83, 71, 78, 80, 0, 0, - 0, 2, 0, 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 1, 0, 0, 0, 3, 3, 0, 0, 83, 86, 95, - 80, 79, 83, 73, 84, 73, 79, 78, 0, 84, 69, 88, 67, 79, 79, - 82, 68, 0, 171, 171, 171, 79, 83, 71, 78, 44, 0, 0, 0, 1, - 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, - 0, 83, 86, 95, 84, 65, 82, 71, 69, 84, 0, 171, 171, 83, 72, - 68, 82, 48, 3, 0, 0, 64, 0, 0, 0, 204, 0, 0, 0, 89, - 0, 0, 4, 70, 142, 32, 0, 0, 0, 0, 0, 1, 0, 0, 0, - 88, 24, 0, 4, 0, 112, 16, 0, 0, 0, 0, 0, 85, 85, 0, - 0, 98, 16, 0, 3, 50, 16, 16, 0, 1, 0, 0, 0, 101, 0, - 0, 3, 242, 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 5, - 0, 0, 0, 51, 0, 0, 11, 50, 0, 16, 0, 0, 0, 0, 0, - 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 128, 63, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, - 0, 0, 50, 0, 0, 14, 194, 0, 16, 0, 0, 0, 0, 0, 6, - 132, 32, 128, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 0, 63, 6, 20, 16, 0, 1, 0, 0, 0, 52, 0, - 0, 10, 194, 0, 16, 0, 0, 0, 0, 0, 166, 14, 16, 0, 0, - 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 50, 0, 16, - 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 230, 10, - 16, 0, 0, 0, 0, 0, 65, 0, 0, 5, 194, 0, 16, 0, 0, - 0, 0, 0, 166, 14, 16, 0, 0, 0, 0, 0, 27, 0, 0, 5, - 50, 0, 16, 0, 1, 0, 0, 0, 230, 10, 16, 0, 0, 0, 0, - 0, 65, 0, 0, 5, 194, 0, 16, 0, 0, 0, 0, 0, 6, 4, - 16, 0, 0, 0, 0, 0, 0, 0, 0, 8, 50, 0, 16, 0, 0, - 0, 0, 0, 230, 10, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, - 70, 0, 16, 0, 0, 0, 0, 0, 27, 0, 0, 5, 50, 0, 16, - 0, 2, 0, 0, 0, 230, 10, 16, 0, 0, 0, 0, 0, 14, 32, - 0, 8, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, - 0, 0, 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 5, 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, - 0, 0, 0, 0, 0, 54, 0, 0, 5, 194, 0, 16, 0, 2, 0, - 0, 0, 86, 9, 16, 0, 1, 0, 0, 0, 45, 0, 0, 7, 242, - 0, 16, 0, 3, 0, 0, 0, 70, 15, 16, 0, 2, 0, 0, 0, - 70, 126, 16, 0, 0, 0, 0, 0, 45, 0, 0, 7, 242, 0, 16, - 0, 4, 0, 0, 0, 134, 15, 16, 0, 2, 0, 0, 0, 70, 126, - 16, 0, 0, 0, 0, 0, 54, 0, 0, 5, 130, 0, 16, 0, 1, - 0, 0, 0, 26, 0, 16, 0, 2, 0, 0, 0, 45, 0, 0, 7, - 242, 0, 16, 0, 2, 0, 0, 0, 198, 10, 16, 0, 1, 0, 0, - 0, 70, 126, 16, 0, 0, 0, 0, 0, 45, 0, 0, 7, 242, 0, - 16, 0, 1, 0, 0, 0, 70, 10, 16, 0, 1, 0, 0, 0, 70, - 126, 16, 0, 0, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, - 4, 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, - 0, 4, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 3, 0, - 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 3, - 0, 0, 0, 0, 0, 0, 11, 82, 0, 16, 0, 0, 0, 0, 0, - 6, 1, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, - 0, 0, 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, - 0, 0, 50, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 6, - 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, 0, - 70, 2, 16, 0, 3, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, - 0, 2, 0, 0, 0, 86, 5, 16, 0, 0, 0, 0, 0, 70, 2, - 16, 0, 2, 0, 0, 0, 50, 0, 0, 9, 178, 0, 16, 0, 0, - 0, 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 70, 8, 16, 0, - 1, 0, 0, 0, 70, 8, 16, 0, 4, 0, 0, 0, 50, 0, 0, - 9, 114, 32, 16, 0, 0, 0, 0, 0, 166, 10, 16, 0, 0, 0, - 0, 0, 70, 3, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 2, - 0, 0, 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, 0, - 1, 64, 0, 0, 0, 0, 128, 63, 62, 0, 0, 1, 83, 84, 65, - 84, 116, 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 200, 0, 0, 0, 0, 0, 0, 0, + 100, 120, 100, 121, 95, 73, 110, 118, 80, 105, 120, 101, 108, 83, 99, + 97, 108, 101, 0, 171, 1, 0, 3, 0, 1, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 77, 105, 99, 114, 111, 115, 111, 102, 116, + 32, 40, 82, 41, 32, 72, 76, 83, 76, 32, 83, 104, 97, 100, 101, + 114, 32, 67, 111, 109, 112, 105, 108, 101, 114, 32, 49, 48, 46, 49, + 0, 73, 83, 71, 78, 80, 0, 0, 0, 2, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 15, 3, 0, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, + 0, 3, 0, 0, 0, 83, 86, 95, 80, 79, 83, 73, 84, 73, 79, + 78, 0, 84, 69, 88, 67, 79, 79, 82, 68, 0, 171, 171, 171, 79, + 83, 71, 78, 44, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, 0, 0, 0, 15, 0, 0, 0, 83, 86, 95, 84, 65, 82, + 71, 69, 84, 0, 171, 171, 83, 72, 68, 82, 68, 3, 0, 0, 64, + 0, 0, 0, 209, 0, 0, 0, 89, 0, 0, 4, 70, 142, 32, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 88, 24, 0, 4, 0, 112, 16, + 0, 0, 0, 0, 0, 85, 85, 0, 0, 100, 32, 0, 4, 50, 16, + 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 101, 0, 0, 3, 242, + 32, 16, 0, 0, 0, 0, 0, 104, 0, 0, 2, 5, 0, 0, 0, + 0, 0, 0, 10, 50, 0, 16, 0, 0, 0, 0, 0, 70, 16, 16, + 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, 0, 0, 191, 0, 0, + 0, 191, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 8, 50, + 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, + 230, 138, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, + 10, 50, 0, 16, 0, 0, 0, 0, 0, 70, 0, 16, 0, 0, 0, + 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 11, 194, 0, 16, 0, + 0, 0, 0, 0, 6, 132, 32, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 63, 0, 0, 128, 63, 0, 0, 0, 7, 194, 0, 16, 0, 0, + 0, 0, 0, 166, 14, 16, 0, 0, 0, 0, 0, 6, 4, 16, 0, + 0, 0, 0, 0, 65, 0, 0, 5, 50, 0, 16, 0, 0, 0, 0, + 0, 70, 0, 16, 0, 0, 0, 0, 0, 27, 0, 0, 5, 50, 0, + 16, 0, 1, 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 65, + 0, 0, 5, 50, 0, 16, 0, 0, 0, 0, 0, 230, 10, 16, 0, + 0, 0, 0, 0, 0, 0, 0, 8, 194, 0, 16, 0, 0, 0, 0, + 0, 6, 4, 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 166, 14, + 16, 0, 0, 0, 0, 0, 27, 0, 0, 5, 50, 0, 16, 0, 2, + 0, 0, 0, 70, 0, 16, 0, 0, 0, 0, 0, 14, 32, 0, 8, + 50, 0, 16, 0, 0, 0, 0, 0, 230, 10, 16, 0, 0, 0, 0, + 0, 70, 128, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, + 0, 5, 66, 0, 16, 0, 1, 0, 0, 0, 1, 64, 0, 0, 0, + 0, 0, 0, 54, 0, 0, 5, 194, 0, 16, 0, 2, 0, 0, 0, + 86, 9, 16, 0, 1, 0, 0, 0, 45, 0, 0, 7, 242, 0, 16, + 0, 3, 0, 0, 0, 70, 15, 16, 0, 2, 0, 0, 0, 70, 126, + 16, 0, 0, 0, 0, 0, 45, 0, 0, 7, 242, 0, 16, 0, 4, + 0, 0, 0, 134, 15, 16, 0, 2, 0, 0, 0, 70, 126, 16, 0, + 0, 0, 0, 0, 54, 0, 0, 5, 130, 0, 16, 0, 1, 0, 0, + 0, 26, 0, 16, 0, 2, 0, 0, 0, 45, 0, 0, 7, 242, 0, + 16, 0, 2, 0, 0, 0, 198, 10, 16, 0, 1, 0, 0, 0, 70, + 126, 16, 0, 0, 0, 0, 0, 45, 0, 0, 7, 242, 0, 16, 0, + 1, 0, 0, 0, 70, 10, 16, 0, 1, 0, 0, 0, 70, 126, 16, + 0, 0, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 4, 0, + 0, 0, 6, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 4, + 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 3, 0, 0, 0, + 6, 0, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 3, 0, 0, + 0, 0, 0, 0, 11, 82, 0, 16, 0, 0, 0, 0, 0, 6, 1, + 16, 128, 65, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 0, 0, + 0, 128, 63, 0, 0, 0, 0, 0, 0, 128, 63, 0, 0, 0, 0, + 50, 0, 0, 9, 114, 0, 16, 0, 2, 0, 0, 0, 6, 0, 16, + 0, 0, 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, 0, 70, 2, + 16, 0, 3, 0, 0, 0, 56, 0, 0, 7, 114, 0, 16, 0, 2, + 0, 0, 0, 86, 5, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, + 2, 0, 0, 0, 50, 0, 0, 9, 178, 0, 16, 0, 0, 0, 0, + 0, 6, 0, 16, 0, 0, 0, 0, 0, 70, 8, 16, 0, 1, 0, + 0, 0, 70, 8, 16, 0, 4, 0, 0, 0, 50, 0, 0, 9, 114, + 32, 16, 0, 0, 0, 0, 0, 166, 10, 16, 0, 0, 0, 0, 0, + 70, 3, 16, 0, 0, 0, 0, 0, 70, 2, 16, 0, 2, 0, 0, + 0, 54, 0, 0, 5, 130, 32, 16, 0, 0, 0, 0, 0, 1, 64, + 0, 0, 0, 0, 128, 63, 62, 0, 0, 1, 83, 84, 65, 84, 116, + 0, 0, 0, 27, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; namespace GpBinarizedShaders diff --git a/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.cpp b/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.cpp index d407a2b..17e6641 100644 --- a/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.cpp +++ b/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.cpp @@ -814,10 +814,10 @@ void GpDisplayDriverD3D11::ScaleVirtualScreen() float fHeight = static_cast(m_windowHeightVirtual) * m_pixelScaleY; DrawQuadVertexConstants vConstantsData; - vConstantsData.m_ndcOriginX = twoDivWidth - 1.0f; - vConstantsData.m_ndcOriginY = negativeTwoDivHeight + 1.0f; - vConstantsData.m_ndcWidth = fWidth * twoDivWidth; - vConstantsData.m_ndcHeight = fHeight * negativeTwoDivHeight; + vConstantsData.m_ndcOriginX = - 1.0f; + vConstantsData.m_ndcOriginY = 1.0f; + vConstantsData.m_ndcWidth = 2.0; + vConstantsData.m_ndcHeight = -2.0; vConstantsData.m_surfaceDimensionX = static_cast(m_windowWidthVirtual); vConstantsData.m_surfaceDimensionY = static_cast(m_windowHeightVirtual); @@ -832,6 +832,8 @@ void GpDisplayDriverD3D11::ScaleVirtualScreen() ScaleQuadPixelConstants pConstantsData; pConstantsData.m_dx = static_cast(static_cast(m_windowWidthVirtual) / static_cast(m_windowWidthPhysical)); pConstantsData.m_dy = static_cast(static_cast(m_windowHeightVirtual) / static_cast(m_windowHeightPhysical)); + pConstantsData.m_invScaleX = static_cast(1.0f / m_pixelScaleX); + pConstantsData.m_invScaleY = static_cast(1.0f / m_pixelScaleY); D3D11_MAPPED_SUBRESOURCE mappedPConstants; if (m_deviceContext->Map(m_scaleQuadPixelConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedPConstants) == S_OK) diff --git a/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.h b/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.h index 6ca540e..831c3d0 100644 --- a/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.h +++ b/GpDisplayDriver_D3D11/GpDisplayDriverD3D11.h @@ -99,7 +99,8 @@ private: { float m_dx; float m_dy; - float m_unused[2]; + float m_invScaleX; + float m_invScaleY; }; struct CompactedPresentHistoryItem diff --git a/ShaderSrc/ScaleQuadP.hlsl b/ShaderSrc/ScaleQuadP.hlsl index 473ec22..007b661 100644 --- a/ShaderSrc/ScaleQuadP.hlsl +++ b/ShaderSrc/ScaleQuadP.hlsl @@ -5,7 +5,7 @@ Texture2D surfaceTexture : register(t0); cbuffer SScaleQuadPixelConstants : register(b0) { - float4 dxdy_Unused; + float4 dxdy_InvPixelScale; }; struct SDrawQuadPixelOutput @@ -20,10 +20,10 @@ float3 SamplePixel(int2 coord) SDrawQuadPixelOutput PSMain(SDrawQuadPixelInput input) { - float dx = dxdy_Unused.x; - float dy = dxdy_Unused.y; + float dx = dxdy_InvPixelScale.x; + float dy = dxdy_InvPixelScale.y; - float2 pixelTopLeftCoord = max(0.0, input.texCoord.xy - float2(dx, dy) * 0.5); + float2 pixelTopLeftCoord = max(0.0, (input.pos.xy - float2(0.5, 0.5)) * dxdy_InvPixelScale.zw); float2 pixelBottomRightCoord = pixelTopLeftCoord + min(float2(1.0, 1.0), float2(dx, dy)); int2 topLeftCoordInteger = int2(floor(pixelTopLeftCoord));