[client] egl: precompute FSR filter constants on CPU

This commit is contained in:
Quantum 2021-08-11 06:12:16 -04:00 committed by Geoffrey McRae
parent fe823b6172
commit f80b67bc50
3 changed files with 32 additions and 35 deletions

View file

@ -21,9 +21,12 @@
#include "filter.h" #include "filter.h"
#include "framebuffer.h" #include "framebuffer.h"
#include "common/array.h"
#include "common/countedbuffer.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/option.h" #include "common/option.h"
#include "cimgui.h" #include "cimgui.h"
#include "ffx.h"
#include "basic.vert.h" #include "basic.vert.h"
#include "ffx_fsr1_easu.frag.h" #include "ffx_fsr1_easu.frag.h"
@ -36,7 +39,7 @@ typedef struct EGL_FilterFFXFSR1
EGL_Shader * easu, * rcas; EGL_Shader * easu, * rcas;
bool enable, active; bool enable, active;
float sharpness; float sharpness;
EGL_Uniform easuUniform, rcasUniform; EGL_Uniform easuUniform[2], rcasUniform;
enum EGL_PixelFormat pixFmt; enum EGL_PixelFormat pixFmt;
unsigned int width, height; unsigned int width, height;
@ -73,6 +76,11 @@ static void egl_filterFFXFSR1EarlyInit(void)
option_register(options); option_register(options);
} }
static void rcasUpdateUniform(EGL_FilterFFXFSR1 * this)
{
ffxFsrRcasConst(this->rcasUniform.ui, 2.0f - this->sharpness * 2.0f);
}
static bool egl_filterFFXFSR1Init(EGL_Filter ** filter) static bool egl_filterFFXFSR1Init(EGL_Filter ** filter)
{ {
EGL_FilterFFXFSR1 * this = calloc(1, sizeof(*this)); EGL_FilterFFXFSR1 * this = calloc(1, sizeof(*this));
@ -115,15 +123,18 @@ static bool egl_filterFFXFSR1Init(EGL_Filter ** filter)
this->enable = option_get_bool("eglFilter", "ffxFSR"); this->enable = option_get_bool("eglFilter", "ffxFSR");
this->easuUniform.type = EGL_UNIFORM_TYPE_2UI; this->easuUniform[0].type = EGL_UNIFORM_TYPE_4UIV;
this->easuUniform.location = this->easuUniform[0].location =
egl_shaderGetUniform(this->easu, "uConsts");
this->easuUniform[0].v = countedBufferNew(16 * sizeof(GLuint));
this->easuUniform[1].type = EGL_UNIFORM_TYPE_2F;
this->easuUniform[1].location =
egl_shaderGetUniform(this->easu, "uOutRes"); egl_shaderGetUniform(this->easu, "uOutRes");
this->rcasUniform.type = EGL_UNIFORM_TYPE_1F; this->rcasUniform.type = EGL_UNIFORM_TYPE_4UI;
this->rcasUniform.location = this->rcasUniform.location = egl_shaderGetUniform(this->rcas, "uConsts");
egl_shaderGetUniform(this->rcas, "uSharpness");
this->sharpness = option_get_float("eglFilter", "ffxFSRSharpness"); this->sharpness = option_get_float("eglFilter", "ffxFSRSharpness");
this->rcasUniform.f[0] = 2.0f - this->sharpness * 2.0f; rcasUpdateUniform(this);
if (!egl_framebufferInit(&this->easuFb)) if (!egl_framebufferInit(&this->easuFb))
{ {
@ -269,7 +280,7 @@ static bool egl_filterFFXFSR1ImguiConfig(EGL_Filter * filter)
} }
this->sharpness = sharpness; this->sharpness = sharpness;
this->rcasUniform.f[0] = 2.0f - sharpness * 2.0f; rcasUpdateUniform(this);
redraw = true; redraw = true;
} }
@ -313,6 +324,11 @@ static bool egl_filterFFXFSR1Setup(EGL_Filter * filter,
this->sizeChanged = false; this->sizeChanged = false;
this->pixFmt = pixFmt; this->pixFmt = pixFmt;
this->prepared = false; this->prepared = false;
this->easuUniform[1].f[0] = this->width;
this->easuUniform[1].f[1] = this->height;
ffxFsrEasuConst((uint32_t *) this->easuUniform[0].v->data, this->inWidth, this->inHeight,
this->inWidth, this->inHeight, this->width, this->height);
return true; return true;
} }
@ -334,10 +350,7 @@ static bool egl_filterFFXFSR1Prepare(EGL_Filter * filter)
if (this->prepared) if (this->prepared)
return true; return true;
this->easuUniform.ui[0] = this->width; egl_shaderSetUniforms(this->easu, this->easuUniform, ARRAY_LENGTH(this->easuUniform));
this->easuUniform.ui[1] = this->height;
egl_shaderSetUniforms(this->easu, &this->easuUniform, 1);
egl_shaderSetUniforms(this->rcas, &this->rcasUniform, 1); egl_shaderSetUniforms(this->rcas, &this->rcasUniform, 1);
this->prepared = true; this->prepared = true;

View file

@ -7,7 +7,8 @@ in vec2 fragCoord;
out vec4 fragColor; out vec4 fragColor;
uniform sampler2D texture; uniform sampler2D texture;
uniform uvec2 uOutRes; uniform vec2 uOutRes;
uniform uvec4 uConsts[4];
#define A_GPU 1 #define A_GPU 1
#define A_GLSL 1 #define A_GLSL 1
@ -36,22 +37,8 @@ AF4 FsrEasuBF(AF2 p){return AF4(_textureGather(texture, p, 2));}
void main() void main()
{ {
vec2 inRes = vec2(textureSize(texture, 0));
vec2 outRes = vec2(uOutRes);
AU4 con0, con1, con2, con3;
FsrEasuCon(
con0,
con1,
con2,
con3,
inRes.x , inRes.y,
inRes.x , inRes.y,
outRes.x, outRes.y
);
vec3 color; vec3 color;
uvec2 point = uvec2(fragCoord * outRes); uvec2 point = uvec2(fragCoord * uOutRes);
FsrEasuF(color, point, con0, con1, con2, con3); FsrEasuF(color, point, uConsts[0], uConsts[1], uConsts[2], uConsts[3]);
fragColor = vec4(color.xyz, 1); fragColor = vec4(color.rgb, 1);
} }

View file

@ -7,7 +7,7 @@ in vec2 fragCoord;
out vec4 fragColor; out vec4 fragColor;
uniform sampler2D texture; uniform sampler2D texture;
uniform float uSharpness; uniform uvec4 uConsts;
#define A_GPU 1 #define A_GPU 1
#define A_GLSL 1 #define A_GLSL 1
@ -27,9 +27,6 @@ void main()
vec2 inRes = vec2(textureSize(texture, 0)); vec2 inRes = vec2(textureSize(texture, 0));
uvec2 point = uvec2(fragCoord * (inRes + 0.5f)); uvec2 point = uvec2(fragCoord * (inRes + 0.5f));
uvec4 const0; FsrRcasF(fragColor.r, fragColor.g, fragColor.b, point, uConsts);
FsrRcasCon(const0, uSharpness);
FsrRcasF(fragColor.r, fragColor.g, fragColor.b, point, const0);
fragColor.a = 1.0f; fragColor.a = 1.0f;
} }