mirror of https://bitbucket.org/CPMADevs/cnq3
fixed RT format mismatch with r_rtColorFormat > 0 and r_smaa > 0
only the inverse tone map needed multiple pipelines
This commit is contained in:
parent
4795cf3666
commit
61fbcb5304
|
@ -581,9 +581,9 @@ struct CachedPSO
|
||||||
struct PostProcess
|
struct PostProcess
|
||||||
{
|
{
|
||||||
void Init();
|
void Init();
|
||||||
void Draw();
|
void Draw(const char* renderPassName, HTexture renderTarget);
|
||||||
void ToneMap();
|
void ToneMap();
|
||||||
void InverseToneMap();
|
void InverseToneMap(int colorFormat);
|
||||||
void SetToneMapInput(HTexture toneMapInput);
|
void SetToneMapInput(HTexture toneMapInput);
|
||||||
void SetInverseToneMapInput(HTexture inverseToneMapInput);
|
void SetInverseToneMapInput(HTexture inverseToneMapInput);
|
||||||
|
|
||||||
|
@ -591,7 +591,7 @@ struct PostProcess
|
||||||
HRootSignature toneMapRootSignature;
|
HRootSignature toneMapRootSignature;
|
||||||
HDescriptorTable toneMapDescriptorTable;
|
HDescriptorTable toneMapDescriptorTable;
|
||||||
|
|
||||||
HPipeline inverseToneMapPipeline;
|
HPipeline inverseToneMapPipelines[RTCF_COUNT];
|
||||||
HRootSignature inverseToneMapRootSignature;
|
HRootSignature inverseToneMapRootSignature;
|
||||||
HDescriptorTable inverseToneMapDescriptorTable;
|
HDescriptorTable inverseToneMapDescriptorTable;
|
||||||
};
|
};
|
||||||
|
|
|
@ -326,7 +326,7 @@ void GRP::EndFrame()
|
||||||
DrawGUI();
|
DrawGUI();
|
||||||
R_DrawGUI();
|
R_DrawGUI();
|
||||||
imgui.Draw();
|
imgui.Draw();
|
||||||
post.Draw();
|
post.Draw("Post-process", GetSwapChainTexture());
|
||||||
world.EndFrame();
|
world.EndFrame();
|
||||||
RHI::EndFrame();
|
RHI::EndFrame();
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,15 @@ void PostProcess::Init()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TextureFormat::Id rtFormats[RTCF_COUNT] = {};
|
||||||
|
rtFormats[RTCF_R8G8B8A8] = TextureFormat::RGBA32_UNorm;
|
||||||
|
rtFormats[RTCF_R10G10B10A2] = TextureFormat::R10G10B10A2_UNorm;
|
||||||
|
rtFormats[RTCF_R16G16B16A16] = TextureFormat::RGBA64_UNorm;
|
||||||
|
for(int i = 0; i < RTCF_COUNT; ++i)
|
||||||
|
{
|
||||||
|
Q_assert((int)rtFormats[i] > 0 && (int)rtFormats[i] < TextureFormat::Count);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
RootSignatureDesc desc("tone map");
|
RootSignatureDesc desc("tone map");
|
||||||
desc.usingVertexBuffers = false;
|
desc.usingVertexBuffers = false;
|
||||||
|
@ -113,26 +122,26 @@ void PostProcess::Init()
|
||||||
update.SetSamplers(1, &grp.samplers[GetSamplerIndex(TW_CLAMP_TO_EDGE, TextureFilter::Linear)]);
|
update.SetSamplers(1, &grp.samplers[GetSamplerIndex(TW_CLAMP_TO_EDGE, TextureFilter::Linear)]);
|
||||||
UpdateDescriptorTable(inverseToneMapDescriptorTable, update);
|
UpdateDescriptorTable(inverseToneMapDescriptorTable, update);
|
||||||
}
|
}
|
||||||
|
for(int i = 0; i < RTCF_COUNT; ++i)
|
||||||
{
|
{
|
||||||
GraphicsPipelineDesc desc("inverse tone map", inverseToneMapRootSignature);
|
GraphicsPipelineDesc desc("inverse tone map", inverseToneMapRootSignature);
|
||||||
desc.vertexShader = ShaderByteCode(inverse_tone_map::g_vs);
|
desc.vertexShader = ShaderByteCode(inverse_tone_map::g_vs);
|
||||||
desc.pixelShader = ShaderByteCode(inverse_tone_map::g_ps);
|
desc.pixelShader = ShaderByteCode(inverse_tone_map::g_ps);
|
||||||
desc.depthStencil.DisableDepth();
|
desc.depthStencil.DisableDepth();
|
||||||
desc.rasterizer.cullMode = CT_TWO_SIDED;
|
desc.rasterizer.cullMode = CT_TWO_SIDED;
|
||||||
desc.AddRenderTarget(0, TextureFormat::RGBA32_UNorm);
|
desc.AddRenderTarget(0, rtFormats[i]);
|
||||||
inverseToneMapPipeline = CreateGraphicsPipeline(desc);
|
inverseToneMapPipelines[i] = CreateGraphicsPipeline(desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PostProcess::Draw()
|
void PostProcess::Draw(const char* renderPassName, HTexture renderTarget)
|
||||||
{
|
{
|
||||||
SCOPED_RENDER_PASS("Post-process", 0.125f, 0.125f, 0.5f);
|
SCOPED_RENDER_PASS(renderPassName, 0.125f, 0.125f, 0.5f);
|
||||||
|
|
||||||
const HTexture swapChain = GetSwapChainTexture();
|
|
||||||
const TextureBarrier barriers[2] =
|
const TextureBarrier barriers[2] =
|
||||||
{
|
{
|
||||||
TextureBarrier(grp.renderTarget, ResourceStates::PixelShaderAccessBit),
|
TextureBarrier(grp.renderTarget, ResourceStates::PixelShaderAccessBit),
|
||||||
TextureBarrier(swapChain, ResourceStates::RenderTargetBit)
|
TextureBarrier(renderTarget, ResourceStates::RenderTargetBit)
|
||||||
};
|
};
|
||||||
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
||||||
|
|
||||||
|
@ -170,7 +179,7 @@ void PostProcess::Draw()
|
||||||
|
|
||||||
if(vsX != 1.0f || vsY != 1.0f)
|
if(vsX != 1.0f || vsY != 1.0f)
|
||||||
{
|
{
|
||||||
CmdClearColorTarget(swapChain, colorBlack);
|
CmdClearColorTarget(renderTarget, colorBlack);
|
||||||
|
|
||||||
const int x = (glInfo.winWidth - glInfo.winWidth * vsX) / 2.0f;
|
const int x = (glInfo.winWidth - glInfo.winWidth * vsX) / 2.0f;
|
||||||
const int y = (glInfo.winHeight - glInfo.winHeight * vsY) / 2.0f;
|
const int y = (glInfo.winHeight - glInfo.winHeight * vsY) / 2.0f;
|
||||||
|
@ -191,7 +200,7 @@ void PostProcess::Draw()
|
||||||
pixelRC.brightness = r_brightness->value;
|
pixelRC.brightness = r_brightness->value;
|
||||||
pixelRC.greyscale = r_greyscale->value;
|
pixelRC.greyscale = r_greyscale->value;
|
||||||
|
|
||||||
CmdBindRenderTargets(1, &swapChain, NULL);
|
CmdBindRenderTargets(1, &renderTarget, NULL);
|
||||||
CmdBindPipeline(toneMapPipeline);
|
CmdBindPipeline(toneMapPipeline);
|
||||||
CmdBindRootSignature(toneMapRootSignature);
|
CmdBindRootSignature(toneMapRootSignature);
|
||||||
CmdBindDescriptorTable(toneMapRootSignature, toneMapDescriptorTable);
|
CmdBindDescriptorTable(toneMapRootSignature, toneMapDescriptorTable);
|
||||||
|
@ -219,13 +228,13 @@ void PostProcess::ToneMap()
|
||||||
CmdDraw(3, 0);
|
CmdDraw(3, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PostProcess::InverseToneMap()
|
void PostProcess::InverseToneMap(int colorFormat)
|
||||||
{
|
{
|
||||||
InverseGammaPixelRC pixelRC = {};
|
InverseGammaPixelRC pixelRC = {};
|
||||||
pixelRC.gamma = r_gamma->value;
|
pixelRC.gamma = r_gamma->value;
|
||||||
pixelRC.invBrightness = 1.0f / r_brightness->value;
|
pixelRC.invBrightness = 1.0f / r_brightness->value;
|
||||||
|
|
||||||
CmdBindPipeline(inverseToneMapPipeline);
|
CmdBindPipeline(inverseToneMapPipelines[colorFormat]);
|
||||||
CmdBindRootSignature(inverseToneMapRootSignature);
|
CmdBindRootSignature(inverseToneMapRootSignature);
|
||||||
CmdBindDescriptorTable(inverseToneMapRootSignature, inverseToneMapDescriptorTable);
|
CmdBindDescriptorTable(inverseToneMapRootSignature, inverseToneMapDescriptorTable);
|
||||||
CmdSetRootConstants(inverseToneMapRootSignature, ShaderStage::Pixel, &pixelRC);
|
CmdSetRootConstants(inverseToneMapRootSignature, ShaderStage::Pixel, &pixelRC);
|
||||||
|
|
|
@ -357,7 +357,7 @@ void SMAA::Draw(const viewParms_t& parms)
|
||||||
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
||||||
|
|
||||||
CmdBindRenderTargets(1, &inputTexture, NULL);
|
CmdBindRenderTargets(1, &inputTexture, NULL);
|
||||||
grp.post.ToneMap(); // writes to grp.renderTarget
|
grp.post.ToneMap(); // RTCF_R8G8B8A8 is assumed
|
||||||
}
|
}
|
||||||
|
|
||||||
CmdBindRootSignature(rootSignature);
|
CmdBindRootSignature(rootSignature);
|
||||||
|
@ -415,6 +415,6 @@ void SMAA::Draw(const viewParms_t& parms)
|
||||||
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
CmdBarrier(ARRAY_LEN(barriers), barriers);
|
||||||
|
|
||||||
CmdBindRenderTargets(1, &grp.renderTarget, NULL);
|
CmdBindRenderTargets(1, &grp.renderTarget, NULL);
|
||||||
grp.post.InverseToneMap(); // writes to outputTexture
|
grp.post.InverseToneMap(r_rtColorFormat->integer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,6 +160,7 @@ namespace RHI
|
||||||
{
|
{
|
||||||
enum Id
|
enum Id
|
||||||
{
|
{
|
||||||
|
Invalid,
|
||||||
RGBA32_UNorm,
|
RGBA32_UNorm,
|
||||||
RGBA64_UNorm,
|
RGBA64_UNorm,
|
||||||
RGBA64_Float,
|
RGBA64_Float,
|
||||||
|
|
|
@ -997,6 +997,7 @@ extern trGlobals_t tr;
|
||||||
#define RTCF_R10G10B10A2 1
|
#define RTCF_R10G10B10A2 1
|
||||||
#define RTCF_R16G16B16A16 2
|
#define RTCF_R16G16B16A16 2
|
||||||
#define RTCF_MAX 2
|
#define RTCF_MAX 2
|
||||||
|
#define RTCF_COUNT 3
|
||||||
|
|
||||||
// r_gpuPreference
|
// r_gpuPreference
|
||||||
#define GPUPREF_HIGHPERF 0
|
#define GPUPREF_HIGHPERF 0
|
||||||
|
|
Loading…
Reference in New Issue