[client] egl: precompute CAS filter constants on CPU

This commit is contained in:
Quantum 2021-08-11 06:33:06 -04:00 committed by Geoffrey McRae
parent 3a1a9121eb
commit 8b2db071d8
2 changed files with 26 additions and 22 deletions

View File

@ -21,9 +21,11 @@
#include "filter.h" #include "filter.h"
#include "framebuffer.h" #include "framebuffer.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_cas.frag.h" #include "ffx_cas.frag.h"
@ -34,10 +36,11 @@ typedef struct EGL_FilterFFXCAS
EGL_Shader * shader; EGL_Shader * shader;
bool enable; bool enable;
EGL_Uniform uniform;
enum EGL_PixelFormat pixFmt; enum EGL_PixelFormat pixFmt;
unsigned int width, height; unsigned int width, height;
float sharpness;
CountedBuffer * consts;
bool prepared; bool prepared;
EGL_Framebuffer * fb; EGL_Framebuffer * fb;
@ -69,6 +72,12 @@ static void egl_filterFFXCASEarlyInit(void)
option_register(options); option_register(options);
} }
static void casUpdateConsts(EGL_FilterFFXCAS * this)
{
ffxCasConst((uint32_t *) this->consts->data, this->sharpness, this->width, this->height,
this->width, this->height);
}
static bool egl_filterFFXCASInit(EGL_Filter ** filter) static bool egl_filterFFXCASInit(EGL_Filter ** filter)
{ {
EGL_FilterFFXCAS * this = calloc(1, sizeof(*this)); EGL_FilterFFXCAS * this = calloc(1, sizeof(*this));
@ -93,12 +102,15 @@ static bool egl_filterFFXCASInit(EGL_Filter ** filter)
goto error_shader; goto error_shader;
} }
this->consts = countedBufferNew(8 * sizeof(GLuint));
egl_shaderSetUniforms(this->shader, &(EGL_Uniform) {
.type = EGL_UNIFORM_TYPE_4UIV,
.location = egl_shaderGetUniform(this->shader, "uConsts"),
.v = this->consts,
}, 1);
this->enable = option_get_bool("eglFilter", "ffxCAS"); this->enable = option_get_bool("eglFilter", "ffxCAS");
this->uniform.type = EGL_UNIFORM_TYPE_1F; this->sharpness = option_get_float("eglFilter", "ffxCASSharpness");
this->uniform.location =
egl_shaderGetUniform(this->shader, "uSharpness");
this->uniform.f[0] =
option_get_float("eglFilter", "ffxCASSharpness");
if (!egl_framebufferInit(&this->fb)) if (!egl_framebufferInit(&this->fb))
{ {
@ -139,7 +151,7 @@ static bool egl_filterFFXCASImguiConfig(EGL_Filter * filter)
bool redraw = false; bool redraw = false;
bool cas = this->enable; bool cas = this->enable;
float casSharpness = this->uniform.f[0]; float casSharpness = this->sharpness;
igCheckbox("AMD FidelityFX CAS", &cas); igCheckbox("AMD FidelityFX CAS", &cas);
if (cas != this->enable) if (cas != this->enable)
@ -156,7 +168,7 @@ static bool egl_filterFFXCASImguiConfig(EGL_Filter * filter)
igSliderFloat("##casSharpness", &casSharpness, 0.0f, 1.0f, NULL, 0); igSliderFloat("##casSharpness", &casSharpness, 0.0f, 1.0f, NULL, 0);
igPopItemWidth(); igPopItemWidth();
if (casSharpness != this->uniform.f[0]) if (casSharpness != this->sharpness)
{ {
// enable CAS if the sharpness was changed // enable CAS if the sharpness was changed
if (!cas) if (!cas)
@ -165,7 +177,8 @@ static bool egl_filterFFXCASImguiConfig(EGL_Filter * filter)
this->enable = true; this->enable = true;
} }
this->uniform.f[0] = casSharpness; this->sharpness = casSharpness;
casUpdateConsts(this);
redraw = true; redraw = true;
} }
@ -190,6 +203,7 @@ static bool egl_filterFFXCASSetup(EGL_Filter * filter,
this->width = width; this->width = width;
this->height = height; this->height = height;
this->prepared = false; this->prepared = false;
casUpdateConsts(this);
return true; return true;
} }
@ -212,7 +226,6 @@ static bool egl_filterFFXCASPrepare(EGL_Filter * filter)
if (this->prepared) if (this->prepared)
return true; return true;
egl_shaderSetUniforms(this->shader, &this->uniform, 1);
this->prepared = true; this->prepared = true;
return true; return true;

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[2];
#define A_GPU 1 #define A_GPU 1
#define A_GLSL 1 #define A_GLSL 1
@ -33,16 +33,7 @@ void main()
vec2 res = vec2(textureSize(texture, 0)); vec2 res = vec2(textureSize(texture, 0));
uvec2 point = uvec2(fragCoord * res); uvec2 point = uvec2(fragCoord * res);
vec4 color;
uvec4 const0;
uvec4 const1;
CasSetup(const0, const1, uSharpness,
res.x, res.y, res.x, res.y);
CasFilter( CasFilter(
fragColor.r, fragColor.g, fragColor.b, fragColor.r, fragColor.g, fragColor.b,
point, point, uConsts[0], uConsts[1], true);
const0, const1,
true);
} }