Skip to content

Commit 080794c

Browse files
committed
Try to do DFR in all situation. Put both left and right eyes in the common mask.
1 parent e366b7b commit 080794c

File tree

4 files changed

+45
-55
lines changed

4 files changed

+45
-55
lines changed

XR_APILAYER_MBUCCHIA_toolkit/VRS.hlsl

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ RWTexture2D<uint> u_Output : register(u0);
5858

5959
[numthreads(VRS_NUM_THREADS_X, VRS_NUM_THREADS_Y, 1)]
6060
void mainCS(in int2 pos : SV_DispatchThreadID) {
61-
// skip already-initialized tiles.
62-
if (u_Output[pos] < 254) {
63-
return;
64-
}
65-
6661
// screen space (w,h) to uv (0,1)
6762
float2 pos_uv = (pos + 0.5f) * Gaze.zw;
6863

@@ -96,7 +91,7 @@ void mainCS(in int2 pos : SV_DispatchThreadID) {
9691
#endif
9792
else rate = VRS_DEFAULT_RATE;
9893

99-
u_Output[pos] = rate;
94+
u_Output[pos] = min(u_Output[pos], rate);
10095
}
10196

10297
// clang-format on

XR_APILAYER_MBUCCHIA_toolkit/layer.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -271,14 +271,6 @@ namespace {
271271
Log("Detected OpenComposite\n");
272272
}
273273

274-
// With OpenComposite, we cannot use the frame analyzer, which results in the eye-tracked foveated rendering
275-
// not being advertised. However for certain apps using double-wide rendering, we can still enable the
276-
// feature, based on the list of apps below.
277-
m_overrideFoveatedRenderingCapability =
278-
m_applicationName == "OpenComposite_AC2-Win64-Shipping" ||
279-
m_applicationName == "OpenComposite_SkyrimVR" ||
280-
m_applicationName == "OpenComposite_Fallout4VR";
281-
282274
// Dump the OpenXR runtime information to help debugging customer issues.
283275
XrInstanceProperties instanceProperties = {XR_TYPE_INSTANCE_PROPERTIES, nullptr};
284276
CHECK_XRCMD(xrGetInstanceProperties(GetXrInstance(), &instanceProperties));
@@ -2667,7 +2659,7 @@ namespace {
26672659
proj->views[1].subImage.imageRect.offset.x != 0;
26682660
// TODO: Here we assume that left is always "first" (either slice 0 or "left-most" viewport).
26692661

2670-
if (useTextureArrays || useDoubleWide || m_overrideFoveatedRenderingCapability) {
2662+
if (useTextureArrays || useDoubleWide) {
26712663
// Assume that we've properly distinguished left/right eyes.
26722664
m_stats.hasColorBuffer[(int)utilities::Eye::Left] =
26732665
m_stats.hasColorBuffer[(int)utilities::Eye::Right] = true;
@@ -3408,7 +3400,6 @@ namespace {
34083400
bool m_isOmniceptDetected{false};
34093401
bool m_hasPimaxEyeTracker{false};
34103402
bool m_isFrameThrottlingPossible{true};
3411-
bool m_overrideFoveatedRenderingCapability{false};
34123403
bool m_overrideParallelProjection{false};
34133404

34143405
std::mutex m_frameLock;

XR_APILAYER_MBUCCHIA_toolkit/menu.cpp

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,9 +1190,8 @@ namespace {
11901190
// Scaling sub-group.
11911191
{
11921192
MenuGroup upscalingGroup(this, [&] {
1193-
return getCurrentScalingType() == ScalingType::NIS
1194-
|| getCurrentScalingType() == ScalingType::FSR
1195-
|| getCurrentScalingType() == ScalingType::CAS;
1193+
return getCurrentScalingType() == ScalingType::NIS || getCurrentScalingType() == ScalingType::FSR ||
1194+
getCurrentScalingType() == ScalingType::CAS;
11961195
});
11971196
m_menuEntries.push_back({MenuIndent::SubGroupIndent,
11981197
"Anamorphic",
@@ -1288,11 +1287,6 @@ namespace {
12881287
VariableShadingRateType::None;
12891288
});
12901289
if (m_isEyeTrackingSupported) {
1291-
// Eye tracking sub-group.
1292-
MenuGroup variableRateShaderEyeTrackingGroup(this, [&] {
1293-
// We only show eye tracking availability if we are able to distinguish left/right eyes.
1294-
return m_stats.hasColorBuffer[0] && m_stats.hasColorBuffer[1];
1295-
});
12961290
m_menuEntries.push_back({MenuIndent::SubGroupIndent,
12971291
"Eye tracking",
12981292
MenuEntryType::Choice,
@@ -1301,7 +1295,6 @@ namespace {
13011295
MenuEntry::LastVal<OffOnType>(),
13021296
MenuEntry::FmtEnum<OffOnType>});
13031297
m_originalEyeTrackingEnabled = isEyeTrackingEnabled();
1304-
variableRateShaderEyeTrackingGroup.finalize();
13051298

13061299
// Eye tracking settings sub-group.
13071300
MenuGroup variableRateShaderEyeTrackingSettingsGroup(
@@ -1416,10 +1409,6 @@ namespace {
14161409
200,
14171410
MenuEntry::FmtPercent});
14181411
m_menuEntries.back().expert = true;
1419-
MenuGroup variableRateShaderHorizontalOffsetGroup(this, [&] {
1420-
// We only show horizontal offset setting if we are able to distinguish left/right eyes.
1421-
return m_stats.hasColorBuffer[0] && m_stats.hasColorBuffer[1];
1422-
});
14231412
m_menuEntries.push_back({MenuIndent::SubGroupIndent,
14241413
"Horizontal offset",
14251414
MenuEntryType::Slider,
@@ -1428,7 +1417,6 @@ namespace {
14281417
100,
14291418
MenuEntry::FmtPercent});
14301419
m_menuEntries.back().expert = true;
1431-
variableRateShaderHorizontalOffsetGroup.finalize();
14321420
m_menuEntries.push_back({MenuIndent::SubGroupIndent,
14331421
"Vertical offset",
14341422
MenuEntryType::Slider,

XR_APILAYER_MBUCCHIA_toolkit/vrs.cpp

Lines changed: 41 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ namespace {
7272

7373
// Standard shading rates
7474
enum ShadingRates {
75-
SHADING_RATE_CULL,
76-
SHADING_RATE_x16,
75+
SHADING_RATE_x16 = 0,
7776
SHADING_RATE_x8,
7877
SHADING_RATE_x4,
7978
SHADING_RATE_x2,
@@ -84,6 +83,7 @@ namespace {
8483
SHADING_RATE_4x2,
8584
SHADING_RATE_2x4,
8685
SHADING_RATE_4x4,
86+
SHADING_RATE_CULL,
8787
SHADING_RATE_COUNT
8888
};
8989

@@ -105,7 +105,7 @@ namespace {
105105
// The number of frames since the mask was last used during a rendering pass.
106106
uint16_t age;
107107

108-
std::shared_ptr<IShaderBuffer> cbShading[ViewCount + 1];
108+
std::shared_ptr<IShaderBuffer> cbShading[ViewCount + 2];
109109
std::shared_ptr<ITexture> mask[ViewCount + 1];
110110
std::shared_ptr<ITexture> maskDoubleWide;
111111
std::shared_ptr<ITexture> maskTextureArray;
@@ -871,17 +871,24 @@ namespace {
871871
// Draw the rings into the mask.
872872
const auto dispatchX = xr::math::DivideRoundingUp(mask.widthInTiles, 8);
873873
const auto dispatchY = xr::math::DivideRoundingUp(mask.heightInTiles, 8);
874-
for (size_t i = 0; i < std::size(mask.mask); i++) {
875-
const auto constants = makeShadingConstants(i, mask.widthInTiles, mask.heightInTiles);
874+
for (size_t i = 0; i < std::size(mask.mask) + 1; i++) {
875+
size_t target = std::min(i, std::size(mask.mask) - 1);
876+
size_t eye = i;
877+
ShadingConstants constants;
878+
if (m_usingEyeTracking) {
879+
// The combined mask has both eyes.
880+
eye = eye % 2;
881+
}
882+
constants = makeShadingConstants(eye, mask.widthInTiles, mask.heightInTiles);
876883
mask.cbShading[i]->uploadData(&constants, sizeof(constants));
877884

878885
m_csShading->updateThreadGroups({dispatchX, dispatchY, 1});
879886
m_device->setShader(m_csShading, SamplerType::NearestClamp);
880887
m_device->setShaderInput(0, mask.cbShading[i]);
881-
mask.mask[i]->setState(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
882-
m_device->setShaderOutput(0, mask.mask[i]);
888+
mask.mask[target]->setState(D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
889+
m_device->setShaderOutput(0, mask.mask[target]);
883890
m_device->dispatchShader();
884-
mask.mask[i]->setState(D3D12_RESOURCE_STATE_COPY_SOURCE);
891+
mask.mask[target]->setState(D3D12_RESOURCE_STATE_COPY_SOURCE);
885892
}
886893

887894
// Copy to the double wide/texture arrays mask.
@@ -929,31 +936,39 @@ namespace {
929936
if (api == Api::D3D11) {
930937
// Implementation uses a constant table with a varying shading rate texture
931938
// We set VRS on 2 viewports in case the stereo view renders in parallel.
932-
m_shadingRates[SHADING_RATE_CULL] = NV_PIXEL_X0_CULL_RASTER_PIXELS;
933-
m_shadingRates[SHADING_RATE_x16] = NV_PIXEL_X16_PER_RASTER_PIXEL;
934-
m_shadingRates[SHADING_RATE_x8] = NV_PIXEL_X8_PER_RASTER_PIXEL;
935-
m_shadingRates[SHADING_RATE_x4] = NV_PIXEL_X4_PER_RASTER_PIXEL;
936-
m_shadingRates[SHADING_RATE_x2] = NV_PIXEL_X2_PER_RASTER_PIXEL;
937-
m_shadingRates[SHADING_RATE_x1] = NV_PIXEL_X1_PER_RASTER_PIXEL;
938-
m_shadingRates[SHADING_RATE_2x1] = NV_PIXEL_X1_PER_2X1_RASTER_PIXELS;
939-
m_shadingRates[SHADING_RATE_1x2] = NV_PIXEL_X1_PER_1X2_RASTER_PIXELS;
940-
m_shadingRates[SHADING_RATE_2x2] = NV_PIXEL_X1_PER_2X2_RASTER_PIXELS;
941-
m_shadingRates[SHADING_RATE_4x2] = NV_PIXEL_X1_PER_4X2_RASTER_PIXELS;
942-
m_shadingRates[SHADING_RATE_2x4] = NV_PIXEL_X1_PER_2X4_RASTER_PIXELS;
943-
m_shadingRates[SHADING_RATE_4x4] = NV_PIXEL_X1_PER_4X4_RASTER_PIXELS;
944-
945-
for (size_t i = 0; i < std::size(m_shadingRates); i++) {
946-
m_nvRates[0].shadingRateTable[i] = static_cast<NV_PIXEL_SHADING_RATE>(m_shadingRates[i]);
947-
}
939+
m_nvRates[0].shadingRateTable[0] = NV_PIXEL_X16_PER_RASTER_PIXEL;
940+
m_shadingRates[SHADING_RATE_x16] = 0;
941+
m_nvRates[0].shadingRateTable[1] = NV_PIXEL_X8_PER_RASTER_PIXEL;
942+
m_shadingRates[SHADING_RATE_x8] = 1;
943+
m_nvRates[0].shadingRateTable[2] = NV_PIXEL_X4_PER_RASTER_PIXEL;
944+
m_shadingRates[SHADING_RATE_x4] = 2;
945+
m_nvRates[0].shadingRateTable[3] = NV_PIXEL_X2_PER_RASTER_PIXEL;
946+
m_shadingRates[SHADING_RATE_x2] = 3;
947+
m_nvRates[0].shadingRateTable[4] = NV_PIXEL_X1_PER_RASTER_PIXEL;
948+
m_shadingRates[SHADING_RATE_x1] = 4;
949+
m_nvRates[0].shadingRateTable[5] = NV_PIXEL_X1_PER_2X1_RASTER_PIXELS;
950+
m_shadingRates[SHADING_RATE_2x1] = 5;
951+
m_nvRates[0].shadingRateTable[6] = NV_PIXEL_X1_PER_1X2_RASTER_PIXELS;
952+
m_shadingRates[SHADING_RATE_1x2] = 6;
953+
m_nvRates[0].shadingRateTable[7] = NV_PIXEL_X1_PER_2X2_RASTER_PIXELS;
954+
m_shadingRates[SHADING_RATE_2x2] = 7;
955+
m_nvRates[0].shadingRateTable[8] = NV_PIXEL_X1_PER_4X2_RASTER_PIXELS;
956+
m_shadingRates[SHADING_RATE_4x2] = 8;
957+
m_nvRates[0].shadingRateTable[9] = NV_PIXEL_X1_PER_2X4_RASTER_PIXELS;
958+
m_shadingRates[SHADING_RATE_2x4] = 9;
959+
m_nvRates[0].shadingRateTable[10] = NV_PIXEL_X1_PER_4X4_RASTER_PIXELS;
960+
m_shadingRates[SHADING_RATE_4x4] = 10;
961+
m_nvRates[0].shadingRateTable[11] = NV_PIXEL_X0_CULL_RASTER_PIXELS;
962+
m_shadingRates[SHADING_RATE_CULL] = 11;
948963
m_nvRates[0].enableVariablePixelShadingRate = true;
964+
949965
for (size_t i = 1; i < std::size(m_nvRates); i++) {
950966
m_nvRates[i] = m_nvRates[0];
951967
}
952968
}
953969
if (api == Api::D3D12) {
954970
// Implementation uses a varying shading rate texture.
955971
// We use a constant table to lookup the shader constants only
956-
m_shadingRates[SHADING_RATE_CULL] = D3D12_SHADING_RATE_4X4;
957972
m_shadingRates[SHADING_RATE_x16] = D3D12_SHADING_RATE_1X1;
958973
m_shadingRates[SHADING_RATE_x8] = D3D12_SHADING_RATE_1X1;
959974
m_shadingRates[SHADING_RATE_x4] = D3D12_SHADING_RATE_1X1;
@@ -965,6 +980,7 @@ namespace {
965980
m_shadingRates[SHADING_RATE_4x2] = D3D12_SHADING_RATE_4X2;
966981
m_shadingRates[SHADING_RATE_2x4] = D3D12_SHADING_RATE_2X4;
967982
m_shadingRates[SHADING_RATE_4x4] = D3D12_SHADING_RATE_4X4;
983+
m_shadingRates[SHADING_RATE_CULL] = D3D12_SHADING_RATE_4X4;
968984
}
969985
}
970986

0 commit comments

Comments
 (0)