Skip to content

Commit 380b85b

Browse files
avbaulaXottab-DUTY
authored andcommitted
Added FXAA for xrRender_R4(DX11)
Acked-by: Alexey Baula <alexeybaula@gmail.com>
1 parent f207607 commit 380b85b

File tree

13 files changed

+137
-2
lines changed

13 files changed

+137
-2
lines changed

res/gamedata/shaders/r3/fxaa.ps

42 KB
Binary file not shown.
1.39 KB
Binary file not shown.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include "common.h"
2+
3+
uniform float4 screen_res; // Screen resolution (x-Width,y-Height, zw - 1/resolution)
4+
5+
struct v
6+
{
7+
float3 P : POSITION;
8+
float2 Tex0 : TEXCOORD0;
9+
};
10+
11+
struct v2p
12+
{
13+
float2 Tex0 : TEXCOORD0;
14+
float4 HPos : SV_Position;
15+
};
16+
17+
//////////////////////////////////////////////////////////////////////////////////////////
18+
// Vertex
19+
v2p main ( v I )
20+
{
21+
v2p O;
22+
O.HPos = float4 (I.P.x * screen_res.z * 2 - 1, (I.P.y * screen_res.w * 2 - 1)* -1, 0, 1);
23+
O.Tex0 = I.Tex0;
24+
25+
return O;
26+
}

