mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-01-09 22:03:58 +00:00
[client] egl: precompute FSR filter constants on CPU
This commit is contained in:
parent
fe823b6172
commit
f80b67bc50
3 changed files with 32 additions and 35 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue