variable rate shading tier2 #152
This commit is contained in:
@@ -63,6 +63,7 @@ This is a reference for the C++ features of Wicked Engine
|
||||
14. [GPU Queries](#gpu-queries)
|
||||
15. [RayTracingAccelerationStructure](#raytracingaccelerationstructure)
|
||||
16. [RayTracingPipelineState](#raytracingpipelinestate)
|
||||
17. [Variable Rate Shading](#variable-rate-shading)
|
||||
2. [GraphicsDevice_DX11](#wigraphicsdevice_dx11)
|
||||
3. [GraphicsDevice_DX12](#wigraphicsdevice_dx12)
|
||||
4. [GraphicsDevice_Vulkan](#wigraphicsdevice_vulkan)
|
||||
@@ -633,6 +634,17 @@ The acceleration strucuture can be bottom level or top level, and decided by the
|
||||
##### RayTracingPipelineState
|
||||
Binding a ray tracing pipeline state is required to dispatch ray tracing shaders. A ray tracing pipeline state holds a collection of shader libraries and hitgroup definitions. It also declares information about max resource usage of the pipeline.
|
||||
|
||||
##### Variable Rate Shading
|
||||
Variable Rate Shading can be used to decrease shading quality while retaining depth testing accuracy. The shading rate can be set up in different ways:
|
||||
|
||||
- `BindShadingRate()`: Set the shading rate for the following draw calls. The first parameter is the shading rate, which is by default `SHADING_RATE_1X1` (the best quality). The increasing enum values are standing for decreasing shading rates.
|
||||
- `BindShadingRateImage()`: Set the shading rate for the screen via a tiled texture. The texture must be using the `FORMAT_R8_UINT` format. In each pixel, the texture contains the shading rate value for a tile of pixels (8x8, 16x16 or 32x32). The tile size can be queried via `GetVariableRateShadingTileSize()`. The shading rate values that the texture contains are not the raw values from `SHADING_RATE` enum, but they must be converted to values that are native to the graphics API used using the `WriteShadingRateValue()` function. The shading rate texture must be written with a compute shader and transitioned to `IMAGE_LAYOUT_SHADING_RATE_SOURCE` with a [GPUBarrier](#gpu-barriers) before setting it with `BindShadingRateImage()`. It is valid to set a `nullptr` instead of the texture, indicating that the shading rate is not specified by a texture.
|
||||
- Or setting the shading rate from a vertex or geometry shader with the `SV_ShadingRate` system value semantic.
|
||||
|
||||
The final shading rate will be determined from the above methods using the maximum shading rate (least detailed) which is applicable to the screen tile. In the future it might be considered to expose the operator to define this.
|
||||
|
||||
To read more about variable rate shading, refer to the [DirectX specifications.](https://microsoft.github.io/DirectX-Specs/d3d/VariableRateShading)
|
||||
|
||||
|
||||
#### GraphicsDevice_DX11
|
||||
[[Header]](../WickedEngine/wiGraphicsDevice_DX11.h) [[Cpp]](../WickedEngine/wiGraphicsDevice_DX11.cpp)
|
||||
|
||||
+1
-1
@@ -698,7 +698,7 @@ void EditorComponent::Load()
|
||||
{
|
||||
filename += ".wiscene";
|
||||
}
|
||||
wiArchive archive(fileName, false);
|
||||
wiArchive archive(filename, false);
|
||||
if (archive.IsOpen())
|
||||
{
|
||||
Scene& scene = wiScene::GetScene();
|
||||
|
||||
@@ -456,6 +456,9 @@
|
||||
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\rtaoLIB.hlsl">
|
||||
<FileType>Document</FileType>
|
||||
</FxCompile>
|
||||
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\shadingRateClassificationCS.hlsl">
|
||||
<FileType>Document</FileType>
|
||||
</FxCompile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -84,7 +84,7 @@ EmitterWindow::EmitterWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
|
||||
|
||||
shaderTypeComboBox = new wiComboBox("ShaderType: ");
|
||||
shaderTypeComboBox->SetPos(XMFLOAT2(x, y += step));
|
||||
shaderTypeComboBox->SetSize(XMFLOAT2(250, itemheight));
|
||||
shaderTypeComboBox->SetSize(XMFLOAT2(300, itemheight));
|
||||
shaderTypeComboBox->AddItem("SOFT");
|
||||
shaderTypeComboBox->AddItem("SOFT + DISTORTION");
|
||||
shaderTypeComboBox->AddItem("SIMPLEST");
|
||||
@@ -101,28 +101,6 @@ EmitterWindow::EmitterWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
|
||||
emitterWindow->AddWidget(shaderTypeComboBox);
|
||||
|
||||
|
||||
shadingRateComboBox = new wiComboBox("Shading Rate: ");
|
||||
shadingRateComboBox->SetTooltip("Select shading rate for this material. \nSelecting larger shading rate will decrease rendering quality of this material, \nbut increases performance.\nDX12 only and requires Tier1 hardware support for variable shading rate");
|
||||
shadingRateComboBox->SetPos(XMFLOAT2(x + 400, y));
|
||||
shadingRateComboBox->SetSize(XMFLOAT2(40, itemheight));
|
||||
shadingRateComboBox->OnSelect([&](wiEventArgs args) {
|
||||
auto emitter = GetEmitter();
|
||||
if (emitter != nullptr)
|
||||
{
|
||||
emitter->shadingRate = (wiGraphics::SHADING_RATE)args.iValue;
|
||||
}
|
||||
});
|
||||
shadingRateComboBox->AddItem("1X1");
|
||||
shadingRateComboBox->AddItem("1X2");
|
||||
shadingRateComboBox->AddItem("2X1");
|
||||
shadingRateComboBox->AddItem("2X2");
|
||||
shadingRateComboBox->AddItem("2X4");
|
||||
shadingRateComboBox->AddItem("4X2");
|
||||
shadingRateComboBox->AddItem("4X4");
|
||||
shadingRateComboBox->SetEnabled(false);
|
||||
emitterWindow->AddWidget(shadingRateComboBox);
|
||||
|
||||
|
||||
sortCheckBox = new wiCheckBox("Sorting Enabled: ");
|
||||
sortCheckBox->SetPos(XMFLOAT2(x, y += step));
|
||||
sortCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
|
||||
@@ -573,7 +551,6 @@ void EmitterWindow::SetEntity(Entity entity)
|
||||
emitterNameField->SetEnabled(true);
|
||||
restartButton->SetEnabled(true);
|
||||
shaderTypeComboBox->SetEnabled(true);
|
||||
shadingRateComboBox->SetEnabled(true);
|
||||
meshComboBox->SetEnabled(true);
|
||||
debugCheckBox->SetEnabled(true);
|
||||
volumeCheckBox->SetEnabled(true);
|
||||
@@ -600,7 +577,6 @@ void EmitterWindow::SetEntity(Entity entity)
|
||||
sph_e_Slider->SetEnabled(true);
|
||||
|
||||
shaderTypeComboBox->SetSelected((int)emitter->shaderType);
|
||||
shadingRateComboBox->SetSelected((int)emitter->shadingRate);
|
||||
|
||||
sortCheckBox->SetCheck(emitter->IsSorted());
|
||||
depthCollisionsCheckBox->SetCheck(emitter->IsDepthCollisionEnabled());
|
||||
@@ -642,7 +618,6 @@ void EmitterWindow::SetEntity(Entity entity)
|
||||
emitterNameField->SetEnabled(false);
|
||||
restartButton->SetEnabled(false);
|
||||
shaderTypeComboBox->SetEnabled(false);
|
||||
shadingRateComboBox->SetEnabled(false);
|
||||
meshComboBox->SetEnabled(false);
|
||||
debugCheckBox->SetEnabled(false);
|
||||
volumeCheckBox->SetEnabled(false);
|
||||
|
||||
@@ -59,7 +59,6 @@ public:
|
||||
wiSlider* sph_K_Slider;
|
||||
wiSlider* sph_p0_Slider;
|
||||
wiSlider* sph_e_Slider;
|
||||
wiComboBox* shadingRateComboBox;
|
||||
|
||||
wiTextInputField* frameRateInput;
|
||||
wiTextInputField* framesXInput;
|
||||
|
||||
@@ -216,27 +216,6 @@ HairParticleWindow::HairParticleWindow(EditorComponent* editor) : GUI(&editor->G
|
||||
|
||||
|
||||
|
||||
shadingRateComboBox = new wiComboBox("Shading Rate: ");
|
||||
shadingRateComboBox->SetTooltip("Select shading rate for this material. \nSelecting larger shading rate will decrease rendering quality of this material, \nbut increases performance.\nDX12 only and requires Tier1 hardware support for variable shading rate");
|
||||
shadingRateComboBox->SetPos(XMFLOAT2(x, y += step));
|
||||
shadingRateComboBox->SetSize(XMFLOAT2(100, 20));
|
||||
shadingRateComboBox->OnSelect([&](wiEventArgs args) {
|
||||
auto hair = GetHair();
|
||||
if (hair != nullptr)
|
||||
{
|
||||
hair->shadingRate = (wiGraphics::SHADING_RATE)args.iValue;
|
||||
}
|
||||
});
|
||||
shadingRateComboBox->AddItem("1X1");
|
||||
shadingRateComboBox->AddItem("1X2");
|
||||
shadingRateComboBox->AddItem("2X1");
|
||||
shadingRateComboBox->AddItem("2X2");
|
||||
shadingRateComboBox->AddItem("2X4");
|
||||
shadingRateComboBox->AddItem("4X2");
|
||||
shadingRateComboBox->AddItem("4X4");
|
||||
shadingRateComboBox->SetEnabled(false);
|
||||
hairWindow->AddWidget(shadingRateComboBox);
|
||||
|
||||
|
||||
hairWindow->Translate(XMFLOAT3(200, 50, 0));
|
||||
hairWindow->SetVisible(false);
|
||||
@@ -270,7 +249,6 @@ void HairParticleWindow::SetEntity(Entity entity)
|
||||
framesYInput->SetValue((int)hair->framesY);
|
||||
frameCountInput->SetValue((int)hair->frameCount);
|
||||
frameStartInput->SetValue((int)hair->frameStart);
|
||||
shadingRateComboBox->SetSelected((int)hair->shadingRate);
|
||||
|
||||
hairWindow->SetEnabled(true);
|
||||
}
|
||||
|
||||
@@ -44,7 +44,6 @@ public:
|
||||
wiTextInputField* framesYInput;
|
||||
wiTextInputField* frameCountInput;
|
||||
wiTextInputField* frameStartInput;
|
||||
wiComboBox* shadingRateComboBox;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -360,6 +360,7 @@ MaterialWindow::MaterialWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
|
||||
shadingRateComboBox->AddItem("4X2");
|
||||
shadingRateComboBox->AddItem("4X4");
|
||||
shadingRateComboBox->SetEnabled(false);
|
||||
shadingRateComboBox->SetMaxVisibleItemCount(4);
|
||||
materialWindow->AddWidget(shadingRateComboBox);
|
||||
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@ RendererWindow::RendererWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
|
||||
wiRenderer::SetToDrawDebugCameras(true);
|
||||
|
||||
rendererWindow = new wiWindow(GUI, "Renderer Window");
|
||||
rendererWindow->SetSize(XMFLOAT2(640, 710));
|
||||
rendererWindow->SetSize(XMFLOAT2(580, 600));
|
||||
GUI->AddWidget(rendererWindow);
|
||||
|
||||
float x = 220, y = 5, step = 28, itemheight = 26;
|
||||
float x = 220, y = 5, step = 22, itemheight = 20;
|
||||
|
||||
vsyncCheckBox = new wiCheckBox("VSync: ");
|
||||
vsyncCheckBox->SetTooltip("Toggle vertical sync");
|
||||
@@ -150,6 +150,28 @@ RendererWindow::RendererWindow(EditorComponent* editor) : GUI(&editor->GetGUI())
|
||||
wireFrameCheckBox->SetCheck(wiRenderer::IsWireRender());
|
||||
rendererWindow->AddWidget(wireFrameCheckBox);
|
||||
|
||||
variableRateShadingClassificationCheckBox = new wiCheckBox("VRS Classification: ");
|
||||
variableRateShadingClassificationCheckBox->SetTooltip("Enable classification of variable rate shading on the screen. Less important parts will be shaded with lesser resolution.\nDX12 only and requires Tier1 hardware support for variable shading rate");
|
||||
variableRateShadingClassificationCheckBox->SetPos(XMFLOAT2(x, y += step));
|
||||
variableRateShadingClassificationCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
|
||||
variableRateShadingClassificationCheckBox->OnClick([](wiEventArgs args) {
|
||||
wiRenderer::SetVariableRateShadingClassification(args.bValue);
|
||||
});
|
||||
variableRateShadingClassificationCheckBox->SetCheck(wiRenderer::GetVariableRateShadingClassification());
|
||||
rendererWindow->AddWidget(variableRateShadingClassificationCheckBox);
|
||||
variableRateShadingClassificationCheckBox->SetEnabled(wiRenderer::GetDevice()->CheckCapability(wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2));
|
||||
|
||||
variableRateShadingClassificationDebugCheckBox = new wiCheckBox("DEBUG: ");
|
||||
variableRateShadingClassificationDebugCheckBox->SetTooltip("Toggle visualization of variable rate shading classification feature");
|
||||
variableRateShadingClassificationDebugCheckBox->SetPos(XMFLOAT2(x + 122, y));
|
||||
variableRateShadingClassificationDebugCheckBox->SetSize(XMFLOAT2(itemheight, itemheight));
|
||||
variableRateShadingClassificationDebugCheckBox->OnClick([](wiEventArgs args) {
|
||||
wiRenderer::SetVariableRateShadingClassificationDebug(args.bValue);
|
||||
});
|
||||
variableRateShadingClassificationDebugCheckBox->SetCheck(wiRenderer::GetVariableRateShadingClassificationDebug());
|
||||
rendererWindow->AddWidget(variableRateShadingClassificationDebugCheckBox);
|
||||
variableRateShadingClassificationDebugCheckBox->SetEnabled(wiRenderer::GetDevice()->CheckCapability(wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2));
|
||||
|
||||
advancedLightCullingCheckBox = new wiCheckBox("2.5D Light Culling: ");
|
||||
advancedLightCullingCheckBox->SetTooltip("Enable a more aggressive light culling approach which can result in slower culling but faster rendering (Tiled renderer only)");
|
||||
advancedLightCullingCheckBox->SetPos(XMFLOAT2(x, y += step));
|
||||
|
||||
@@ -51,6 +51,8 @@ public:
|
||||
wiCheckBox* debugForceFieldsCheckBox;
|
||||
wiCheckBox* debugRaytraceBVHCheckBox;
|
||||
wiCheckBox* wireFrameCheckBox;
|
||||
wiCheckBox* variableRateShadingClassificationCheckBox;
|
||||
wiCheckBox* variableRateShadingClassificationDebugCheckBox;
|
||||
wiCheckBox* advancedLightCullingCheckBox;
|
||||
wiCheckBox* debugLightCullingCheckBox;
|
||||
wiCheckBox* tessellationCheckBox;
|
||||
|
||||
@@ -486,6 +486,9 @@
|
||||
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\rtaoLIB.hlsl">
|
||||
<FileType>Document</FileType>
|
||||
</FxCompile>
|
||||
<FxCompile Update="C:\PROJECTS\WickedEngine\WickedEngine\shadingRateClassificationCS.hlsl">
|
||||
<FileType>Document</FileType>
|
||||
</FxCompile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
This file contains changelog of wiArchive versions
|
||||
|
||||
49: Particles are just using material's shading rate, so removed shading rate from particles
|
||||
48: Serialized shading rate for material and particles
|
||||
47: Serialized animation speed
|
||||
46: Decoupled animation data from targets
|
||||
|
||||
@@ -201,6 +201,19 @@ void RenderPath3D::ResizeBuffers()
|
||||
device->SetName(&rtGUIBlurredBackground[2], "rtGUIBlurredBackground[2]");
|
||||
}
|
||||
|
||||
if(device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
|
||||
{
|
||||
uint32_t tileSize = device->GetVariableRateShadingTileSize();
|
||||
|
||||
TextureDesc desc;
|
||||
desc.BindFlags = BIND_UNORDERED_ACCESS;
|
||||
desc.Format = FORMAT_R8_UINT;
|
||||
desc.Width = (wiRenderer::GetInternalResolution().x + tileSize - 1) / tileSize;
|
||||
desc.Height = (wiRenderer::GetInternalResolution().y + tileSize - 1) / tileSize;
|
||||
device->CreateTexture(&desc, nullptr, &rtShadingRate);
|
||||
device->SetName(&rtShadingRate, "rtShadingRate");
|
||||
}
|
||||
|
||||
// Depth buffers:
|
||||
{
|
||||
TextureDesc desc;
|
||||
@@ -408,7 +421,7 @@ void RenderPath3D::Compose(CommandList cmd) const
|
||||
wiImage::Draw(GetLastPostprocessRT(), fx, cmd);
|
||||
device->EventEnd(cmd);
|
||||
|
||||
if (wiRenderer::GetDebugLightCulling())
|
||||
if (wiRenderer::GetDebugLightCulling() || wiRenderer::GetVariableRateShadingClassificationDebug())
|
||||
{
|
||||
wiImage::Draw((Texture*)wiRenderer::GetTexture(TEXTYPE_2D_DEBUGUAV), wiImageParams((float)wiRenderer::GetDevice()->GetScreenWidth(), (float)wiRenderer::GetDevice()->GetScreenHeight()), cmd);
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ protected:
|
||||
wiGraphics::Texture rtSun[2]; // 0: sun render target used for lightshafts (can be MSAA), 1: radial blurred lightshafts
|
||||
wiGraphics::Texture rtSun_resolved; // sun render target, but the resolved version if MSAA is enabled
|
||||
wiGraphics::Texture rtGUIBlurredBackground[3]; // downsampled, gaussian blurred scene for GUI
|
||||
wiGraphics::Texture rtShadingRate; // UINT8 shading rate per tile
|
||||
|
||||
wiGraphics::Texture rtPostprocess_HDR; // ping-pong with main scene RT in HDR post-process chain
|
||||
wiGraphics::Texture rtPostprocess_LDR[2]; // ping-pong with itself in LDR post-process chain
|
||||
|
||||
@@ -212,6 +212,13 @@ void RenderPath3D_Forward::Render() const
|
||||
GraphicsDevice* device = wiRenderer::GetDevice();
|
||||
wiRenderer::UpdateCameraCB(wiRenderer::GetCamera(), cmd);
|
||||
|
||||
if (wiRenderer::GetVariableRateShadingClassification() && device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
|
||||
{
|
||||
wiRenderer::ComputeShadingRateClassification(*GetSceneRT_Read(1), rtLinearDepth, rtShadingRate, cmd);
|
||||
device->BindShadingRate(SHADING_RATE_1X1, cmd);
|
||||
device->BindShadingRateImage(&rtShadingRate, cmd);
|
||||
}
|
||||
|
||||
// Opaque Scene:
|
||||
{
|
||||
auto range = wiProfiler::BeginRangeGPU("Opaque Scene", cmd);
|
||||
@@ -235,6 +242,8 @@ void RenderPath3D_Forward::Render() const
|
||||
|
||||
wiProfiler::EndRange(range); // Opaque Scene
|
||||
}
|
||||
|
||||
device->BindShadingRateImage(nullptr, cmd);
|
||||
});
|
||||
|
||||
cmd = device->BeginCommandList();
|
||||
|
||||
@@ -110,6 +110,13 @@ void RenderPath3D_TiledForward::Render() const
|
||||
cmd
|
||||
);
|
||||
|
||||
if (wiRenderer::GetVariableRateShadingClassification() && device->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2))
|
||||
{
|
||||
wiRenderer::ComputeShadingRateClassification(*GetSceneRT_Read(1), rtLinearDepth, rtShadingRate, cmd);
|
||||
device->BindShadingRate(SHADING_RATE_1X1, cmd);
|
||||
device->BindShadingRateImage(&rtShadingRate, cmd);
|
||||
}
|
||||
|
||||
device->UnbindResources(TEXSLOT_ONDEMAND0, 1, cmd);
|
||||
|
||||
// Opaque scene:
|
||||
@@ -135,6 +142,8 @@ void RenderPath3D_TiledForward::Render() const
|
||||
|
||||
wiProfiler::EndRange(range); // Opaque Scene
|
||||
}
|
||||
|
||||
device->BindShadingRateImage(nullptr, cmd);
|
||||
});
|
||||
|
||||
cmd = device->BeginCommandList();
|
||||
|
||||
@@ -54,6 +54,19 @@ CBUFFER(MSAO_UPSAMPLECB, CBSLOT_RENDERER_POSTPROCESS)
|
||||
float kUpsampleTolerance;
|
||||
};
|
||||
|
||||
CBUFFER(ShadingRateClassificationCB, CBSLOT_RENDERER_POSTPROCESS)
|
||||
{
|
||||
uint xShadingRateTileSize;
|
||||
uint SHADING_RATE_1X1;
|
||||
uint SHADING_RATE_1X2;
|
||||
uint SHADING_RATE_2X1;
|
||||
|
||||
uint SHADING_RATE_2X2;
|
||||
uint SHADING_RATE_2X4;
|
||||
uint SHADING_RATE_4X2;
|
||||
uint SHADING_RATE_4X4;
|
||||
};
|
||||
|
||||
static const uint MOTIONBLUR_TILESIZE = 32;
|
||||
#define motionblur_strength xPPParams0.x
|
||||
|
||||
|
||||
@@ -616,6 +616,29 @@
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Pixel</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Pixel</ShaderType>
|
||||
</FxCompile>
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS.hlsl">
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
|
||||
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Compute</ShaderType>
|
||||
<FileType>Document</FileType>
|
||||
</FxCompile>
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS_DEBUG.hlsl">
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
|
||||
<ShaderModel Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">5.0</ShaderModel>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Compute</ShaderType>
|
||||
</FxCompile>
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)volumetricCloud_curlnoiseCS.hlsl">
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compute</ShaderType>
|
||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compute</ShaderType>
|
||||
|
||||
@@ -1007,5 +1007,11 @@
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)volumetricCloud_weathermapCS.hlsl">
|
||||
<Filter>CS</Filter>
|
||||
</FxCompile>
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS.hlsl">
|
||||
<Filter>CS</Filter>
|
||||
</FxCompile>
|
||||
<FxCompile Include="$(MSBuildThisFileDirectory)shadingRateClassificationCS_DEBUG.hlsl">
|
||||
<Filter>CS</Filter>
|
||||
</FxCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -43,7 +43,7 @@ for item in root.iter():
|
||||
if profile == "LIB":
|
||||
cmd += "lib"
|
||||
|
||||
raytracing_inline = 1
|
||||
raytracing_inline = 0
|
||||
if raytracing_inline == 1:
|
||||
cmd += "_6_5 "
|
||||
cmd += "-D RAYTRACING_INLINE "
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
#include "globals.hlsli"
|
||||
#include "ShaderInterop_Postprocess.h"
|
||||
|
||||
RWTEXTURE2D(output, uint, 0);
|
||||
|
||||
#ifdef DEBUG_SHADINGRATECLASSIFICATION
|
||||
RWTEXTURE2D(output_debug, float4, 1);
|
||||
#endif // DEBUG_SHADINGRATECLASSIFICATION
|
||||
|
||||
// TODO optimize this shader by removing loops
|
||||
[numthreads(POSTPROCESS_BLOCKSIZE, POSTPROCESS_BLOCKSIZE, 1)]
|
||||
void main( uint3 DTid : SV_DispatchThreadID )
|
||||
{
|
||||
const uint2 tile = DTid.xy;
|
||||
const uint2 pixel_upperleft = tile * xShadingRateTileSize;
|
||||
|
||||
uint2 dim;
|
||||
texture_gbuffer1.GetDimensions(dim.x, dim.y);
|
||||
|
||||
float magnitude = 1000000;
|
||||
uint i, j;
|
||||
[loop]
|
||||
for (i = 0; i < xShadingRateTileSize; ++i)
|
||||
{
|
||||
[loop]
|
||||
for (j = 0; j < xShadingRateTileSize; ++j)
|
||||
{
|
||||
const uint2 pixel = min(pixel_upperleft + uint2(i, j), dim - 1);
|
||||
const float2 velocity = abs(texture_gbuffer1[pixel].zw);
|
||||
magnitude = min(magnitude, max(velocity.x, velocity.y));
|
||||
}
|
||||
}
|
||||
|
||||
uint rate = 0;
|
||||
if (magnitude > 0.1f)
|
||||
{
|
||||
rate = SHADING_RATE_4X4; // least detailed
|
||||
}
|
||||
else if (magnitude > 0.01f)
|
||||
{
|
||||
rate = SHADING_RATE_2X4;
|
||||
}
|
||||
else if (magnitude > 0.005f)
|
||||
{
|
||||
rate = SHADING_RATE_2X2;
|
||||
}
|
||||
else if (magnitude > 0.001f)
|
||||
{
|
||||
rate = SHADING_RATE_1X2;
|
||||
}
|
||||
else
|
||||
{
|
||||
rate = SHADING_RATE_1X1; // most detailed
|
||||
}
|
||||
|
||||
output[tile] = rate;
|
||||
|
||||
#ifdef DEBUG_SHADINGRATECLASSIFICATION
|
||||
[loop]
|
||||
for (i = 0; i < xShadingRateTileSize; ++i)
|
||||
{
|
||||
[loop]
|
||||
for (j = 0; j < xShadingRateTileSize; ++j)
|
||||
{
|
||||
float4 debugcolor = float4(0, 0, 0, 0);
|
||||
float debugalpha = 0.6f;
|
||||
|
||||
if(rate == SHADING_RATE_4X4)
|
||||
debugcolor = float4(1, 0, 0, debugalpha);
|
||||
else if(rate == SHADING_RATE_2X4 || rate == SHADING_RATE_4X2)
|
||||
debugcolor = float4(1, 1, 0, debugalpha);
|
||||
else if (rate == SHADING_RATE_2X2)
|
||||
debugcolor = float4(0, 1, 0, debugalpha);
|
||||
else if (rate == SHADING_RATE_1X2 || rate == SHADING_RATE_2X1)
|
||||
debugcolor = float4(0, 0, 1, debugalpha);
|
||||
|
||||
if (i == 0 || i == xShadingRateTileSize - 1 || j == 0 || j == xShadingRateTileSize - 1)
|
||||
debugcolor = float4(0, 0, 0, debugalpha);
|
||||
|
||||
const uint2 pixel = pixel_upperleft + uint2(i, j);
|
||||
output_debug[pixel] = debugcolor;
|
||||
}
|
||||
}
|
||||
#endif // DEBUG_SHADINGRATECLASSIFICATION
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
#define DEBUG_SHADINGRATECLASSIFICATION
|
||||
#include "shadingRateClassificationCS.hlsl"
|
||||
@@ -7,7 +7,7 @@
|
||||
using namespace std;
|
||||
|
||||
// this should always be only INCREMENTED and only if a new serialization is implemeted somewhere!
|
||||
uint64_t __archiveVersion = 48;
|
||||
uint64_t __archiveVersion = 49;
|
||||
// this is the version number of which below the archive is not compatible with the current version
|
||||
uint64_t __archiveVersionBarrier = 22;
|
||||
|
||||
|
||||
@@ -526,8 +526,6 @@ void wiEmittedParticle::Draw(const CameraComponent& camera, const MaterialCompon
|
||||
GraphicsDevice* device = wiRenderer::GetDevice();
|
||||
device->EventBegin("EmittedParticle", cmd);
|
||||
|
||||
device->BindShadingRate(shadingRate, cmd);
|
||||
|
||||
if (wiRenderer::IsWireRender())
|
||||
{
|
||||
device->BindPipelineState(&PSO_wire, cmd);
|
||||
@@ -537,6 +535,7 @@ void wiEmittedParticle::Draw(const CameraComponent& camera, const MaterialCompon
|
||||
const BLENDMODE blendMode = material.GetBlendMode();
|
||||
device->BindPipelineState(&PSO[blendMode][shaderType], cmd);
|
||||
device->BindResource(PS, material.GetBaseColorMap(), TEXSLOT_ONDEMAND0, cmd);
|
||||
device->BindShadingRate(material.shadingRate, cmd);
|
||||
}
|
||||
|
||||
device->BindConstantBuffer(VS, &constantBuffer, CB_GETBINDSLOT(EmittedParticleCB), cmd);
|
||||
@@ -730,7 +729,8 @@ void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
|
||||
|
||||
if (archive.GetVersion() >= 48)
|
||||
{
|
||||
archive >> (uint8_t&)shadingRate;
|
||||
uint8_t shadingRate;
|
||||
archive >> shadingRate; // no longer needed
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -764,11 +764,6 @@ void wiEmittedParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
|
||||
archive << frameStart;
|
||||
archive << frameRate;
|
||||
}
|
||||
|
||||
if (archive.GetVersion() >= 48)
|
||||
{
|
||||
archive << (uint8_t)shadingRate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +76,6 @@ public:
|
||||
uint32_t _flags = EMPTY;
|
||||
|
||||
PARTICLESHADERTYPE shaderType = SOFT;
|
||||
wiGraphics::SHADING_RATE shadingRate = wiGraphics::SHADING_RATE_1X1;
|
||||
|
||||
wiECS::Entity meshID = wiECS::INVALID_ENTITY;
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ enum CBTYPES
|
||||
CBTYPE_POSTPROCESS_MSAO_UPSAMPLE,
|
||||
CBTYPE_LENSFLARE,
|
||||
CBTYPE_PAINTRADIUS,
|
||||
CBTYPE_SHADINGRATECLASSIFICATION,
|
||||
CBTYPE_COUNT
|
||||
};
|
||||
|
||||
@@ -269,6 +270,8 @@ enum CSTYPES
|
||||
{
|
||||
CSTYPE_LUMINANCE_PASS1,
|
||||
CSTYPE_LUMINANCE_PASS2,
|
||||
CSTYPE_SHADINGRATECLASSIFICATION,
|
||||
CSTYPE_SHADINGRATECLASSIFICATION_DEBUG,
|
||||
CSTYPE_TILEFRUSTUMS,
|
||||
CSTYPE_RESOLVEMSAADEPTHSTENCIL,
|
||||
CSTYPE_VOXELSCENECOPYCLEAR,
|
||||
|
||||
@@ -281,6 +281,7 @@ namespace wiGraphics
|
||||
IMAGE_LAYOUT_UNORDERED_ACCESS, // shader resource, write enabled
|
||||
IMAGE_LAYOUT_COPY_SRC, // copy from
|
||||
IMAGE_LAYOUT_COPY_DST, // copy to
|
||||
IMAGE_LAYOUT_SHADING_RATE_SOURCE, // shading rate control per tile
|
||||
};
|
||||
enum BUFFER_STATE
|
||||
{
|
||||
|
||||
@@ -35,6 +35,8 @@ bool GraphicsDevice::CheckCapability(GRAPHICSDEVICE_CAPABILITY capability) const
|
||||
return DESCRIPTOR_MANAGEMENT;
|
||||
case wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING:
|
||||
return VARIABLE_RATE_SHADING;
|
||||
case wiGraphics::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2:
|
||||
return VARIABLE_RATE_SHADING_TIER2;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -30,8 +30,10 @@ namespace wiGraphics
|
||||
bool RAYTRACING_INLINE = false;
|
||||
bool DESCRIPTOR_MANAGEMENT = false;
|
||||
bool VARIABLE_RATE_SHADING = false;
|
||||
bool VARIABLE_RATE_SHADING_TIER2 = false;
|
||||
size_t SHADER_IDENTIFIER_SIZE = 0;
|
||||
size_t TOPLEVEL_ACCELERATION_STRUCTURE_INSTANCE_SIZE = 0;
|
||||
uint32_t VARIABLE_RATE_SHADING_TILE_SIZE = 0;
|
||||
|
||||
public:
|
||||
virtual bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) = 0;
|
||||
@@ -52,6 +54,7 @@ namespace wiGraphics
|
||||
|
||||
virtual int CreateSubresource(Texture* texture, SUBRESOURCE_TYPE type, uint32_t firstSlice, uint32_t sliceCount, uint32_t firstMip, uint32_t mipCount) = 0;
|
||||
|
||||
virtual void WriteShadingRateValue(SHADING_RATE rate, void* dest) {};
|
||||
virtual void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) {}
|
||||
virtual void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) {}
|
||||
virtual void WriteDescriptor(const DescriptorTable* table, uint32_t rangeIndex, uint32_t arrayIndex, const GPUResource* resource, int subresource = -1, uint64_t offset = 0) {}
|
||||
@@ -103,6 +106,7 @@ namespace wiGraphics
|
||||
GRAPHICSDEVICE_CAPABILITY_RAYTRACING_INLINE,
|
||||
GRAPHICSDEVICE_CAPABILITY_DESCRIPTOR_MANAGEMENT,
|
||||
GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING,
|
||||
GRAPHICSDEVICE_CAPABILITY_VARIABLE_RATE_SHADING_TIER2,
|
||||
GRAPHICSDEVICE_CAPABILITY_COUNT,
|
||||
};
|
||||
bool CheckCapability(GRAPHICSDEVICE_CAPABILITY capability) const;
|
||||
@@ -123,7 +127,7 @@ namespace wiGraphics
|
||||
|
||||
inline size_t GetShaderIdentifierSize() const { return SHADER_IDENTIFIER_SIZE; }
|
||||
inline size_t GetTopLevelAccelerationStructureInstanceSize() const { return TOPLEVEL_ACCELERATION_STRUCTURE_INSTANCE_SIZE; }
|
||||
|
||||
inline uint32_t GetVariableRateShadingTileSize() const { return VARIABLE_RATE_SHADING_TILE_SIZE; }
|
||||
|
||||
///////////////Thread-sensitive////////////////////////
|
||||
|
||||
@@ -144,6 +148,7 @@ namespace wiGraphics
|
||||
virtual void BindStencilRef(uint32_t value, CommandList cmd) = 0;
|
||||
virtual void BindBlendFactor(float r, float g, float b, float a, CommandList cmd) = 0;
|
||||
virtual void BindShadingRate(SHADING_RATE rate, CommandList cmd) {}
|
||||
virtual void BindShadingRateImage(const Texture* texture, CommandList cmd) {}
|
||||
virtual void BindPipelineState(const PipelineState* pso, CommandList cmd) = 0;
|
||||
virtual void BindComputeShader(const Shader* cs, CommandList cmd) = 0;
|
||||
virtual void Draw(uint32_t vertexCount, uint32_t startVertexLocation, CommandList cmd) = 0;
|
||||
|
||||
@@ -651,6 +651,8 @@ namespace DX12_Internal
|
||||
return D3D12_RESOURCE_STATE_COPY_SOURCE;
|
||||
case wiGraphics::IMAGE_LAYOUT_COPY_DST:
|
||||
return D3D12_RESOURCE_STATE_COPY_DEST;
|
||||
case wiGraphics::IMAGE_LAYOUT_SHADING_RATE_SOURCE:
|
||||
return D3D12_RESOURCE_STATE_SHADING_RATE_SOURCE;
|
||||
}
|
||||
|
||||
return D3D12_RESOURCE_STATE_COMMON;
|
||||
@@ -702,7 +704,7 @@ namespace DX12_Internal
|
||||
}
|
||||
return D3D12_SHADER_VISIBILITY_ALL;
|
||||
}
|
||||
constexpr D3D12_SHADING_RATE _ConvertShadingRate(SHADING_RATE value, const D3D12_FEATURE_DATA_D3D12_OPTIONS6& features_6)
|
||||
constexpr D3D12_SHADING_RATE _ConvertShadingRate(SHADING_RATE value)
|
||||
{
|
||||
switch (value)
|
||||
{
|
||||
@@ -715,11 +717,11 @@ namespace DX12_Internal
|
||||
case wiGraphics::SHADING_RATE_2X2:
|
||||
return D3D12_SHADING_RATE_2X2;
|
||||
case wiGraphics::SHADING_RATE_2X4:
|
||||
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_2X4 : D3D12_SHADING_RATE_2X2;
|
||||
return D3D12_SHADING_RATE_2X4;
|
||||
case wiGraphics::SHADING_RATE_4X2:
|
||||
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_4X2 : D3D12_SHADING_RATE_2X2;
|
||||
return D3D12_SHADING_RATE_4X2;
|
||||
case wiGraphics::SHADING_RATE_4X4:
|
||||
return features_6.AdditionalShadingRatesSupported ? D3D12_SHADING_RATE_4X4 : D3D12_SHADING_RATE_2X2;
|
||||
return D3D12_SHADING_RATE_4X4;
|
||||
default:
|
||||
return D3D12_SHADING_RATE_1X1;
|
||||
}
|
||||
@@ -2165,7 +2167,8 @@ using namespace DX12_Internal;
|
||||
|
||||
hr = device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS6, &features_6, sizeof(features_6));
|
||||
VARIABLE_RATE_SHADING = features_6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_1;
|
||||
|
||||
VARIABLE_RATE_SHADING_TIER2 = features_6.VariableShadingRateTier >= D3D12_VARIABLE_SHADING_RATE_TIER_2;
|
||||
VARIABLE_RATE_SHADING_TILE_SIZE = features_6.ShadingRateImageTileSize;
|
||||
|
||||
// Create common indirect command signatures:
|
||||
|
||||
@@ -4154,6 +4157,15 @@ using namespace DX12_Internal;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void GraphicsDevice_DX12::WriteShadingRateValue(SHADING_RATE rate, void* dest)
|
||||
{
|
||||
D3D12_SHADING_RATE _rate = _ConvertShadingRate(rate);
|
||||
if (!features_6.AdditionalShadingRatesSupported)
|
||||
{
|
||||
_rate = std::min(_rate, D3D12_SHADING_RATE_2X2);
|
||||
}
|
||||
*(uint8_t*)dest = _rate;
|
||||
}
|
||||
void GraphicsDevice_DX12::WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest)
|
||||
{
|
||||
D3D12_RAYTRACING_INSTANCE_DESC* desc = (D3D12_RAYTRACING_INSTANCE_DESC*)dest;
|
||||
@@ -4578,9 +4590,19 @@ using namespace DX12_Internal;
|
||||
active_rootsig_graphics[cmd] = nullptr;
|
||||
active_rootsig_compute[cmd] = nullptr;
|
||||
active_renderpass[cmd] = nullptr;
|
||||
prev_shadingrate[cmd] = SHADING_RATE_1X1;
|
||||
prev_shadingrate[cmd] = D3D12_SHADING_RATE_1X1;
|
||||
dirty_pso[cmd] = false;
|
||||
|
||||
if (VARIABLE_RATE_SHADING)
|
||||
{
|
||||
D3D12_SHADING_RATE_COMBINER combiners[] =
|
||||
{
|
||||
D3D12_SHADING_RATE_COMBINER_MAX,
|
||||
D3D12_SHADING_RATE_COMBINER_MAX,
|
||||
};
|
||||
GetDirectCommandList(cmd)->RSSetShadingRate(D3D12_SHADING_RATE_1X1, combiners);
|
||||
}
|
||||
|
||||
return cmd;
|
||||
}
|
||||
void GraphicsDevice_DX12::SubmitCommandLists()
|
||||
@@ -5033,10 +5055,29 @@ using namespace DX12_Internal;
|
||||
}
|
||||
void GraphicsDevice_DX12::BindShadingRate(SHADING_RATE rate, CommandList cmd)
|
||||
{
|
||||
if (prev_shadingrate[cmd] != rate)
|
||||
D3D12_SHADING_RATE _rate = D3D12_SHADING_RATE_1X1;
|
||||
WriteShadingRateValue(rate, &_rate);
|
||||
|
||||
if (VARIABLE_RATE_SHADING && prev_shadingrate[cmd] != _rate)
|
||||
{
|
||||
prev_shadingrate[cmd] = rate;
|
||||
GetDirectCommandList(cmd)->RSSetShadingRate(_ConvertShadingRate(rate, features_6), nullptr);
|
||||
prev_shadingrate[cmd] = _rate;
|
||||
// Combiners are set to MAX by default in BeginCommandList
|
||||
GetDirectCommandList(cmd)->RSSetShadingRate(_rate, nullptr);
|
||||
}
|
||||
}
|
||||
void GraphicsDevice_DX12::BindShadingRateImage(const Texture* texture, CommandList cmd)
|
||||
{
|
||||
if (VARIABLE_RATE_SHADING_TIER2)
|
||||
{
|
||||
if (texture == nullptr)
|
||||
{
|
||||
GetDirectCommandList(cmd)->RSSetShadingRateImage(nullptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(texture->desc.Format == FORMAT_R8_UINT);
|
||||
GetDirectCommandList(cmd)->RSSetShadingRateImage(to_internal(texture)->resource.Get());
|
||||
}
|
||||
}
|
||||
}
|
||||
void GraphicsDevice_DX12::BindPipelineState(const PipelineState* pso, CommandList cmd)
|
||||
|
||||
@@ -152,7 +152,7 @@ namespace wiGraphics
|
||||
const RootSignature* active_rootsig_compute[COMMANDLIST_COUNT] = {};
|
||||
const RenderPass* active_renderpass[COMMANDLIST_COUNT] = {};
|
||||
D3D12_RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS resolve_subresources[COMMANDLIST_COUNT][D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT] = {};
|
||||
SHADING_RATE prev_shadingrate[COMMANDLIST_COUNT] = {};
|
||||
D3D12_SHADING_RATE prev_shadingrate[COMMANDLIST_COUNT] = {};
|
||||
|
||||
bool dirty_pso[COMMANDLIST_COUNT] = {};
|
||||
void pso_validate(CommandList cmd);
|
||||
@@ -192,6 +192,7 @@ namespace wiGraphics
|
||||
|
||||
int CreateSubresource(Texture* texture, SUBRESOURCE_TYPE type, uint32_t firstSlice, uint32_t sliceCount, uint32_t firstMip, uint32_t mipCount) override;
|
||||
|
||||
void WriteShadingRateValue(SHADING_RATE rate, void* dest) override;
|
||||
void WriteTopLevelAccelerationStructureInstance(const RaytracingAccelerationStructureDesc::TopLevel::Instance* instance, void* dest) override;
|
||||
void WriteShaderIdentifier(const RaytracingPipelineState* rtpso, uint32_t group_index, void* dest) override;
|
||||
void WriteDescriptor(const DescriptorTable* table, uint32_t rangeIndex, uint32_t arrayIndex, const GPUResource* resource, int subresource = -1, uint64_t offset = 0) override;
|
||||
@@ -235,6 +236,7 @@ namespace wiGraphics
|
||||
void BindStencilRef(uint32_t value, CommandList cmd) override;
|
||||
void BindBlendFactor(float r, float g, float b, float a, CommandList cmd) override;
|
||||
void BindShadingRate(SHADING_RATE rate, CommandList cmd) override;
|
||||
void BindShadingRateImage(const Texture* texture, CommandList cmd) override;
|
||||
void BindPipelineState(const PipelineState* pso, CommandList cmd) override;
|
||||
void BindComputeShader(const Shader* cs, CommandList cmd) override;
|
||||
void Draw(uint32_t vertexCount, uint32_t startVertexLocation, CommandList cmd) override;
|
||||
|
||||
@@ -212,8 +212,6 @@ void wiHairParticle::Draw(const CameraComponent& camera, const MaterialComponent
|
||||
GraphicsDevice* device = wiRenderer::GetDevice();
|
||||
device->EventBegin("HairParticle - Draw", cmd);
|
||||
|
||||
device->BindShadingRate(shadingRate, cmd);
|
||||
|
||||
device->BindStencilRef(STENCILREF_DEFAULT, cmd);
|
||||
|
||||
if (wiRenderer::IsWireRender())
|
||||
@@ -234,6 +232,7 @@ void wiHairParticle::Draw(const CameraComponent& camera, const MaterialComponent
|
||||
};
|
||||
device->BindResources(PS, res, TEXSLOT_ONDEMAND0, arraysize(res), cmd);
|
||||
device->BindResources(VS, res, TEXSLOT_ONDEMAND0, arraysize(res), cmd);
|
||||
device->BindShadingRate(material.shadingRate, cmd);
|
||||
}
|
||||
|
||||
device->BindConstantBuffer(VS, &cb, CB_GETBINDSLOT(HairParticleCB), cmd);
|
||||
@@ -273,7 +272,8 @@ void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
|
||||
|
||||
if (archive.GetVersion() >= 48)
|
||||
{
|
||||
archive >> (uint8_t&)shadingRate;
|
||||
uint8_t shadingRate;
|
||||
archive >> shadingRate; // no longer needed
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -298,11 +298,6 @@ void wiHairParticle::Serialize(wiArchive& archive, wiECS::Entity seed)
|
||||
archive << frameCount;
|
||||
archive << frameStart;
|
||||
}
|
||||
|
||||
if (archive.GetVersion() >= 48)
|
||||
{
|
||||
archive << (uint8_t)shadingRate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ public:
|
||||
float randomness = 0.2f;
|
||||
float viewDistance = 200;
|
||||
std::vector<float> vertex_lengths;
|
||||
wiGraphics::SHADING_RATE shadingRate = wiGraphics::SHADING_RATE_1X1;
|
||||
|
||||
// Sprite sheet properties:
|
||||
uint32_t framesX = 1;
|
||||
|
||||
@@ -102,6 +102,8 @@ bool voxelHelper = false;
|
||||
bool requestReflectionRendering = false;
|
||||
bool requestVolumetricLightRendering = false;
|
||||
bool advancedLightCulling = true;
|
||||
bool variableRateShadingClassification = false;
|
||||
bool variableRateShadingClassificationDebug = false;
|
||||
bool ldsSkinningEnabled = true;
|
||||
bool scene_bvh_invalid = true;
|
||||
float renderTime = 0;
|
||||
@@ -1335,6 +1337,8 @@ void LoadShaders()
|
||||
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_LUMINANCE_PASS1], "luminancePass1CS.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_LUMINANCE_PASS2], "luminancePass2CS.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_SHADINGRATECLASSIFICATION], "shadingRateClassificationCS.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_SHADINGRATECLASSIFICATION_DEBUG], "shadingRateClassificationCS_DEBUG.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_TILEFRUSTUMS], "tileFrustumsCS.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_RESOLVEMSAADEPTHSTENCIL], "resolveMSAADepthStencilCS.cso"); });
|
||||
wiJobSystem::Execute(ctx, [](wiJobArgs args) { LoadShader(CS, computeShaders[CSTYPE_VOXELSCENECOPYCLEAR], "voxelSceneCopyClearCS.cso"); });
|
||||
@@ -2296,6 +2300,10 @@ void LoadBuffers()
|
||||
device->CreateBuffer(&bd, nullptr, &constantBuffers[CBTYPE_PAINTRADIUS]);
|
||||
device->SetName(&constantBuffers[CBTYPE_PAINTRADIUS], "PaintRadiusCB");
|
||||
|
||||
bd.ByteWidth = sizeof(ShadingRateClassificationCB);
|
||||
device->CreateBuffer(&bd, nullptr, &constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION]);
|
||||
device->SetName(&constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], "ShadingRateClassificationCB");
|
||||
|
||||
|
||||
}
|
||||
void SetUpStates()
|
||||
@@ -9403,6 +9411,68 @@ const Texture* ComputeLuminance(const Texture& sourceImage, CommandList cmd)
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ComputeShadingRateClassification(
|
||||
const Texture& gbuffer1,
|
||||
const Texture& lineardepth,
|
||||
const Texture& output,
|
||||
CommandList cmd
|
||||
)
|
||||
{
|
||||
GraphicsDevice* device = GetDevice();
|
||||
|
||||
device->EventBegin("ComputeShadingRateClassification", cmd);
|
||||
auto range = wiProfiler::BeginRangeGPU("ComputeShadingRateClassification", cmd);
|
||||
|
||||
if (GetVariableRateShadingClassificationDebug())
|
||||
{
|
||||
device->BindUAV(CS, &textures[TEXTYPE_2D_DEBUGUAV], 1, cmd);
|
||||
device->BindComputeShader(&computeShaders[CSTYPE_SHADINGRATECLASSIFICATION_DEBUG], cmd);
|
||||
}
|
||||
else
|
||||
{
|
||||
device->BindComputeShader(&computeShaders[CSTYPE_SHADINGRATECLASSIFICATION], cmd);
|
||||
}
|
||||
|
||||
device->BindResource(CS, &gbuffer1, TEXSLOT_GBUFFER1, cmd);
|
||||
device->BindResource(CS, &lineardepth, TEXSLOT_LINEARDEPTH, cmd);
|
||||
|
||||
const TextureDesc& desc = output.GetDesc();
|
||||
|
||||
ShadingRateClassificationCB cb = {}; // zero init the shading rates!
|
||||
cb.xShadingRateTileSize = device->GetVariableRateShadingTileSize();
|
||||
device->WriteShadingRateValue(SHADING_RATE_1X1, &cb.SHADING_RATE_1X1);
|
||||
device->WriteShadingRateValue(SHADING_RATE_1X2, &cb.SHADING_RATE_1X2);
|
||||
device->WriteShadingRateValue(SHADING_RATE_2X1, &cb.SHADING_RATE_2X1);
|
||||
device->WriteShadingRateValue(SHADING_RATE_2X2, &cb.SHADING_RATE_2X2);
|
||||
device->WriteShadingRateValue(SHADING_RATE_2X4, &cb.SHADING_RATE_2X4);
|
||||
device->WriteShadingRateValue(SHADING_RATE_4X2, &cb.SHADING_RATE_4X2);
|
||||
device->WriteShadingRateValue(SHADING_RATE_4X4, &cb.SHADING_RATE_4X4);
|
||||
device->UpdateBuffer(&constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], &cb, cmd);
|
||||
device->BindConstantBuffer(CS, &constantBuffers[CBTYPE_SHADINGRATECLASSIFICATION], CB_GETBINDSLOT(PostProcessCB), cmd);
|
||||
|
||||
const GPUResource* uavs[] = {
|
||||
&output,
|
||||
};
|
||||
device->BindUAVs(CS, uavs, 0, arraysize(uavs), cmd);
|
||||
|
||||
device->Dispatch(
|
||||
(desc.Width + POSTPROCESS_BLOCKSIZE - 1) / POSTPROCESS_BLOCKSIZE,
|
||||
(desc.Height + POSTPROCESS_BLOCKSIZE - 1) / POSTPROCESS_BLOCKSIZE,
|
||||
1,
|
||||
cmd
|
||||
);
|
||||
|
||||
GPUBarrier barriers[] = {
|
||||
GPUBarrier::Memory(),
|
||||
GPUBarrier::Image(&output,IMAGE_LAYOUT_UNORDERED_ACCESS, IMAGE_LAYOUT_SHADING_RATE_SOURCE),
|
||||
};
|
||||
device->Barrier(barriers, arraysize(barriers), cmd);
|
||||
|
||||
device->UnbindUAVs(0, arraysize(uavs), cmd);
|
||||
|
||||
wiProfiler::EndRange(range);
|
||||
device->EventEnd(cmd);
|
||||
}
|
||||
|
||||
void DeferredComposition(
|
||||
const Texture& gbuffer0,
|
||||
@@ -11593,7 +11663,7 @@ void Postprocess_VolumetricClouds(
|
||||
const Texture& lightshaftoutput,
|
||||
const Texture& lineardepth,
|
||||
const Texture& depthbuffer,
|
||||
wiGraphics::CommandList cmd
|
||||
CommandList cmd
|
||||
)
|
||||
{
|
||||
GraphicsDevice* device = GetDevice();
|
||||
@@ -12455,6 +12525,10 @@ void SetDebugLightCulling(bool enabled) { debugLightCulling = enabled; }
|
||||
bool GetDebugLightCulling() { return debugLightCulling; }
|
||||
void SetAdvancedLightCulling(bool enabled) { advancedLightCulling = enabled; }
|
||||
bool GetAdvancedLightCulling() { return advancedLightCulling; }
|
||||
void SetVariableRateShadingClassification(bool enabled) { variableRateShadingClassification = enabled; }
|
||||
bool GetVariableRateShadingClassification() { return variableRateShadingClassification; }
|
||||
void SetVariableRateShadingClassificationDebug(bool enabled) { variableRateShadingClassificationDebug = enabled; }
|
||||
bool GetVariableRateShadingClassificationDebug() { return variableRateShadingClassificationDebug; }
|
||||
void SetAlphaCompositionEnabled(bool enabled) { ALPHACOMPOSITIONENABLED = enabled; }
|
||||
bool GetAlphaCompositionEnabled() { return ALPHACOMPOSITIONENABLED; }
|
||||
void SetOcclusionCullingEnabled(bool value)
|
||||
|
||||
@@ -174,6 +174,12 @@ namespace wiRenderer
|
||||
// Compute the luminance for the source image and return the texture containing the luminance value in pixel [0,0]
|
||||
const wiGraphics::Texture* ComputeLuminance(const wiGraphics::Texture& sourceImage, wiGraphics::CommandList cmd);
|
||||
|
||||
void ComputeShadingRateClassification(
|
||||
const wiGraphics::Texture& gbuffer1,
|
||||
const wiGraphics::Texture& lineardepth,
|
||||
const wiGraphics::Texture& output,
|
||||
wiGraphics::CommandList cmd
|
||||
);
|
||||
|
||||
void DeferredComposition(
|
||||
const wiGraphics::Texture& gbuffer0,
|
||||
@@ -183,7 +189,8 @@ namespace wiRenderer
|
||||
const wiGraphics::Texture& lightmap_specular,
|
||||
const wiGraphics::Texture& ao,
|
||||
const wiGraphics::Texture& depth,
|
||||
wiGraphics::CommandList cmd);
|
||||
wiGraphics::CommandList cmd
|
||||
);
|
||||
|
||||
|
||||
void Postprocess_Blur_Gaussian(
|
||||
@@ -471,6 +478,10 @@ namespace wiRenderer
|
||||
bool GetDebugLightCulling();
|
||||
void SetAdvancedLightCulling(bool enabled);
|
||||
bool GetAdvancedLightCulling();
|
||||
void SetVariableRateShadingClassification(bool enabled);
|
||||
bool GetVariableRateShadingClassification();
|
||||
void SetVariableRateShadingClassificationDebug(bool enabled);
|
||||
bool GetVariableRateShadingClassificationDebug();
|
||||
void SetAlphaCompositionEnabled(bool enabled);
|
||||
bool GetAlphaCompositionEnabled();
|
||||
void SetOcclusionCullingEnabled(bool enabled);
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace wiVersion
|
||||
// minor features, major updates, breaking API changes
|
||||
const int minor = 47;
|
||||
// minor bug fixes, alterations, refactors, updates
|
||||
const int revision = 27;
|
||||
const int revision = 28;
|
||||
|
||||
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user