src/Layers/xrRender/xrRender_console.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ xr_token qmsaa__atest_token[] = {
3838
u32 ps_r3_minmax_sm = 3; // = 0;
3939
xr_token qminmax_sm_token[] = {{"off", 0}, {"on", 1}, {"auto", 2}, {"autodetect", 3}, {nullptr, 0}};
4040

41+
int ps_r3_fxaa = 0;
42+
4143
// “Off”
4244
// “DX10.0 style [Standard]”
4345
// “DX10.1 style [Higher quality]”
@@ -875,6 +877,7 @@ void xrRender_initconsole()
875877
#ifdef DETAIL_RADIUS
876878
CMD4(CCC_detail_radius, "r__detail_radius", &ps_r__detail_radius, 49, 300);
877879
#endif
880+
CMD4(CCC_Integer, "r3_fxaa", &ps_r3_fxaa, 0, 1);
878881

879882
// Allow real-time fog config reload
880883
#if (RENDER == R_R3) || (RENDER == R_R4)

src/Layers/xrRender/xrRender_console.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ extern ECORE_API xr_token qmsaa__atest_token[];
2424
extern ECORE_API u32 ps_r3_minmax_sm; // = 0;
2525
extern ECORE_API xr_token qminmax_sm_token[];
2626

27+
extern ECORE_API int ps_r3_fxaa;
28+
2729
extern ENGINE_API int ps_r__Supersample;
2830
extern ECORE_API int ps_r__LightSleepFrames;
2931

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include "stdafx.h"
2+
#pragma hdrstop
3+
4+
#include "blender_fxaa.h"
5+
6+
CBlender_FXAA::CBlender_FXAA() { description.CLS = 0; }
7+
CBlender_FXAA::~CBlender_FXAA() { }
8+
9+
void CBlender_FXAA::Compile(CBlender_Compile& C)
10+
{
11+
IBlender::Compile(C);
12+
13+
switch (C.iElement)
14+
{
15+
case 0:
16+
C.r_Pass("fxaa_main", "fxaa_main", false, FALSE, FALSE);
17+
C.r_dx10Texture("s_base0", r2_RT_generic0);
18+
C.r_dx10Sampler("smp_rtlinear");
19+
C.r_End();
20+
break;
21+
}
22+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#pragma once
2+
3+
class CBlender_FXAA : public IBlender
4+
{
5+
public:
6+
LPCSTR getComment() override { return "FXAA"; }
7+
BOOL canBeDetailed() override { return FALSE; }
8+
BOOL canBeLMAPped() override { return FALSE; }
9+
10+
void Compile(CBlender_Compile& C) override;
11+
12+
CBlender_FXAA();
13+
virtual ~CBlender_FXAA();
14+
};

src/Layers/xrRenderPC_R4/r4_rendertarget.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "blender_bloom_build.h"
1111
#include "blender_luminance.h"
1212
#include "blender_ssao.h"
13+
#include "blender_fxaa.h"
1314
#include "dx11MinMaxSMBlender.h"
1415
#include "dx11HDAOCSBlender.h"
1516
#include "Layers/xrRenderDX10/msaa/dx10MSAABlender.h"
@@ -322,6 +323,9 @@ CRenderTarget::CRenderTarget()
322323
b_combine = new CBlender_combine();
323324
b_ssao = new CBlender_SSAO_noMSAA();
324325

326+
//FXAA
327+
b_fxaa = new CBlender_FXAA();
328+
325329
// HDAO
326330
b_hdao_cs = new CBlender_CS_HDAO();
327331
if (RImplementation.o.dx10_msaa)
@@ -412,11 +416,12 @@ CRenderTarget::CRenderTarget()
412416
// generic(LDR) RTs
413417
rt_Generic_0.create(r2_RT_generic0, w, h, D3DFMT_A8R8G8B8, 1);
414418
rt_Generic_1.create(r2_RT_generic1, w, h, D3DFMT_A8R8G8B8, 1);
419+
rt_Generic.create(r2_RT_generic, w, h, D3DFMT_A8R8G8B8, 1);
420+
415421
if (RImplementation.o.dx10_msaa)
416422
{
417423
rt_Generic_0_r.create(r2_RT_generic0_r, w, h, D3DFMT_A8R8G8B8, SampleCount);
418424
rt_Generic_1_r.create(r2_RT_generic1_r, w, h, D3DFMT_A8R8G8B8, SampleCount);
419-
rt_Generic.create(r2_RT_generic, w, h, D3DFMT_A8R8G8B8, 1);
420425
}
421426
// Igor: for volumetric lights
422427
// rt_Generic_2.create (r2_RT_generic2,w,h,D3DFMT_A8R8G8B8 );
@@ -652,6 +657,10 @@ CRenderTarget::CRenderTarget()
652657
s_ssao.create(b_ssao, "r2\\ssao");
653658
}
654659

660+
//FXAA
661+
s_fxaa.create(b_fxaa, "r3\\fxaa");
662+
g_fxaa.create(FVF::F_V, RCache.Vertex.Buffer(), RCache.QuadIB);
663+
655664
// if (RImplementation.o.ssao_blur_on)
656665
//{
657666
// u32 w = Device.dwWidth, h = Device.dwHeight;
@@ -1061,6 +1070,7 @@ CRenderTarget::~CRenderTarget()
10611070
xr_delete(b_accum_point);
10621071
xr_delete(b_accum_direct);
10631072
xr_delete(b_ssao);
1073+
xr_delete(b_fxaa); //FXAA
10641074

10651075
if (RImplementation.o.dx10_msaa)
10661076
{

src/Layers/xrRenderPC_R4/r4_rendertarget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class CRenderTarget : public IRender_Target
4949
IBlender* b_accum_reflected_msaa[8];
5050
IBlender* b_ssao;
5151
IBlender* b_ssao_msaa[8];
52+
IBlender* b_fxaa;
5253

5354
// compute shader for hdao
5455
IBlender* b_hdao_cs;
@@ -127,6 +128,10 @@ class CRenderTarget : public IRender_Target
127128
ref_shader s_hdao_cs;
128129
ref_shader s_hdao_cs_msaa;
129130

131+
//FXAA
132+
ref_shader s_fxaa;
133+
ref_geom g_fxaa;
134+
130135
// Accum
131136
ref_shader s_accum_mask;
132137
ref_shader s_accum_direct;
@@ -261,6 +266,7 @@ class CRenderTarget : public IRender_Target
261266
void phase_occq();
262267
void phase_ssao();
263268
void phase_hdao();
269+
void phase_fxaa();
264270
void phase_downsamp();
265271
void phase_wallmarks();
266272
void phase_smap_direct(light* L, u32 sub_phase);
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include "stdafx.h"
2+
#include "r4_rendertarget.h"
3+
4+
void CRenderTarget::phase_fxaa()
5+
{
6+
u32 Offset = 0;
7+
const float _w = float(Device.dwWidth);
8+
const float _h = float(Device.dwHeight);
9+
const float du = ps_r1_pps_u, dv = ps_r1_pps_v;
10+
11+
u_setrt(rt_Generic, nullptr, nullptr, HW.pBaseZB);
12+
13+
FVF::V* pv = (FVF::V*)RCache.Vertex.Lock(4, g_fxaa->vb_stride, Offset);
14+
pv->set(du + 0, dv + float(_h), 0, 0, 1);
15+
pv++;
16+
pv->set(du + 0, dv + 0, 0, 0, 0);
17+
pv++;
18+
pv->set(du + float(_w), dv + float(_h), 0, 1, 1);
19+
pv++;
20+
pv->set(du + float(_w), dv + 0, 0, 1, 0);
21+
pv++;
22+
RCache.Vertex.Unlock(4, g_fxaa->vb_stride);
23+
24+
RCache.set_Element(s_fxaa->E[0]);
25+
RCache.set_Geometry(g_fxaa);
26+
RCache.Render(D3DPT_TRIANGLELIST, Offset, 0, 4, 0, 2);
27+
28+
HW.pContext->CopyResource(rt_Generic_0->pTexture->surface_get(), rt_Generic->pTexture->surface_get());
29+
}

0 commit comments

Comments
 (0)